Change transmition proctocoll to new version
This commit is contained in:
@ -1,93 +1,64 @@
|
|||||||
#include "W433DataTransmitter.h"
|
#include "W433DataTransmitter.h"
|
||||||
#include "writepin.h"
|
#include "writepin.h"
|
||||||
|
#include <util/crc16.h>
|
||||||
|
|
||||||
W433DataTransmitter::W433DataTransmitter(volatile unsigned char *port, const unsigned char pin): _port(port), _pin(pin)
|
W433DataTransmitter::W433DataTransmitter(volatile unsigned char *port, const unsigned char pin): _port(port), _pin(pin)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void W433DataTransmitter::sendBit(const bool bit)
|
uint16_t W433DataTransmitter::calcCrc(const uint32_t data)
|
||||||
{
|
{
|
||||||
switch(bit)
|
uint16_t crc = 0xffff;
|
||||||
{
|
const uint8_t* ptr = reinterpret_cast<const uint8_t*>(&data);
|
||||||
case true:
|
for(uint8_t i = 0; i < sizeof(data); ++i)
|
||||||
writePin(_port,_pin,true);
|
crc = _crc_ccitt_update(crc, ptr[i]);
|
||||||
_delay_us(SMALL_TIME);
|
return crc;
|
||||||
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()
|
void W433DataTransmitter::sendSymbol(const uint8_t data)
|
||||||
{
|
{
|
||||||
for(uint8_t i = 0; i < 25; ++i)
|
for(uint8_t i = 0; i < 6; ++i)
|
||||||
{
|
{
|
||||||
writePin(_port,_pin,true);
|
writePin(_port, _pin, data & 1<<i);
|
||||||
_delay_us(SYNC_TIME);
|
_delay_us(DELAY_US);
|
||||||
writePin(_port,_pin,false);
|
}
|
||||||
_delay_us(SYNC_TIME);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void W433DataTransmitter::sendEndPulse()
|
void W433DataTransmitter::sendData(const uint8_t data)
|
||||||
{
|
{
|
||||||
writePin(_port,_pin,false);
|
sendSymbol(symbols[data & 0x0F]);
|
||||||
_delay_us(LARGE_TIME);
|
sendSymbol(symbols[data >> 4]);
|
||||||
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)
|
void W433DataTransmitter::sendPacket(const uint32_t data)
|
||||||
{
|
{
|
||||||
sendSyncpulse();
|
_delay_ms(LONG_DELAY_MS);
|
||||||
_delay_us(LARGE_TIME);
|
sendSymbol(SIGNATURE & 0b111111);
|
||||||
sendRawData(signature);
|
sendSymbol(SIGNATURE >> 6);
|
||||||
uint8_t checksum = 0;
|
for(uint8_t i = 0; i < 4; ++i)
|
||||||
for(uint8_t i = 0; i < 4; ++i)
|
{
|
||||||
{
|
uint8_t dataOctet = (data & (0xFF000000 >> i*8 )) >> (24 - 8*i);
|
||||||
uint8_t dataOctet = (data & (0xFF000000 >> i*8 )) >> (24 - 8*i);
|
sendData(dataOctet);
|
||||||
//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));
|
uint16_t crc = calcCrc(data);
|
||||||
sendRawData( dataOctet );
|
sendData(crc & 0xFF);
|
||||||
|
sendData(crc >> 8);
|
||||||
}
|
|
||||||
sendRawData( checksum );
|
|
||||||
sendEndPulse();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void W433DataTransmitter::send(const uint8_t* const data, uint16_t length)
|
void W433DataTransmitter::send(const uint8_t* const data, uint16_t length)
|
||||||
{
|
{
|
||||||
uint16_t packets = length/4;
|
uint16_t packets = length/4;
|
||||||
if(length % 4 != 0) ++packets;
|
if(length % 4 != 0)
|
||||||
for(uint8_t j = 0; j < packets; j++)
|
++packets;
|
||||||
{
|
for(uint8_t j = 0; j < packets; j++)
|
||||||
uint32_t paketData = 0;
|
{
|
||||||
uint8_t* paketDataPointer = reinterpret_cast<uint8_t*>(&paketData);
|
uint32_t paketData = 0;
|
||||||
for(uint8_t i = 0; i < 4 && j*4+i < length; i++) paketDataPointer[3-i] = data[j*4+i];
|
uint8_t* paketDataPointer = reinterpret_cast<uint8_t*>(&paketData);
|
||||||
sendPacket(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)
|
void W433DataTransmitter::send(const uint8_t data)
|
||||||
|
@ -7,24 +7,29 @@
|
|||||||
class W433DataTransmitter
|
class W433DataTransmitter
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
static constexpr uint16_t BIT_RATE = 2000;
|
||||||
static constexpr uint16_t LARGE_TIME = 2000;
|
static constexpr int32_t DELAY_US = 1000000/BIT_RATE;
|
||||||
static constexpr uint16_t SMALL_TIME = 500;
|
static constexpr int16_t LONG_DELAY_MS = 10;
|
||||||
static constexpr uint16_t SYNC_TIME = 800;
|
static constexpr uint16_t SIGNATURE = 0xb38;
|
||||||
|
volatile unsigned char * const _port;
|
||||||
static constexpr uint8_t signature = 0xA5;
|
const unsigned char _pin;
|
||||||
volatile unsigned char * const _port;
|
|
||||||
const unsigned char _pin;
|
void sendSymbol(const uint8_t data);
|
||||||
|
void sendData(const uint8_t data);
|
||||||
void sendBit(const bool bit);
|
|
||||||
void sendSyncpulse();
|
static constexpr int SYMBOL_TABLE_SIZE = 16;
|
||||||
void sendRawData(const uint8_t data);
|
static constexpr uint8_t symbols[SYMBOL_TABLE_SIZE] =
|
||||||
void sendEndPulse();
|
{
|
||||||
|
0xd, 0xe, 0x13, 0x15, 0x16, 0x19, 0x1a, 0x1c,
|
||||||
|
0x23, 0x25, 0x26, 0x29, 0x2a, 0x2c, 0x32, 0x34
|
||||||
|
};
|
||||||
|
|
||||||
|
uint16_t calcCrc(const uint32_t data);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
W433DataTransmitter(volatile unsigned char * const port, const unsigned char pin);
|
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* const data, uint16_t length);
|
||||||
void send(const uint8_t data);
|
void send(const uint8_t data);
|
||||||
void sendPacket(const uint32_t data);
|
void sendPacket(const uint32_t data);
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user