mirror of https://github.com/lumapu/ahoy.git
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							93 lines
						
					
					
						
							1.9 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							93 lines
						
					
					
						
							1.9 KiB
						
					
					
				
								#ifndef __HM_PACKETS_H
							 | 
						|
								#define __HM_PACKETS_H
							 | 
						|
								
							 | 
						|
								#include "hm_crc.h"
							 | 
						|
								
							 | 
						|
								class HM_Packets
							 | 
						|
								{
							 | 
						|
								private:
							 | 
						|
									uint32_t unixTimeStamp;
							 | 
						|
								
							 | 
						|
									void prepareBuffer(uint8_t *buf);
							 | 
						|
									void copyToBuffer(uint8_t *buf, uint32_t val);
							 | 
						|
									void copyToBufferBE(uint8_t *buf, uint32_t val);
							 | 
						|
								
							 | 
						|
								public:
							 | 
						|
									void SetUnixTimeStamp(uint32_t ts);
							 | 
						|
									void UnixTimeStampTick();
							 | 
						|
								
							 | 
						|
									int32_t GetTimePacket(uint8_t *buf, uint32_t wrAdr, uint32_t dtuAdr);
							 | 
						|
									int32_t GetCmdPacket(uint8_t *buf, uint32_t wrAdr, uint32_t dtuAdr, uint8_t mid, uint8_t cmd);
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								void HM_Packets::SetUnixTimeStamp(uint32_t ts)
							 | 
						|
								{
							 | 
						|
									unixTimeStamp = ts;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								void HM_Packets::UnixTimeStampTick()
							 | 
						|
								{
							 | 
						|
									unixTimeStamp++;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								void HM_Packets::prepareBuffer(uint8_t *buf)
							 | 
						|
								{
							 | 
						|
									// minimal buffer size of 32 bytes is assumed
							 | 
						|
									memset(buf, 0x00, 32);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								void HM_Packets::copyToBuffer(uint8_t *buf, uint32_t val)
							 | 
						|
								{
							 | 
						|
									buf[0]= (uint8_t)(val >> 24);
							 | 
						|
									buf[1]= (uint8_t)(val >> 16);
							 | 
						|
									buf[2]= (uint8_t)(val >> 8);
							 | 
						|
									buf[3]= (uint8_t)(val & 0xFF);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								void HM_Packets::copyToBufferBE(uint8_t *buf, uint32_t val)
							 | 
						|
								{
							 | 
						|
									memcpy(buf, &val, sizeof(uint32_t));
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								static uint8_t cid = 0;
							 | 
						|
								
							 | 
						|
								int32_t HM_Packets::GetTimePacket(uint8_t *buf, uint32_t wrAdr, uint32_t dtuAdr)
							 | 
						|
								{
							 | 
						|
									prepareBuffer(buf);
							 | 
						|
								
							 | 
						|
									buf[0] = 0x15;
							 | 
						|
									copyToBufferBE(&buf[1], wrAdr);
							 | 
						|
									copyToBufferBE(&buf[5], dtuAdr);
							 | 
						|
									buf[9] = 0x80;
							 | 
						|
								  buf[10] = 0x0B;        //0x0B;  0x03 0x11
							 | 
						|
									buf[11] = 0x00;
							 | 
						|
								
							 | 
						|
									copyToBuffer(&buf[12], unixTimeStamp);
							 | 
						|
								
							 | 
						|
									buf[19] = 0x05;
							 | 
						|
								
							 | 
						|
									// CRC16
							 | 
						|
									uint16_t crc16 = crc16_modbus(&buf[10], 14);
							 | 
						|
									buf[24] = crc16 >> 8;
							 | 
						|
									buf[25] = crc16 & 0xFF;
							 | 
						|
								
							 | 
						|
									// crc8
							 | 
						|
									buf[26] = crc8(&buf[0], 26);
							 | 
						|
								
							 | 
						|
									return 27;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								int32_t HM_Packets::GetCmdPacket(uint8_t *buf, uint32_t wrAdr, uint32_t dtuAdr, uint8_t mid, uint8_t cmd)
							 | 
						|
								{
							 | 
						|
									buf[0] = mid;
							 | 
						|
									copyToBufferBE(&buf[1], wrAdr);
							 | 
						|
									copyToBufferBE(&buf[5], dtuAdr);
							 | 
						|
									buf[9] = cmd;
							 | 
						|
								
							 | 
						|
									// crc8
							 | 
						|
									buf[10] = crc8(&buf[0], 10);
							 | 
						|
								
							 | 
						|
									return 11;
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								#endif
							 | 
						|
								
							 |