Sloted approach on TX side
This commit is contained in:
249
crossbow.ino
249
crossbow.ino
@@ -1,12 +1,12 @@
|
|||||||
#define LORA_HARDWARE_SPI
|
#define LORA_HARDWARE_SPI
|
||||||
|
|
||||||
// #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 DEBUG_SERIAL
|
#define DEBUG_SERIAL
|
||||||
#define DEBUG_PING_PONG
|
// #define DEBUG_PING_PONG
|
||||||
// #define DEBUG_LED
|
// #define DEBUG_LED
|
||||||
// #define WAIT_FOR_SERIAL
|
// #define WAIT_FOR_SERIAL
|
||||||
|
|
||||||
@@ -91,14 +91,6 @@ void writeToRadio(uint8_t dataByte, QspConfiguration_t *qsp)
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
display.clearDisplay();
|
|
||||||
display.setCursor(0,0);
|
|
||||||
display.print("Lat:");
|
|
||||||
display.print(remoteData.latitude);
|
|
||||||
display.display();
|
|
||||||
*/
|
|
||||||
|
|
||||||
void setup(void)
|
void setup(void)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_SERIAL
|
#ifdef DEBUG_SERIAL
|
||||||
@@ -193,6 +185,47 @@ void setup(void)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int8_t txSendSequence[16] = {
|
||||||
|
QSP_FRAME_PING,
|
||||||
|
QSP_FRAME_RC_DATA,
|
||||||
|
QSP_FRAME_RC_DATA,
|
||||||
|
QSP_FRAME_RC_DATA,
|
||||||
|
QSP_FRAME_RC_DATA,
|
||||||
|
QSP_FRAME_RC_DATA,
|
||||||
|
QSP_FRAME_RC_DATA,
|
||||||
|
QSP_FRAME_RC_DATA,
|
||||||
|
QSP_FRAME_RC_DATA,
|
||||||
|
QSP_FRAME_RC_DATA,
|
||||||
|
QSP_FRAME_RC_DATA,
|
||||||
|
QSP_FRAME_RC_DATA,
|
||||||
|
QSP_FRAME_RC_DATA,
|
||||||
|
QSP_FRAME_RC_DATA,
|
||||||
|
QSP_FRAME_RC_DATA,
|
||||||
|
QSP_FRAME_RC_DATA
|
||||||
|
};
|
||||||
|
|
||||||
|
int8_t rxSendSequence[16] = {
|
||||||
|
QSP_FRAME_RX_HEALTH,
|
||||||
|
-1,
|
||||||
|
-1,
|
||||||
|
-1,
|
||||||
|
-1,
|
||||||
|
-1,
|
||||||
|
-1,
|
||||||
|
-1,
|
||||||
|
QSP_FRAME_RX_HEALTH,
|
||||||
|
-1,
|
||||||
|
-1,
|
||||||
|
-1,
|
||||||
|
-1,
|
||||||
|
-1,
|
||||||
|
-1,
|
||||||
|
-1
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t currentSequenceIndex = 0;
|
||||||
|
#define TRANSMIT_SEQUENCE_COUNT 16
|
||||||
|
|
||||||
#ifdef DEVICE_MODE_RX
|
#ifdef DEVICE_MODE_RX
|
||||||
|
|
||||||
void updateRxDeviceState(RxDeviceState_t *rxDeviceState) {
|
void updateRxDeviceState(RxDeviceState_t *rxDeviceState) {
|
||||||
@@ -203,6 +236,30 @@ void updateRxDeviceState(RxDeviceState_t *rxDeviceState) {
|
|||||||
rxDeviceState->snr = getRadioSnr();
|
rxDeviceState->snr = getRadioSnr();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int8_t getFrameToTransmit() {
|
||||||
|
int8_t retVal = rxSendSequence[currentSequenceIndex];
|
||||||
|
|
||||||
|
currentSequenceIndex++;
|
||||||
|
if (currentSequenceIndex >= TRANSMIT_SEQUENCE_COUNT) {
|
||||||
|
currentSequenceIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DEVICE_MODE_TX
|
||||||
|
int8_t getFrameToTransmit() {
|
||||||
|
int8_t retVal = txSendSequence[currentSequenceIndex];
|
||||||
|
|
||||||
|
currentSequenceIndex++;
|
||||||
|
if (currentSequenceIndex >= TRANSMIT_SEQUENCE_COUNT) {
|
||||||
|
currentSequenceIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void loop(void)
|
void loop(void)
|
||||||
@@ -220,18 +277,53 @@ void loop(void)
|
|||||||
qsp.protocolState = QSP_STATE_IDLE;
|
qsp.protocolState = QSP_STATE_IDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef DEVICE_MODE_TX
|
||||||
|
|
||||||
if (
|
if (
|
||||||
qsp.forcePongFrame &&
|
abs(currentMillis - qsp.lastTxSlotTimestamp) > TX_TRANSMIT_SLOT_RATE &&
|
||||||
!transmitPayload &&
|
|
||||||
qsp.protocolState == QSP_STATE_IDLE
|
qsp.protocolState == QSP_STATE_IDLE
|
||||||
)
|
) {
|
||||||
{
|
|
||||||
qsp.forcePongFrame = false;
|
int8_t frameToSend = getFrameToTransmit();
|
||||||
qsp.lastFrameTransmitedAt[QSP_FRAME_PONG] = currentMillis;
|
|
||||||
qsp.frameToSend = QSP_FRAME_PONG;
|
if (frameToSend == QSP_FRAME_RC_DATA && !ppmReader.isReceiving()) {
|
||||||
transmitPayload = true;
|
frameToSend = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (frameToSend > -1) {
|
||||||
|
|
||||||
|
qsp.frameToSend = frameToSend;
|
||||||
|
qspClearPayload(&qsp);
|
||||||
|
|
||||||
|
switch (qsp.frameToSend) {
|
||||||
|
case QSP_FRAME_PING:
|
||||||
|
encodePingPayload(&qsp, micros());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case QSP_FRAME_RC_DATA:
|
||||||
|
encodeRcDataPayload(&qsp, &ppmReader, PPM_INPUT_CHANNEL_COUNT);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
transmitPayload = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
qsp.lastTxSlotTimestamp = currentMillis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// if (
|
||||||
|
// qsp.forcePongFrame &&
|
||||||
|
// !transmitPayload &&
|
||||||
|
// qsp.protocolState == QSP_STATE_IDLE
|
||||||
|
// )
|
||||||
|
// {
|
||||||
|
// qsp.forcePongFrame = false;
|
||||||
|
// qsp.frameToSend = QSP_FRAME_PONG;
|
||||||
|
// transmitPayload = true;
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEVICE_MODE_TX
|
#ifdef DEVICE_MODE_TX
|
||||||
|
|
||||||
@@ -269,104 +361,55 @@ void loop(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DEBUG_PING_PONG
|
|
||||||
//PING frame
|
|
||||||
if (
|
|
||||||
currentMillis - qsp.lastFrameTransmitedAt[QSP_FRAME_PING] > TX_PING_RATE &&
|
|
||||||
!transmitPayload &&
|
|
||||||
qsp.protocolState == QSP_STATE_IDLE
|
|
||||||
)
|
|
||||||
{
|
|
||||||
qsp.lastFrameTransmitedAt[QSP_FRAME_PING] = currentMillis;
|
|
||||||
|
|
||||||
qspClearPayload(&qsp);
|
|
||||||
encodePingPayload(&qsp, micros());
|
|
||||||
qsp.frameToSend = QSP_FRAME_PING;
|
|
||||||
|
|
||||||
transmitPayload = true;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
// #ifdef DEVICE_MODE_RX
|
||||||
* RC_DATA QSP frame
|
|
||||||
*/
|
|
||||||
if (
|
|
||||||
currentMillis - qsp.lastFrameTransmitedAt[QSP_FRAME_RC_DATA] > TX_RC_FRAME_RATE &&
|
|
||||||
!transmitPayload &&
|
|
||||||
qsp.protocolState == QSP_STATE_IDLE &&
|
|
||||||
ppmReader.isReceiving()
|
|
||||||
)
|
|
||||||
{
|
|
||||||
qsp.lastFrameTransmitedAt[QSP_FRAME_RC_DATA] = currentMillis;
|
|
||||||
|
|
||||||
qspClearPayload(&qsp);
|
// if (currentMillis > sbusTime) {
|
||||||
encodeRcDataPayload(&qsp, &ppmReader, PPM_INPUT_CHANNEL_COUNT);
|
// sbusPreparePacket(sbusPacket, ppm, false, (qsp.deviceState == DEVICE_STATE_FAILSAFE));
|
||||||
qsp.frameToSend = QSP_FRAME_RC_DATA;
|
// Serial1.write(sbusPacket, SBUS_PACKET_LENGTH);
|
||||||
|
|
||||||
transmitPayload = true;
|
// sbusTime = currentMillis + SBUS_UPDATE_RATE;
|
||||||
}
|
// }
|
||||||
|
|
||||||
#endif
|
// /*
|
||||||
|
// * This routine updates RX device state and updates one of radio channels with RSSI value
|
||||||
|
// */
|
||||||
|
// if (currentMillis - lastRxStateTaskTime > RX_TASK_HEALTH) {
|
||||||
|
// lastRxStateTaskTime = currentMillis;
|
||||||
|
// updateRxDeviceState(&rxDeviceState);
|
||||||
|
// ppm[RSSI_CHANNEL - 1] = map(rxDeviceState.rssi, 0, 255, 1000, 2000);
|
||||||
|
|
||||||
#ifdef DEVICE_MODE_RX
|
// if (qsp.deviceState == DEVICE_STATE_FAILSAFE) {
|
||||||
|
// digitalWrite(LED_BUILTIN, HIGH);
|
||||||
|
// } else {
|
||||||
|
// digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
|
||||||
|
// }
|
||||||
|
|
||||||
if (currentMillis > sbusTime) {
|
// }
|
||||||
sbusPreparePacket(sbusPacket, ppm, false, (qsp.deviceState == DEVICE_STATE_FAILSAFE));
|
|
||||||
Serial1.write(sbusPacket, SBUS_PACKET_LENGTH);
|
|
||||||
|
|
||||||
sbusTime = currentMillis + SBUS_UPDATE_RATE;
|
// /*
|
||||||
}
|
// * RX_HEALTH QSP frame
|
||||||
|
// */
|
||||||
|
// if (
|
||||||
|
// currentMillis - qsp.lastFrameTransmitedAt[QSP_FRAME_RX_HEALTH] > RX_RX_HEALTH_FRAME_RATE &&
|
||||||
|
// !transmitPayload &&
|
||||||
|
// qsp.protocolState == QSP_STATE_IDLE
|
||||||
|
// )
|
||||||
|
// {
|
||||||
|
// qspClearPayload(&qsp);
|
||||||
|
// encodeRxHealthPayload(&qsp, &rxDeviceState);
|
||||||
|
// qsp.frameToSend = QSP_FRAME_RX_HEALTH;
|
||||||
|
|
||||||
/*
|
// transmitPayload = true;
|
||||||
* This routine updates RX device state and updates one of radio channels with RSSI value
|
// }
|
||||||
*/
|
// #endif
|
||||||
if (currentMillis - lastRxStateTaskTime > RX_TASK_HEALTH) {
|
|
||||||
lastRxStateTaskTime = currentMillis;
|
|
||||||
updateRxDeviceState(&rxDeviceState);
|
|
||||||
ppm[RSSI_CHANNEL - 1] = map(rxDeviceState.rssi, 0, 255, 1000, 2000);
|
|
||||||
|
|
||||||
if (qsp.deviceState == DEVICE_STATE_FAILSAFE) {
|
|
||||||
digitalWrite(LED_BUILTIN, HIGH);
|
|
||||||
} else {
|
|
||||||
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* RX_HEALTH QSP frame
|
|
||||||
*/
|
|
||||||
if (
|
|
||||||
currentMillis - qsp.lastFrameTransmitedAt[QSP_FRAME_RX_HEALTH] > RX_RX_HEALTH_FRAME_RATE &&
|
|
||||||
!transmitPayload &&
|
|
||||||
qsp.protocolState == QSP_STATE_IDLE
|
|
||||||
)
|
|
||||||
{
|
|
||||||
qsp.lastFrameTransmitedAt[QSP_FRAME_RX_HEALTH] = currentMillis;
|
|
||||||
qspClearPayload(&qsp);
|
|
||||||
encodeRxHealthPayload(&qsp, &rxDeviceState);
|
|
||||||
qsp.frameToSend = QSP_FRAME_RX_HEALTH;
|
|
||||||
|
|
||||||
transmitPayload = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (qsp.canTransmit && transmitPayload)
|
if (qsp.canTransmit && transmitPayload)
|
||||||
{
|
{
|
||||||
radioPacketStart();
|
radioPacketStart();
|
||||||
qspEncodeFrame(&qsp);
|
qspEncodeFrame(&qsp);
|
||||||
radioPacketEnd();
|
radioPacketEnd();
|
||||||
|
|
||||||
#ifdef DEBUG_LED
|
|
||||||
digitalWrite(LED_BUILTIN, HIGH);
|
|
||||||
delay(10);
|
|
||||||
digitalWrite(LED_BUILTIN, LOW);
|
|
||||||
delay(70);
|
|
||||||
digitalWrite(LED_BUILTIN, HIGH);
|
|
||||||
delay(10);
|
|
||||||
digitalWrite(LED_BUILTIN, LOW);
|
|
||||||
#endif
|
|
||||||
transmitPayload = false;
|
transmitPayload = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,8 +12,8 @@
|
|||||||
#define RSSI_CHANNEL 11
|
#define RSSI_CHANNEL 11
|
||||||
|
|
||||||
#define RX_RX_HEALTH_FRAME_RATE 503
|
#define RX_RX_HEALTH_FRAME_RATE 503
|
||||||
#define TX_RC_FRAME_RATE 50 //ms
|
#define TX_TRANSMIT_SLOT_RATE 57 //ms
|
||||||
#define RX_FAILSAFE_DELAY (TX_RC_FRAME_RATE * 8)
|
#define RX_FAILSAFE_DELAY (TX_TRANSMIT_SLOT_RATE * 8)
|
||||||
|
|
||||||
#define TX_PING_RATE 2007
|
#define TX_PING_RATE 2007
|
||||||
|
|
||||||
@@ -75,13 +75,13 @@ 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*);
|
||||||
bool canTransmit = false;
|
bool canTransmit = false;
|
||||||
bool forcePongFrame = false;
|
bool forcePongFrame = false;
|
||||||
uint8_t debugConfig = 0;
|
uint8_t debugConfig = 0;
|
||||||
uint32_t frameDecodingStartedAt = 0;
|
uint32_t frameDecodingStartedAt = 0;
|
||||||
|
uint32_t lastTxSlotTimestamp = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RxDeviceState_t {
|
struct RxDeviceState_t {
|
||||||
|
|||||||
Reference in New Issue
Block a user