close #2
This commit is contained in:
46
crossbow.ino
46
crossbow.ino
@@ -50,15 +50,12 @@ RxDeviceState_t rxDeviceState = {};
|
|||||||
* End of QSP protocol implementation
|
* End of QSP protocol implementation
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static uint32_t lastRcFrameTransmit = 0;
|
|
||||||
static uint32_t lastRxHealthFrameTransmit = 0;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Serial port used to send data
|
* Serial port used to send data
|
||||||
*/
|
*/
|
||||||
#ifdef LORA_HARDWARE_SERIAL
|
#ifdef LORA_HARDWARE_SERIAL
|
||||||
|
|
||||||
int getRadioRssi(void)
|
unint8_t getRadioRssi(void)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -92,14 +89,15 @@ void writeToRadio(uint8_t dataByte, QspConfiguration_t *qsp)
|
|||||||
|
|
||||||
#ifdef LORA_HARDWARE_SPI
|
#ifdef LORA_HARDWARE_SPI
|
||||||
|
|
||||||
int getRadioRssi(void)
|
uint8_t getRadioRssi(void)
|
||||||
{
|
{
|
||||||
return LoRa.packetRssi();
|
//Map from -164:0 to 0:100
|
||||||
|
return map(constrain(LoRa.packetRssi() * -1, 0, 164), 0, 164, 100, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
float getRadioSnr(void)
|
float getRadioSnr(void)
|
||||||
{
|
{
|
||||||
return LoRa.packetSnr();
|
return (uint8_t) constrain(LoRa.packetSnr() * 10, 0, 255);
|
||||||
}
|
}
|
||||||
|
|
||||||
void radioPacketStart(void)
|
void radioPacketStart(void)
|
||||||
@@ -219,6 +217,10 @@ if (!LoRa.begin(868E6))
|
|||||||
TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt
|
TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt
|
||||||
sei();
|
sei();
|
||||||
|
|
||||||
|
pinMode(RX_ADC_PIN_1, INPUT);
|
||||||
|
pinMode(RX_ADC_PIN_2, INPUT);
|
||||||
|
pinMode(RX_ADC_PIN_3, INPUT);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
pinMode(LED_BUILTIN, OUTPUT);
|
pinMode(LED_BUILTIN, OUTPUT);
|
||||||
@@ -285,6 +287,14 @@ ISR(TIMER1_COMPA_vect) { //leave this alone
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void updateRxDeviceState(RxDeviceState_t *rxDeviceState) {
|
||||||
|
rxDeviceState->rxVoltage = map(analogRead(RX_ADC_PIN_1), 0, 1024, 0, 255);
|
||||||
|
rxDeviceState->a1Voltage = map(analogRead(RX_ADC_PIN_2), 0, 1024, 0, 255);
|
||||||
|
rxDeviceState->a2Voltage = map(analogRead(RX_ADC_PIN_3), 0, 1024, 0, 255);
|
||||||
|
rxDeviceState->rssi = getRadioRssi();
|
||||||
|
rxDeviceState->snr = getRadioSnr();
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void loop(void)
|
void loop(void)
|
||||||
@@ -296,9 +306,13 @@ void loop(void)
|
|||||||
/*
|
/*
|
||||||
* RC_DATA QSP frame
|
* RC_DATA QSP frame
|
||||||
*/
|
*/
|
||||||
if (currentMillis - lastRcFrameTransmit > TX_RC_FRAME_RATE && !transmitPayload && qsp.protocolState == QSP_STATE_IDLE)
|
if (
|
||||||
|
currentMillis - qsp.lastFrameTransmitedAt[QSP_FRAME_RC_DATA] > TX_RC_FRAME_RATE &&
|
||||||
|
!transmitPayload &&
|
||||||
|
qsp.protocolState == QSP_STATE_IDLE
|
||||||
|
)
|
||||||
{
|
{
|
||||||
lastRcFrameTransmit = currentMillis;
|
qsp.lastFrameTransmitedAt[QSP_FRAME_RC_DATA] = currentMillis;
|
||||||
|
|
||||||
qspClearPayload(&qsp);
|
qspClearPayload(&qsp);
|
||||||
encodeRcDataPayload(&qsp, &ppmReader, PPM_CHANNEL_COUNT);
|
encodeRcDataPayload(&qsp, &ppmReader, PPM_CHANNEL_COUNT);
|
||||||
@@ -311,11 +325,17 @@ void loop(void)
|
|||||||
|
|
||||||
#ifdef DEVICE_MODE_RX
|
#ifdef DEVICE_MODE_RX
|
||||||
/*
|
/*
|
||||||
* RC_DATA QSP frame
|
* RX_HEALTH QSP frame
|
||||||
*/
|
*/
|
||||||
if (currentMillis - lastRxHealthFrameTransmit > RX_RX_HEALTH_FRAME_RATE && !transmitPayload && qsp.protocolState == QSP_STATE_IDLE)
|
if (
|
||||||
|
currentMillis - qsp.lastFrameTransmitedAt[QSP_FRAME_RX_HEALTH] > RX_RX_HEALTH_FRAME_RATE &&
|
||||||
|
!transmitPayload &&
|
||||||
|
qsp.protocolState == QSP_STATE_IDLE
|
||||||
|
)
|
||||||
{
|
{
|
||||||
lastRxHealthFrameTransmit = currentMillis;
|
qsp.lastFrameTransmitedAt[QSP_FRAME_RX_HEALTH] = currentMillis;
|
||||||
|
|
||||||
|
updateRxDeviceState(&rxDeviceState);
|
||||||
|
|
||||||
qspClearPayload(&qsp);
|
qspClearPayload(&qsp);
|
||||||
encodeRxHealthPayload(&qsp, &rxDeviceState);
|
encodeRxHealthPayload(&qsp, &rxDeviceState);
|
||||||
@@ -378,7 +398,7 @@ void onReceive(int packetSize)
|
|||||||
|
|
||||||
while (LoRa.available())
|
while (LoRa.available())
|
||||||
{
|
{
|
||||||
qspDecodeIncomingFrame(&qsp, LoRa.read(), ppm);
|
qspDecodeIncomingFrame(&qsp, LoRa.read(), ppm, &rxDeviceState);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
23
qsp.cpp
23
qsp.cpp
@@ -56,7 +56,7 @@ void qspComputeCrc(QspConfiguration_t *qsp, uint8_t dataByte)
|
|||||||
|
|
||||||
void encodeRxHealthPayload(QspConfiguration_t *qsp, RxDeviceState_t *rxDeviceState) {
|
void encodeRxHealthPayload(QspConfiguration_t *qsp, RxDeviceState_t *rxDeviceState) {
|
||||||
qsp->payload[0] = rxDeviceState->rssi;
|
qsp->payload[0] = rxDeviceState->rssi;
|
||||||
qsp->payload[1] = constrain(rxDeviceState->snr * 10, 0, 255);
|
qsp->payload[1] = rxDeviceState->snr;
|
||||||
qsp->payload[2] = rxDeviceState->rxVoltage;
|
qsp->payload[2] = rxDeviceState->rxVoltage;
|
||||||
qsp->payload[3] = rxDeviceState->a1Voltage;
|
qsp->payload[3] = rxDeviceState->a1Voltage;
|
||||||
qsp->payload[4] = rxDeviceState->a2Voltage;
|
qsp->payload[4] = rxDeviceState->a2Voltage;
|
||||||
@@ -65,6 +65,15 @@ void encodeRxHealthPayload(QspConfiguration_t *qsp, RxDeviceState_t *rxDeviceSta
|
|||||||
qsp->payloadLength = 6;
|
qsp->payloadLength = 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void decodeRxHealthPayload(QspConfiguration_t *qsp, RxDeviceState_t *rxDeviceState) {
|
||||||
|
rxDeviceState->rssi = qsp->payload[0];
|
||||||
|
rxDeviceState->snr = qsp->payload[1];
|
||||||
|
rxDeviceState->rxVoltage = qsp->payload[2];
|
||||||
|
rxDeviceState->a1Voltage = qsp->payload[3];
|
||||||
|
rxDeviceState->a2Voltage = qsp->payload[4];
|
||||||
|
// rxDeviceState->rssi = qsp->payload[0]; //TODO we skipped decoding this byte, figure it out
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encode 10 RC channels
|
* Encode 10 RC channels
|
||||||
*/
|
*/
|
||||||
@@ -132,7 +141,7 @@ void qspClearPayload(QspConfiguration_t *qsp)
|
|||||||
qsp->payloadLength = 0;
|
qsp->payloadLength = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void qspDecodeIncomingFrame(QspConfiguration_t *qsp, uint8_t incomingByte, int ppm[])
|
void qspDecodeIncomingFrame(QspConfiguration_t *qsp, uint8_t incomingByte, int ppm[], RxDeviceState_t *rxDeviceState)
|
||||||
{
|
{
|
||||||
static uint8_t frameId;
|
static uint8_t frameId;
|
||||||
static uint8_t payloadLength;
|
static uint8_t payloadLength;
|
||||||
@@ -229,6 +238,16 @@ void qspDecodeIncomingFrame(QspConfiguration_t *qsp, uint8_t incomingByte, int p
|
|||||||
qspDecodeRcDataFrame(qsp, ppm);
|
qspDecodeRcDataFrame(qsp, ppm);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case QSP_FRAME_RX_HEALTH:
|
||||||
|
decodeRxHealthPayload(qsp, rxDeviceState);
|
||||||
|
if (qsp->debugConfig & DEBUG_FLAG_SERIAL) {
|
||||||
|
Serial.print("RX RSSI: ");
|
||||||
|
Serial.println(rxDeviceState->rssi);
|
||||||
|
Serial.print("RX SNR: ");
|
||||||
|
Serial.println(rxDeviceState->snr);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
//Unknown frame
|
//Unknown frame
|
||||||
//TODO do something in this case
|
//TODO do something in this case
|
||||||
|
|||||||
4
qsp.h
4
qsp.h
@@ -2,12 +2,14 @@
|
|||||||
#include <PPMReader.h>
|
#include <PPMReader.h>
|
||||||
|
|
||||||
void qspDecodeRcDataFrame(QspConfiguration_t *qsp, int output[]);
|
void qspDecodeRcDataFrame(QspConfiguration_t *qsp, int output[]);
|
||||||
|
void decodeRxHealthPayload(QspConfiguration_t *qsp, RxDeviceState_t *rxDeviceState);
|
||||||
|
|
||||||
uint8_t get10bitHighShift(uint8_t channel);
|
uint8_t get10bitHighShift(uint8_t channel);
|
||||||
uint8_t get10bitLowShift(uint8_t channel);
|
uint8_t get10bitLowShift(uint8_t channel);
|
||||||
void qspComputeCrc(QspConfiguration_t *qsp, uint8_t dataByte);
|
void qspComputeCrc(QspConfiguration_t *qsp, uint8_t dataByte);
|
||||||
void encodeRxHealthPayload(QspConfiguration_t *qsp, RxDeviceState_t *rxDeviceState);
|
void encodeRxHealthPayload(QspConfiguration_t *qsp, RxDeviceState_t *rxDeviceState);
|
||||||
void encodeRcDataPayload(QspConfiguration_t *qsp, PPMReader *ppmSource, uint8_t noOfChannels);
|
void encodeRcDataPayload(QspConfiguration_t *qsp, PPMReader *ppmSource, uint8_t noOfChannels);
|
||||||
uint8_t qspGetPacketId(void);
|
uint8_t qspGetPacketId(void);
|
||||||
void qspDecodeIncomingFrame(QspConfiguration_t *qsp, uint8_t incomingByte, int ppm[]);
|
void qspDecodeIncomingFrame(QspConfiguration_t *qsp, uint8_t incomingByte, int ppm[], RxDeviceState_t *rxDeviceState);
|
||||||
void qspClearPayload(QspConfiguration_t *qsp);
|
void qspClearPayload(QspConfiguration_t *qsp);
|
||||||
void qspEncodeFrame(QspConfiguration_t *qsp);
|
void qspEncodeFrame(QspConfiguration_t *qsp);
|
||||||
@@ -21,6 +21,10 @@
|
|||||||
#define QSP_FRAME_SET_RX_CONFIG 0x4
|
#define QSP_FRAME_SET_RX_CONFIG 0x4
|
||||||
#define QSP_FRAME_COUNT 0x5
|
#define QSP_FRAME_COUNT 0x5
|
||||||
|
|
||||||
|
#define RX_ADC_PIN_1 A0
|
||||||
|
#define RX_ADC_PIN_2 A1
|
||||||
|
#define RX_ADC_PIN_3 A2
|
||||||
|
|
||||||
enum dataStates {
|
enum dataStates {
|
||||||
QSP_STATE_IDLE,
|
QSP_STATE_IDLE,
|
||||||
QSP_STATE_PREAMBLE_RECEIVED,
|
QSP_STATE_PREAMBLE_RECEIVED,
|
||||||
@@ -57,6 +61,7 @@ struct QspConfiguration_t {
|
|||||||
uint8_t payloadLength = 0;
|
uint8_t payloadLength = 0;
|
||||||
uint8_t frameToSend = 0;
|
uint8_t frameToSend = 0;
|
||||||
uint32_t lastFrameReceivedAt[QSP_FRAME_COUNT] = {0};
|
uint32_t lastFrameReceivedAt[QSP_FRAME_COUNT] = {0};
|
||||||
|
uint32_t lastFrameTransmitedAt[QSP_FRAME_COUNT] = {0};
|
||||||
uint8_t deviceState = DEVICE_STATE_OK;
|
uint8_t deviceState = DEVICE_STATE_OK;
|
||||||
void (* hardwareWriteFunction)(uint8_t, QspConfiguration_t*);
|
void (* hardwareWriteFunction)(uint8_t, QspConfiguration_t*);
|
||||||
uint8_t lastReceivedPacketId = 0;
|
uint8_t lastReceivedPacketId = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user