#include "W433DataTransmitter.h" #include "writepin.h" #include 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(&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<> 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(&paketData); for(uint8_t i = 0; i < 4 && static_cast(j*4+i) < length; i++) paketDataPointer[3-i] = data[j*4+i]; sendPacket(paketData); } } void W433DataTransmitter::send(const uint8_t data) { sendPacket(data); }