mirror of
https://github.com/lumapu/ahoy.git
synced 2025-06-06 20:51:38 +02:00
MI - restructure error calculation
This commit is contained in:
parent
250d3f9fb1
commit
b498ea619f
1 changed files with 87 additions and 58 deletions
|
@ -21,7 +21,7 @@ typedef struct {
|
||||||
bool complete;
|
bool complete;
|
||||||
bool dataAB[3];
|
bool dataAB[3];
|
||||||
bool stsAB[3];
|
bool stsAB[3];
|
||||||
uint16_t sts[5];
|
uint16_t sts[6];
|
||||||
uint8_t txId;
|
uint8_t txId;
|
||||||
uint8_t invId;
|
uint8_t invId;
|
||||||
uint8_t retransmits;
|
uint8_t retransmits;
|
||||||
|
@ -49,7 +49,7 @@ class MiPayload {
|
||||||
mMaxRetrans = maxRetransmits;
|
mMaxRetrans = maxRetransmits;
|
||||||
mTimestamp = timestamp;
|
mTimestamp = timestamp;
|
||||||
for(uint8_t i = 0; i < MAX_NUM_INVERTERS; i++) {
|
for(uint8_t i = 0; i < MAX_NUM_INVERTERS; i++) {
|
||||||
reset(i);
|
reset(i, true);
|
||||||
mPayload[i].limitrequested = true;
|
mPayload[i].limitrequested = true;
|
||||||
}
|
}
|
||||||
mSerialDebug = false;
|
mSerialDebug = false;
|
||||||
|
@ -240,19 +240,28 @@ const byteAssign_t InfoAssignment[] = {
|
||||||
DBGPRINTLN(String((p->packet[24] << 8) + p->packet[25]));
|
DBGPRINTLN(String((p->packet[24] << 8) + p->packet[25]));
|
||||||
/*iv->setQueuedCmdFinished();
|
/*iv->setQueuedCmdFinished();
|
||||||
mSys->Radio.sendCmdPacket(iv->radioId.u64, 0x0f, 0x01, false);*/
|
mSys->Radio.sendCmdPacket(iv->radioId.u64, 0x0f, 0x01, false);*/
|
||||||
} else if ( p->packet[9] == 0x01 ) {//second frame
|
} else if ( p->packet[9] == 0x01 || p->packet[9] == 0x10 ) {//second frame for MI, 3rd gen. answers in 0x10
|
||||||
DPRINTHEAD(DBG_INFO, iv->id);
|
DPRINTHEAD(DBG_INFO, iv->id);
|
||||||
DBGPRINTLN(F("got 2nd frame (hw info)"));
|
if ( p->packet[9] == 0x01 ) {
|
||||||
|
DBGPRINTLN(F("got 2nd frame (hw info)"));
|
||||||
|
} else {
|
||||||
|
DBGPRINTLN(F("3rd gen. inverter!")); // see table in OpenDTU code, DevInfoParser.cpp devInfo[]
|
||||||
|
}
|
||||||
// xlsx: HW_ECapValue is total energy?!? (data coll. inst. #154)
|
// xlsx: HW_ECapValue is total energy?!? (data coll. inst. #154)
|
||||||
DPRINT(DBG_INFO,F("HW_ECapValue "));
|
DPRINT(DBG_INFO,F("HW_PartNo "));
|
||||||
DBGPRINTLN(String((p->packet[20] << 8) + p->packet[21]));
|
DBGPRINTLN(String((uint32_t) (((p->packet[10] << 8) | p->packet[11]) << 8 | p->packet[12]) << 8 | p->packet[13]));
|
||||||
iv->setValue(iv->getPosByChFld(0, FLD_YT, rec), rec, (float) ((p->packet[20] << 8) + p->packet[21])/1);
|
//DBGPRINTLN(String((p->packet[12] << 8) + p->packet[13]));
|
||||||
DPRINT(DBG_INFO,F("HW_FB_TLmValue "));
|
if ( p->packet[9] == 0x01 ) {
|
||||||
DBGPRINTLN(String((p->packet[14] << 8) + p->packet[15]));
|
DPRINT(DBG_INFO,F("HW_ECapValue "));
|
||||||
DPRINT(DBG_INFO,F("HW_FB_ReSPRT "));
|
DBGPRINTLN(String((p->packet[20] << 8) + p->packet[21]));
|
||||||
DBGPRINTLN(String((p->packet[16] << 8) + p->packet[17]));
|
iv->setValue(iv->getPosByChFld(0, FLD_YT, rec), rec, (float) ((p->packet[20] << 8) + p->packet[21])/1);
|
||||||
DPRINT(DBG_INFO,F("HW_GridSamp_ResValule "));
|
DPRINT(DBG_INFO,F("HW_FB_TLmValue "));
|
||||||
DBGPRINTLN(String((p->packet[18] << 8) + p->packet[19]));
|
DBGPRINTLN(String((p->packet[14] << 8) + p->packet[15]));
|
||||||
|
DPRINT(DBG_INFO,F("HW_FB_ReSPRT "));
|
||||||
|
DBGPRINTLN(String((p->packet[16] << 8) + p->packet[17]));
|
||||||
|
DPRINT(DBG_INFO,F("HW_GridSamp_ResValule "));
|
||||||
|
DBGPRINTLN(String((p->packet[18] << 8) + p->packet[19]));
|
||||||
|
}
|
||||||
} else if ( p->packet[9] == 0x12 ) {//3rd frame
|
} else if ( p->packet[9] == 0x12 ) {//3rd frame
|
||||||
DPRINTHEAD(DBG_INFO, iv->id);
|
DPRINTHEAD(DBG_INFO, iv->id);
|
||||||
DBGPRINTLN(F("got 3rd frame (hw info)"));
|
DBGPRINTLN(F("got 3rd frame (hw info)"));
|
||||||
|
@ -261,7 +270,7 @@ const byteAssign_t InfoAssignment[] = {
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if ( p->packet[0] == (TX_REQ_INFO + ALL_FRAMES) // response from get information command
|
} else if ( p->packet[0] == (TX_REQ_INFO + ALL_FRAMES) // response from get information command
|
||||||
|| p->packet[0] == 0xB6 ) { // strange short response from MI-1500 3rd gen; might be missleading!
|
|| p->packet[0] == 0xB6 && mPayload[iv->id].txCmd != 0x36) { // strange short response from MI-1500 3rd gen; might be missleading!
|
||||||
// atm, we just do nothing else than print out what we got...
|
// atm, we just do nothing else than print out what we got...
|
||||||
// for decoding see xls- Data collection instructions - #147ff
|
// for decoding see xls- Data collection instructions - #147ff
|
||||||
//mPayload[iv->id].txId = p->packet[0];
|
//mPayload[iv->id].txId = p->packet[0];
|
||||||
|
@ -502,16 +511,6 @@ const byteAssign_t InfoAssignment[] = {
|
||||||
DPRINTLN(DBG_INFO, F("procPyld: txid: 0x") + String(mPayload[iv->id].txId, HEX));
|
DPRINTLN(DBG_INFO, F("procPyld: txid: 0x") + String(mPayload[iv->id].txId, HEX));
|
||||||
//DPRINTLN(DBG_DEBUG, F("procPyld: max: ") + String(mPayload[iv->id].maxPackId));
|
//DPRINTLN(DBG_DEBUG, F("procPyld: max: ") + String(mPayload[iv->id].maxPackId));
|
||||||
//record_t<> *rec = iv->getRecordStruct(mPayload[iv->id].txCmd); // choose the parser
|
//record_t<> *rec = iv->getRecordStruct(mPayload[iv->id].txCmd); // choose the parser
|
||||||
mPayload[iv->id].complete = true;
|
|
||||||
uint8_t ac_pow = 0;
|
|
||||||
//if (mPayload[iv->id].sts[0] == 3) {
|
|
||||||
ac_pow = calcPowerDcCh0(iv, 0)*9.5;
|
|
||||||
//}
|
|
||||||
record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); // choose the parser
|
|
||||||
iv->setValue(iv->getPosByChFld(0, FLD_PAC, rec), rec, (float) (ac_pow/10));
|
|
||||||
DPRINTLN(DBG_INFO, F("process: compl. set of msgs detected"));
|
|
||||||
iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0));
|
|
||||||
iv->doCalculations();
|
|
||||||
//uint8_t payload[128];
|
//uint8_t payload[128];
|
||||||
//uint8_t payloadLen = 0;
|
//uint8_t payloadLen = 0;
|
||||||
//memset(payload, 0, 128);
|
//memset(payload, 0, 128);
|
||||||
|
@ -573,28 +572,45 @@ const byteAssign_t InfoAssignment[] = {
|
||||||
rec->ts = mPayload[iv->id].ts;
|
rec->ts = mPayload[iv->id].ts;
|
||||||
mPayload[iv->id].gotFragment = true;
|
mPayload[iv->id].gotFragment = true;
|
||||||
mPayload[iv->id].txId = p->packet[0];
|
mPayload[iv->id].txId = p->packet[0];
|
||||||
|
miStsConsolidate(iv, stschan, rec, p->packet[10], p->packet[12], p->packet[9], p->packet[11]);
|
||||||
//uint8_t status = (p->packet[11] << 8) + p->packet[12];
|
|
||||||
uint16_t status = 3; // regular status for MI, change to 1 later?
|
|
||||||
if ( p->packet[10] < 3 ) {
|
|
||||||
status = p->packet[10]*100 + p->packet[9]*10 + stschan; //first approach, needs review!
|
|
||||||
} else if ( p->packet[10] > 3 ) {
|
|
||||||
status = p->packet[10]*1000 + p->packet[9]*100 + p->packet[12]*10 + p->packet[11];
|
|
||||||
if (p->packet[12] < 6) {
|
|
||||||
status += stschan;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ( status != 3 ) {
|
|
||||||
DPRINTLN(DBG_WARN, F("Error code ") + String(status));
|
|
||||||
}
|
|
||||||
|
|
||||||
mPayload[iv->id].sts[stschan] = status;
|
|
||||||
mPayload[iv->id].stsAB[stschan] = true;
|
mPayload[iv->id].stsAB[stschan] = true;
|
||||||
if (mPayload[iv->id].stsAB[CH1] && mPayload[iv->id].stsAB[CH2])
|
if (mPayload[iv->id].stsAB[CH1] && mPayload[iv->id].stsAB[CH2])
|
||||||
mPayload[iv->id].stsAB[CH0] = true;
|
mPayload[iv->id].stsAB[CH0] = true;
|
||||||
if ( !mPayload[iv->id].sts[0] || status < mPayload[iv->id].sts[0] ) {
|
//mPayload[iv->id].skipfirstrepeat = 1;
|
||||||
mPayload[iv->id].sts[0] = status;
|
if (mPayload[iv->id].stsAB[CH0] && mPayload[iv->id].dataAB[CH0] && !mPayload[iv->id].complete) {
|
||||||
iv->setValue(iv->getPosByChFld(0, FLD_EVT, rec), rec, status);
|
miComplete(iv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void miStsConsolidate(Inverter<> *iv, uint8_t stschan, record_t<> *rec, uint8_t uState, uint8_t uEnum, uint8_t lState = 0, uint8_t lEnum = 0) {
|
||||||
|
//uint8_t status = (p->packet[11] << 8) + p->packet[12];
|
||||||
|
uint16_t status = 3; // regular status for MI, change to 1 later?
|
||||||
|
if ( uState < 3 ) {
|
||||||
|
status = uState*100 + stschan; //first approach, needs review!
|
||||||
|
if (lState)
|
||||||
|
status += lState*10;
|
||||||
|
} else if ( uState > 3 ) {
|
||||||
|
status = uState*1000 + uEnum*10;
|
||||||
|
if (lState)
|
||||||
|
status += lState*100; //needs review, esp. for 4ch-8310 state!
|
||||||
|
//if (lEnum)
|
||||||
|
status += lEnum;
|
||||||
|
if (uEnum < 6) {
|
||||||
|
status += stschan;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t prntsts = status == 3 ? 1 : status;
|
||||||
|
if ( status != mPayload[iv->id].sts[stschan] ) { //sth.'s changed?
|
||||||
|
mPayload[iv->id].sts[stschan] = status;
|
||||||
|
DPRINT(DBG_WARN, F("Status change for CH"));
|
||||||
|
DBGPRINT(String(stschan)); DBGPRINT(F(": "));
|
||||||
|
DBGPRINTLN(iv->getAlarmStr(prntsts));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !mPayload[iv->id].sts[0] || prntsts < mPayload[iv->id].sts[0] ) {
|
||||||
|
mPayload[iv->id].sts[0] = prntsts;
|
||||||
|
iv->setValue(iv->getPosByChFld(0, FLD_EVT, rec), rec, prntsts);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (iv->alarmMesIndex < rec->record[iv->getPosByChFld(0, FLD_EVT, rec)]){
|
if (iv->alarmMesIndex < rec->record[iv->getPosByChFld(0, FLD_EVT, rec)]){
|
||||||
|
@ -603,12 +619,20 @@ const byteAssign_t InfoAssignment[] = {
|
||||||
DPRINTHEAD(DBG_INFO, iv->id);
|
DPRINTHEAD(DBG_INFO, iv->id);
|
||||||
DBGPRINT_TXT(TXT_INCRALM);
|
DBGPRINT_TXT(TXT_INCRALM);
|
||||||
DBGPRINTLN(String(iv->alarmMesIndex));
|
DBGPRINTLN(String(iv->alarmMesIndex));
|
||||||
//iv->enqueCommand<InfoCommand>(AlarmData); Would just start with second channel request 0x11...
|
|
||||||
}
|
|
||||||
//mPayload[iv->id].skipfirstrepeat = 1;
|
|
||||||
if (mPayload[iv->id].stsAB[CH0] && mPayload[iv->id].dataAB[CH0] && !mPayload[iv->id].complete) {
|
|
||||||
miComplete(iv);
|
|
||||||
}
|
}
|
||||||
|
/*if(AlarmData == mPayload[iv->id].txCmd) {
|
||||||
|
uint8_t i = 0;
|
||||||
|
uint16_t code;
|
||||||
|
uint32_t start, end;
|
||||||
|
while(1) {
|
||||||
|
code = iv->parseAlarmLog(i++, payload, payloadLen, &start, &end);
|
||||||
|
if(0 == code)
|
||||||
|
break;
|
||||||
|
if (NULL != mCbAlarm)
|
||||||
|
(mCbAlarm)(code, start, end);
|
||||||
|
yield();
|
||||||
|
}
|
||||||
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void miDataDecode(Inverter<> *iv, packet_t *p) {
|
void miDataDecode(Inverter<> *iv, packet_t *p) {
|
||||||
|
@ -653,12 +677,14 @@ const byteAssign_t InfoAssignment[] = {
|
||||||
FCODE = (uint8_t)(p->packet[27]);
|
FCODE = (uint8_t)(p->packet[27]);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
uint16_t status = (uint8_t)(p->packet[23]);
|
/*uint16_t status = (uint8_t)(p->packet[23]);
|
||||||
mPayload[iv->id].sts[datachan] = status;
|
mPayload[iv->id].sts[datachan] = status;
|
||||||
if ( !mPayload[iv->id].sts[0] || status < mPayload[iv->id].sts[0]) {
|
if ( !mPayload[iv->id].sts[0] || status < mPayload[iv->id].sts[0]) {
|
||||||
mPayload[iv->id].sts[0] = status;
|
mPayload[iv->id].sts[0] = status;
|
||||||
iv->setValue(iv->getPosByChFld(0, FLD_EVT, rec), rec, status);
|
iv->setValue(iv->getPosByChFld(0, FLD_EVT, rec), rec, status);
|
||||||
}
|
}*/
|
||||||
|
miStsConsolidate(iv, datachan, rec, p->packet[23], p->packet[24]);
|
||||||
|
|
||||||
|
|
||||||
if (p->packet[0] < (0x39 + ALL_FRAMES) ) {
|
if (p->packet[0] < (0x39 + ALL_FRAMES) ) {
|
||||||
/*uint8_t cmd = p->packet[0] - ALL_FRAMES + 1;
|
/*uint8_t cmd = p->packet[0] - ALL_FRAMES + 1;
|
||||||
|
@ -674,17 +700,17 @@ const byteAssign_t InfoAssignment[] = {
|
||||||
mPayload[iv->id].complete = true;
|
mPayload[iv->id].complete = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (iv->alarmMesIndex < rec->record[iv->getPosByChFld(0, FLD_EVT, rec)]){
|
/*if (iv->alarmMesIndex < rec->record[iv->getPosByChFld(0, FLD_EVT, rec)]){
|
||||||
iv->alarmMesIndex = rec->record[iv->getPosByChFld(0, FLD_EVT, rec)];
|
iv->alarmMesIndex = rec->record[iv->getPosByChFld(0, FLD_EVT, rec)];
|
||||||
|
|
||||||
DPRINTHEAD(DBG_INFO, iv->id);
|
DPRINTHEAD(DBG_INFO, iv->id);
|
||||||
DBGPRINT_TXT(TXT_INCRALM);
|
DBGPRINT_TXT(TXT_INCRALM);
|
||||||
DBGPRINTLN(String(iv->alarmMesIndex));
|
DBGPRINTLN(String(iv->alarmMesIndex));
|
||||||
}
|
}*/
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( mPayload[iv->id].complete || //4ch device
|
if ( mPayload[iv->id].complete || //4ch device
|
||||||
(iv->type != INV_TYPE_4CH //other devices
|
(iv->type != INV_TYPE_4CH //other devices
|
||||||
&& mPayload[iv->id].dataAB[CH0]
|
&& mPayload[iv->id].dataAB[CH0]
|
||||||
&& mPayload[iv->id].stsAB[CH0])) {
|
&& mPayload[iv->id].stsAB[CH0])) {
|
||||||
|
@ -768,7 +794,7 @@ const byteAssign_t InfoAssignment[] = {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void reset(uint8_t id) {
|
void reset(uint8_t id, bool clrSts = false) {
|
||||||
DPRINTHEAD(DBG_INFO, id);
|
DPRINTHEAD(DBG_INFO, id);
|
||||||
DBGPRINTLN_TXT(TXT_RSTPYLD);
|
DBGPRINTLN_TXT(TXT_RSTPYLD);
|
||||||
memset(mPayload[id].len, 0, MAX_PAYLOAD_ENTRIES);
|
memset(mPayload[id].len, 0, MAX_PAYLOAD_ENTRIES);
|
||||||
|
@ -788,10 +814,13 @@ const byteAssign_t InfoAssignment[] = {
|
||||||
mPayload[id].requested = false;
|
mPayload[id].requested = false;
|
||||||
mPayload[id].ts = *mTimestamp;
|
mPayload[id].ts = *mTimestamp;
|
||||||
mPayload[id].sts[0] = 0;
|
mPayload[id].sts[0] = 0;
|
||||||
mPayload[id].sts[CH1] = 0;
|
if (clrSts) { // only clear channel states at startup
|
||||||
mPayload[id].sts[CH2] = 0;
|
mPayload[id].sts[CH1] = 0;
|
||||||
mPayload[id].sts[CH3] = 0;
|
mPayload[id].sts[CH2] = 0;
|
||||||
mPayload[id].sts[CH4] = 0;
|
mPayload[id].sts[CH3] = 0;
|
||||||
|
mPayload[id].sts[CH4] = 0;
|
||||||
|
mPayload[id].sts[5] = 0; //remember last summarized state
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue