#include "W433DataTransmitter.h" #include "writepin.h" 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; } } void W433DataTransmitter::sendSyncpulse() { for(uint8_t i = 0; i < 25; ++i) { writePin(_port,_pin,true); _delay_us(SYNC_TIME); writePin(_port,_pin,false); _delay_us(SYNC_TIME); } } void W433DataTransmitter::sendEndPulse() { writePin(_port,_pin,false); _delay_us(LARGE_TIME); writePin(_port,_pin,true); _delay_us(LARGE_TIME); writePin(_port,_pin,false); _delay_us(LARGE_TIME*10); } void W433DataTransmitter::sendRawData(const uint8_t data) { for(uint8_t i = 0; i < 8; i++) sendBit(data & ( 1 << (7 - i))); } 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(); } 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); } } void W433DataTransmitter::send(const uint8_t data) { sendPacket(data); }