74 lines
1.7 KiB
C++
74 lines
1.7 KiB
C++
#include "W433DataTransmitter.h"
|
|
#include "writepin.h"
|
|
#include <util/crc16.h>
|
|
|
|
W433DataTransmitter::W433DataTransmitter(volatile unsigned char *port, const unsigned char pin): _port(port), _pin(pin)
|
|
{
|
|
}
|
|
|
|
uint16_t W433DataTransmitter::calcCrc(const uint32_t data)
|
|
{
|
|
uint16_t crc = 0xffff;
|
|
const uint8_t* ptr = reinterpret_cast<const uint8_t*>(&data);
|
|
for(uint8_t i = 0; i < sizeof(data); ++i)
|
|
crc = _crc_ccitt_update(crc, ptr[i]);
|
|
return crc;
|
|
}
|
|
|
|
void W433DataTransmitter::sendSymbol(const uint8_t data)
|
|
{
|
|
for(uint8_t i = 0; i < 6; ++i)
|
|
{
|
|
writePin(_port, _pin, data & 1<<i);
|
|
_delay_us(DELAY_US);
|
|
}
|
|
}
|
|
|
|
void W433DataTransmitter::sendData(const uint8_t data)
|
|
{
|
|
sendSymbol(symbols[data & 0x0F]);
|
|
sendSymbol(symbols[data >> 4]);
|
|
}
|
|
|
|
void W433DataTransmitter::sendPacket(const uint32_t data)
|
|
{
|
|
_delay_ms(LONG_DELAY_MS);
|
|
sendSymbol(0b010101);
|
|
sendSymbol(0b101010);
|
|
sendSymbol(0b010101);
|
|
sendSymbol(0b101010);
|
|
sendSymbol(SIGNATURE & 0b111111);
|
|
sendSymbol(SIGNATURE >> 6);
|
|
for(uint8_t i = 0; i < 4; ++i)
|
|
{
|
|
uint8_t dataOctet = (data & (0xFF000000 >> i*8 )) >> (24 - 8*i);
|
|
sendData(dataOctet);
|
|
}
|
|
uint16_t crc = calcCrc(data);
|
|
sendData(crc & 0xFF);
|
|
sendData(crc >> 8);
|
|
}
|
|
|
|
void W433DataTransmitter::send(const uint8_t* const data, uint16_t length)
|
|
{
|
|
uint16_t packets = length/4;
|
|
if(length % 4 != 0)
|
|
++packets;
|
|
for(uint8_t j = 0; j < packets; j++)
|
|
{
|
|
uint32_t paketData = 0;
|
|
uint8_t* paketDataPointer = reinterpret_cast<uint8_t*>(&paketData);
|
|
for(uint8_t i = 0; i < 4 && static_cast<uint16_t>(j*4+i) < length; i++)
|
|
paketDataPointer[3-i] = data[j*4+i];
|
|
sendPacket(paketData);
|
|
}
|
|
|
|
}
|
|
|
|
void W433DataTransmitter::send(const uint8_t data)
|
|
{
|
|
sendPacket(data);
|
|
}
|
|
|
|
|