98 lines
2.4 KiB
C++
98 lines
2.4 KiB
C++
#include "W433DataTransmitter.h"
|
|
#include "writepin.h"
|
|
|
|
W433DataTransmitter::W433DataTransmitter(volatile unsigned char *port, 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)));
|
|
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<uint8_t*>(&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);
|
|
}
|
|
|
|
|