Rx_health frame encoding, no data is yet acquired from Rx hardware

This commit is contained in:
Pawel Spychalski
2017-10-12 13:29:10 +02:00
parent 0071b7880f
commit 021decff98
5 changed files with 61 additions and 18 deletions

View File

@@ -41,8 +41,9 @@ Total length of `RC_DATA` payload is 9 bytes
| Byte | Description |
| ---- | ---- |
| 0 | RX RSSI |
| 1 | RX SNR |
| 2 | RX supply volatage, sent in 0,1V |
| 3 | RX analog input 1 sent in 0,1V |
| 4 | RX analog input 2 sent in 0,1V |
| 1 | RX RSSI |
| 2 | RX SNR |
| 3 | RX supply volatage, sent in 0,1V |
| 4 | RX analog input 1 sent in 0,1V |
| 5 | RX analog input 2 sent in 0,1V |
| 6 | Last received packet ID |

View File

@@ -52,12 +52,14 @@ bool canTransmit = false;
* Start of QSP protocol implementation
*/
QspConfiguration_t qsp = {};
RxDeviceState_t rxDeviceState = {};
/*
* End of QSP protocol implementation
*/
static uint32_t lastRcFrameTransmit = 0;
static uint32_t lastRxHealthFrameTransmit = 0;
/*
* Serial port used to send data
@@ -250,8 +252,6 @@ void loop(void)
bool transmitPayload = false;
#ifdef DEVICE_MODE_TX
//TODO It should be only possible to transmit when radio is not receiveing
/*
* RC_DATA QSP frame
*/
@@ -268,6 +268,23 @@ void loop(void)
#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
if (Serial.available())
{

14
qsp.cpp
View File

@@ -54,6 +54,17 @@ void qspComputeCrc(QspConfiguration_t *qsp, uint8_t 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
*/
@@ -130,6 +141,7 @@ void qspDecodeIncomingFrame(QspConfiguration_t *qsp, uint8_t incomingByte, int p
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
qsp->protocolState = QSP_STATE_PREAMBLE_RECEIVED;
qsp->crc = 0 ^ incomingByte;
@@ -199,6 +211,8 @@ void qspDecodeIncomingFrame(QspConfiguration_t *qsp, uint8_t incomingByte, int p
qsp->lastFrameReceivedAt[frameId] = millis();
}
qsp->lastReceivedPacketId = packetId;
switch (frameId) {
case QSP_FRAME_RC_DATA:
qspDecodeRcDataFrame(qsp, ppm);

1
qsp.h
View File

@@ -5,6 +5,7 @@ void qspDecodeRcDataFrame(QspConfiguration_t *qsp, int output[]);
uint8_t get10bitHighShift(uint8_t channel);
uint8_t get10bitLowShift(uint8_t channel);
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);
uint8_t qspGetPacketId(void);
void qspDecodeIncomingFrame(QspConfiguration_t *qsp, uint8_t incomingByte, int ppm[]);

View File

@@ -6,7 +6,8 @@
#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 CHANNEL_ID 0x01
@@ -55,4 +56,13 @@ struct QspConfiguration_t {
uint32_t lastFrameReceivedAt[QSP_FRAME_COUNT] = {0};
uint8_t deviceState = DEVICE_STATE_OK;
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;
};