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.
74 lines
1.4 KiB
74 lines
1.4 KiB
#include "Arduino.h"
|
|
|
|
#include "hm_crc.h"
|
|
#include "hm_packets.h"
|
|
|
|
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));
|
|
}
|
|
|
|
|
|
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; // cid
|
|
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;
|
|
}
|
|
|