ESP32-PaxCounter/src/cyclic.cpp

162 lines
4.6 KiB
C++
Raw Normal View History

2018-07-22 20:27:58 +02:00
/* This routine is called by interrupt in regular intervals */
/* Interval can be set in paxcounter.conf (HOMECYCLE) */
// Basic config
2018-10-03 23:07:22 +02:00
#include "cyclic.h"
2018-07-22 20:27:58 +02:00
// Local logging tag
2019-02-27 00:52:27 +01:00
static const char TAG[] = __FILE__;
2018-07-22 20:27:58 +02:00
Ticker housekeeper;
2020-02-03 15:29:32 +01:00
#if (HAS_SDS011)
extern boolean isSDS011Active;
#endif
void setCyclicIRQ() {
2019-04-13 18:44:25 +02:00
xTaskNotifyFromISR(irqHandlerTask, CYCLIC_IRQ, eSetBits, NULL);
}
2018-07-22 20:27:58 +02:00
// do all housekeeping
2018-09-21 18:23:34 +02:00
void doHousekeeping() {
2018-07-25 00:17:31 +02:00
// update uptime counter
uptime();
2018-09-15 18:59:20 +02:00
// check if update mode trigger switch was set
if (RTC_runmode == RUNMODE_UPDATE) {
// check battery status if we can before doing ota
2019-12-25 23:22:11 +01:00
if (batt_sufficient()) {
do_reset(true); // warmstart to runmode update
2019-12-25 23:22:11 +01:00
} else {
2020-04-11 21:30:09 +02:00
ESP_LOGE(TAG, "Battery level %d%% is too low for OTA", batt_level);
2019-12-25 23:22:11 +01:00
RTC_runmode = RUNMODE_NORMAL; // keep running in normal mode
}
}
// task storage debugging //
2019-01-06 19:41:42 +01:00
ESP_LOGD(TAG, "IRQhandler %d bytes left | Taskstate = %d",
uxTaskGetStackHighWaterMark(irqHandlerTask),
eTaskGetState(irqHandlerTask));
#if (HAS_LORA)
ESP_LOGD(TAG, "LMiCtask %d bytes left | Taskstate = %d",
uxTaskGetStackHighWaterMark(lmicTask), eTaskGetState(lmicTask));
2019-08-30 18:54:53 +02:00
ESP_LOGD(TAG, "Lorasendtask %d bytes left | Taskstate = %d",
uxTaskGetStackHighWaterMark(lorasendTask),
eTaskGetState(lorasendTask));
#endif
2019-04-13 18:44:25 +02:00
#if (HAS_GPS)
ESP_LOGD(TAG, "Gpsloop %d bytes left | Taskstate = %d",
uxTaskGetStackHighWaterMark(GpsTask), eTaskGetState(GpsTask));
#endif
#ifdef HAS_SPI
ESP_LOGD(TAG, "spiloop %d bytes left | Taskstate = %d",
uxTaskGetStackHighWaterMark(spiTask), eTaskGetState(spiTask));
#endif
2020-05-21 19:42:42 +02:00
#ifdef HAS_MQTT
ESP_LOGD(TAG, "MQTTloop %d bytes left | Taskstate = %d",
uxTaskGetStackHighWaterMark(mqttTask), eTaskGetState(mqttTask));
#endif
2019-04-08 22:51:12 +02:00
#if (defined HAS_DCF77 || defined HAS_IF482)
2019-02-08 23:08:14 +01:00
ESP_LOGD(TAG, "Clockloop %d bytes left | Taskstate = %d",
uxTaskGetStackHighWaterMark(ClockTask), eTaskGetState(ClockTask));
#endif
#if (HAS_LED != NOT_A_PIN) || defined(HAS_RGB_LED)
2019-01-06 19:41:42 +01:00
ESP_LOGD(TAG, "LEDloop %d bytes left | Taskstate = %d",
uxTaskGetStackHighWaterMark(ledLoopTask),
eTaskGetState(ledLoopTask));
#endif
2018-07-22 20:27:58 +02:00
// read battery voltage into global variable
#if (defined BAT_MEASURE_ADC || defined HAS_PMU || defined HAS_IP5306)
2020-04-11 21:30:09 +02:00
batt_level = read_battlevel();
#ifdef HAS_PMU
AXP192_showstatus();
#endif
#ifdef HAS_IP5306
printIP5306Stats();
#endif
#endif
// display BME680/280 sensor data
#if (HAS_BME)
2019-03-08 18:13:51 +01:00
#ifdef HAS_BME680
2019-01-06 19:41:42 +01:00
ESP_LOGI(TAG, "BME680 Temp: %.2f°C | IAQ: %.2f | IAQacc: %d",
bme_status.temperature, bme_status.iaq, bme_status.iaq_accuracy);
#elif defined HAS_BME280
2019-03-16 09:08:25 +01:00
ESP_LOGI(TAG, "BME280 Temp: %.2f°C | Humidity: %.2f | Pressure: %.0f",
2019-03-08 18:13:51 +01:00
bme_status.temperature, bme_status.humidity, bme_status.pressure);
2019-12-08 12:58:12 +01:00
#elif defined HAS_BMP180
2019-12-25 23:22:11 +01:00
ESP_LOGI(TAG, "BMP180 Temp: %.2f°C | Pressure: %.0f", bme_status.temperature,
bme_status.pressure);
#endif
2019-03-08 18:13:51 +01:00
#endif
2018-12-22 14:37:47 +01:00
// check free heap memory
if (ESP.getMinFreeHeap() <= MEM_LOW) {
2018-08-04 14:37:41 +02:00
ESP_LOGI(TAG,
2018-07-22 20:27:58 +02:00
"Memory full, counter cleared (heap low water mark = %d Bytes / "
"free heap = %d bytes)",
2019-01-06 19:41:42 +01:00
ESP.getMinFreeHeap(), ESP.getFreeHeap());
reset_counters(); // clear macs container and reset all counters
get_salt(); // get new salt for salting hashes
2018-08-04 18:09:25 +02:00
2019-01-06 19:41:42 +01:00
if (ESP.getMinFreeHeap() <= MEM_LOW) // check again
do_reset(true); // memory leak, reset device
2018-07-22 20:27:58 +02:00
}
2018-12-22 14:37:47 +01:00
// check free PSRAM memory
#ifdef BOARD_HAS_PSRAM
if (ESP.getMinFreePsram() <= MEM_LOW) {
ESP_LOGI(TAG, "PSRAM full, counter cleared");
reset_counters(); // clear macs container and reset all counters
get_salt(); // get new salt for salting hashes
2018-12-22 14:37:47 +01:00
if (ESP.getMinFreePsram() <= MEM_LOW) // check again
do_reset(true); // memory leak, reset device
2018-12-22 14:37:47 +01:00
}
#endif
2020-02-03 15:29:32 +01:00
#if (HAS_SDS011)
2020-04-11 23:36:17 +02:00
if (isSDS011Active) {
ESP_LOGD(TAG, "SDS011: go to sleep");
sds011_loop();
} else {
ESP_LOGD(TAG, "SDS011: wakeup");
sds011_wakeup();
}
2020-02-03 15:29:32 +01:00
#endif
} // doHousekeeping()
// uptime counter 64bit to prevent millis() rollover after 49 days
uint64_t uptime() {
static uint32_t low32, high32;
uint32_t new_low32 = millis();
if (new_low32 < low32)
high32++;
low32 = new_low32;
return (uint64_t)high32 << 32 | low32;
}
uint32_t getFreeRAM() {
#ifndef BOARD_HAS_PSRAM
return ESP.getFreeHeap();
#else
return ESP.getFreePsram();
#endif
}
void reset_counters() {
#if ((WIFICOUNTER) || (BLECOUNTER))
macs.clear(); // clear all macs container
macs_wifi = 0;
macs_ble = 0;
#ifdef HAS_DISPLAY
dp_plotCurve(0, true);
2020-02-03 15:29:32 +01:00
#endif
#endif
}