|  |  | @ -165,25 +165,38 @@ class HmRadio { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         void sendControlPacket(uint64_t invId, uint8_t cmd, uint16_t *data) { | 
			
		
	
		
			
				
					|  |  |  |             DPRINTLN(DBG_INFO, F("sendControlPacket cmd: ") + String(cmd)); | 
			
		
	
		
			
				
					|  |  |  |             sendCmdPacket(invId, TX_REQ_DEVCONTROL, ALL_FRAMES, false); // 0x80 implementation as original DTU code
 | 
			
		
	
		
			
				
					|  |  |  |             sendCmdPacket(invId, TX_REQ_DEVCONTROL, SINGLE_FRAME, false); // SINGLE_FRAME 0x81 as original DTU code
 | 
			
		
	
		
			
				
					|  |  |  |             int cnt = 0; | 
			
		
	
		
			
				
					|  |  |  |             mTxBuf[10] = cmd; // cmd --> 0x0b => Type_ActivePowerContr, 0 on, 1 off, 2 restart, 12 reactive power, 13 power factor
 | 
			
		
	
		
			
				
					|  |  |  |             mTxBuf[10 + (++cnt)] = 0x00; | 
			
		
	
		
			
				
					|  |  |  |             if (cmd >= ActivePowerContr && cmd <= PFSet){ | 
			
		
	
		
			
				
					|  |  |  |                 mTxBuf[10 + (++cnt)] = ((data[0] * 10) >> 8) & 0xff; // power limit
 | 
			
		
	
		
			
				
					|  |  |  |                 mTxBuf[10 + (++cnt)] = ((data[0] * 10)     ) & 0xff; // power limit
 | 
			
		
	
		
			
				
					|  |  |  |                 mTxBuf[10 + (++cnt)] = ((data[1]     ) >> 8) & 0xff; // setting for persistens handlings
 | 
			
		
	
		
			
				
					|  |  |  |                 mTxBuf[10 + (++cnt)] = ((data[1]     )     ) & 0xff; // setting for persistens handling
 | 
			
		
	
		
			
				
					|  |  |  |             mTxBuf[10] = cmd; // cmd --> 0x0b => Type_ActivePowerContr, 0 on, 1 off, 2 restart, 12 reactive power, 13 power factor, 20 CleanState_LockAndAlarm
 | 
			
		
	
		
			
				
					|  |  |  |             if (cmd == CleanState_LockAndAlarm) { | 
			
		
	
		
			
				
					|  |  |  |                 // skip user data, append only crc8
 | 
			
		
	
		
			
				
					|  |  |  |             } else { | 
			
		
	
		
			
				
					|  |  |  |                 // append user data and crc16
 | 
			
		
	
		
			
				
					|  |  |  |                 mTxBuf[10 + (++cnt)] = 0x00; | 
			
		
	
		
			
				
					|  |  |  |                 if (cmd >= ActivePowerContr && cmd <= PFSet){ | 
			
		
	
		
			
				
					|  |  |  |                     mTxBuf[10 + (++cnt)] = ((data[0] * 10) >> 8) & 0xff; // power limit
 | 
			
		
	
		
			
				
					|  |  |  |                     mTxBuf[10 + (++cnt)] = ((data[0] * 10)     ) & 0xff; // power limit
 | 
			
		
	
		
			
				
					|  |  |  |                     mTxBuf[10 + (++cnt)] = ((data[1]     ) >> 8) & 0xff; // setting for persistens handlings
 | 
			
		
	
		
			
				
					|  |  |  |                     mTxBuf[10 + (++cnt)] = ((data[1]     )     ) & 0xff; // setting for persistens handling
 | 
			
		
	
		
			
				
					|  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |                 // crc16 control data
 | 
			
		
	
		
			
				
					|  |  |  |                 uint16_t crc = Ahoy::crc16(&mTxBuf[10], cnt+1); | 
			
		
	
		
			
				
					|  |  |  |                 mTxBuf[10 + (++cnt)] = (crc >> 8) & 0xff; | 
			
		
	
		
			
				
					|  |  |  |                 mTxBuf[10 + (++cnt)] = (crc     ) & 0xff; | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |             // crc control data
 | 
			
		
	
		
			
				
					|  |  |  |             uint16_t crc = Ahoy::crc16(&mTxBuf[10], cnt+1); | 
			
		
	
		
			
				
					|  |  |  |             mTxBuf[10 + (++cnt)] = (crc >> 8) & 0xff; | 
			
		
	
		
			
				
					|  |  |  |             mTxBuf[10 + (++cnt)] = (crc     ) & 0xff; | 
			
		
	
		
			
				
					|  |  |  |             // crc over all
 | 
			
		
	
		
			
				
					|  |  |  |             cnt +=1; | 
			
		
	
		
			
				
					|  |  |  |             mTxBuf[10 + cnt] = Ahoy::crc8(mTxBuf, 10 + cnt); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             // crc8 over all
 | 
			
		
	
		
			
				
					|  |  |  |             mTxBuf[10 + (++cnt)] = Ahoy::crc8(mTxBuf, 10 + cnt); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             sendPacket(invId, mTxBuf, 10 + (++cnt), true); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             // Is required to prevent retransmissions without answer.
 | 
			
		
	
		
			
				
					|  |  |  |             if (cmd == CleanState_LockAndAlarm || cmd == Restart) | 
			
		
	
		
			
				
					|  |  |  |             { | 
			
		
	
		
			
				
					|  |  |  |                 DPRINTLN(DBG_INFO, F("TODO: Prevent retransmit after Reboot / CleanState_LockAndAlarm...")); | 
			
		
	
		
			
				
					|  |  |  |                 // if(mPayload[iv->id].retransmits < mConfig.maxRetransPerPyld)
 | 
			
		
	
		
			
				
					|  |  |  |                 //mPayload[iv->id].retransmits = mConfig.maxRetransPerPyld;
 | 
			
		
	
		
			
				
					|  |  |  |             }                          | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         void sendTimePacket(uint64_t invId, uint8_t cmd, uint32_t ts, uint16_t alarmMesId) { | 
			
		
	
	
		
			
				
					|  |  | 
 |