83 lines
2.9 KiB
C++
83 lines
2.9 KiB
C++
#include <Arduino.h>
|
|
#include <MiLightRemoteType.h>
|
|
#include <Size.h>
|
|
#include <RadioUtils.h>
|
|
|
|
#ifndef _MILIGHT_RADIO_CONFIG
|
|
#define _MILIGHT_RADIO_CONFIG
|
|
|
|
#define MILIGHT_MAX_PACKET_LENGTH 9
|
|
|
|
class MiLightRadioConfig {
|
|
public:
|
|
static const size_t NUM_CHANNELS = 3;
|
|
|
|
// We can set this to two possible values. It only has an affect on the nRF24 radio. The
|
|
// LT8900/PL1167 radio will always use the raw syncwords. For the nRF24, this controls what
|
|
// we set the "address" to, which roughly corresponds to the LT8900 syncword.
|
|
//
|
|
// The PL1167 packet is structured as follows (lengths in bits):
|
|
// Preamble ( 8) | Syncword (32) | Trailer ( 4) | Packet Len ( 8) | Packet (...)
|
|
//
|
|
// 4 -- Use the raw syncword bits as the address. This means the Trailer will be included in
|
|
// the packet data. Since the Trailer is 4 bits, packet data will not be byte-aligned,
|
|
// and the data must be bitshifted every time it's received.
|
|
//
|
|
// 5 -- Include the Trailer in the syncword. Avoids us needing to bitshift packet data. The
|
|
// downside is that the Trailer is hardcoded and assumed based on received packets.
|
|
//
|
|
// In general, this should be set to 5 unless packets that should be showing up are
|
|
// mysteriously not present.
|
|
static const uint8_t SYNCWORD_LENGTH = 5;
|
|
|
|
MiLightRadioConfig(
|
|
const uint16_t syncword0,
|
|
const uint16_t syncword3,
|
|
const size_t packetLength,
|
|
const uint8_t channel0,
|
|
const uint8_t channel1,
|
|
const uint8_t channel2,
|
|
const uint8_t preamble,
|
|
const uint8_t trailer
|
|
) : syncword0(syncword0)
|
|
, syncword3(syncword3)
|
|
, packetLength(packetLength)
|
|
{
|
|
channels[0] = channel0;
|
|
channels[1] = channel1;
|
|
channels[2] = channel2;
|
|
|
|
size_t ix = SYNCWORD_LENGTH;
|
|
|
|
// precompute the syncword for the nRF24. we include the fixed preamble and trailer in the
|
|
// syncword to avoid needing to bitshift packets. trailer is 4 bits, so the actual syncword
|
|
// is no longer byte-aligned.
|
|
if (SYNCWORD_LENGTH == 5) {
|
|
syncwordBytes[ --ix ] = reverseBits(
|
|
((syncword0 << 4) & 0xF0) | (preamble & 0x0F)
|
|
);
|
|
syncwordBytes[ --ix ] = reverseBits((syncword0 >> 4) & 0xFF);
|
|
syncwordBytes[ --ix ] = reverseBits(((syncword0 >> 12) & 0x0F) + ((syncword3 << 4) & 0xF0));
|
|
syncwordBytes[ --ix ] = reverseBits((syncword3 >> 4) & 0xFF);
|
|
syncwordBytes[ --ix ] = reverseBits(
|
|
((syncword3 >> 12) & 0x0F) | ((trailer << 4) & 0xF0)
|
|
);
|
|
} else {
|
|
syncwordBytes[ --ix ] = reverseBits(syncword0 & 0xff);
|
|
syncwordBytes[ --ix ] = reverseBits( (syncword0 >> 8) & 0xff);
|
|
syncwordBytes[ --ix ] = reverseBits(syncword3 & 0xff);
|
|
syncwordBytes[ --ix ] = reverseBits( (syncword3 >> 8) & 0xff);
|
|
}
|
|
}
|
|
|
|
uint8_t channels[3];
|
|
uint8_t syncwordBytes[SYNCWORD_LENGTH];
|
|
uint16_t syncword0, syncword3;
|
|
|
|
const size_t packetLength;
|
|
|
|
static const size_t NUM_CONFIGS = 5;
|
|
static MiLightRadioConfig ALL_CONFIGS[NUM_CONFIGS];
|
|
};
|
|
|
|
#endif
|