This commit is contained in:
Pawel Spychalski (DzikuVx)
2017-10-22 09:31:46 +02:00
parent 7af49621fc
commit 779b64189a
4 changed files with 62 additions and 16 deletions

View File

@@ -50,15 +50,12 @@ RxDeviceState_t rxDeviceState = {};
* End of QSP protocol implementation * End of QSP protocol implementation
*/ */
static uint32_t lastRcFrameTransmit = 0;
static uint32_t lastRxHealthFrameTransmit = 0;
/* /*
* Serial port used to send data * Serial port used to send data
*/ */
#ifdef LORA_HARDWARE_SERIAL #ifdef LORA_HARDWARE_SERIAL
int getRadioRssi(void) unint8_t getRadioRssi(void)
{ {
return 0; return 0;
} }
@@ -92,14 +89,15 @@ void writeToRadio(uint8_t dataByte, QspConfiguration_t *qsp)
#ifdef LORA_HARDWARE_SPI #ifdef LORA_HARDWARE_SPI
int getRadioRssi(void) uint8_t getRadioRssi(void)
{ {
return LoRa.packetRssi(); //Map from -164:0 to 0:100
return map(constrain(LoRa.packetRssi() * -1, 0, 164), 0, 164, 100, 0);
} }
float getRadioSnr(void) float getRadioSnr(void)
{ {
return LoRa.packetSnr(); return (uint8_t) constrain(LoRa.packetSnr() * 10, 0, 255);
} }
void radioPacketStart(void) void radioPacketStart(void)
@@ -219,6 +217,10 @@ if (!LoRa.begin(868E6))
TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt
sei(); sei();
pinMode(RX_ADC_PIN_1, INPUT);
pinMode(RX_ADC_PIN_2, INPUT);
pinMode(RX_ADC_PIN_3, INPUT);
#endif #endif
pinMode(LED_BUILTIN, OUTPUT); pinMode(LED_BUILTIN, OUTPUT);
@@ -285,6 +287,14 @@ ISR(TIMER1_COMPA_vect) { //leave this alone
} }
} }
void updateRxDeviceState(RxDeviceState_t *rxDeviceState) {
rxDeviceState->rxVoltage = map(analogRead(RX_ADC_PIN_1), 0, 1024, 0, 255);
rxDeviceState->a1Voltage = map(analogRead(RX_ADC_PIN_2), 0, 1024, 0, 255);
rxDeviceState->a2Voltage = map(analogRead(RX_ADC_PIN_3), 0, 1024, 0, 255);
rxDeviceState->rssi = getRadioRssi();
rxDeviceState->snr = getRadioSnr();
}
#endif #endif
void loop(void) void loop(void)
@@ -296,9 +306,13 @@ void loop(void)
/* /*
* RC_DATA QSP frame * RC_DATA QSP frame
*/ */
if (currentMillis - lastRcFrameTransmit > TX_RC_FRAME_RATE && !transmitPayload && qsp.protocolState == QSP_STATE_IDLE) if (
currentMillis - qsp.lastFrameTransmitedAt[QSP_FRAME_RC_DATA] > TX_RC_FRAME_RATE &&
!transmitPayload &&
qsp.protocolState == QSP_STATE_IDLE
)
{ {
lastRcFrameTransmit = currentMillis; qsp.lastFrameTransmitedAt[QSP_FRAME_RC_DATA] = currentMillis;
qspClearPayload(&qsp); qspClearPayload(&qsp);
encodeRcDataPayload(&qsp, &ppmReader, PPM_CHANNEL_COUNT); encodeRcDataPayload(&qsp, &ppmReader, PPM_CHANNEL_COUNT);
@@ -311,11 +325,17 @@ void loop(void)
#ifdef DEVICE_MODE_RX #ifdef DEVICE_MODE_RX
/* /*
* RC_DATA QSP frame * RX_HEALTH QSP frame
*/ */
if (currentMillis - lastRxHealthFrameTransmit > RX_RX_HEALTH_FRAME_RATE && !transmitPayload && qsp.protocolState == QSP_STATE_IDLE) if (
currentMillis - qsp.lastFrameTransmitedAt[QSP_FRAME_RX_HEALTH] > RX_RX_HEALTH_FRAME_RATE &&
!transmitPayload &&
qsp.protocolState == QSP_STATE_IDLE
)
{ {
lastRxHealthFrameTransmit = currentMillis; qsp.lastFrameTransmitedAt[QSP_FRAME_RX_HEALTH] = currentMillis;
updateRxDeviceState(&rxDeviceState);
qspClearPayload(&qsp); qspClearPayload(&qsp);
encodeRxHealthPayload(&qsp, &rxDeviceState); encodeRxHealthPayload(&qsp, &rxDeviceState);
@@ -378,7 +398,7 @@ void onReceive(int packetSize)
while (LoRa.available()) while (LoRa.available())
{ {
qspDecodeIncomingFrame(&qsp, LoRa.read(), ppm); qspDecodeIncomingFrame(&qsp, LoRa.read(), ppm, &rxDeviceState);
} }
} }
#endif #endif

23
qsp.cpp
View File

@@ -56,7 +56,7 @@ void qspComputeCrc(QspConfiguration_t *qsp, uint8_t dataByte)
void encodeRxHealthPayload(QspConfiguration_t *qsp, RxDeviceState_t *rxDeviceState) { void encodeRxHealthPayload(QspConfiguration_t *qsp, RxDeviceState_t *rxDeviceState) {
qsp->payload[0] = rxDeviceState->rssi; qsp->payload[0] = rxDeviceState->rssi;
qsp->payload[1] = constrain(rxDeviceState->snr * 10, 0, 255); qsp->payload[1] = rxDeviceState->snr;
qsp->payload[2] = rxDeviceState->rxVoltage; qsp->payload[2] = rxDeviceState->rxVoltage;
qsp->payload[3] = rxDeviceState->a1Voltage; qsp->payload[3] = rxDeviceState->a1Voltage;
qsp->payload[4] = rxDeviceState->a2Voltage; qsp->payload[4] = rxDeviceState->a2Voltage;
@@ -65,6 +65,15 @@ void encodeRxHealthPayload(QspConfiguration_t *qsp, RxDeviceState_t *rxDeviceSta
qsp->payloadLength = 6; qsp->payloadLength = 6;
} }
void decodeRxHealthPayload(QspConfiguration_t *qsp, RxDeviceState_t *rxDeviceState) {
rxDeviceState->rssi = qsp->payload[0];
rxDeviceState->snr = qsp->payload[1];
rxDeviceState->rxVoltage = qsp->payload[2];
rxDeviceState->a1Voltage = qsp->payload[3];
rxDeviceState->a2Voltage = qsp->payload[4];
// rxDeviceState->rssi = qsp->payload[0]; //TODO we skipped decoding this byte, figure it out
}
/** /**
* Encode 10 RC channels * Encode 10 RC channels
*/ */
@@ -132,7 +141,7 @@ void qspClearPayload(QspConfiguration_t *qsp)
qsp->payloadLength = 0; qsp->payloadLength = 0;
} }
void qspDecodeIncomingFrame(QspConfiguration_t *qsp, uint8_t incomingByte, int ppm[]) void qspDecodeIncomingFrame(QspConfiguration_t *qsp, uint8_t incomingByte, int ppm[], RxDeviceState_t *rxDeviceState)
{ {
static uint8_t frameId; static uint8_t frameId;
static uint8_t payloadLength; static uint8_t payloadLength;
@@ -229,6 +238,16 @@ void qspDecodeIncomingFrame(QspConfiguration_t *qsp, uint8_t incomingByte, int p
qspDecodeRcDataFrame(qsp, ppm); qspDecodeRcDataFrame(qsp, ppm);
break; break;
case QSP_FRAME_RX_HEALTH:
decodeRxHealthPayload(qsp, rxDeviceState);
if (qsp->debugConfig & DEBUG_FLAG_SERIAL) {
Serial.print("RX RSSI: ");
Serial.println(rxDeviceState->rssi);
Serial.print("RX SNR: ");
Serial.println(rxDeviceState->snr);
}
break;
default: default:
//Unknown frame //Unknown frame
//TODO do something in this case //TODO do something in this case

4
qsp.h
View File

@@ -2,12 +2,14 @@
#include <PPMReader.h> #include <PPMReader.h>
void qspDecodeRcDataFrame(QspConfiguration_t *qsp, int output[]); void qspDecodeRcDataFrame(QspConfiguration_t *qsp, int output[]);
void decodeRxHealthPayload(QspConfiguration_t *qsp, RxDeviceState_t *rxDeviceState);
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 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[], RxDeviceState_t *rxDeviceState);
void qspClearPayload(QspConfiguration_t *qsp); void qspClearPayload(QspConfiguration_t *qsp);
void qspEncodeFrame(QspConfiguration_t *qsp); void qspEncodeFrame(QspConfiguration_t *qsp);

View File

@@ -21,6 +21,10 @@
#define QSP_FRAME_SET_RX_CONFIG 0x4 #define QSP_FRAME_SET_RX_CONFIG 0x4
#define QSP_FRAME_COUNT 0x5 #define QSP_FRAME_COUNT 0x5
#define RX_ADC_PIN_1 A0
#define RX_ADC_PIN_2 A1
#define RX_ADC_PIN_3 A2
enum dataStates { enum dataStates {
QSP_STATE_IDLE, QSP_STATE_IDLE,
QSP_STATE_PREAMBLE_RECEIVED, QSP_STATE_PREAMBLE_RECEIVED,
@@ -57,6 +61,7 @@ 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*);
uint8_t lastReceivedPacketId = 0; uint8_t lastReceivedPacketId = 0;