|  | @ -23,7 +23,7 @@ class Communication : public CommQueue<> { | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |                 switch(mState) { |  |  |                 switch(mState) { | 
			
		
	
		
		
			
				
					|  |  |                     case States::RESET: |  |  |                     case States::RESET: | 
			
		
	
		
		
			
				
					
					|  |  |                         lastFound = false; |  |  |                         mMaxFrameId = 0; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                         for(uint8_t i = 0; i < MAX_PAYLOAD_ENTRIES; i++) { |  |  |                         for(uint8_t i = 0; i < MAX_PAYLOAD_ENTRIES; i++) { | 
			
		
	
		
		
			
				
					|  |  |                             mLocalBuf[i].len = 0; |  |  |                             mLocalBuf[i].len = 0; | 
			
		
	
		
		
			
				
					|  |  |                         } |  |  |                         } | 
			
		
	
	
		
		
			
				
					|  | @ -33,7 +33,7 @@ class Communication : public CommQueue<> { | 
			
		
	
		
		
			
				
					|  |  |                     case States::START: |  |  |                     case States::START: | 
			
		
	
		
		
			
				
					|  |  |                         setTs(mTimestamp); |  |  |                         setTs(mTimestamp); | 
			
		
	
		
		
			
				
					|  |  |                         q->iv->radio->prepareDevInformCmd(q->iv, q->cmd, q->ts, q->iv->alarmLastId, false); |  |  |                         q->iv->radio->prepareDevInformCmd(q->iv, q->cmd, q->ts, q->iv->alarmLastId, false); | 
			
		
	
		
		
			
				
					
					|  |  |                         mWaitTimeout = millis() + 500; |  |  |                         mWaitTimeout = millis() + 1500; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                         setAttempt(); |  |  |                         setAttempt(); | 
			
		
	
		
		
			
				
					|  |  |                         mState = States::WAIT; |  |  |                         mState = States::WAIT; | 
			
		
	
		
		
			
				
					|  |  |                         break; |  |  |                         break; | 
			
		
	
	
		
		
			
				
					|  | @ -45,20 +45,29 @@ class Communication : public CommQueue<> { | 
			
		
	
		
		
			
				
					|  |  |                         break; |  |  |                         break; | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |                     case States::CHECK_FRAMES: { |  |  |                     case States::CHECK_FRAMES: { | 
			
		
	
		
		
			
				
					
					|  |  |                         if(!q->iv->radio->loop()) { |  |  |                         if(!q->iv->radio->get()) { // radio buffer empty
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |                             pop(); |  |  |                             cmdDone(); | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |                             DBGPRINTLN(F("request timeout")); | 
			
		
	
		
		
			
				
					|  |  |                             q->iv->radioStatistics.rxFailNoAnser++; // got nothing
 |  |  |                             q->iv->radioStatistics.rxFailNoAnser++; // got nothing
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                             if((IV_HMS == q->iv->ivGen) || (IV_HMT == q->iv->ivGen)) { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                                 q->iv->radio->switchFrequency(q->iv, HOY_BOOT_FREQ_KHZ, WORK_FREQ_KHZ); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                                 mWaitTimeout = millis() + 2000; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                                 mState = States::GAP; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                                 break; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                             } else { | 
			
		
	
		
		
			
				
					|  |  |                                 mState = States::RESET; |  |  |                                 mState = States::RESET; | 
			
		
	
		
		
			
				
					
					|  |  |                             break; // radio buffer empty
 |  |  |                                 break; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |                             } | 
			
		
	
		
		
			
				
					|  |  |                         } |  |  |                         } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |                         States nextState = States::RESET; |  |  |                         States nextState = States::RESET; | 
			
		
	
		
		
			
				
					|  |  |                         while(!q->iv->radio->mBufCtrl.empty()) { |  |  |                         while(!q->iv->radio->mBufCtrl.empty()) { | 
			
		
	
		
		
			
				
					|  |  |                             packet_t *p = &q->iv->radio->mBufCtrl.front(); |  |  |                             packet_t *p = &q->iv->radio->mBufCtrl.front(); | 
			
		
	
		
		
			
				
					|  |  |                             q->iv->radio->mBufCtrl.pop(); |  |  |  | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |                             DPRINT_IVID(DBG_INFO, q->iv->id); |  |  |                             DPRINT_IVID(DBG_INFO, q->iv->id); | 
			
		
	
		
		
			
				
					|  |  |                             DPRINT(DBG_INFO, F("RX ")); |  |  |                             DPRINT(DBG_INFO, F("RX ")); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                             DBGPRINT(String(p->millis)); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                             DBGPRINT(F("ms ")); | 
			
		
	
		
		
			
				
					|  |  |                             DBGPRINT(String(p->len)); |  |  |                             DBGPRINT(String(p->len)); | 
			
		
	
		
		
			
				
					|  |  |                             DBGPRINT(F(" CH")); |  |  |                             DBGPRINT(F(" CH")); | 
			
		
	
		
		
			
				
					|  |  |                             DBGPRINT(String(p->ch)); |  |  |                             DBGPRINT(String(p->ch)); | 
			
		
	
	
		
		
			
				
					|  | @ -67,9 +76,7 @@ class Communication : public CommQueue<> { | 
			
		
	
		
		
			
				
					|  |  |                             DBGPRINT(F("dBm | ")); |  |  |                             DBGPRINT(F("dBm | ")); | 
			
		
	
		
		
			
				
					|  |  |                             ah::dumpBuf(p->packet, p->len); |  |  |                             ah::dumpBuf(p->packet, p->len); | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |                             if(!checkIvSerial(&p->packet[1], q->iv)) |  |  |                             if(checkIvSerial(&p->packet[1], q->iv)) { | 
			
				
				
			
		
	
		
		
			
				
					|  |  |                                 continue; // inverter ID incorrect
 |  |  |  | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					|  |  |                                 q->iv->radioStatistics.frmCnt++; |  |  |                                 q->iv->radioStatistics.frmCnt++; | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |                                 if (p->packet[0] == (TX_REQ_INFO + ALL_FRAMES)) {  // response from get information command
 |  |  |                                 if (p->packet[0] == (TX_REQ_INFO + ALL_FRAMES)) {  // response from get information command
 | 
			
		
	
	
		
		
			
				
					|  | @ -77,19 +84,25 @@ class Communication : public CommQueue<> { | 
			
		
	
		
		
			
				
					|  |  |                                     nextState = States::CHECK_PACKAGE; |  |  |                                     nextState = States::CHECK_PACKAGE; | 
			
		
	
		
		
			
				
					|  |  |                                 } else if (p->packet[0] == (TX_REQ_DEVCONTROL + ALL_FRAMES)) // response from dev control command
 |  |  |                                 } else if (p->packet[0] == (TX_REQ_DEVCONTROL + ALL_FRAMES)) // response from dev control command
 | 
			
		
	
		
		
			
				
					|  |  |                                     parseDevCtrl(p); |  |  |                                     parseDevCtrl(p); | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                             } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                             q->iv->radio->mBufCtrl.pop(); | 
			
		
	
		
		
			
				
					|  |  |                             yield(); |  |  |                             yield(); | 
			
		
	
		
		
			
				
					|  |  |                         } |  |  |                         } | 
			
		
	
		
		
			
				
					|  |  |                         mState = nextState; |  |  |                         mState = nextState; | 
			
		
	
		
		
			
				
					|  |  |                         } |  |  |                         } | 
			
		
	
		
		
			
				
					|  |  |                         break; |  |  |                         break; | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                     case States::GAP: | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                         if(millis() < mWaitTimeout) | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                             return; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                         mState = States::RESET; | 
			
		
	
		
		
			
				
					|  |  |  |  |  |                         break; | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |                     case States::CHECK_PACKAGE: |  |  |                     case States::CHECK_PACKAGE: | 
			
		
	
		
		
			
				
					
					|  |  |                         if(!lastFound) { |  |  |                         if(0 == mMaxFrameId) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                             DPRINT_IVID(DBG_WARN, q->iv->id); |  |  |                             DPRINT_IVID(DBG_WARN, q->iv->id); | 
			
		
	
		
		
			
				
					
					|  |  |                             DBGPRINT(F("last frame ")); |  |  |                             DBGPRINT(F("last frame missing: request retransmit")); | 
			
				
				
			
		
	
		
		
			
				
					|  |  |                             DBGPRINT(String(mMaxFrameId+1)); |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                             DBGPRINTLN(F(" missing: Request Retransmit")); |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |                             q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (SINGLE_FRAME + mMaxFrameId + 1), true); |  |  |                             q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (SINGLE_FRAME + mMaxFrameId + 1), true); | 
			
		
	
		
		
			
				
					|  |  |                             setAttempt(); |  |  |                             setAttempt(); | 
			
		
	
	
		
		
			
				
					|  | @ -103,9 +116,9 @@ class Communication : public CommQueue<> { | 
			
		
	
		
		
			
				
					|  |  |                                 DPRINT_IVID(DBG_WARN, q->iv->id); |  |  |                                 DPRINT_IVID(DBG_WARN, q->iv->id); | 
			
		
	
		
		
			
				
					|  |  |                                 DBGPRINT(F("frame ")); |  |  |                                 DBGPRINT(F("frame ")); | 
			
		
	
		
		
			
				
					|  |  |                                 DBGPRINT(String(i + 1)); |  |  |                                 DBGPRINT(String(i + 1)); | 
			
		
	
		
		
			
				
					
					|  |  |                                 DBGPRINTLN(F(" missing: Request Retransmit")); |  |  |                                 DBGPRINTLN(F(" missing: request retransmit")); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |                                 q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (SINGLE_FRAME + i), true); |  |  |                                 q->iv->radio->sendCmdPacket(q->iv, TX_REQ_INFO, (ALL_FRAMES + i), true); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                                 setAttempt(); |  |  |                                 setAttempt(); | 
			
		
	
		
		
			
				
					|  |  |                                 mWaitTimeout = millis() + 100; |  |  |                                 mWaitTimeout = millis() + 100; | 
			
		
	
		
		
			
				
					|  |  |                                 mState = States::WAIT; |  |  |                                 mState = States::WAIT; | 
			
		
	
	
		
		
			
				
					|  | @ -115,7 +128,7 @@ class Communication : public CommQueue<> { | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |                         compilePayload(q); |  |  |                         compilePayload(q); | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |                         pop(true); // remove done request
 |  |  |                         cmdDone(true); // remove done request
 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                         mState = States::RESET; // everything ok, next request
 |  |  |                         mState = States::RESET; // everything ok, next request
 | 
			
		
	
		
		
			
				
					|  |  |                         break; |  |  |                         break; | 
			
		
	
		
		
			
				
					|  |  |                 } |  |  |                 } | 
			
		
	
	
		
		
			
				
					|  | @ -139,21 +152,22 @@ class Communication : public CommQueue<> { | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |         inline void parseFrame(packet_t *p) { |  |  |         inline void parseFrame(packet_t *p) { | 
			
		
	
		
		
			
				
					|  |  |             uint8_t *frameId = &p->packet[9]; |  |  |             uint8_t *frameId = &p->packet[9]; | 
			
		
	
		
		
			
				
					
					|  |  |             if(0x00 == *frameId) |  |  |             if(0x00 == *frameId) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |                 DPRINTLN(DBG_WARN, F("invalid frameId 0x00")); | 
			
		
	
		
		
			
				
					|  |  |                 return; // skip current packet
 |  |  |                 return; // skip current packet
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             } | 
			
		
	
		
		
			
				
					|  |  |             if((*frameId & 0x7f) > MAX_PAYLOAD_ENTRIES) { |  |  |             if((*frameId & 0x7f) > MAX_PAYLOAD_ENTRIES) { | 
			
		
	
		
		
			
				
					
					|  |  |                 DPRINTLN(DBG_WARN, F("local buffer to small for payload fragments!")); |  |  |                 DPRINTLN(DBG_WARN, F("local buffer to small for payload fragments")); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                 return; // local storage is to small for id
 |  |  |                 return; // local storage is to small for id
 | 
			
		
	
		
		
			
				
					|  |  |             } |  |  |             } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |             if(!checkFrameCrc(p->packet, p->len)) |  |  |             if(!checkFrameCrc(p->packet, p->len)) { | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |  |  |  |                 DPRINTLN(DBG_WARN, F("frame CRC is wrong")); | 
			
		
	
		
		
			
				
					|  |  |                 return; // CRC8 is wrong, frame invalid
 |  |  |                 return; // CRC8 is wrong, frame invalid
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |             } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |             if((*frameId & ALL_FRAMES) == ALL_FRAMES) { |  |  |             if((*frameId & ALL_FRAMES) == ALL_FRAMES) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                 mMaxFrameId = (*frameId & 0x7f); |  |  |                 mMaxFrameId = (*frameId & 0x7f); | 
			
		
	
		
		
			
				
					|  |  |                 if(*frameId > 0x81) |  |  |  | 
			
		
	
		
		
			
				
					|  |  |                     lastFound = true; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |             } |  |  |  | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |             frame_t *f = &mLocalBuf[(*frameId & 0x7f) - 1]; |  |  |             frame_t *f = &mLocalBuf[(*frameId & 0x7f) - 1]; | 
			
		
	
		
		
			
				
					|  |  |             memcpy(f->buf, &p->packet[10], p->len-11); |  |  |             memcpy(f->buf, &p->packet[10], p->len-11); | 
			
		
	
	
		
		
			
				
					|  | @ -182,7 +196,7 @@ class Communication : public CommQueue<> { | 
			
		
	
		
		
			
				
					|  |  |                 if(q->attempts == 0) { |  |  |                 if(q->attempts == 0) { | 
			
		
	
		
		
			
				
					|  |  |                     DBGPRINTLN(F("-> Fail")); |  |  |                     DBGPRINTLN(F("-> Fail")); | 
			
		
	
		
		
			
				
					|  |  |                     q->iv->radioStatistics.rxFail++; // got fragments but not complete response
 |  |  |                     q->iv->radioStatistics.rxFail++; // got fragments but not complete response
 | 
			
		
	
		
		
			
				
					
					|  |  |                     pop(); |  |  |                     cmdDone(); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |                 } else |  |  |                 } else | 
			
		
	
		
		
			
				
					|  |  |                     DBGPRINTLN(F("-> complete retransmit")); |  |  |                     DBGPRINTLN(F("-> complete retransmit")); | 
			
		
	
		
		
			
				
					|  |  |                 mState = States::RESET; |  |  |                 mState = States::RESET; | 
			
		
	
	
		
		
			
				
					|  | @ -220,7 +234,7 @@ class Communication : public CommQueue<> { | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |     private: |  |  |     private: | 
			
		
	
		
		
			
				
					|  |  |         enum class States : uint8_t { |  |  |         enum class States : uint8_t { | 
			
		
	
		
		
			
				
					
					|  |  |             RESET, START, WAIT, CHECK_FRAMES, CHECK_PACKAGE |  |  |             RESET, START, WAIT, CHECK_FRAMES, CHECK_PACKAGE, GAP | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |         }; |  |  |         }; | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |         typedef struct { |  |  |         typedef struct { | 
			
		
	
	
		
		
			
				
					|  | @ -234,7 +248,6 @@ class Communication : public CommQueue<> { | 
			
		
	
		
		
			
				
					|  |  |         uint32_t *mTimestamp; |  |  |         uint32_t *mTimestamp; | 
			
		
	
		
		
			
				
					|  |  |         uint32_t mWaitTimeout; |  |  |         uint32_t mWaitTimeout; | 
			
		
	
		
		
			
				
					|  |  |         std::array<frame_t, MAX_PAYLOAD_ENTRIES> mLocalBuf; |  |  |         std::array<frame_t, MAX_PAYLOAD_ENTRIES> mLocalBuf; | 
			
		
	
		
		
			
				
					|  |  |         bool lastFound; |  |  |  | 
			
		
	
		
		
			
				
					|  |  |         uint8_t mMaxFrameId; |  |  |         uint8_t mMaxFrameId; | 
			
		
	
		
		
			
				
					|  |  |         uint8_t mPayload[150]; |  |  |         uint8_t mPayload[150]; | 
			
		
	
		
		
			
				
					|  |  | }; |  |  | }; | 
			
		
	
	
		
		
			
				
					|  | 
 |