Change transmition proctocoll to new version

This commit is contained in:
2023-03-30 19:26:20 +02:00
parent 1f18e76622
commit 0969918f04
2 changed files with 61 additions and 85 deletions

View File

@ -1,93 +1,64 @@
#include "W433DataTransmitter.h"
#include "writepin.h"
#include <util/crc16.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;
}
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::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<<i);
_delay_us(DELAY_US);
}
}
void W433DataTransmitter::sendEndPulse()
void W433DataTransmitter::sendData(const uint8_t data)
{
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)));
sendSymbol(symbols[data & 0x0F]);
sendSymbol(symbols[data >> 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<uint8_t*>(&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<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)