diff --git a/W433DataTransmitter.cpp b/W433DataTransmitter.cpp index 62906b4..9221c06 100644 --- a/W433DataTransmitter.cpp +++ b/W433DataTransmitter.cpp @@ -1,93 +1,64 @@ #include "W433DataTransmitter.h" #include "writepin.h" +#include W433DataTransmitter::W433DataTransmitter(volatile unsigned char *port, const unsigned char pin): _port(port), _pin(pin) { } -void W433DataTransmitter::sendBit(const bool bit) -{ - switch(bit) - { - case true: - writePin(_port,_pin,true); - _delay_us(SMALL_TIME); - writePin(_port,_pin,false); - _delay_us(LARGE_TIME); - writePin(_port,_pin,true); - _delay_us(SMALL_TIME); - writePin(_port,_pin,false); - _delay_us(LARGE_TIME); - break; - - case false: - writePin(_port,_pin,true); - _delay_us(LARGE_TIME); - writePin(_port,_pin,false); - _delay_us(SMALL_TIME); - writePin(_port,_pin,true); - _delay_us(SMALL_TIME); - writePin(_port,_pin,false); - _delay_us(LARGE_TIME); - break; - } +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::sendSyncpulse() +void W433DataTransmitter::sendSymbol(const uint8_t data) { - for(uint8_t i = 0; i < 25; ++i) - { - writePin(_port,_pin,true); - _delay_us(SYNC_TIME); - writePin(_port,_pin,false); - _delay_us(SYNC_TIME); - } + for(uint8_t i = 0; i < 6; ++i) + { + writePin(_port, _pin, data & 1<> 4]); } void W433DataTransmitter::sendPacket(const uint32_t data) { - sendSyncpulse(); - _delay_us(LARGE_TIME); - sendRawData(signature); - uint8_t checksum = 0; - for(uint8_t i = 0; i < 4; ++i) - { - uint8_t dataOctet = (data & (0xFF000000 >> i*8 )) >> (24 - 8*i); - //for(uint8_t i = 0; i < 8; i++) checksum = checksum + (dataOctet & ( 1 << (8 - i))); - for(uint8_t i = 0; i < 8; i++) checksum = checksum + ((dataOctet & ( 1 << (8 - i))) >> (8 - i)); - sendRawData( dataOctet ); - - } - sendRawData( checksum ); - sendEndPulse(); + _delay_ms(LONG_DELAY_MS); + 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 && j*4+i < length; i++) paketDataPointer[3-i] = data[j*4+i]; - sendPacket(paketData); - } + 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) diff --git a/W433DataTransmitter.h b/W433DataTransmitter.h index 007f8a2..f1d131d 100644 --- a/W433DataTransmitter.h +++ b/W433DataTransmitter.h @@ -7,24 +7,29 @@ class W433DataTransmitter { private: - - static constexpr uint16_t LARGE_TIME = 2000; - static constexpr uint16_t SMALL_TIME = 500; - static constexpr uint16_t SYNC_TIME = 800; - - static constexpr uint8_t signature = 0xA5; - volatile unsigned char * const _port; - const unsigned char _pin; - - void sendBit(const bool bit); - void sendSyncpulse(); - void sendRawData(const uint8_t data); - void sendEndPulse(); + static constexpr uint16_t BIT_RATE = 2000; + static constexpr int32_t DELAY_US = 1000000/BIT_RATE; + static constexpr int16_t LONG_DELAY_MS = 10; + static constexpr uint16_t SIGNATURE = 0xb38; + volatile unsigned char * const _port; + const unsigned char _pin; + + void sendSymbol(const uint8_t data); + void sendData(const uint8_t data); + + static constexpr int SYMBOL_TABLE_SIZE = 16; + static constexpr uint8_t symbols[SYMBOL_TABLE_SIZE] = + { + 0xd, 0xe, 0x13, 0x15, 0x16, 0x19, 0x1a, 0x1c, + 0x23, 0x25, 0x26, 0x29, 0x2a, 0x2c, 0x32, 0x34 + }; + + uint16_t calcCrc(const uint32_t data); public: - W433DataTransmitter(volatile unsigned char * const port, const unsigned char pin); - void send(const uint8_t* const data, uint16_t length); - void send(const uint8_t data); - void sendPacket(const uint32_t data); + W433DataTransmitter(volatile unsigned char * const port, const unsigned char pin); + void send(const uint8_t* const data, uint16_t length); + void send(const uint8_t data); + void sendPacket(const uint32_t data); };