From 6dc3361d0605d0a36470d60b1fdabb46d5da42e7 Mon Sep 17 00:00:00 2001 From: cyberman54 Date: Sun, 6 Nov 2022 14:59:56 +0100 Subject: [PATCH 1/5] fix missing includes --- include/main.h | 1 + include/payload.h | 1 - include/power.h | 2 ++ include/rcommand.h | 1 + include/senddata.h | 1 + 5 files changed, 5 insertions(+), 1 deletion(-) diff --git a/include/main.h b/include/main.h index 824b020e..571d1338 100644 --- a/include/main.h +++ b/include/main.h @@ -23,5 +23,6 @@ #include "boot.h" #include "power.h" #include "antenna.h" +#include "button.h" #endif \ No newline at end of file diff --git a/include/payload.h b/include/payload.h index 2add80b7..b272daa3 100644 --- a/include/payload.h +++ b/include/payload.h @@ -100,6 +100,5 @@ private: }; extern PayloadConvert payload; -extern int8_t batt_level; #endif // _PAYLOAD_H_ diff --git a/include/power.h b/include/power.h index 1f7b7333..1bbcbae3 100644 --- a/include/power.h +++ b/include/power.h @@ -53,11 +53,13 @@ typedef uint8_t (*mapFn_t)(uint16_t, uint16_t, uint16_t); uint16_t read_voltage(void); void calibrate_voltage(void); bool batt_sufficient(void); +extern int8_t batt_level; #ifdef HAS_PMU #include extern XPowersPMU pmu; enum pmu_power_t { pmu_power_on, pmu_power_off, pmu_power_sleep }; +void IRAM_ATTR PMUIRQ(); void AXP192_powerevent_IRQ(void); void AXP192_power(pmu_power_t powerlevel); void AXP192_init(void); diff --git a/include/rcommand.h b/include/rcommand.h index e01369b1..94e833b6 100644 --- a/include/rcommand.h +++ b/include/rcommand.h @@ -15,6 +15,7 @@ #include "timesync.h" #include "power.h" #include "antenna.h" +#include "payload.h" // maximum number of elements in rcommand interpreter queue #define RCMD_QUEUE_SIZE 5 diff --git a/include/senddata.h b/include/senddata.h index ff0a382b..3e0f0711 100644 --- a/include/senddata.h +++ b/include/senddata.h @@ -8,6 +8,7 @@ #include "lorawan.h" #include "display.h" #include "sdcard.h" +#include "payload.h" void SendPayload(uint8_t port); void sendData(void); From 0a36377e66889824a55064006c1f620f47163b86 Mon Sep 17 00:00:00 2001 From: cyberman54 Date: Sun, 6 Nov 2022 15:00:10 +0100 Subject: [PATCH 2/5] lopy4.h fix rgb led bug --- src/hal/lopy4.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/hal/lopy4.h b/src/hal/lopy4.h index cb960fa7..1848dd15 100644 --- a/src/hal/lopy4.h +++ b/src/hal/lopy4.h @@ -20,7 +20,6 @@ #define CFG_sx1276_radio 1 #define HAS_LED NOT_A_PIN // LoPy4 has no on board mono LED, we use on board RGB LED -#define RGB_LED_COUNT 1 // we have 1 LEDs #define RGB_LED_COUNT 1 // we have 1 LED #define HAS_RGB_LED FastLED.addLeds(leds, RGB_LED_COUNT); #define BOARD_HAS_PSRAM // use extra 4MB extern RAM From 4015e9e989530f8d77e5f1b1aabb766af765d38f Mon Sep 17 00:00:00 2001 From: cyberman54 Date: Sun, 6 Nov 2022 15:00:54 +0100 Subject: [PATCH 3/5] new button lib --- include/button.h | 12 ++++++--- include/cyclic.h | 1 + include/irqhandler.h | 8 ------ platformio_orig.ini | 2 +- platformio_orig_s3.ini | 2 +- src/button.cpp | 61 +++++++++++++++++++++++------------------- src/cyclic.cpp | 7 +++++ src/irqhandler.cpp | 16 +++-------- src/main.cpp | 3 ++- src/power.cpp | 2 ++ 10 files changed, 61 insertions(+), 53 deletions(-) diff --git a/include/button.h b/include/button.h index 92eeb3f4..afc42a43 100644 --- a/include/button.h +++ b/include/button.h @@ -1,7 +1,7 @@ #ifndef _BUTTON_H #define _BUTTON_H -#include +#include #include "irqhandler.h" #include "senddata.h" #include "display.h" @@ -11,7 +11,13 @@ #define BUTTON_ACTIVEHIGH 0 #endif -void button_init(int pin); -void readButton(); +#ifndef BUTTON_PULLUP +#define BUTTON_PULLUP 0 +#endif + +extern TaskHandle_t buttonLoopTask; + +void button_init(void); +void IRAM_ATTR readButton(void); #endif \ No newline at end of file diff --git a/include/cyclic.h b/include/cyclic.h index d53b10e2..d9a7db45 100644 --- a/include/cyclic.h +++ b/include/cyclic.h @@ -13,6 +13,7 @@ #include "reset.h" #include "led.h" #include "power.h" +#include "button.h" extern Ticker cyclicTimer; diff --git a/include/irqhandler.h b/include/irqhandler.h index eacbd35f..91f076c8 100644 --- a/include/irqhandler.h +++ b/include/irqhandler.h @@ -36,12 +36,4 @@ void IRAM_ATTR DisplayIRQ(); void IRAM_ATTR MatrixDisplayIRQ(); #endif -#ifdef HAS_BUTTON -void IRAM_ATTR ButtonIRQ(); -#endif - -#ifdef HAS_PMU -void IRAM_ATTR PMUIRQ(); -#endif - #endif \ No newline at end of file diff --git a/platformio_orig.ini b/platformio_orig.ini index f291f52c..87eeecf4 100644 --- a/platformio_orig.ini +++ b/platformio_orig.ini @@ -81,7 +81,7 @@ lib_deps_basic = https://github.com/SukkoPera/Arduino-Rokkit-Hash.git bblanchon/ArduinoJson @ ^6 makuna/RTC @ ^2.3.5 - spacehuhn/SimpleButton + mathertel/OneButton @ ^2.0.3 lewisxhe/XPowersLib @ ^0.1.4 256dpi/MQTT @ ^2.5.0 lib_deps_all = diff --git a/platformio_orig_s3.ini b/platformio_orig_s3.ini index c8bf4c65..30e98be7 100644 --- a/platformio_orig_s3.ini +++ b/platformio_orig_s3.ini @@ -29,7 +29,7 @@ lib_deps_all = https://github.com/cyberman54/libpax.git https://github.com/SukkoPera/Arduino-Rokkit-Hash.git bblanchon/ArduinoJson @ ^6 - spacehuhn/SimpleButton + mathertel/OneButton @ ^2.0.3 256dpi/MQTT @ ^2.5.0 ricmoo/QRCode @ ^0.0.1 build_flags_basic = diff --git a/src/button.cpp b/src/button.cpp index 8e78de6f..b929222b 100644 --- a/src/button.cpp +++ b/src/button.cpp @@ -3,42 +3,49 @@ #include "globals.h" #include "button.h" -using namespace simplebutton; - // Local logging tag static const char TAG[] = __FILE__; -static Button *b = NULL; +OneButton button(HAS_BUTTON, !BUTTON_ACTIVEHIGH, !!BUTTON_PULLUP); +TaskHandle_t buttonLoopTask; -void button_init(int pin) { -#ifdef BUTTON_PULLUP - b = new ButtonPullup(pin); -#else - b = new Button(pin, !BUTTON_ACTIVEHIGH); -#endif +void IRAM_ATTR readButton(void) { button.tick(); } - // attach events to the button - - b->setOnDoubleClicked([]() {}); - - b->setOnClicked([]() { +void singleClick(void) { #ifdef HAS_DISPLAY - dp_refresh(true); // switch to next display page + dp_refresh(true); // switch to next display page #endif #ifdef HAS_MATRIX_DISPLAY - refreshTheMatrixDisplay(true); // switch to next display page + refreshTheMatrixDisplay(true); // switch to next display page #endif - }); - - b->setOnHolding([]() { - payload.reset(); - payload.addButton(0x01); - SendPayload(BUTTONPORT); - }); - - // attach interrupt to the button - attachInterrupt(digitalPinToInterrupt(pin), ButtonIRQ, CHANGE); } -void readButton() { b->update(); } +void longPressStart(void) { + payload.reset(); + payload.addButton(0x01); + SendPayload(BUTTONPORT); +} + +void buttonLoop(void *parameter) { + while (1) { + doIRQ(BUTTON_IRQ); + delay(20); + } +} + +void button_init(void) { + ESP_LOGI(TAG, "Starting button Controller..."); + xTaskCreatePinnedToCore(buttonLoop, // task function + "buttonloop", // name of task + 2048, // stack size of task + (void *)1, // parameter of the task + 2, // priority of the task + &buttonLoopTask, // task handle + 1); // CPU core + + button.setPressTicks(1000); + button.attachClick(singleClick); + button.attachLongPressStart(longPressStart); +}; + #endif \ No newline at end of file diff --git a/src/cyclic.cpp b/src/cyclic.cpp index ef2f2d5c..3b384333 100644 --- a/src/cyclic.cpp +++ b/src/cyclic.cpp @@ -71,6 +71,13 @@ void doHousekeeping() { eTaskGetState(ledLoopTask)); #endif +#ifdef HAS_BUTTON + if (buttonLoopTask != NULL) + ESP_LOGD(TAG, "Buttonloop %d bytes left | Taskstate = %d", + uxTaskGetStackHighWaterMark(buttonLoopTask), + eTaskGetState(buttonLoopTask)); +#endif + // read battery voltage into global variable #if (defined BAT_MEASURE_ADC || defined HAS_PMU || defined HAS_IP5306) batt_level = read_battlevel(); diff --git a/src/irqhandler.cpp b/src/irqhandler.cpp index 81b24304..87f6c7bd 100644 --- a/src/irqhandler.cpp +++ b/src/irqhandler.cpp @@ -13,10 +13,10 @@ void irqHandler(void *pvParameters) { // task remains in blocked state until it is notified by an irq for (;;) { - xTaskNotifyWait(0x00, // Don't clear any bits on entry - ULONG_MAX, // Clear all bits on exit - &irqSource, // Receives the notification value - portMAX_DELAY); // wait forever + xTaskNotifyWait(0x00, // Don't clear any bits on entry + ULONG_MAX, // Clear all bits on exit + &irqSource, // Receives the notification value + portMAX_DELAY); // wait forever if (irqSource & UNMASK_IRQ) // interrupt handler to be enabled? irqSource &= ~MASK_IRQ; // then clear irq mask flag @@ -102,14 +102,6 @@ void IRAM_ATTR DisplayIRQ() { doIRQ(DISPLAY_IRQ); } void IRAM_ATTR MatrixDisplayIRQ() { doIRQ(MATRIX_DISPLAY_IRQ); } #endif -#ifdef HAS_BUTTON -void IRAM_ATTR ButtonIRQ() { doIRQ(BUTTON_IRQ); } -#endif - -#ifdef HAS_PMU -void IRAM_ATTR PMUIRQ() { doIRQ(PMU_IRQ); } -#endif - void mask_user_IRQ() { xTaskNotify(irqHandlerTask, MASK_IRQ, eSetBits); } void unmask_user_IRQ() { xTaskNotify(irqHandlerTask, UNMASK_IRQ, eSetBits); } \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index a1af483c..511b9244 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -28,6 +28,7 @@ licenses. Refer to LICENSE.txt file in repository for more details. Task Core Prio Purpose ------------------------------------------------------------------------------- ledloop* 1 1 blinks LEDs +buttonloop* 1 2 reads button spiloop# 0 2 reads/writes data on spi interface lmictask* 1 2 MCCI LMiC LORAWAN stack clockloop# 1 6 generates realtime telegrams for external clock @@ -468,7 +469,7 @@ void setup() { #else strcat_P(features, "PD"); #endif // BUTTON_PULLUP - button_init(HAS_BUTTON); + button_init(); #endif // HAS_BUTTON // only if we have a timesource we do timesync diff --git a/src/power.cpp b/src/power.cpp index 0e346cac..61f7e27d 100644 --- a/src/power.cpp +++ b/src/power.cpp @@ -25,6 +25,8 @@ static const adc_unit_t unit = ADC_UNIT_1; #ifdef HAS_PMU XPowersPMU pmu; +void IRAM_ATTR PMUIRQ() { doIRQ(PMU_IRQ); } + void AXP192_powerevent_IRQ(void) { pmu.getIrqStatus(); From e5cc72fb1cd560e8d91e7f543c33874a48f4839f Mon Sep 17 00:00:00 2001 From: cyberman54 Date: Sun, 6 Nov 2022 15:16:28 +0100 Subject: [PATCH 4/5] senddata.cpp: fix missing } --- src/senddata.cpp | 133 +++++++++++++++++++++++------------------------ 1 file changed, 66 insertions(+), 67 deletions(-) diff --git a/src/senddata.cpp b/src/senddata.cpp index 1d4bd81b..5fb2cd6a 100644 --- a/src/senddata.cpp +++ b/src/senddata.cpp @@ -96,9 +96,8 @@ void sendData() { #if !(PAYLOAD_OPENSENSEBOX) payload.addCount(count.wifi_count, MAC_SNIFF_WIFI); - if (cfg.blescan) { + if (cfg.blescan) payload.addCount(count.ble_count, MAC_SNIFF_BLE); - } #endif #if (HAS_GPS) @@ -114,116 +113,116 @@ void sendData() { #if (PAYLOAD_OPENSENSEBOX) payload.addCount(count.wifi_count, MAC_SNIFF_WIFI); - if (cfg.blescan) { + if (cfg.blescan) payload.addCount(count.ble_count, MAC_SNIFF_BLE); #endif #if (HAS_SDS011) - sds011_store(&sds_status); - payload.addSDS(sds_status); + sds011_store(&sds_status); + payload.addSDS(sds_status); #endif #ifdef HAS_DISPLAY - dp_plotCurve(count.pax, true); + dp_plotCurve(count.pax, true); #endif #if (HAS_SDCARD) - sdcardWriteData(count.wifi_count, count.ble_count + sdcardWriteData(count.wifi_count, count.ble_count #if (defined BAT_MEASURE_ADC || defined HAS_PMU) - , - read_voltage() + , + read_voltage() #endif - ); + ); #endif // HAS_SDCARD - SendPayload(COUNTERPORT); - break; // case COUNTDATA + SendPayload(COUNTERPORT); + break; // case COUNTDATA #endif // ((WIFICOUNTER) || (BLECOUNTER)) #if (HAS_BME) - case MEMS_DATA: - payload.reset(); - payload.addBME(bme_status); - SendPayload(BMEPORT); - break; + case MEMS_DATA: + payload.reset(); + payload.addBME(bme_status); + SendPayload(BMEPORT); + break; #endif #if (HAS_GPS) - case GPS_DATA: - if (GPSPORT != COUNTERPORT) { - // send GPS position only if we have a fix - if (gps_hasfix()) { - gps_storelocation(&gps_status); - payload.reset(); - payload.addGPS(gps_status); - SendPayload(GPSPORT); - } else - ESP_LOGD(TAG, "No valid GPS position"); - } - break; + case GPS_DATA: + if (GPSPORT != COUNTERPORT) { + // send GPS position only if we have a fix + if (gps_hasfix()) { + gps_storelocation(&gps_status); + payload.reset(); + payload.addGPS(gps_status); + SendPayload(GPSPORT); + } else + ESP_LOGD(TAG, "No valid GPS position"); + } + break; #endif #if (HAS_SENSORS) #if (HAS_SENSOR_1) - case SENSOR1_DATA: - payload.reset(); - payload.addSensor(sensor_read(1)); - SendPayload(SENSOR1PORT); - break; + case SENSOR1_DATA: + payload.reset(); + payload.addSensor(sensor_read(1)); + SendPayload(SENSOR1PORT); + break; #endif #if (HAS_SENSOR_2) - case SENSOR2_DATA: - payload.reset(); - payload.addSensor(sensor_read(2)); - SendPayload(SENSOR2PORT); - break; + case SENSOR2_DATA: + payload.reset(); + payload.addSensor(sensor_read(2)); + SendPayload(SENSOR2PORT); + break; #endif #if (HAS_SENSOR_3) - case SENSOR3_DATA: - payload.reset(); - payload.addSensor(sensor_read(3)); - SendPayload(SENSOR3PORT); - break; + case SENSOR3_DATA: + payload.reset(); + payload.addSensor(sensor_read(3)); + SendPayload(SENSOR3PORT); + break; #endif #endif #if (defined BAT_MEASURE_ADC || defined HAS_PMU) - case BATT_DATA: - payload.reset(); - payload.addVoltage(read_voltage()); - SendPayload(BATTPORT); - break; + case BATT_DATA: + payload.reset(); + payload.addVoltage(read_voltage()); + SendPayload(BATTPORT); + break; #endif - } // switch - bitmask &= ~mask; - mask <<= 1; - } // while (bitmask) - } // sendData() + } // switch + bitmask &= ~mask; + mask <<= 1; + } // while (bitmask) +} // sendData() - void flushQueues(void) { - rcmd_queuereset(); +void flushQueues(void) { + rcmd_queuereset(); #if (HAS_LORA) - lora_queuereset(); + lora_queuereset(); #endif #ifdef HAS_SPI - spi_queuereset(); + spi_queuereset(); #endif #ifdef HAS_MQTT - mqtt_queuereset(); + mqtt_queuereset(); #endif - } +} - bool allQueuesEmtpy(void) { - uint32_t rc = rcmd_queuewaiting(); +bool allQueuesEmtpy(void) { + uint32_t rc = rcmd_queuewaiting(); #if (HAS_LORA) - rc += lora_queuewaiting(); + rc += lora_queuewaiting(); #endif #ifdef HAS_SPI - rc += spi_queuewaiting(); + rc += spi_queuewaiting(); #endif #ifdef HAS_MQTT - rc += mqtt_queuewaiting(); + rc += mqtt_queuewaiting(); #endif - return (rc == 0) ? true : false; - } + return (rc == 0) ? true : false; +} From 3bcb7417092aa1592bd33d570faaeb8414526848 Mon Sep 17 00:00:00 2001 From: cyberman54 Date: Sun, 6 Nov 2022 15:21:10 +0100 Subject: [PATCH 5/5] bump to v3.4.1 --- platformio_orig.ini | 2 +- platformio_orig_s3.ini | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platformio_orig.ini b/platformio_orig.ini index 87eeecf4..d1e6ee70 100644 --- a/platformio_orig.ini +++ b/platformio_orig.ini @@ -46,7 +46,7 @@ description = Paxcounter is a device for metering passenger flows in realtime. I [common] ; for release_version use max. 10 chars total, use any decimal format like "a.b.c" -release_version = 3.4.0 +release_version = 3.4.1 ; DEBUG LEVEL: For production run set to 0, otherwise device will leak RAM while running! ; 0=None, 1=Error, 2=Warn, 3=Info, 4=Debug, 5=Verbose debug_level = 3 diff --git a/platformio_orig_s3.ini b/platformio_orig_s3.ini index 30e98be7..11737fc4 100644 --- a/platformio_orig_s3.ini +++ b/platformio_orig_s3.ini @@ -10,7 +10,7 @@ description = Paxcounter is a device for metering passenger flows in realtime. I [common] ; for release_version use max. 10 chars total, use any decimal format like "a.b.c" -release_version = 3.4.0 +release_version = 3.4.1 ; DEBUG LEVEL: For production run set to 0, otherwise device will leak RAM while running! ; 0=None, 1=Error, 2=Warn, 3=Info, 4=Debug, 5=Verbose debug_level = 3