ESP32-PaxCounter/src/senddata.cpp

121 lines
3.8 KiB
C++
Raw Normal View History

2018-07-14 19:12:20 +02:00
// Basic Config
#include "globals.h"
2018-08-03 23:50:04 +02:00
// put data to send in RTos Queues used for transmit over channels Lora and SPI
2018-08-04 15:27:58 +02:00
void SendData(uint8_t port) {
2018-08-04 14:37:41 +02:00
MessageBuffer_t SendBuffer;
SendBuffer.MessageSize = payload.getSize();
SendBuffer.MessagePort = PAYLOAD_ENCODER <= 2
? port
: (PAYLOAD_ENCODER == 4 ? LPP2PORT : LPP1PORT);
memcpy(SendBuffer.Message, payload.getBuffer(), payload.getSize());
2018-08-04 14:37:41 +02:00
// enqueue message in LoRa send queue
#ifdef HAS_LORA
if (xQueueSendToBack(LoraSendQueue, (void *)&SendBuffer, (TickType_t)0) ==
pdTRUE)
2018-08-04 15:27:58 +02:00
ESP_LOGI(TAG, "%d bytes enqueued to send on LoRa", payload.getSize());
2018-08-04 14:37:41 +02:00
#endif
// enqueue message in SPI send queue
#ifdef HAS_SPI
if (xQueueSendToBack(SPISendQueue, (void *)&SendBuffer, (TickType_t)0) ==
pdTRUE)
2018-08-04 15:27:58 +02:00
ESP_LOGI(TAG, "%d bytes enqueued to send on SPI", payload.getSize());
2018-08-04 14:37:41 +02:00
#endif
// clear counter if not in cumulative counter mode
if ((port == COUNTERPORT) && (cfg.countermode != 1)) {
reset_counters(); // clear macs container and reset all counters
reset_salt(); // get new salt for salting hashes
ESP_LOGI(TAG, "Counter cleared");
}
2018-08-04 15:27:58 +02:00
} // SendData
2018-08-04 14:37:41 +02:00
// cyclic called function to prepare payload to send
void sendPayload() {
2018-08-04 14:37:41 +02:00
if (SendCycleTimerIRQ) {
portENTER_CRITICAL(&timerMux);
SendCycleTimerIRQ = 0;
portEXIT_CRITICAL(&timerMux);
// append counter data to payload
payload.reset();
payload.addCount(macs_wifi, cfg.blescan ? macs_ble : 0);
// append GPS data, if present
#ifdef HAS_GPS
// show NMEA data in debug mode, useful for debugging GPS on board
// connection
ESP_LOGD(TAG, "GPS NMEA data: passed %d / failed: %d / with fix: %d",
gps.passedChecksum(), gps.failedChecksum(),
gps.sentencesWithFix());
// log GPS position if we have a fix and gps data mode is enabled
if ((cfg.gpsmode) && (gps.location.isValid())) {
gps_read();
payload.addGPS(gps_status);
ESP_LOGD(TAG, "lat=%.6f | lon=%.6f | %u Sats | HDOP=%.1f | Altitude=%um",
gps_status.latitude / (float)1e6,
gps_status.longitude / (float)1e6, gps_status.satellites,
gps_status.hdop / (float)100, gps_status.altitude);
} else {
ESP_LOGD(TAG, "No valid GPS position or GPS data mode disabled");
}
#endif
2018-08-04 15:27:58 +02:00
SendData(COUNTERPORT);
2018-08-04 14:37:41 +02:00
}
} // sendpayload()
// interrupt handler used for payload send cycle timer
void IRAM_ATTR SendCycleIRQ() {
portENTER_CRITICAL(&timerMux);
SendCycleTimerIRQ++;
portEXIT_CRITICAL(&timerMux);
}
// cyclic called function to eat data from RTos send queues and transmit it
void processSendBuffer() {
int m1 = 0, m2 = 0;
m1 = ESP.getFreeHeap();
MessageBuffer_t SendBuffer;
2018-08-04 14:37:41 +02:00
#ifdef HAS_LORA
// Check if there is a pending TX/RX job running
if ((LMIC.opmode & (OP_JOINING | OP_REJOIN | OP_TXDATA | OP_POLL)) != 0) {
// LoRa Busy -> don't eat data from queue, since it cannot be sent
} else {
if (xQueueReceive(LoraSendQueue, &SendBuffer, (TickType_t)0) == pdTRUE) {
2018-08-08 00:05:38 +02:00
// SendBuffer gets struct MessageBuffer with next payload from queue
LMIC_setTxData2(SendBuffer.MessagePort, SendBuffer.Message,
SendBuffer.MessageSize, (cfg.countermode & 0x02));
2018-08-11 19:12:04 +02:00
//ESP_LOGI(TAG, "%d bytes sent to LoRa", SendBuffer.MessageSize);
2018-08-04 14:37:41 +02:00
sprintf(display_line7, "PACKET QUEUED");
}
}
#endif
#ifdef HAS_SPI
if (xQueueReceive(SPISendQueue, &SendBuffer, (TickType_t)0) == pdTRUE) {
2018-08-11 19:12:04 +02:00
//ESP_LOGI(TAG, "%d bytes sent to SPI", SendBuffer.MessageSize);
2018-08-04 14:37:41 +02:00
}
#endif
m2 = ESP.getFreeHeap();
if (m2 - m1)
2018-08-11 19:12:04 +02:00
ESP_LOGI(TAG, "processSendBuffer consumed %d bytes", m2 - m1);
2018-08-04 14:37:41 +02:00
} // processSendBuffer
2018-08-05 12:16:54 +02:00
void flushQueues() {
2018-08-03 23:50:04 +02:00
#ifdef HAS_LORA
2018-08-08 00:05:38 +02:00
xQueueReset(LoraSendQueue);
2018-08-03 23:50:04 +02:00
#endif
#ifdef HAS_SPI
2018-08-08 00:05:38 +02:00
xQueueReset(SPISendQueue);
2018-08-03 23:50:04 +02:00
#endif
2018-08-05 12:16:54 +02:00
}