Update main.cpp
This commit is contained in:
parent
3621cfcc52
commit
1cfe16b33c
437
src/main.cpp
437
src/main.cpp
@ -323,6 +323,443 @@ void setup() {
|
|||||||
assert(spi_init() == ESP_OK);
|
assert(spi_init() == ESP_OK);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAS_SDCARD
|
||||||
|
if (sdcard_init())
|
||||||
|
strcat_P(features, " SD");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (HAS_SDS011)
|
||||||
|
ESP_LOGI(TAG, "init fine-dust-sensor");
|
||||||
|
if ( sds011_init() )
|
||||||
|
strcat_P(features, " SDS");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (VENDORFILTER)
|
||||||
|
strcat_P(features, " FILTER");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// initialize matrix display
|
||||||
|
#ifdef HAS_MATRIX_DISPLAY
|
||||||
|
strcat_P(features, " LED_MATRIX");
|
||||||
|
MatrixDisplayIsOn = cfg.screenon;
|
||||||
|
init_matrix_display(); // note: blocking call
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// show payload encoder
|
||||||
|
#if PAYLOAD_ENCODER == 1
|
||||||
|
strcat_P(features, " PLAIN");
|
||||||
|
#elif PAYLOAD_ENCODER == 2
|
||||||
|
strcat_P(features, " PACKED");
|
||||||
|
#elif PAYLOAD_ENCODER == 3
|
||||||
|
strcat_P(features, " LPPDYN");
|
||||||
|
#elif PAYLOAD_ENCODER == 4
|
||||||
|
strcat_P(features, " LPPPKD");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// initialize RTC
|
||||||
|
#ifdef HAS_RTC
|
||||||
|
strcat_P(features, " RTC");
|
||||||
|
assert(rtc_init());
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined HAS_DCF77
|
||||||
|
strcat_P(features, " DCF77");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined HAS_IF482
|
||||||
|
strcat_P(features, " IF482");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (WIFICOUNTER)
|
||||||
|
strcat_P(features, " WIFI");
|
||||||
|
// start wifi in monitor mode and start channel rotation timer
|
||||||
|
ESP_LOGI(TAG, "Starting Wifi...");
|
||||||
|
wifi_sniffer_init();
|
||||||
|
#else
|
||||||
|
// switch off wifi
|
||||||
|
esp_wifi_deinit();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// initialize salt value using esp_random() called by random() in
|
||||||
|
// arduino-esp32 core. Note: do this *after* wifi has started, since
|
||||||
|
// function gets it's seed from RF noise
|
||||||
|
get_salt(); // get new 16bit for salting hashes
|
||||||
|
|
||||||
|
// start state machine
|
||||||
|
ESP_LOGI(TAG, "Starting Interrupt Handler...");
|
||||||
|
xTaskCreatePinnedToCore(irqHandler, // task function
|
||||||
|
"irqhandler", // name of task
|
||||||
|
4096, // stack size of task
|
||||||
|
(void *)1, // parameter of the task
|
||||||
|
2, // priority of the task
|
||||||
|
&irqHandlerTask, // task handle
|
||||||
|
1); // CPU core
|
||||||
|
|
||||||
|
// initialize BME sensor (BME280/BME680)
|
||||||
|
#if (HAS_BME)
|
||||||
|
#ifdef HAS_BME680
|
||||||
|
strcat_P(features, " BME680");
|
||||||
|
#elif defined HAS_BME280
|
||||||
|
strcat_P(features, " BME280");
|
||||||
|
#elif defined HAS_BMP180
|
||||||
|
strcat_P(features, " BMP180");
|
||||||
|
#endif
|
||||||
|
if (bme_init())
|
||||||
|
ESP_LOGI(TAG, "Starting BME sensor...");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// starting timers and interrupts
|
||||||
|
assert(irqHandlerTask != NULL); // has interrupt handler task started?
|
||||||
|
ESP_LOGI(TAG, "Starting Timers...");
|
||||||
|
|
||||||
|
// display interrupt
|
||||||
|
#ifdef HAS_DISPLAY
|
||||||
|
// https://techtutorialsx.com/2017/10/07/esp32-arduino-timer-interrupts/
|
||||||
|
// prescaler 80 -> divides 80 MHz CPU freq to 1 MHz, timer 0, count up
|
||||||
|
displayIRQ = timerBegin(0, 80, true);
|
||||||
|
timerAttachInterrupt(displayIRQ, &DisplayIRQ, true);
|
||||||
|
timerAlarmWrite(displayIRQ, DISPLAYREFRESH_MS * 1000, true);
|
||||||
|
timerAlarmEnable(displayIRQ);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// LED Matrix display interrupt
|
||||||
|
#ifdef HAS_MATRIX_DISPLAY
|
||||||
|
// https://techtutorialsx.com/2017/10/07/esp32-arduino-timer-interrupts/
|
||||||
|
// prescaler 80 -> divides 80 MHz CPU freq to 1 MHz, timer 3, count up
|
||||||
|
matrixDisplayIRQ = timerBegin(3, 80, true);
|
||||||
|
timerAttachInterrupt(matrixDisplayIRQ, &MatrixDisplayIRQ, true);
|
||||||
|
timerAlarmWrite(matrixDisplayIRQ, MATRIX_DISPLAY_SCAN_US, true);
|
||||||
|
timerAlarmEnable(matrixDisplayIRQ);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// initialize button
|
||||||
|
#ifdef HAS_BUTTON
|
||||||
|
strcat_P(features, " BTN_");
|
||||||
|
#ifdef BUTTON_PULLUP
|
||||||
|
strcat_P(features, "PU");
|
||||||
|
#else
|
||||||
|
strcat_P(features, "PD");
|
||||||
|
#endif // BUTTON_PULLUP
|
||||||
|
button_init(HAS_BUTTON);
|
||||||
|
#endif // HAS_BUTTON
|
||||||
|
|
||||||
|
// cyclic function interrupts
|
||||||
|
sendcycler.attach(SENDCYCLE * 2, sendcycle);
|
||||||
|
housekeeper.attach(HOMECYCLE, housekeeping);
|
||||||
|
|
||||||
|
#if (TIME_SYNC_INTERVAL)
|
||||||
|
|
||||||
|
#if (!(TIME_SYNC_LORAWAN) && !(TIME_SYNC_LORASERVER) && !defined HAS_GPS && \
|
||||||
|
!defined HAS_RTC)
|
||||||
|
#warning you did not specify a time source, time will not be synched
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// initialize gps time
|
||||||
|
#if (HAS_GPS)
|
||||||
|
fetch_gpsTime();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined HAS_IF482 || defined HAS_DCF77)
|
||||||
|
ESP_LOGI(TAG, "Starting Clock Controller...");
|
||||||
|
clock_init();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (TIME_SYNC_LORASERVER)
|
||||||
|
timesync_init(); // create loraserver time sync task
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ESP_LOGI(TAG, "Starting Timekeeper...");
|
||||||
|
assert(timepulse_init()); // setup pps timepulse
|
||||||
|
timepulse_start(); // starts pps and cyclic time sync
|
||||||
|
|
||||||
|
#endif // TIME_SYNC_INTERVAL
|
||||||
|
|
||||||
|
// show compiled features
|
||||||
|
ESP_LOGI(TAG, "Features:%s", features);
|
||||||
|
|
||||||
|
// set runmode to normal
|
||||||
|
RTC_runmode = RUNMODE_NORMAL;
|
||||||
|
|
||||||
|
vTaskDelete(NULL);
|
||||||
|
|
||||||
|
} // setup()
|
||||||
|
|
||||||
|
void loop() { vTaskDelete(NULL); }
|
||||||
|
3 MatrixDisplayIRQ -> matrix mux cycle -> 0,5ms (MATRIX_DISPLAY_SCAN_US)
|
||||||
|
|
||||||
|
|
||||||
|
// Interrupt routines
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
fired by hardware
|
||||||
|
DisplayIRQ -> esp32 timer 0 -> irqHandlerTask (Core 1)
|
||||||
|
CLOCKIRQ -> esp32 timer 1 -> ClockTask (Core 1)
|
||||||
|
ButtonIRQ -> external gpio -> irqHandlerTask (Core 1)
|
||||||
|
PMUIRQ -> PMU chip gpio -> irqHandlerTask (Core 1)
|
||||||
|
|
||||||
|
fired by software (Ticker.h)
|
||||||
|
TIMESYNC_IRQ -> timeSync() -> irqHandlerTask (Core 1)
|
||||||
|
CYCLIC_IRQ -> housekeeping() -> irqHandlerTask (Core 1)
|
||||||
|
SENDCYCLE_IRQ -> sendcycle() -> irqHandlerTask (Core 1)
|
||||||
|
BME_IRQ -> bmecycle() -> irqHandlerTask (Core 1)
|
||||||
|
|
||||||
|
|
||||||
|
// External RTC timer (if present)
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
triggers pps 1 sec impulse
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Basic Config
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
configData_t cfg; // struct holds current device configuration
|
||||||
|
char lmic_event_msg[LMIC_EVENTMSG_LEN]; // display buffer for LMIC event message
|
||||||
|
uint8_t volatile channel = 0; // channel rotation counter
|
||||||
|
uint16_t volatile macs_total = 0, macs_wifi = 0, macs_ble = 0,
|
||||||
|
batt_voltage = 0; // globals for display
|
||||||
|
|
||||||
|
hw_timer_t *ppsIRQ = NULL, *displayIRQ = NULL, *matrixDisplayIRQ = NULL;
|
||||||
|
|
||||||
|
TaskHandle_t irqHandlerTask = NULL, ClockTask = NULL;
|
||||||
|
SemaphoreHandle_t I2Caccess;
|
||||||
|
bool volatile TimePulseTick = false;
|
||||||
|
time_t userUTCTime = 0;
|
||||||
|
timesource_t timeSource = _unsynced;
|
||||||
|
|
||||||
|
// container holding unique MAC address hashes with Memory Alloctor using PSRAM,
|
||||||
|
// if present
|
||||||
|
std::set<uint16_t, std::less<uint16_t>, Mallocator<uint16_t>> macs;
|
||||||
|
|
||||||
|
// initialize payload encoder
|
||||||
|
PayloadConvert payload(PAYLOAD_BUFFER_SIZE);
|
||||||
|
|
||||||
|
// set Time Zone for user setting from paxcounter.conf
|
||||||
|
TimeChangeRule myDST = DAYLIGHT_TIME;
|
||||||
|
TimeChangeRule mySTD = STANDARD_TIME;
|
||||||
|
Timezone myTZ(myDST, mySTD);
|
||||||
|
|
||||||
|
// local Tag for logging
|
||||||
|
static const char TAG[] = __FILE__;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
|
||||||
|
char features[100] = "";
|
||||||
|
|
||||||
|
// create some semaphores for syncing / mutexing tasks
|
||||||
|
I2Caccess = xSemaphoreCreateMutex(); // for access management of i2c bus
|
||||||
|
assert(I2Caccess != NULL);
|
||||||
|
I2C_MUTEX_UNLOCK();
|
||||||
|
|
||||||
|
// disable brownout detection
|
||||||
|
#ifdef DISABLE_BROWNOUT
|
||||||
|
// register with brownout is at address DR_REG_RTCCNTL_BASE + 0xd4
|
||||||
|
(*((uint32_t volatile *)ETS_UNCACHED_ADDR((DR_REG_RTCCNTL_BASE + 0xd4)))) = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// setup debug output or silence device
|
||||||
|
#if (VERBOSE)
|
||||||
|
Serial.begin(115200);
|
||||||
|
esp_log_level_set("*", ESP_LOG_VERBOSE);
|
||||||
|
#else
|
||||||
|
// mute logs completely by redirecting them to silence function
|
||||||
|
esp_log_level_set("*", ESP_LOG_NONE);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
do_after_reset(rtc_get_reset_reason(0));
|
||||||
|
|
||||||
|
// print chip information on startup if in verbose mode after coldstart
|
||||||
|
#if (VERBOSE)
|
||||||
|
|
||||||
|
if (RTC_runmode == RUNMODE_POWERCYCLE) {
|
||||||
|
esp_chip_info_t chip_info;
|
||||||
|
esp_chip_info(&chip_info);
|
||||||
|
ESP_LOGI(TAG,
|
||||||
|
"This is ESP32 chip with %d CPU cores, WiFi%s%s, silicon revision "
|
||||||
|
"%d, %dMB %s Flash",
|
||||||
|
chip_info.cores,
|
||||||
|
(chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "",
|
||||||
|
(chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : "",
|
||||||
|
chip_info.revision, spi_flash_get_chip_size() / (1024 * 1024),
|
||||||
|
(chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded"
|
||||||
|
: "external");
|
||||||
|
ESP_LOGI(TAG, "Internal Total heap %d, internal Free Heap %d",
|
||||||
|
ESP.getHeapSize(), ESP.getFreeHeap());
|
||||||
|
#ifdef BOARD_HAS_PSRAM
|
||||||
|
ESP_LOGI(TAG, "SPIRam Total heap %d, SPIRam Free Heap %d",
|
||||||
|
ESP.getPsramSize(), ESP.getFreePsram());
|
||||||
|
#endif
|
||||||
|
ESP_LOGI(TAG, "ChipRevision %d, Cpu Freq %d, SDK Version %s",
|
||||||
|
ESP.getChipRevision(), ESP.getCpuFreqMHz(), ESP.getSdkVersion());
|
||||||
|
ESP_LOGI(TAG, "Flash Size %d, Flash Speed %d", ESP.getFlashChipSize(),
|
||||||
|
ESP.getFlashChipSpeed());
|
||||||
|
ESP_LOGI(TAG, "Wifi/BT software coexist version %s",
|
||||||
|
esp_coex_version_get());
|
||||||
|
|
||||||
|
#if (HAS_LORA)
|
||||||
|
ESP_LOGI(TAG, "IBM LMIC version %d.%d.%d", LMIC_VERSION_MAJOR,
|
||||||
|
LMIC_VERSION_MINOR, LMIC_VERSION_BUILD);
|
||||||
|
ESP_LOGI(TAG, "Arduino LMIC version %d.%d.%d.%d",
|
||||||
|
ARDUINO_LMIC_VERSION_GET_MAJOR(ARDUINO_LMIC_VERSION),
|
||||||
|
ARDUINO_LMIC_VERSION_GET_MINOR(ARDUINO_LMIC_VERSION),
|
||||||
|
ARDUINO_LMIC_VERSION_GET_PATCH(ARDUINO_LMIC_VERSION),
|
||||||
|
ARDUINO_LMIC_VERSION_GET_LOCAL(ARDUINO_LMIC_VERSION));
|
||||||
|
showLoraKeys();
|
||||||
|
#endif // HAS_LORA
|
||||||
|
|
||||||
|
#if (HAS_GPS)
|
||||||
|
ESP_LOGI(TAG, "TinyGPS+ version %s", TinyGPSPlus::libraryVersion());
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif // VERBOSE
|
||||||
|
|
||||||
|
// open i2c bus
|
||||||
|
i2c_init();
|
||||||
|
|
||||||
|
// setup power on boards with power management logic
|
||||||
|
#ifdef EXT_POWER_SW
|
||||||
|
pinMode(EXT_POWER_SW, OUTPUT);
|
||||||
|
digitalWrite(EXT_POWER_SW, EXT_POWER_ON);
|
||||||
|
strcat_P(features, " VEXT");
|
||||||
|
#endif
|
||||||
|
#ifdef HAS_PMU
|
||||||
|
AXP192_init();
|
||||||
|
strcat_P(features, " PMU");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// read (and initialize on first run) runtime settings from NVRAM
|
||||||
|
loadConfig(); // includes initialize if necessary
|
||||||
|
|
||||||
|
// initialize display
|
||||||
|
#ifdef HAS_DISPLAY
|
||||||
|
strcat_P(features, " OLED");
|
||||||
|
DisplayIsOn = cfg.screenon;
|
||||||
|
// display verbose info only after a coldstart (note: blocking call!)
|
||||||
|
init_display(RTC_runmode == RUNMODE_POWERCYCLE ? true : false);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// scan i2c bus for devices
|
||||||
|
i2c_scan();
|
||||||
|
|
||||||
|
#ifdef BOARD_HAS_PSRAM
|
||||||
|
assert(psramFound());
|
||||||
|
ESP_LOGI(TAG, "PSRAM found and initialized");
|
||||||
|
strcat_P(features, " PSRAM");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BAT_MEASURE_EN
|
||||||
|
pinMode(BAT_MEASURE_EN, OUTPUT);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// initialize leds
|
||||||
|
#if (HAS_LED != NOT_A_PIN)
|
||||||
|
pinMode(HAS_LED, OUTPUT);
|
||||||
|
strcat_P(features, " LED");
|
||||||
|
|
||||||
|
#ifdef LED_POWER_SW
|
||||||
|
pinMode(LED_POWER_SW, OUTPUT);
|
||||||
|
digitalWrite(LED_POWER_SW, LED_POWER_ON);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAS_TWO_LED
|
||||||
|
pinMode(HAS_TWO_LED, OUTPUT);
|
||||||
|
strcat_P(features, " LED1");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// use LED for power display if we have additional RGB LED, else for status
|
||||||
|
#ifdef HAS_RGB_LED
|
||||||
|
switch_LED(LED_ON);
|
||||||
|
strcat_P(features, " RGB");
|
||||||
|
rgb_set_color(COLOR_PINK);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // HAS_LED
|
||||||
|
|
||||||
|
#if (HAS_LED != NOT_A_PIN) || defined(HAS_RGB_LED)
|
||||||
|
// start led loop
|
||||||
|
ESP_LOGI(TAG, "Starting LED Controller...");
|
||||||
|
xTaskCreatePinnedToCore(ledLoop, // task function
|
||||||
|
"ledloop", // name of task
|
||||||
|
1024, // stack size of task
|
||||||
|
(void *)1, // parameter of the task
|
||||||
|
3, // priority of the task
|
||||||
|
&ledLoopTask, // task handle
|
||||||
|
0); // CPU core
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// initialize wifi antenna
|
||||||
|
#ifdef HAS_ANTENNA_SWITCH
|
||||||
|
strcat_P(features, " ANT");
|
||||||
|
antenna_init();
|
||||||
|
antenna_select(cfg.wifiant);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// initialize battery status
|
||||||
|
#if (defined BAT_MEASURE_ADC || defined HAS_PMU)
|
||||||
|
strcat_P(features, " BATT");
|
||||||
|
calibrate_voltage();
|
||||||
|
batt_voltage = read_voltage();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (USE_OTA)
|
||||||
|
strcat_P(features, " OTA");
|
||||||
|
// reboot to firmware update mode if ota trigger switch is set
|
||||||
|
if (RTC_runmode == RUNMODE_UPDATE)
|
||||||
|
start_ota_update();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// start BLE scan callback if BLE function is enabled in NVRAM configuration
|
||||||
|
// or switch off bluetooth, if not compiled
|
||||||
|
#if (BLECOUNTER)
|
||||||
|
strcat_P(features, " BLE");
|
||||||
|
if (cfg.blescan) {
|
||||||
|
ESP_LOGI(TAG, "Starting Bluetooth...");
|
||||||
|
start_BLEscan();
|
||||||
|
} else
|
||||||
|
btStop();
|
||||||
|
#else
|
||||||
|
// remove bluetooth stack to gain more free memory
|
||||||
|
btStop();
|
||||||
|
ESP_ERROR_CHECK(esp_bt_mem_release(ESP_BT_MODE_BTDM));
|
||||||
|
ESP_ERROR_CHECK(esp_coex_preference_set(
|
||||||
|
ESP_COEX_PREFER_WIFI)); // configure Wifi/BT coexist lib
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// initialize gps
|
||||||
|
#if (HAS_GPS)
|
||||||
|
strcat_P(features, " GPS");
|
||||||
|
if (gps_init()) {
|
||||||
|
ESP_LOGI(TAG, "Starting GPS Feed...");
|
||||||
|
xTaskCreatePinnedToCore(gps_loop, // task function
|
||||||
|
"gpsloop", // name of task
|
||||||
|
2048, // stack size of task
|
||||||
|
(void *)1, // parameter of the task
|
||||||
|
1, // priority of the task
|
||||||
|
&GpsTask, // task handle
|
||||||
|
1); // CPU core
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// initialize sensors
|
||||||
|
#if (HAS_SENSORS)
|
||||||
|
strcat_P(features, " SENS");
|
||||||
|
sensor_init();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// initialize LoRa
|
||||||
|
#if (HAS_LORA)
|
||||||
|
strcat_P(features, " LORA");
|
||||||
|
// kick off join, except we come from sleep
|
||||||
|
assert(lora_stack_init(RTC_runmode == RUNMODE_WAKEUP ? false : true) ==
|
||||||
|
ESP_OK);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// initialize SPI
|
||||||
|
#ifdef HAS_SPI
|
||||||
|
strcat_P(features, " SPI");
|
||||||
|
assert(spi_init() == ESP_OK);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAS_SDCARD
|
#ifdef HAS_SDCARD
|
||||||
if (sdcardInit())
|
if (sdcardInit())
|
||||||
strcat_P(features, " SD");
|
strcat_P(features, " SD");
|
||||||
|
Loading…
Reference in New Issue
Block a user