diff --git a/src/hasp_button.cpp b/src/hasp_button.cpp index 798da6bb..95f3f446 100644 --- a/src/hasp_button.cpp +++ b/src/hasp_button.cpp @@ -5,13 +5,40 @@ #include "hasp_conf.h" #include "lv_conf.h" +#include "hasp_mqtt.h" // testing memory consumption #include "hasp_button.h" #include "hasp_dispatch.h" using namespace ace_button; -AceButton * button[HASP_NUM_INPUTS]; // Connect your button between pin 2 and GND +static AceButton * button[HASP_NUM_INPUTS]; // Connect your button between pin 2 and GND -void handleEvent(AceButton *, uint8_t, uint8_t); +static void IRAM_ATTR button_event_cb(AceButton * button, uint8_t eventType, uint8_t buttonState) +{ + char buffer[8]; + switch(eventType) { + case 0: // AceButton::kEventPressed: + memcpy_P(buffer, PSTR("DOWN"), sizeof(buffer)); + break; + case 2: // AceButton::kEventClicked: + memcpy_P(buffer, PSTR("SHORT"), sizeof(buffer)); + break; + // case AceButton::kEventDoubleClicked: + // memcpy_P(buffer, PSTR("DOUBLE"), sizeof(buffer)); + // break; + case 4: // AceButton::kEventLongPressed: + memcpy_P(buffer, PSTR("LONG"), sizeof(buffer)); + break; + case 5: // AceButton::kEventRepeatPressed: + return; // Fix needed for switches + memcpy_P(buffer, PSTR("HOLD"), sizeof(buffer)); + break; + case 1: // AceButton::kEventReleased: + memcpy_P(buffer, PSTR("UP"), sizeof(buffer)); + break; + } + // dispatch_button(button->getId(), buffer); + mqtt_send_input(button->getId(), buffer); +} void buttonSetup(void) { @@ -19,8 +46,10 @@ void buttonSetup(void) button[1] = new AceButton(3, HIGH, 1); button[2] = new AceButton(4, HIGH, 2); + Log.verbose(F("BTNS: setup(): ready")); + ButtonConfig * buttonConfig = ButtonConfig::getSystemButtonConfig(); - buttonConfig->setEventHandler(handleEvent); + buttonConfig->setEventHandler(button_event_cb); // Features buttonConfig->setFeature(ButtonConfig::kFeatureClick); @@ -35,50 +64,13 @@ void buttonSetup(void) buttonConfig->setLongPressDelay(LV_INDEV_DEF_LONG_PRESS_TIME); buttonConfig->setRepeatPressDelay(LV_INDEV_DEF_LONG_PRESS_TIME); buttonConfig->setRepeatPressInterval(LV_INDEV_DEF_LONG_PRESS_REP_TIME); - - Log.verbose(F("BTNS: setup(): ready")); } -void buttonLoop(void) +void IRAM_ATTR buttonLoop(void) { - // Should be called every 4-5ms or faster, for the default debouncing time // of ~20ms. - for(uint8_t i = 0; i < (sizeof button / sizeof *button); i++) { + for(uint8_t i = 0; i < HASP_NUM_INPUTS; i++) { if(button[i]) button[i]->check(); } } - -// The event handler for the button. -void handleEvent(AceButton * button, uint8_t eventType, uint8_t buttonState) -{ - char buffer[128]; - - // Print out a message for all events. - /* Serial.print(F("handleEvent(): eventType: ")); - Serial.print(eventType); - Serial.print(F("; buttonState: ")); - Serial.println(buttonState); */ - - switch(eventType) { - case AceButton::kEventPressed: - memcpy_P(buffer, PSTR("DOWN"), sizeof(buffer)); - break; - case AceButton::kEventClicked: - memcpy_P(buffer, PSTR("SHORT"), sizeof(buffer)); - break; - case AceButton::kEventDoubleClicked: - memcpy_P(buffer, PSTR("DOUBLE"), sizeof(buffer)); - break; - case AceButton::kEventLongPressed: - memcpy_P(buffer, PSTR("LONG"), sizeof(buffer)); - break; - case AceButton::kEventRepeatPressed: - memcpy_P(buffer, PSTR("HOLD"), sizeof(buffer)); - break; - case AceButton::kEventReleased: - memcpy_P(buffer, PSTR("UP"), sizeof(buffer)); - break; - } - dispatchButton(button->getId(), buffer); -} \ No newline at end of file