Callback for QSP decoding

This commit is contained in:
Pawel Spychalski
2017-11-16 16:12:20 +01:00
parent 9d609dfa77
commit 3778fcd0cd
4 changed files with 78 additions and 67 deletions

View File

@@ -1,5 +1,5 @@
// #define DEVICE_MODE_TX #define DEVICE_MODE_TX
#define DEVICE_MODE_RX // #define DEVICE_MODE_RX
#define FEATURE_TX_OLED #define FEATURE_TX_OLED
#define FORCE_TX_WITHOUT_INPUT #define FORCE_TX_WITHOUT_INPUT
@@ -79,6 +79,50 @@ void writeToRadio(uint8_t dataByte, QspConfiguration_t *qsp)
LoRa.write(dataByte); LoRa.write(dataByte);
} }
void onQspSuccess(QspConfiguration_t *qsp, TxDeviceState_t *txDeviceState, RxDeviceState_t *rxDeviceState, RadioState_t *radioState) {
//If devide received a valid frame, that means it can start to talk
qsp->canTransmit = true;
//Store the last timestamp when frame was received
if (qsp->frameId < QSP_FRAME_COUNT) {
qsp->lastFrameReceivedAt[qsp->frameId] = millis();
}
qsp->anyFrameRecivedAt = millis();
switch (qsp->frameId) {
case QSP_FRAME_RC_DATA:
qspDecodeRcDataFrame(qsp, rxDeviceState);
break;
case QSP_FRAME_RX_HEALTH:
decodeRxHealthPayload(qsp, rxDeviceState);
break;
case QSP_FRAME_PING:
qsp->forcePongFrame = true;
break;
case QSP_FRAME_PONG:
txDeviceState->roundtrip = qsp->payload[0];
txDeviceState->roundtrip += (uint32_t) qsp->payload[1] << 8;
txDeviceState->roundtrip += (uint32_t) qsp->payload[2] << 16;
txDeviceState->roundtrip += (uint32_t) qsp->payload[3] << 24;
txDeviceState->roundtrip = (micros() - txDeviceState->roundtrip) / 1000;
break;
default:
//Unknown frame
//TODO do something in this case
break;
}
qsp->transmitWindowOpen = true;
}
void onQspFailure(QspConfiguration_t *qsp, TxDeviceState_t *txDeviceState, RxDeviceState_t *rxDeviceState, RadioState_t *radioState) {
}
void setup(void) void setup(void)
{ {
#ifdef DEBUG_SERIAL #ifdef DEBUG_SERIAL
@@ -86,6 +130,8 @@ void setup(void)
#endif #endif
qsp.hardwareWriteFunction = writeToRadio; qsp.hardwareWriteFunction = writeToRadio;
qsp.onSuccessCallback = onQspSuccess;
qsp.onFailureCallback = onQspFailure;
#ifdef DEVICE_MODE_RX #ifdef DEVICE_MODE_RX
qsp.deviceState = DEVICE_STATE_FAILSAFE; qsp.deviceState = DEVICE_STATE_FAILSAFE;
@@ -215,7 +261,7 @@ void loop(void)
if (radioState.bytesToRead != NO_DATA_TO_READ) { if (radioState.bytesToRead != NO_DATA_TO_READ) {
for (uint8_t i = 0; i < radioState.bytesToRead; i++) { for (uint8_t i = 0; i < radioState.bytesToRead; i++) {
qspDecodeIncomingFrame(&qsp, radioState.data[i], &rxDeviceState, &txDeviceState); qspDecodeIncomingFrame(&qsp, radioState.data[i], &rxDeviceState, &txDeviceState, &radioState);
} }
radioState.bytesToRead = NO_DATA_TO_READ; radioState.bytesToRead = NO_DATA_TO_READ;

51
qsp.cpp
View File

@@ -160,7 +160,8 @@ void qspDecodeIncomingFrame(
QspConfiguration_t *qsp, QspConfiguration_t *qsp,
uint8_t incomingByte, uint8_t incomingByte,
RxDeviceState_t *rxDeviceState, RxDeviceState_t *rxDeviceState,
TxDeviceState_t *txDeviceState TxDeviceState_t *txDeviceState,
RadioState_t *radioState
) { ) {
static uint8_t frameId; static uint8_t frameId;
static uint8_t payloadLength; static uint8_t payloadLength;
@@ -189,7 +190,7 @@ void qspDecodeIncomingFrame(
//Frame ID and payload length //Frame ID and payload length
qspComputeCrc(qsp, incomingByte); qspComputeCrc(qsp, incomingByte);
frameId = (incomingByte >> 4) & 0x0f; qsp->frameId = (incomingByte >> 4) & 0x0f;
payloadLength = incomingByte & 0x0f; payloadLength = incomingByte & 0x0f;
qsp->protocolState = QSP_STATE_FRAME_TYPE_RECEIVED; qsp->protocolState = QSP_STATE_FRAME_TYPE_RECEIVED;
@@ -216,49 +217,9 @@ void qspDecodeIncomingFrame(
{ {
if (qsp->crc == incomingByte) { if (qsp->crc == incomingByte) {
//CRC is correct //CRC is correct
qsp->onSuccessCallback(qsp, txDeviceState, rxDeviceState, radioState);
//If devide received a valid frame, that means it can start to talk } else {
qsp->canTransmit = true; qsp->onFailureCallback(qsp, txDeviceState, rxDeviceState, radioState);
//Store the last timestamp when frame was received
if (frameId < QSP_FRAME_COUNT) {
qsp->lastFrameReceivedAt[frameId] = millis();
}
qsp->anyFrameRecivedAt = millis();
switch (frameId) {
case QSP_FRAME_RC_DATA:
qspDecodeRcDataFrame(qsp, rxDeviceState);
break;
case QSP_FRAME_RX_HEALTH:
decodeRxHealthPayload(qsp, rxDeviceState);
break;
case QSP_FRAME_PING:
qsp->forcePongFrame = true;
break;
case QSP_FRAME_PONG:
txDeviceState->roundtrip = qsp->payload[0];
txDeviceState->roundtrip += (uint32_t) qsp->payload[1] << 8;
txDeviceState->roundtrip += (uint32_t) qsp->payload[2] << 16;
txDeviceState->roundtrip += (uint32_t) qsp->payload[3] << 24;
txDeviceState->roundtrip = (micros() - txDeviceState->roundtrip) / 1000;
break;
default:
//Unknown frame
//TODO do something in this case
break;
}
qsp->transmitWindowOpen = true;
}
else
{
//CRC failed, frame has to be rejected
//TODO do something in this case or something
} }
// In both cases switch to listening for next preamble // In both cases switch to listening for next preamble

3
qsp.h
View File

@@ -13,7 +13,8 @@ void qspDecodeIncomingFrame(
QspConfiguration_t *qsp, QspConfiguration_t *qsp,
uint8_t incomingByte, uint8_t incomingByte,
RxDeviceState_t *rxDeviceState, RxDeviceState_t *rxDeviceState,
TxDeviceState_t *txDeviceState TxDeviceState_t *txDeviceState,
RadioState_t *radioState
); );
void qspClearPayload(QspConfiguration_t *qsp); void qspClearPayload(QspConfiguration_t *qsp);
void qspEncodeFrame(QspConfiguration_t *qsp); void qspEncodeFrame(QspConfiguration_t *qsp);

View File

@@ -85,24 +85,6 @@ struct RadioState_t {
uint8_t data[20] = {0}; //Max size of packet that can be processed in QSP uint8_t data[20] = {0}; //Max size of packet that can be processed in QSP
}; };
struct QspConfiguration_t {
uint8_t protocolState = QSP_STATE_IDLE;
uint8_t crc = 0;
uint8_t payload[QSP_PAYLOAD_LENGTH] = {0};
uint8_t payloadLength = 0;
uint8_t frameToSend = 0;
uint32_t lastFrameReceivedAt[QSP_FRAME_COUNT] = {0};
uint32_t anyFrameRecivedAt = 0;
uint8_t deviceState = DEVICE_STATE_UNDETERMINED;
void (* hardwareWriteFunction)(uint8_t, QspConfiguration_t*);
bool canTransmit = false;
bool forcePongFrame = false;
uint8_t debugConfig = 0;
uint32_t frameDecodingStartedAt = 0;
uint32_t lastTxSlotTimestamp = 0;
bool transmitWindowOpen = false;
};
struct TxDeviceState_t { struct TxDeviceState_t {
uint8_t flags = 0; uint8_t flags = 0;
uint32_t roundtrip = 0; uint32_t roundtrip = 0;
@@ -118,3 +100,24 @@ struct RxDeviceState_t {
uint8_t flags = 0; uint8_t flags = 0;
int16_t channels[16] = {}; int16_t channels[16] = {};
}; };
struct QspConfiguration_t {
uint8_t protocolState = QSP_STATE_IDLE;
uint8_t crc = 0;
uint8_t payload[QSP_PAYLOAD_LENGTH] = {0};
uint8_t payloadLength = 0;
uint8_t frameToSend = 0;
uint8_t frameId = 0;
uint32_t lastFrameReceivedAt[QSP_FRAME_COUNT] = {0};
uint32_t anyFrameRecivedAt = 0;
uint8_t deviceState = DEVICE_STATE_UNDETERMINED;
void (* hardwareWriteFunction)(uint8_t, QspConfiguration_t*);
void (* onSuccessCallback)(QspConfiguration_t*, TxDeviceState_t*, RxDeviceState_t*, RadioState_t*);
void (* onFailureCallback)(QspConfiguration_t*, TxDeviceState_t*, RxDeviceState_t*, RadioState_t*);
bool canTransmit = false;
bool forcePongFrame = false;
uint8_t debugConfig = 0;
uint32_t frameDecodingStartedAt = 0;
uint32_t lastTxSlotTimestamp = 0;
bool transmitWindowOpen = false;
};