|  | @ -24,13 +24,12 @@ typedef struct { | 
			
		
	
		
		
			
				
					|  |  |     uint8_t txId; |  |  |     uint8_t txId; | 
			
		
	
		
		
			
				
					|  |  |     uint8_t invId; |  |  |     uint8_t invId; | 
			
		
	
		
		
			
				
					|  |  |     uint8_t retransmits; |  |  |     uint8_t retransmits; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     uint8_t skipfirstrepeat; | 
			
		
	
		
		
			
				
					|  |  |     bool gotFragment; |  |  |     bool gotFragment; | 
			
		
	
		
		
			
				
					|  |  |     /*
 |  |  |     /*
 | 
			
		
	
		
		
			
				
					|  |  |     uint8_t data[MAX_PAYLOAD_ENTRIES][MAX_RF_PAYLOAD_SIZE]; |  |  |     uint8_t data[MAX_PAYLOAD_ENTRIES][MAX_RF_PAYLOAD_SIZE]; | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |     uint8_t maxPackId; |  |  |     uint8_t maxPackId; | 
			
		
	
		
		
			
				
					
					|  |  |     bool lastFound; |  |  |     bool lastFound;*/ | 
			
				
				
			
		
	
		
		
			
				
					|  |  |     bool gotFragment;*/ |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					|  |  | } miPayload_t; |  |  | } miPayload_t; | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  | @ -93,12 +92,14 @@ class MiPayload { | 
			
		
	
		
		
			
				
					|  |  |             DBGPRINT(F(") prepareDevInformCmd 0x")); |  |  |             DBGPRINT(F(") prepareDevInformCmd 0x")); | 
			
		
	
		
		
			
				
					|  |  |             DBGPRINTLN(String(cmd, HEX)); |  |  |             DBGPRINTLN(String(cmd, HEX)); | 
			
		
	
		
		
			
				
					|  |  |             uint8_t cmd2 = cmd; |  |  |             uint8_t cmd2 = cmd; | 
			
		
	
		
		
			
				
					
					|  |  |             if (cmd == 0x1 ) { |  |  |             if (cmd == 0x1 ) { //0x1
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |                 cmd  = TX_REQ_INFO; |  |  |                 cmd  = 0x0f; | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |                 cmd2 = 0x00; |  |  |                 cmd2 = 0x00; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 mSys->Radio.sendCmdPacket(iv->radioId.u64, cmd, cmd2, false); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             } else { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 mSys->Radio.prepareDevInformCmd(iv->radioId.u64, cmd2, mPayload[iv->id].ts, iv->alarmMesIndex, false, cmd); | 
			
		
	
		
		
			
				
					|  |  |             }; |  |  |             }; | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |             mSys->Radio.prepareDevInformCmd(iv->radioId.u64, cmd2, mPayload[iv->id].ts, iv->alarmMesIndex, false, cmd); |  |  |  | 
			
		
	
		
		
			
				
					|  |  |             mPayload[iv->id].txCmd = cmd; |  |  |             mPayload[iv->id].txCmd = cmd; | 
			
		
	
		
		
			
				
					|  |  |             if (iv->type == INV_TYPE_1CH || iv->type == INV_TYPE_2CH) { |  |  |             if (iv->type == INV_TYPE_1CH || iv->type == INV_TYPE_2CH) { | 
			
		
	
		
		
			
				
					|  |  |                 mPayload[iv->id].dataAB[CH1] = false; |  |  |                 mPayload[iv->id].dataAB[CH1] = false; | 
			
		
	
	
		
		
			
				
					|  | @ -118,53 +119,30 @@ class MiPayload { | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |             if (p->packet[0] == (0x08 + ALL_FRAMES)) { // 0x88; MI status response to 0x09
 |  |  |             if (p->packet[0] == (0x08 + ALL_FRAMES)) { // 0x88; MI status response to 0x09
 | 
			
		
	
		
		
			
				
					|  |  |                 miStsDecode(iv, p); |  |  |                 miStsDecode(iv, p); | 
			
		
	
		
		
			
				
					
					|  |  |             } else if (p->packet[0] == (0x11 + SINGLE_FRAME)) { // 0x92; MI status response to 0x11
 |  |  |             } | 
			
				
				
			
		
	
		
		
			
				
					|  |  |                 miStsDecode(iv, p, CH2); |  |  |  | 
			
		
	
		
		
			
				
					|  |  |             /*} else if (p->packet[0] == (0x09 + ALL_FRAMES)) { // MI data response to 0x09
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 mPayload[iv->id].txId = p->packet[0]; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 miDataDecode(iv,p); |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 //iv->setQueuedCmdFinished();
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 if (INV_TYPE_2CH == iv->type) { |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                     //mSys->Radio.prepareDevInformCmd(iv->radioId.u64, iv->getQueuedCmd(), mPayload[iv->id].ts, iv->alarmMesIndex, false, 0x11);
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                     //mSys->Radio.prepareDevInformCmd(iv->radioId.u64, 0x11, mPayload[iv->id].ts, iv->alarmMesIndex, false, 0x11);
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 } else { // additional check for mPayload[iv->id].stsa == true might be a good idea (request retransmit?)
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                     mPayload[iv->id].complete = true; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                     //iv->setQueuedCmdFinished();
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 } |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |             } else if (p->packet[0] == ()) { // MI data response to 0x11
 |  |  |             else if (p->packet[0] == (0x11 + SINGLE_FRAME)) { // 0x92; MI status response to 0x11
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |                 mPayload[iv->id].txId = p->packet[0]; |  |  |                 miStsDecode(iv, p, CH2); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |                 miDataDecode(iv,p); |  |  |             } | 
			
				
				
			
		
	
		
		
			
				
					|  |  |                 mStat->rxSuccess++; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 //iv->setQueuedCmdFinished();*/
 |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |             } else if ( p->packet[0] == 0x09 + ALL_FRAMES || |  |  |             else if ( p->packet[0] == 0x09 + ALL_FRAMES || | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                         p->packet[0] == 0x11 + ALL_FRAMES || |  |  |                         p->packet[0] == 0x11 + ALL_FRAMES || | 
			
		
	
		
		
			
				
					|  |  |                         ( p->packet[0] >= (0x36 + ALL_FRAMES) && p->packet[0] < (0x39 + SINGLE_FRAME) ) ) { // small MI or MI 1500 data responses to 0x09, 0x11, 0x36, 0x37, 0x38 and 0x39
 |  |  |                         ( p->packet[0] >= (0x36 + ALL_FRAMES) && p->packet[0] < (0x39 + SINGLE_FRAME) ) ) { // small MI or MI 1500 data responses to 0x09, 0x11, 0x36, 0x37, 0x38 and 0x39
 | 
			
		
	
		
		
			
				
					|  |  |                 mPayload[iv->id].txId = p->packet[0]; |  |  |                 mPayload[iv->id].txId = p->packet[0]; | 
			
		
	
		
		
			
				
					|  |  |                 miDataDecode(iv,p); |  |  |                 miDataDecode(iv,p); | 
			
		
	
		
		
			
				
					
					|  |  |                 //mStat->rxSuccess++;
 |  |  |             } | 
			
				
				
			
		
	
		
		
			
				
					|  |  |                 //iv->setQueuedCmdFinished();
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 /*if (p->packet[0] < (0x39 + ALL_FRAMES)) {
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                     //mSys->Radio.prepareDevInformCmd(iv->radioId.u64, iv->getQueuedCmd(), mPayload[iv->id].ts, iv->alarmMesIndex, false, p->packet[0] + 1 - ALL_FRAMES);
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                     //mSys->Radio.prepareDevInformCmd(iv->radioId.u64, p->packet[0] + 1 - ALL_FRAMES, mPayload[iv->id].ts, iv->alarmMesIndex, false, p->packet[0] + 1 - ALL_FRAMES);
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 } else { |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                     mPayload[iv->id].complete = true; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                     //iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, CALC_YD_CH0);
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                     //iv->setQueuedCmdFinished();
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 }*/ |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |             //}
 |  |  |             else if (p->packet[0] == ( 0x0f + ALL_FRAMES)) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |                 // MI response from get hardware information request
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 record_t<> *rec = iv->getRecordStruct(InverterDevInform_All);  // choose the record structure
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 rec->ts = mPayload[iv->id].ts; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 mPayload[iv->id].gotFragment = true; | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |             } else if (p->packet[0] == (TX_REQ_INFO + ALL_FRAMES)) {  // response from get information command
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |             // atm, we just do nothing else than print out what we got...
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |             // for decoding see xls- Data collection instructions - #147ff
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  | /*
 |  |  | /*
 | 
			
		
	
		
		
			
				
					|  |  |  Polling the device software and hardware version number command |  |  |  Polling the device software and hardware version number command | 
			
		
	
		
		
			
				
					|  |  |  start byte	Command word	 routing address				 target address				 User data	 check	 end byte |  |  |  start byte	Command word	 routing address				 target address				 User data	 check	 end byte | 
			
		
	
		
		
			
				
					|  |  |  byte[0]	 byte[1]	 byte[2]	 byte[3]	 byte[4]	 byte[5]	 byte[6]	 byte[7]	 byte[8]	 byte[9]	 byte[10]	 byte[11]	 byte[12] |  |  |  byte[0]	 byte[1]	 byte[2]	 byte[3]	 byte[4]	 byte[5]	 byte[6]	 byte[7]	 byte[8]	 byte[9]	 byte[10]	 byte[11]	 byte[12] | 
			
		
	
		
		
			
				
					|  |  |  0x7e	 0x0f	 xx	 xx	 xx	 xx	 YY	 YY	 YY	 YY	 0x00	 CRC	 0x7f |  |  |  0x7e	 0x0f	 xx	 xx	 xx	 xx	 YY	 YY	 YY	 YY	 0x00	 CRC	 0x7f | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |  Command Receipt - First Frame |  |  |  Command Receipt - First Frame | 
			
		
	
		
		
			
				
					|  |  |  start byte	Command word	 target address				 routing address				 Multi-frame marking	 User data	 User data	 User data	 User data	 User data	 User data	 User data	 User data	 User data	 User data	 User data	 User data	 User data	 User data	 User data	 User data	 check	 end byte |  |  |  start byte	Command word	 target address				 routing address				 Multi-frame marking	 User data	 User data	 User data	 User data	 User data	 User data	 User data	 User data	 User data	 User data	 User data	 User data	 User data	 User data	 User data	 User data	 check	 end byte | 
			
		
	
		
		
			
				
					|  |  |  byte[0]	 byte[1]	 byte[2]	 byte[3]	 byte[4]	 byte[5]	 byte[6]	 byte[7]	 byte[8]	 byte[9]	 byte[10]	 byte[11]	 byte[12]	 byte[13]	 byte[14]	 byte[15]	 byte[16]	 byte[17]	 byte[18]	 byte[19]	 byte[20]	 byte[21]	 byte[22]	 byte[23]	 byte[24]	 byte[25]	 byte[26]	 byte[27]	 byte[28] |  |  |  byte[0]	 byte[1]	 byte[2]	 byte[3]	 byte[4]	 byte[5]	 byte[6]	 byte[7]	 byte[8]	 byte[9]	 byte[10]	 byte[11]	 byte[12]	 byte[13]	 byte[14]	 byte[15]	 byte[16]	 byte[17]	 byte[18]	 byte[19]	 byte[20]	 byte[21]	 byte[22]	 byte[23]	 byte[24]	 byte[25]	 byte[26]	 byte[27]	 byte[28] | 
			
		
	
	
		
		
			
				
					|  | @ -177,8 +155,41 @@ class MiPayload { | 
			
		
	
		
		
			
				
					|  |  |  start byte	Command word	 target address				 routing address				 Multi-frame marking	 User data	 User data	 User data	 User data	 User data	 User data	 User data	 User data	 check	 end byte |  |  |  start byte	Command word	 target address				 routing address				 Multi-frame marking	 User data	 User data	 User data	 User data	 User data	 User data	 User data	 User data	 check	 end byte | 
			
		
	
		
		
			
				
					|  |  |  byte[0]	 byte[1]	 byte[2]	 byte[3]	 byte[4]	 byte[5]	 byte[6]	 byte[7]	 byte[8]	 byte[9]	 byte[10]	 byte[11]	 byte[12]	 byte[13]	 byte[14]	 byte[15]	 byte[16]	 byte[15]	 byte[16]	 byte[17]	 byte[18] |  |  |  byte[0]	 byte[1]	 byte[2]	 byte[3]	 byte[4]	 byte[5]	 byte[6]	 byte[7]	 byte[8]	 byte[9]	 byte[10]	 byte[11]	 byte[12]	 byte[13]	 byte[14]	 byte[15]	 byte[16]	 byte[15]	 byte[16]	 byte[17]	 byte[18] | 
			
		
	
		
		
			
				
					|  |  |  0x7e	 0x8f	 YY	 YY	 YY	 YY	 xx	 xx	 xx	 xx	 0x12	 APPFW_MINVER		 HWInfoAddr		 PNInfoCRC_gusv		 PNInfoCRC_gusv		 CRC	 0x7f |  |  |  0x7e	 0x8f	 YY	 YY	 YY	 YY	 xx	 xx	 xx	 xx	 0x12	 APPFW_MINVER		 HWInfoAddr		 PNInfoCRC_gusv		 PNInfoCRC_gusv		 CRC	 0x7f | 
			
		
	
		
		
			
				
					|  |  |  |  |  | */ | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | /*
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | case InverterDevInform_All: | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                     rec->length  = (uint8_t)(HMINFO_LIST_LEN); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                     rec->assign  = (byteAssign_t *)InfoAssignment; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                     rec->pyldLen = HMINFO_PAYLOAD_LEN; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                     break; | 
			
		
	
		
		
			
				
					|  |  |  |  |  | const byteAssign_t InfoAssignment[] = { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     { FLD_FW_VERSION,           UNIT_NONE,   CH0,  0, 2, 1 }, | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     { FLD_FW_BUILD_YEAR,        UNIT_NONE,   CH0,  2, 2, 1 }, | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     { FLD_FW_BUILD_MONTH_DAY,   UNIT_NONE,   CH0,  4, 2, 1 }, | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     { FLD_FW_BUILD_HOUR_MINUTE, UNIT_NONE,   CH0,  6, 2, 1 }, | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     { FLD_HW_ID,                UNIT_NONE,   CH0,  8, 2, 1 } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | }; | 
			
		
	
		
		
			
				
					|  |  | */ |  |  | */ | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 if ( p->packet[9] == 0x00 ) {//first frame
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                     //FLD_FW_VERSION
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                     for (uint8_t i = 0; i < 5; i++) { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                         iv->setValue(i, rec, (float) ((p->packet[(12+2*i)] << 8) + p->packet[(13+2*i)])/1); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                     } | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                     iv->setQueuedCmdFinished(); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                     mStat->rxSuccess++; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                     mSys->Radio.sendCmdPacket(iv->radioId.u64, 0x0f, 0x01, false); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 } else if ( p->packet[9] == 0x01 ) {//second frame
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                     DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") got 2nd frame (hw info)")); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                     mSys->Radio.sendCmdPacket(iv->radioId.u64, 0x0f, 0x12, false); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 } else if ( p->packet[9] == 0x12 ) {//3rd frame
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                     DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") got 3rd frame (hw info)")); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             } else if (p->packet[0] == (TX_REQ_INFO + ALL_FRAMES)) {  // response from get information command
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             // atm, we just do nothing else than print out what we got...
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             // for decoding see xls- Data collection instructions - #147ff
 | 
			
		
	
		
		
			
				
					|  |  |                 mPayload[iv->id].txId = p->packet[0]; |  |  |                 mPayload[iv->id].txId = p->packet[0]; | 
			
		
	
		
		
			
				
					|  |  |                 DPRINTLN(DBG_DEBUG, F("Response from info request received")); |  |  |                 DPRINTLN(DBG_DEBUG, F("Response from info request received")); | 
			
		
	
		
		
			
				
					|  |  |                 uint8_t *pid = &p->packet[9]; |  |  |                 uint8_t *pid = &p->packet[9]; | 
			
		
	
	
		
		
			
				
					|  | @ -194,7 +205,6 @@ class MiPayload { | 
			
		
	
		
		
			
				
					|  |  |                         mPayload[iv->id].len[(*pid & 0x7F) - 1] = p->len - 11; |  |  |                         mPayload[iv->id].len[(*pid & 0x7F) - 1] = p->len - 11; | 
			
		
	
		
		
			
				
					|  |  |                         mPayload[iv->id].gotFragment = true; |  |  |                         mPayload[iv->id].gotFragment = true; | 
			
		
	
		
		
			
				
					|  |  |                     } |  |  |                     } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                     if ((*pid & ALL_FRAMES) == ALL_FRAMES) { |  |  |                     if ((*pid & ALL_FRAMES) == ALL_FRAMES) { | 
			
		
	
		
		
			
				
					|  |  |                         // Last packet
 |  |  |                         // Last packet
 | 
			
		
	
		
		
			
				
					|  |  |                         if (((*pid & 0x7f) > mPayload[iv->id].maxPackId) || (MAX_PAYLOAD_ENTRIES == mPayload[iv->id].maxPackId)) { |  |  |                         if (((*pid & 0x7f) > mPayload[iv->id].maxPackId) || (MAX_PAYLOAD_ENTRIES == mPayload[iv->id].maxPackId)) { | 
			
		
	
	
		
		
			
				
					|  | @ -291,7 +301,8 @@ class MiPayload { | 
			
		
	
		
		
			
				
					|  |  |                 if (IV_HM == iv->ivGen) // only process MI inverters
 |  |  |                 if (IV_HM == iv->ivGen) // only process MI inverters
 | 
			
		
	
		
		
			
				
					|  |  |                     continue; // skip to next inverter
 |  |  |                     continue; // skip to next inverter
 | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |                 if ((mPayload[iv->id].txId != (TX_REQ_INFO + ALL_FRAMES)) && |  |  |                 if ( !mPayload[iv->id].complete && | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |                     (mPayload[iv->id].txId != (TX_REQ_INFO + ALL_FRAMES)) && | 
			
		
	
		
		
			
				
					|  |  |                     (mPayload[iv->id].txId <  (0x36 + ALL_FRAMES)) && |  |  |                     (mPayload[iv->id].txId <  (0x36 + ALL_FRAMES)) && | 
			
		
	
		
		
			
				
					|  |  |                     (mPayload[iv->id].txId >  (0x39 + ALL_FRAMES)) && |  |  |                     (mPayload[iv->id].txId >  (0x39 + ALL_FRAMES)) && | 
			
		
	
		
		
			
				
					|  |  |                     (mPayload[iv->id].txId != (0x09 + ALL_FRAMES)) && |  |  |                     (mPayload[iv->id].txId != (0x09 + ALL_FRAMES)) && | 
			
		
	
	
		
		
			
				
					|  | @ -304,6 +315,13 @@ class MiPayload { | 
			
		
	
		
		
			
				
					|  |  |                     continue; // skip to next inverter
 |  |  |                     continue; // skip to next inverter
 | 
			
		
	
		
		
			
				
					|  |  |                 } |  |  |                 } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 //delayed next message?
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 //mPayload[iv->id].skipfirstrepeat++;
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 if (mPayload[iv->id].skipfirstrepeat) { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                     mPayload[iv->id].skipfirstrepeat = 0; //reset counter*/
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                     continue; // skip to next inverter
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |                 if (!mPayload[iv->id].complete) { |  |  |                 if (!mPayload[iv->id].complete) { | 
			
		
	
		
		
			
				
					|  |  |                     //DPRINTLN(DBG_INFO, F("Pyld incompl code")); //info for testing only
 |  |  |                     //DPRINTLN(DBG_INFO, F("Pyld incompl code")); //info for testing only
 | 
			
		
	
		
		
			
				
					|  |  |                     bool crcPass, pyldComplete; |  |  |                     bool crcPass, pyldComplete; | 
			
		
	
	
		
		
			
				
					|  | @ -315,9 +333,12 @@ class MiPayload { | 
			
		
	
		
		
			
				
					|  |  |                                 DPRINTLN(DBG_INFO, F("Prevent retransmit on Restart / CleanState_LockAndAlarm...")); |  |  |                                 DPRINTLN(DBG_INFO, F("Prevent retransmit on Restart / CleanState_LockAndAlarm...")); | 
			
		
	
		
		
			
				
					|  |  |                                 mPayload[iv->id].retransmits = mMaxRetrans; |  |  |                                 mPayload[iv->id].retransmits = mMaxRetrans; | 
			
		
	
		
		
			
				
					|  |  |                             } else if(iv->devControlCmd == ActivePowerContr) { |  |  |                             } else if(iv->devControlCmd == ActivePowerContr) { | 
			
		
	
		
		
			
				
					
					|  |  |                                 DPRINTLN(DBG_INFO, F("retransmit power limit")); |  |  |                                 DPRINT(DBG_INFO, F("(#")); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |                                 DBGPRINT(String(iv->id)); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                                 DBGPRINTLN(F(") retransmit power limit")); | 
			
		
	
		
		
			
				
					|  |  |                                 mSys->Radio.sendControlPacket(iv->radioId.u64, iv->devControlCmd, iv->powerLimit, true); |  |  |                                 mSys->Radio.sendControlPacket(iv->radioId.u64, iv->devControlCmd, iv->powerLimit, true); | 
			
		
	
		
		
			
				
					|  |  |                             } else { |  |  |                             } else { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                                 uint8_t cmd = mPayload[iv->id].txCmd; | 
			
		
	
		
		
			
				
					|  |  |                                 if (mPayload[iv->id].retransmits < mMaxRetrans) { |  |  |                                 if (mPayload[iv->id].retransmits < mMaxRetrans) { | 
			
		
	
		
		
			
				
					|  |  |                                     mPayload[iv->id].retransmits++; |  |  |                                     mPayload[iv->id].retransmits++; | 
			
		
	
		
		
			
				
					|  |  |                                     if( !mPayload[iv->id].gotFragment ) { |  |  |                                     if( !mPayload[iv->id].gotFragment ) { | 
			
		
	
	
		
		
			
				
					|  | @ -325,22 +346,40 @@ class MiPayload { | 
			
		
	
		
		
			
				
					|  |  |                                         DBGPRINT(String(iv->id)); |  |  |                                         DBGPRINT(String(iv->id)); | 
			
		
	
		
		
			
				
					|  |  |                                         DBGPRINTLN(F(") nothing received")); |  |  |                                         DBGPRINTLN(F(") nothing received")); | 
			
		
	
		
		
			
				
					|  |  |                                         mPayload[iv->id].retransmits = mMaxRetrans; |  |  |                                         mPayload[iv->id].retransmits = mMaxRetrans; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                                     } else if ( cmd == 0x0f ) { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                                         //hard/firmware request
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                                         mSys->Radio.sendCmdPacket(iv->radioId.u64, 0x0f, 0x00, true); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                                         //iv->setQueuedCmdFinished();
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                                         //cmd = iv->getQueuedCmd();
 | 
			
		
	
		
		
			
				
					|  |  |                                     } else { |  |  |                                     } else { | 
			
		
	
		
		
			
				
					
					|  |  |                                         uint8_t cmd = mPayload[iv->id].txCmd; |  |  |                                         bool change = false; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                                         if ( cmd >= 0x36 && cmd < 0x39 ) { // MI-1500 Data command
 |  |  |                                         if ( cmd >= 0x36 && cmd < 0x39 ) { // MI-1500 Data command
 | 
			
		
	
		
		
			
				
					|  |  |                                             cmd++; // just request the next channel
 |  |  |                                             cmd++; // just request the next channel
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                                             change = true; | 
			
		
	
		
		
			
				
					|  |  |                                         } else if ( cmd == 0x09 ) {//MI single or dual channel device
 |  |  |                                         } else if ( cmd == 0x09 ) {//MI single or dual channel device
 | 
			
		
	
		
		
			
				
					|  |  |                                             if ( mPayload[iv->id].dataAB[CH1] && iv->type == INV_TYPE_2CH  ) { |  |  |                                             if ( mPayload[iv->id].dataAB[CH1] && iv->type == INV_TYPE_2CH  ) { | 
			
		
	
		
		
			
				
					
					|  |  |                                                 if (!mPayload[iv->id].stsAB[CH2] || !mPayload[iv->id].dataAB[CH2] ) |  |  |                                                 if (!mPayload[iv->id].stsAB[CH2] || !mPayload[iv->id].dataAB[CH2] ) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                                                     cmd = 0x11; |  |  |                                                     cmd = 0x11; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                                                     change = true; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                                                 } | 
			
		
	
		
		
			
				
					|  |  |                                             } |  |  |                                             } | 
			
		
	
		
		
			
				
					|  |  |                                         } else if ( cmd == 0x11) { |  |  |                                         } else if ( cmd == 0x11) { | 
			
		
	
		
		
			
				
					|  |  |                                             if ( mPayload[iv->id].dataAB[CH2] ) { // data is there, but no status
 |  |  |                                             if ( mPayload[iv->id].dataAB[CH2] ) { // data is there, but no status
 | 
			
		
	
		
		
			
				
					
					|  |  |                                                 if (!mPayload[iv->id].stsAB[CH1] || !mPayload[iv->id].dataAB[CH1] ) |  |  |                                                 if (!mPayload[iv->id].stsAB[CH1] || !mPayload[iv->id].dataAB[CH1] ) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                                                     cmd = 0x09; |  |  |                                                     cmd = 0x09; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                                                     change = true; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                                                 } | 
			
		
	
		
		
			
				
					|  |  |                                             } |  |  |                                             } | 
			
		
	
		
		
			
				
					|  |  |                                         } |  |  |                                         } | 
			
		
	
		
		
			
				
					
					|  |  |                                         DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") next request is 0x") + String(cmd, HEX)); |  |  |                                         DPRINT(DBG_INFO, F("(#")); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |                                         DBGPRINT(String(iv->id)); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                                         DBGPRINT(F(") ")); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                                         if (change) { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                                             DBGPRINT(F("next request is 0x")); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                                         } else { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                                             DBGPRINT(F("not complete: Request Retransmit 0x")); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                                         } | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                                         DBGPRINTLN(String(cmd, HEX)); | 
			
		
	
		
		
			
				
					|  |  |                                         //mSys->Radio.sendCmdPacket(iv->radioId.u64, cmd, cmd, true);
 |  |  |                                         //mSys->Radio.sendCmdPacket(iv->radioId.u64, cmd, cmd, true);
 | 
			
		
	
		
		
			
				
					|  |  |                                         mSys->Radio.prepareDevInformCmd(iv->radioId.u64, cmd, mPayload[iv->id].ts, iv->alarmMesIndex, true, cmd); |  |  |                                         mSys->Radio.prepareDevInformCmd(iv->radioId.u64, cmd, mPayload[iv->id].ts, iv->alarmMesIndex, true, cmd); | 
			
		
	
		
		
			
				
					|  |  |                                         mPayload[iv->id].txCmd = cmd; |  |  |                                         mPayload[iv->id].txCmd = cmd; | 
			
		
	
	
		
		
			
				
					|  | @ -357,12 +396,13 @@ class MiPayload { | 
			
		
	
		
		
			
				
					|  |  |                             DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") prepareDevInformCmd 0x") + String(mPayload[iv->id].txCmd, HEX)); |  |  |                             DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") prepareDevInformCmd 0x") + String(mPayload[iv->id].txCmd, HEX)); | 
			
		
	
		
		
			
				
					|  |  |                             mSys->Radio.prepareDevInformCmd(iv->radioId.u64, mPayload[iv->id].txCmd, mPayload[iv->id].ts, iv->alarmMesIndex, true); |  |  |                             mSys->Radio.prepareDevInformCmd(iv->radioId.u64, mPayload[iv->id].txCmd, mPayload[iv->id].ts, iv->alarmMesIndex, true); | 
			
		
	
		
		
			
				
					|  |  |                         } |  |  |                         } | 
			
		
	
		
		
			
				
					
					|  |  |                     } else {  // payload complete
 |  |  |                     } | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |                     /*else {  // payload complete
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                         //This tree is not really tested, most likely it's not truly complete....
 | 
			
		
	
		
		
			
				
					|  |  |                         DPRINTLN(DBG_INFO, F("procPyld: cmd:  0x") + String(mPayload[iv->id].txCmd, HEX)); |  |  |                         DPRINTLN(DBG_INFO, F("procPyld: cmd:  0x") + String(mPayload[iv->id].txCmd, HEX)); | 
			
		
	
		
		
			
				
					|  |  |                         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; |  |  |                         mPayload[iv->id].complete = true; | 
			
		
	
		
		
			
				
					|  |  |                         uint8_t ac_pow = 0; |  |  |                         uint8_t ac_pow = 0; | 
			
		
	
		
		
			
				
					|  |  |                         //if (mPayload[iv->id].sts[0] == 3) {
 |  |  |                         //if (mPayload[iv->id].sts[0] == 3) {
 | 
			
		
	
	
		
		
			
				
					|  | @ -370,34 +410,27 @@ class MiPayload { | 
			
		
	
		
		
			
				
					|  |  |                         //}
 |  |  |                         //}
 | 
			
		
	
		
		
			
				
					|  |  |                         record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug);  // choose the parser
 |  |  |                         record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug);  // choose the parser
 | 
			
		
	
		
		
			
				
					|  |  |                         iv->setValue(iv->getPosByChFld(0, FLD_PAC, rec), rec, (float) (ac_pow/10)); |  |  |                         iv->setValue(iv->getPosByChFld(0, FLD_PAC, rec), rec, (float) (ac_pow/10)); | 
			
		
	
		
		
			
				
					
					|  |  | 
 |  |  |                         DPRINTLN(DBG_INFO, F("process: compl. set of msgs detected")); | 
			
				
				
			
		
	
		
		
			
				
					|  |  |                         DPRINTLN(DBG_INFO, F("proces: compl. set of msgs detected")); |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					|  |  |                         iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0)); |  |  |                         iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0)); | 
			
		
	
		
		
			
				
					|  |  |                         iv->doCalculations(); |  |  |                         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); | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                         for (uint8_t i = 0; i < (mPayload[iv->id].maxPackId); i++) { |  |  |                         for (uint8_t i = 0; i < (mPayload[iv->id].maxPackId); i++) { | 
			
		
	
		
		
			
				
					|  |  |                             memcpy(&payload[payloadLen], mPayload[iv->id].data[i], (mPayload[iv->id].len[i])); |  |  |                             memcpy(&payload[payloadLen], mPayload[iv->id].data[i], (mPayload[iv->id].len[i])); | 
			
		
	
		
		
			
				
					|  |  |                             payloadLen += (mPayload[iv->id].len[i]); |  |  |                             payloadLen += (mPayload[iv->id].len[i]); | 
			
		
	
		
		
			
				
					|  |  |                             yield(); |  |  |                             yield(); | 
			
		
	
		
		
			
				
					|  |  |                         } |  |  |                         } | 
			
		
	
		
		
			
				
					|  |  |                         payloadLen -= 2; |  |  |                         payloadLen -= 2; | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                         if (mSerialDebug) { |  |  |                         if (mSerialDebug) { | 
			
		
	
		
		
			
				
					|  |  |                             DPRINT(DBG_INFO, F("Payload (") + String(payloadLen) + "): "); |  |  |                             DPRINT(DBG_INFO, F("Payload (") + String(payloadLen) + "): "); | 
			
		
	
		
		
			
				
					|  |  |                             mSys->Radio.dumpBuf(payload, payloadLen); |  |  |                             mSys->Radio.dumpBuf(payload, payloadLen); | 
			
		
	
		
		
			
				
					|  |  |                         } |  |  |                         } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                         if (NULL == rec) { |  |  |                         if (NULL == rec) { | 
			
		
	
		
		
			
				
					|  |  |                             DPRINTLN(DBG_ERROR, F("record is NULL!")); |  |  |                             DPRINTLN(DBG_ERROR, F("record is NULL!")); | 
			
		
	
		
		
			
				
					|  |  |                         } else if ((rec->pyldLen == payloadLen) || (0 == rec->pyldLen)) { |  |  |                         } else if ((rec->pyldLen == payloadLen) || (0 == rec->pyldLen)) { | 
			
		
	
		
		
			
				
					|  |  |                             if (mPayload[iv->id].txId == (TX_REQ_INFO + ALL_FRAMES)) |  |  |                             if (mPayload[iv->id].txId == (TX_REQ_INFO + ALL_FRAMES)) | 
			
		
	
		
		
			
				
					|  |  |                                 mStat->rxSuccess++; |  |  |                                 mStat->rxSuccess++; | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                             rec->ts = mPayload[iv->id].ts; |  |  |                             rec->ts = mPayload[iv->id].ts; | 
			
		
	
		
		
			
				
					|  |  |                             for (uint8_t i = 0; i < rec->length; i++) { |  |  |                             for (uint8_t i = 0; i < rec->length; i++) { | 
			
		
	
		
		
			
				
					|  |  |                                 iv->addValue(i, payload, rec); |  |  |                                 iv->addValue(i, payload, rec); | 
			
		
	
	
		
		
			
				
					|  | @ -405,7 +438,6 @@ class MiPayload { | 
			
		
	
		
		
			
				
					|  |  |                             } |  |  |                             } | 
			
		
	
		
		
			
				
					|  |  |                             iv->doCalculations(); |  |  |                             iv->doCalculations(); | 
			
		
	
		
		
			
				
					|  |  |                             notify(mPayload[iv->id].txCmd); |  |  |                             notify(mPayload[iv->id].txCmd); | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                             if(AlarmData == mPayload[iv->id].txCmd) { |  |  |                             if(AlarmData == mPayload[iv->id].txCmd) { | 
			
		
	
		
		
			
				
					|  |  |                                 uint8_t i = 0; |  |  |                                 uint8_t i = 0; | 
			
		
	
		
		
			
				
					|  |  |                                 uint16_t code; |  |  |                                 uint16_t code; | 
			
		
	
	
		
		
			
				
					|  | @ -423,9 +455,8 @@ class MiPayload { | 
			
		
	
		
		
			
				
					|  |  |                             DPRINTLN(DBG_ERROR, F("plausibility check failed, expected ") + String(rec->pyldLen) + F(" bytes")); |  |  |                             DPRINTLN(DBG_ERROR, F("plausibility check failed, expected ") + String(rec->pyldLen) + F(" bytes")); | 
			
		
	
		
		
			
				
					|  |  |                             mStat->rxFail++; |  |  |                             mStat->rxFail++; | 
			
		
	
		
		
			
				
					|  |  |                         } |  |  |                         } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                         iv->setQueuedCmdFinished(); */ |  |  |                         iv->setQueuedCmdFinished(); */ | 
			
		
	
		
		
			
				
					
					|  |  |                     } |  |  |                     //}*/
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                 } |  |  |                 } | 
			
		
	
		
		
			
				
					|  |  |                 yield(); |  |  |                 yield(); | 
			
		
	
		
		
			
				
					|  |  |             } |  |  |             } | 
			
		
	
	
		
		
			
				
					|  | @ -455,29 +486,30 @@ class MiPayload { | 
			
		
	
		
		
			
				
					|  |  |                 iv->setValue(iv->getPosByChFld(0, FLD_EVT, rec), rec, status); |  |  |                 iv->setValue(iv->getPosByChFld(0, FLD_EVT, rec), rec, status); | 
			
		
	
		
		
			
				
					|  |  |             } |  |  |             } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |             /*if ( !mPayload[iv->id].dataAB[0] || !mPayload[iv->id].dataAB[1] ) {
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 uint8_t cmd = mPayload[iv->id].dataAB[0] ? 0x11 : 0x09; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 DPRINTLN(DBG_INFO, F("request missing status 0x") + String(cmd, HEX)); |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 mSys->Radio.prepareDevInformCmd(iv->radioId.u64, cmd, mPayload[iv->id].ts, iv->alarmMesIndex, false, cmd); |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 mPayload[iv->id].txCmd = cmd; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 rem: gotFragment should be a better solution |  |  |  | 
			
		
	
		
		
			
				
					|  |  |             } */ |  |  |  | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |             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)]; // seems there's no status per channel in 3rd gen. models?!?
 |  |  |                 iv->alarmMesIndex = rec->record[iv->getPosByChFld(0, FLD_EVT, rec)]; // seems there's no status per channel in 3rd gen. models?!?
 | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |                 DPRINTLN(DBG_INFO, "alarm ID incremented to " + String(iv->alarmMesIndex)); |  |  |                 DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") alarm ID incremented to ") + String(iv->alarmMesIndex)); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                 iv->enqueCommand<InfoCommand>(AlarmData); |  |  |                 iv->enqueCommand<InfoCommand>(AlarmData); | 
			
		
	
		
		
			
				
					|  |  |             } |  |  |             } | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             //mPayload[iv->id].skipfirstrepeat = 1;
 | 
			
		
	
		
		
			
				
					|  |  |             if (mPayload[iv->id].stsAB[CH0] && mPayload[iv->id].dataAB[CH0] && !mPayload[iv->id].complete) { |  |  |             if (mPayload[iv->id].stsAB[CH0] && mPayload[iv->id].dataAB[CH0] && !mPayload[iv->id].complete) { | 
			
		
	
		
		
			
				
					
					|  |  |                 mPayload[iv->id].complete = true; |  |  |                 miComplete(iv); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |                 DPRINTLN(DBG_INFO, F("rec. complete set of msgs")); |  |  |                 /*mPayload[iv->id].complete = true;
 | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |                 DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") got all msgs")); | 
			
		
	
		
		
			
				
					|  |  |                 iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0)); |  |  |                 iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0)); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 //preliminary AC calculation...
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 uint8_t ac_pow = 0; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 //if (mPayload[iv->id].sts[0] == 3) {
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                     ac_pow = calcPowerDcCh0(iv, 0)*9.5; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 //}
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 iv->setValue(iv->getPosByChFld(0, FLD_PAC, rec), rec, (float) (ac_pow/10)); | 
			
		
	
		
		
			
				
					|  |  |                 iv->setQueuedCmdFinished(); |  |  |                 iv->setQueuedCmdFinished(); | 
			
		
	
		
		
			
				
					|  |  |                 iv->doCalculations(); |  |  |                 iv->doCalculations(); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 mPayload[iv->id].skipfirstrepeat = 0; | 
			
		
	
		
		
			
				
					|  |  |                 notify(mPayload[iv->id].txCmd); |  |  |                 notify(mPayload[iv->id].txCmd); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 yield();*/ | 
			
		
	
		
		
			
				
					|  |  |             } |  |  |             } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |         } |  |  |         } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |         void miDataDecode(Inverter<> *iv, packet_t *p) { |  |  |         void miDataDecode(Inverter<> *iv, packet_t *p) { | 
			
		
	
	
		
		
			
				
					|  | @ -553,43 +585,30 @@ class MiPayload { | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |             } |  |  |             } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |             //preliminary AC calculation...
 |  |  | 
 | 
			
				
				
			
		
	
		
		
			
				
					|  |  |             uint8_t ac_pow = 0; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |             //if (mPayload[iv->id].sts[0] == 3) {
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 ac_pow = calcPowerDcCh0(iv, 0)*9.5; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |             //}
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |             iv->setValue(iv->getPosByChFld(0, FLD_PAC, rec), rec, (float) (ac_pow/10)); |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |             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] ) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |                     mPayload[iv->id].complete = true; // For 2 CH devices, this might be too short...
 |  |  |                      miComplete(iv); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |                     DPRINTLN(DBG_INFO, F("rec. complete set of msgs")); |  |  |                     /*mPayload[iv->id].complete = true; // For 2 CH devices, this might be too short...
 | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |                     DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") got all msgs")); | 
			
		
	
		
		
			
				
					|  |  |                     iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0)); |  |  |                     iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0)); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                     //preliminary AC calculation...
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                     uint8_t ac_pow = 0; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                     //if (mPayload[iv->id].sts[0] == 3) {
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                         ac_pow = calcPowerDcCh0(iv, 0)*9.5; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                     //}
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                     iv->setValue(iv->getPosByChFld(0, FLD_PAC, rec), rec, (float) (ac_pow/10)); | 
			
		
	
		
		
			
				
					|  |  |                     iv->doCalculations(); |  |  |                     iv->doCalculations(); | 
			
		
	
		
		
			
				
					
					|  |  |                 /*} else {
 |  |  |                     iv->setQueuedCmdFinished(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |                     //retry to get missing status info for one or two channel devices
 |  |  |                     mStat->rxSuccess++; | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |                     DPRINTLN(DBG_INFO, F("request missing data or status 0x") + String(cmd, HEX)); |  |  |                     yield(); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |                     mSys->Radio.prepareDevInformCmd(iv->radioId.u64, cmd, mPayload[iv->id].ts, iv->alarmMesIndex, false, cmd); |  |  |                     notify(mPayload[iv->id].txCmd);*/ | 
			
				
				
			
		
	
		
		
			
				
					|  |  |                     mPayload[iv->id].txCmd = cmd; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                     //iv->enqueCommand(cmd); // mPayload[iv->id].dataAB[1] ? 0x09 : 0x11)
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 }*/ |  |  |  | 
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |             } |  |  |             } | 
			
		
	
		
		
			
				
					|  |  |             /* should be included in process()
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |             else if (mPayload[iv->id].txCmd == 0x09 && iv->type == INV_TYPE_2CH) { |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 uint8_t cmd = 0x11; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 DPRINTLN(DBG_INFO, F("request second data channel 0x") + String(cmd, HEX)); |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 mSys->Radio.prepareDevInformCmd(iv->radioId.u64, cmd, mPayload[iv->id].ts, iv->alarmMesIndex, false, cmd); |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 mPayload[iv->id].txCmd = cmd; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 mPayload[iv->id].complete = false; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |             }*/ |  |  |  | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |             iv->setQueuedCmdFinished(); |  |  |  | 
			
		
	
		
		
			
				
					|  |  |             mStat->rxSuccess++; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |             yield(); |  |  |  | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |             notify(mPayload[iv->id].txCmd); |  |  |  | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | /*
 |  |  | /*
 | 
			
		
	
		
		
			
				
					|  |  |                             if(AlarmData == mPayload[iv->id].txCmd) { |  |  |                             if(AlarmData == mPayload[iv->id].txCmd) { | 
			
		
	
	
		
		
			
				
					|  | @ -607,6 +626,24 @@ class MiPayload { | 
			
		
	
		
		
			
				
					|  |  |                             }*/ |  |  |                             }*/ | 
			
		
	
		
		
			
				
					|  |  |         } |  |  |         } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         void miComplete(Inverter<> *iv) { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             mPayload[iv->id].complete = true; // For 2 CH devices, this might be too short...
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             DPRINTLN(DBG_INFO, F("(#") + String(iv->id) + F(") got all msgs")); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             record_t<> *rec = iv->getRecordStruct(RealTimeRunData_Debug); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             iv->setValue(iv->getPosByChFld(0, FLD_YD, rec), rec, calcYieldDayCh0(iv,0)); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             //preliminary AC calculation...
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             uint8_t ac_pow = 0; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             //if (mPayload[iv->id].sts[0] == 3) {
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                 ac_pow = calcPowerDcCh0(iv, 0)*9.5; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             //}
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             iv->setValue(iv->getPosByChFld(0, FLD_PAC, rec), rec, (float) (ac_pow/10)); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             iv->doCalculations(); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             iv->setQueuedCmdFinished(); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             mStat->rxSuccess++; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             yield(); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             notify(mPayload[iv->id].txCmd); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |         bool build(uint8_t id, bool *complete) { |  |  |         bool build(uint8_t id, bool *complete) { | 
			
		
	
		
		
			
				
					|  |  |             DPRINTLN(DBG_VERBOSE, F("build")); |  |  |             DPRINTLN(DBG_VERBOSE, F("build")); | 
			
		
	
		
		
			
				
					|  |  |             /*uint16_t crc = 0xffff, crcRcv = 0x0000;
 |  |  |             /*uint16_t crc = 0xffff, crcRcv = 0x0000;
 | 
			
		
	
	
		
		
			
				
					|  | @ -620,7 +657,7 @@ class MiPayload { | 
			
		
	
		
		
			
				
					|  |  |             //uint8_t cmd = getQueuedCmd();
 |  |  |             //uint8_t cmd = getQueuedCmd();
 | 
			
		
	
		
		
			
				
					|  |  |             if(!*complete) { |  |  |             if(!*complete) { | 
			
		
	
		
		
			
				
					|  |  |                 DPRINTLN(DBG_VERBOSE, F("incomlete, txCmd is 0x") + String(txCmd, HEX)); // + F("cmd is 0x") + String(cmd, HEX));
 |  |  |                 DPRINTLN(DBG_VERBOSE, F("incomlete, txCmd is 0x") + String(txCmd, HEX)); // + F("cmd is 0x") + String(cmd, HEX));
 | 
			
		
	
		
		
			
				
					
					|  |  |                 if (txCmd == 0x09 || txCmd == 0x11 || (txCmd >= 0x36 && txCmd <= 0x39)) |  |  |                 if (txCmd == 0x09 || txCmd == 0x11 || txCmd >= 0x36 && txCmd <= 0x39 ) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                     return false; |  |  |                     return false; | 
			
		
	
		
		
			
				
					|  |  |             } |  |  |             } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  | @ -634,7 +671,6 @@ class MiPayload { | 
			
		
	
		
		
			
				
					|  |  |                 } |  |  |                 } | 
			
		
	
		
		
			
				
					|  |  |                 yield(); |  |  |                 yield(); | 
			
		
	
		
		
			
				
					|  |  |             } |  |  |             } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |             return (crc == crcRcv) ? true : false;*/ |  |  |             return (crc == crcRcv) ? true : false;*/ | 
			
		
	
		
		
			
				
					|  |  |             return true; |  |  |             return true; | 
			
		
	
		
		
			
				
					|  |  |         } |  |  |         } | 
			
		
	
	
		
		
			
				
					|  | @ -654,6 +690,7 @@ class MiPayload { | 
			
		
	
		
		
			
				
					|  |  |             mPayload[id].stsAB[CH1]  = true; //required for 1CH and 2CH devices
 |  |  |             mPayload[id].stsAB[CH1]  = true; //required for 1CH and 2CH devices
 | 
			
		
	
		
		
			
				
					|  |  |             mPayload[id].stsAB[CH2]  = true; //only required for 2CH devices
 |  |  |             mPayload[id].stsAB[CH2]  = true; //only required for 2CH devices
 | 
			
		
	
		
		
			
				
					|  |  |             mPayload[id].txCmd       = 0; |  |  |             mPayload[id].txCmd       = 0; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             mPayload[id].skipfirstrepeat   = 0; | 
			
		
	
		
		
			
				
					|  |  |             mPayload[id].requested   = false; |  |  |             mPayload[id].requested   = false; | 
			
		
	
		
		
			
				
					|  |  |             mPayload[id].ts          = *mTimestamp; |  |  |             mPayload[id].ts          = *mTimestamp; | 
			
		
	
		
		
			
				
					|  |  |             mPayload[id].sts[0]      = 0; //disable this in case gotFragment is not working
 |  |  |             mPayload[id].sts[0]      = 0; //disable this in case gotFragment is not working
 | 
			
		
	
	
		
		
			
				
					|  | @ -664,28 +701,6 @@ class MiPayload { | 
			
		
	
		
		
			
				
					|  |  |         } |  |  |         } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | /*        template<class T=uint8_t>
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  |         static T calcMiSts(Inverter<> *iv) { |  |  |  | 
			
		
	
		
		
			
				
					|  |  |             if(NULL != iv) { |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 T result = 0; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 bool stsComplete = true; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 uint8_t stsCh; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 for(uint8_t i = 1; i <= iv->channels; i++) { |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                     stsCh = mPayload[iv->id].sts[i]; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                     if (!stsCh) { |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                         stsComplete = false; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                     } else if ( !result || stsCh < result ) { |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                         result = stsCh; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                         if (stsComplete && stsCh > stsComplete) { |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                             stsComplete = stsCh; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                         } |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                     } |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 } |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 mPayload[iv->id].sts[0] = stsComplete; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                 return result; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |             } |  |  |  | 
			
		
	
		
		
			
				
					|  |  |             return 0; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |         } */ |  |  |  | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |         IApp *mApp; |  |  |         IApp *mApp; | 
			
		
	
		
		
			
				
					|  |  |         HMSYSTEM *mSys; |  |  |         HMSYSTEM *mSys; | 
			
		
	
	
		
		
			
				
					|  | 
 |