diff --git a/include/button.h b/include/button.h index b6951ceb..e7799847 100644 --- a/include/button.h +++ b/include/button.h @@ -1,6 +1,9 @@ #ifndef _BUTTON_H #define _BUTTON_H +#include + +void button_init(int pin); void readButton(); #endif \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index 91466e24..940b7a4b 100644 --- a/platformio.ini +++ b/platformio.ini @@ -32,7 +32,7 @@ description = Paxcounter is a proof-of-concept ESP32 device for metering passeng [common] ; for release_version use max. 10 chars total, use any decimal format like "a.b.c" -release_version = 1.7.55 +release_version = 1.7.6 ; 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 @@ -63,6 +63,7 @@ lib_deps_basic = ArduinoJson@^5.13.1 Timezone@^1.2.2 RTC@^2.3.0 + SimpleButton lib_deps_all = ${common.lib_deps_basic} ${common.lib_deps_lora} diff --git a/src/button.cpp b/src/button.cpp index 68e29d4e..ed34367f 100644 --- a/src/button.cpp +++ b/src/button.cpp @@ -3,17 +3,44 @@ #include "globals.h" #include "button.h" +using namespace simplebutton; + // Local logging tag static const char TAG[] = __FILE__; -void readButton() { - ESP_LOGI(TAG, "Button pressed"); -#ifdef HAS_DISPLAY - refreshtheDisplay(true); // switch to next display page +static Button *b = NULL; + +void button_init(int pin) { +#ifdef BUTTON_PULLDOWN + b = new Button(pin); #else - payload.reset(); - payload.addButton(0x01); - SendPayload(BUTTONPORT, prio_normal); + b = new ButtonPullup(pin); #endif + + // attach events to the button + + b->setOnDoubleClicked([]() {}); + + b->setOnClicked([]() { +#ifdef HAS_DISPLAY + refreshtheDisplay(true); // switch to next display page +#else + payload.reset(); + payload.addButton(0x01); + SendPayload(BUTTONPORT, prio_normal); +#endif + }); + + b->setOnHolding([]() { +#if (HAS_LORA) + cfg.adrmode = !cfg.adrmode; + LMIC_setAdrMode(cfg.adrmode); +#endif + }); + + // attach interrupt to the button + attachInterrupt(digitalPinToInterrupt(pin), ButtonIRQ, CHANGE); } + +void readButton() { b->update(); } #endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 50ecac69..d2d4c4ca 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -266,20 +266,6 @@ void setup() { esp_coex_prefer_t)ESP_COEX_PREFER_WIFI)); // configure Wifi/BT coexist lib #endif -// initialize button -#ifdef HAS_BUTTON - strcat_P(features, " BTN_"); -#ifdef BUTTON_PULLUP - strcat_P(features, "PU"); - // install button interrupt (pullup mode) - pinMode(HAS_BUTTON, INPUT_PULLUP); -#else - strcat_P(features, "PD"); - // install button interrupt (pulldown mode) - pinMode(HAS_BUTTON, INPUT_PULLDOWN); -#endif // BUTTON_PULLUP -#endif // HAS_BUTTON - // initialize gps #if (HAS_GPS) strcat_P(features, " GPS"); @@ -372,9 +358,6 @@ void setup() { esp_wifi_deinit(); #endif - // show compiled features - ESP_LOGI(TAG, "Features:%s", features); - // start state machine ESP_LOGI(TAG, "Starting Interrupt Handler..."); xTaskCreatePinnedToCore(irqHandler, // task function @@ -428,6 +411,17 @@ void setup() { 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 + // gps buffer read interrupt #if (HAS_GPS) gpsIRQ = timerBegin(2, 80, true); @@ -440,15 +434,6 @@ void setup() { sendcycler.attach(SENDCYCLE * 2, sendcycle); housekeeper.attach(HOMECYCLE, housekeeping); -// button interrupt -#ifdef HAS_BUTTON -#ifdef BUTTON_PULLUP - attachInterrupt(digitalPinToInterrupt(HAS_BUTTON), ButtonIRQ, RISING); -#else - attachInterrupt(digitalPinToInterrupt(HAS_BUTTON), ButtonIRQ, FALLING); -#endif -#endif // HAS_BUTTON - #if (TIME_SYNC_INTERVAL) #if (!(TIME_SYNC_LORAWAN) && !(TIME_SYNC_LORASERVER) && !defined HAS_GPS && \ @@ -471,6 +456,9 @@ void setup() { #endif // TIME_SYNC_INTERVAL + // show compiled features + ESP_LOGI(TAG, "Features:%s", features); + } // setup() void loop() {