Callback for QSP decoding
This commit is contained in:
52
crossbow.ino
52
crossbow.ino
@@ -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
51
qsp.cpp
@@ -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
3
qsp.h
@@ -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);
|
||||||
|
|||||||
39
variables.h
39
variables.h
@@ -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;
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user