Rx_health frame encoding, no data is yet acquired from Rx hardware
This commit is contained in:
15
README.md
15
README.md
@@ -39,10 +39,11 @@ Total length of `RC_DATA` payload is 9 bytes
|
|||||||
|
|
||||||
### `RX_HEALTH` frame format
|
### `RX_HEALTH` frame format
|
||||||
|
|
||||||
| Byte | Description |
|
| Byte | Description |
|
||||||
| ---- | ---- |
|
| ---- | ---- |
|
||||||
| 0 | RX RSSI |
|
| 1 | RX RSSI |
|
||||||
| 1 | RX SNR |
|
| 2 | RX SNR |
|
||||||
| 2 | RX supply volatage, sent in 0,1V |
|
| 3 | RX supply volatage, sent in 0,1V |
|
||||||
| 3 | RX analog input 1 sent in 0,1V |
|
| 4 | RX analog input 1 sent in 0,1V |
|
||||||
| 4 | RX analog input 2 sent in 0,1V |
|
| 5 | RX analog input 2 sent in 0,1V |
|
||||||
|
| 6 | Last received packet ID |
|
||||||
|
|||||||
21
crossbow.ino
21
crossbow.ino
@@ -52,12 +52,14 @@ bool canTransmit = false;
|
|||||||
* Start of QSP protocol implementation
|
* Start of QSP protocol implementation
|
||||||
*/
|
*/
|
||||||
QspConfiguration_t qsp = {};
|
QspConfiguration_t qsp = {};
|
||||||
|
RxDeviceState_t rxDeviceState = {};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* End of QSP protocol implementation
|
* End of QSP protocol implementation
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static uint32_t lastRcFrameTransmit = 0;
|
static uint32_t lastRcFrameTransmit = 0;
|
||||||
|
static uint32_t lastRxHealthFrameTransmit = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Serial port used to send data
|
* Serial port used to send data
|
||||||
@@ -250,8 +252,6 @@ void loop(void)
|
|||||||
bool transmitPayload = false;
|
bool transmitPayload = false;
|
||||||
|
|
||||||
#ifdef DEVICE_MODE_TX
|
#ifdef DEVICE_MODE_TX
|
||||||
|
|
||||||
//TODO It should be only possible to transmit when radio is not receiveing
|
|
||||||
/*
|
/*
|
||||||
* RC_DATA QSP frame
|
* RC_DATA QSP frame
|
||||||
*/
|
*/
|
||||||
@@ -268,6 +268,23 @@ void loop(void)
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef DEVICE_MODE_RX
|
||||||
|
/*
|
||||||
|
* RC_DATA QSP frame
|
||||||
|
*/
|
||||||
|
if (currentMillis - lastRxHealthFrameTransmit > RX_RX_HEALTH_FRAME_RATE && !transmitPayload && qsp.protocolState == QSP_STATE_IDLE)
|
||||||
|
{
|
||||||
|
lastRxHealthFrameTransmit = currentMillis;
|
||||||
|
|
||||||
|
qspClearPayload(&qsp);
|
||||||
|
encodeRxHealthPayload(&qsp, &rxDeviceState);
|
||||||
|
qsp.frameToSend = QSP_FRAME_RX_HEALTH;
|
||||||
|
|
||||||
|
transmitPayload = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef LORA_HARDWARE_SERIAL
|
#ifdef LORA_HARDWARE_SERIAL
|
||||||
if (Serial.available())
|
if (Serial.available())
|
||||||
{
|
{
|
||||||
|
|||||||
30
qsp.cpp
30
qsp.cpp
@@ -54,6 +54,17 @@ void qspComputeCrc(QspConfiguration_t *qsp, uint8_t dataByte)
|
|||||||
qsp->crc ^= dataByte;
|
qsp->crc ^= dataByte;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void encodeRxHealthPayload(QspConfiguration_t *qsp, RxDeviceState_t *rxDeviceState) {
|
||||||
|
qsp->payload[0] = rxDeviceState->rssi;
|
||||||
|
qsp->payload[1] = constrain(rxDeviceState->snr * 10, 0, 255);
|
||||||
|
qsp->payload[2] = rxDeviceState->rxVoltage;
|
||||||
|
qsp->payload[3] = rxDeviceState->a1Voltage;
|
||||||
|
qsp->payload[4] = rxDeviceState->a2Voltage;
|
||||||
|
qsp->payload[5] = qsp->lastReceivedPacketId;
|
||||||
|
|
||||||
|
qsp->payloadLength = 6;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encode 10 RC channels
|
* Encode 10 RC channels
|
||||||
*/
|
*/
|
||||||
@@ -130,6 +141,7 @@ void qspDecodeIncomingFrame(QspConfiguration_t *qsp, uint8_t incomingByte, int p
|
|||||||
|
|
||||||
if (qsp->protocolState == QSP_STATE_IDLE && incomingByte == QSP_PREAMBLE)
|
if (qsp->protocolState == QSP_STATE_IDLE && incomingByte == QSP_PREAMBLE)
|
||||||
{
|
{
|
||||||
|
//FIXME there should be a way to go back to IDLE if frame did not finished decoding in reasonable time
|
||||||
//If in IDLE and correct preamble comes, start to decode frame
|
//If in IDLE and correct preamble comes, start to decode frame
|
||||||
qsp->protocolState = QSP_STATE_PREAMBLE_RECEIVED;
|
qsp->protocolState = QSP_STATE_PREAMBLE_RECEIVED;
|
||||||
qsp->crc = 0 ^ incomingByte;
|
qsp->crc = 0 ^ incomingByte;
|
||||||
@@ -199,15 +211,17 @@ void qspDecodeIncomingFrame(QspConfiguration_t *qsp, uint8_t incomingByte, int p
|
|||||||
qsp->lastFrameReceivedAt[frameId] = millis();
|
qsp->lastFrameReceivedAt[frameId] = millis();
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (frameId) {
|
qsp->lastReceivedPacketId = packetId;
|
||||||
case QSP_FRAME_RC_DATA:
|
|
||||||
qspDecodeRcDataFrame(qsp, ppm);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
switch (frameId) {
|
||||||
//Unknown frame
|
case QSP_FRAME_RC_DATA:
|
||||||
//TODO do something in this case
|
qspDecodeRcDataFrame(qsp, ppm);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
//Unknown frame
|
||||||
|
//TODO do something in this case
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
1
qsp.h
1
qsp.h
@@ -5,6 +5,7 @@ void qspDecodeRcDataFrame(QspConfiguration_t *qsp, int output[]);
|
|||||||
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 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[]);
|
||||||
|
|||||||
12
variables.h
12
variables.h
@@ -6,7 +6,8 @@
|
|||||||
|
|
||||||
#define PPM_CHANNEL_COUNT 10
|
#define PPM_CHANNEL_COUNT 10
|
||||||
|
|
||||||
#define TX_RC_FRAME_RATE 5000 //ms
|
#define RX_RX_HEALTH_FRAME_RATE 5000
|
||||||
|
#define TX_RC_FRAME_RATE 1000 //ms
|
||||||
#define RX_FAILSAFE_DELAY (TX_RC_FRAME_RATE * 4)
|
#define RX_FAILSAFE_DELAY (TX_RC_FRAME_RATE * 4)
|
||||||
|
|
||||||
#define CHANNEL_ID 0x01
|
#define CHANNEL_ID 0x01
|
||||||
@@ -55,4 +56,13 @@ struct QspConfiguration_t {
|
|||||||
uint32_t lastFrameReceivedAt[QSP_FRAME_COUNT] = {0};
|
uint32_t lastFrameReceivedAt[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;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RxDeviceState_t {
|
||||||
|
int rssi = 0;
|
||||||
|
float snr = 0;
|
||||||
|
uint8_t rxVoltage = 0;
|
||||||
|
uint8_t a1Voltage = 0;
|
||||||
|
uint8_t a2Voltage = 0;
|
||||||
};
|
};
|
||||||
Reference in New Issue
Block a user