ESP32-PaxCounter/src/senddata.cpp

168 lines
4.1 KiB
C++
Raw Normal View History

2018-07-14 19:12:20 +02:00
// Basic Config
2018-11-03 20:44:54 +01:00
#include "senddata.h"
2018-07-14 19:12:20 +02:00
Ticker sendcycler;
2019-04-13 18:44:25 +02:00
void sendcycle() {
xTaskNotifyFromISR(irqHandlerTask, SENDCYCLE_IRQ, eSetBits, NULL);
}
2018-08-03 23:50:04 +02:00
// put data to send in RTos Queues used for transmit over channels Lora and SPI
void SendPayload(uint8_t port, sendprio_t prio) {
2018-08-04 14:37:41 +02:00
MessageBuffer_t
SendBuffer; // contains MessageSize, MessagePort, MessagePrio, Message[]
SendBuffer.MessageSize = payload.getSize();
SendBuffer.MessagePrio = prio;
2018-11-25 23:39:12 +01:00
switch (PAYLOAD_ENCODER) {
2019-02-24 13:35:22 +01:00
case 1: // plain -> no mapping
case 2: // packed -> no mapping
2018-11-25 23:39:12 +01:00
SendBuffer.MessagePort = port;
break;
2019-02-24 13:35:22 +01:00
case 3: // Cayenne LPP dynamic -> all payload goes out on same port
SendBuffer.MessagePort = CAYENNE_LPP1;
2018-11-25 23:39:12 +01:00
break;
2019-02-24 13:35:22 +01:00
case 4: // Cayenne LPP packed -> we need to map some paxcounter ports
SendBuffer.MessagePort = CAYENNE_LPP2;
switch (SendBuffer.MessagePort) {
case COUNTERPORT:
SendBuffer.MessagePort = CAYENNE_LPP2;
break;
case RCMDPORT:
SendBuffer.MessagePort = CAYENNE_ACTUATOR;
break;
case TIMEPORT:
SendBuffer.MessagePort = CAYENNE_DEVICECONFIG;
break;
}
2018-11-25 23:39:12 +01:00
break;
default:
SendBuffer.MessagePort = port;
}
2019-08-28 21:55:50 +02:00
memcpy(SendBuffer.Message, payload.getBuffer(), SendBuffer.MessageSize);
2018-08-04 14:37:41 +02:00
2019-02-27 00:49:32 +01:00
// enqueue message in device's send queues
2019-03-15 20:20:21 +01:00
#if (HAS_LORA)
lora_enqueuedata(&SendBuffer);
2019-02-27 00:49:32 +01:00
#endif
#ifdef HAS_SPI
spi_enqueuedata(&SendBuffer);
2019-02-27 00:49:32 +01:00
#endif
2018-08-04 14:37:41 +02:00
} // SendPayload
2018-08-04 14:37:41 +02:00
2018-09-21 18:23:34 +02:00
// interrupt triggered function to prepare payload to send
2019-08-30 18:54:53 +02:00
void sendData() {
2018-11-19 00:41:15 +01:00
uint8_t bitmask = cfg.payloadmask;
uint8_t mask = 1;
2019-11-24 18:13:42 +01:00
gpsStatus_t gps_status;
2018-08-04 14:37:41 +02:00
2018-11-19 00:41:15 +01:00
while (bitmask) {
switch (bitmask & mask) {
2018-11-17 22:49:14 +01:00
2019-04-13 18:44:25 +02:00
#if ((WIFICOUNTER) || (BLECOUNTER))
2018-11-19 00:41:15 +01:00
case COUNT_DATA:
payload.reset();
2019-11-19 23:27:12 +01:00
#if !(PAYLOAD_OPENSENSEBOX)
2019-11-21 21:34:54 +01:00
if (cfg.wifiscan)
2018-12-02 14:08:50 +01:00
payload.addCount(macs_wifi, MAC_SNIFF_WIFI);
if (cfg.blescan)
payload.addCount(macs_ble, MAC_SNIFF_BLE);
2019-11-19 23:27:12 +01:00
#endif
2019-11-24 18:13:42 +01:00
#if (HAS_GPS)
if (GPSPORT == COUNTERPORT) {
// send GPS position only if we have a fix
if (gps.location.isValid()) {
gps_storelocation(&gps_status);
payload.addGPS(gps_status);
} else
ESP_LOGD(TAG, "No valid GPS position");
}
2019-11-19 23:27:12 +01:00
#endif
#if (PAYLOAD_OPENSENSEBOX)
2019-11-21 21:34:54 +01:00
if (cfg.wifiscan)
2019-11-19 23:27:12 +01:00
payload.addCount(macs_wifi, MAC_SNIFF_WIFI);
if (cfg.blescan)
payload.addCount(macs_ble, MAC_SNIFF_BLE);
#endif
SendPayload(COUNTERPORT, prio_normal);
2018-11-19 00:41:15 +01:00
// clear counter if not in cumulative counter mode
if (cfg.countermode != 1) {
reset_counters(); // clear macs container and reset all counters
get_salt(); // get new salt for salting hashes
ESP_LOGI(TAG, "Counter cleared");
}
2019-10-01 18:06:49 +02:00
#ifdef HAS_DISPLAY
else
oledPlotCurve(macs.size(), true);
#endif
2018-11-19 00:41:15 +01:00
break;
2019-04-13 18:44:25 +02:00
#endif
2018-11-19 00:41:15 +01:00
2019-03-15 20:20:21 +01:00
#if (HAS_BME)
case MEMS_DATA:
payload.reset();
2018-11-19 00:41:15 +01:00
payload.addBME(bme_status);
SendPayload(BMEPORT, prio_normal);
2018-11-19 00:41:15 +01:00
break;
#endif
2018-11-19 00:41:15 +01:00
2019-11-24 18:13:42 +01:00
#if (HAS_GPS)
case GPS_DATA:
2019-11-24 18:13:42 +01:00
if (GPSPORT != COUNTERPORT) {
// send GPS position only if we have a fix
if (gps.location.isValid()) {
gps_storelocation(&gps_status);
payload.reset();
payload.addGPS(gps_status);
SendPayload(GPSPORT, prio_high);
} else
ESP_LOGD(TAG, "No valid GPS position");
}
break;
2018-11-19 00:41:15 +01:00
#endif
2019-03-15 20:20:21 +01:00
#if (HAS_SENSORS)
case SENSOR1_DATA:
payload.reset();
payload.addSensor(sensor_read(1));
SendPayload(SENSOR1PORT, prio_normal);
break;
case SENSOR2_DATA:
payload.reset();
payload.addSensor(sensor_read(2));
SendPayload(SENSOR2PORT, prio_normal);
break;
case SENSOR3_DATA:
payload.reset();
payload.addSensor(sensor_read(3));
SendPayload(SENSOR3PORT, prio_normal);
2018-11-19 00:41:15 +01:00
break;
2018-11-27 11:21:20 +01:00
#endif
2018-11-19 00:41:15 +01:00
#if (defined BAT_MEASURE_ADC || defined HAS_PMU)
2018-11-27 11:21:20 +01:00
case BATT_DATA:
payload.reset();
2018-11-27 11:21:20 +01:00
payload.addVoltage(read_voltage());
SendPayload(BATTPORT, prio_normal);
break;
#endif
2018-11-19 00:41:15 +01:00
} // switch
bitmask &= ~mask;
mask <<= 1;
} // while (bitmask)
2019-08-30 18:54:53 +02:00
} // sendData()
2018-08-04 14:37:41 +02:00
2018-08-05 12:16:54 +02:00
void flushQueues() {
2019-03-15 20:20:21 +01:00
#if (HAS_LORA)
2018-11-03 20:29:02 +01:00
lora_queuereset();
2019-02-27 00:49:32 +01:00
#endif
#ifdef HAS_SPI
spi_queuereset();
2019-02-27 00:49:32 +01:00
#endif
2018-08-05 12:16:54 +02:00
}