diff --git a/src/hasp/hasp_dispatch.cpp b/src/hasp/hasp_dispatch.cpp index 8f9f2fda..85bb0db6 100644 --- a/src/hasp/hasp_dispatch.cpp +++ b/src/hasp/hasp_dispatch.cpp @@ -147,7 +147,25 @@ static inline bool dispatch_parse_button_attribute(const char* topic_p, const ch return true; } -static void dispatch_gpio(const char* topic, const char* payload) +static void dispatch_input(const char* topic, const char* payload) +{ +#if HASP_USE_GPIO > 0 + + if(!Parser::is_only_digits(topic)) { + LOG_WARNING(TAG_MSGR, F("Invalid pin %s"), topic); + return; + } + + // just output the pin state + uint8_t pin = atoi(topic); + if(gpio_input_pin_state(pin)) return; + + LOG_WARNING(TAG_GPIO, F(D_BULLET "Pin %d is not configured"), pin); + +#endif +} + +static void dispatch_output(const char* topic, const char* payload) { #if HASP_USE_GPIO > 0 @@ -232,8 +250,10 @@ void dispatch_command(const char* topic, const char* payload, bool update) /* =============================== Not standard payload commands ===================================== */ if(topic == strstr_P(topic, PSTR("output"))) { + dispatch_output(topic + 6, payload); - dispatch_gpio(topic + 6, payload); + } else if(topic == strstr_P(topic, PSTR("input"))) { + dispatch_input(topic + 5, payload); // } else if(strcasecmp_P(topic, PSTR("screenshot")) == 0) { // guiTakeScreenshot("/screenshot.bmp"); // Literal String diff --git a/src/sys/gpio/hasp_gpio.cpp b/src/sys/gpio/hasp_gpio.cpp index 30062077..b9798e2e 100644 --- a/src/sys/gpio/hasp_gpio.cpp +++ b/src/sys/gpio/hasp_gpio.cpp @@ -92,7 +92,8 @@ static void gpio_event_handler(AceButton* button, uint8_t eventType, uint8_t but switch(eventType) { case AceButton::kEventPressed: if(gpioConfig[btnid].type != hasp_gpio_type_t::BUTTON) { - eventid = HASP_EVENT_ON; + eventid = HASP_EVENT_ON; + gpioConfig[btnid].power = 1; } else { eventid = HASP_EVENT_DOWN; } @@ -115,7 +116,8 @@ static void gpio_event_handler(AceButton* button, uint8_t eventType, uint8_t but // break; case AceButton::kEventReleased: if(gpioConfig[btnid].type != hasp_gpio_type_t::BUTTON) { - eventid = HASP_EVENT_OFF; + eventid = HASP_EVENT_OFF; + gpioConfig[btnid].power = 0; } else { eventid = HASP_EVENT_RELEASE; } @@ -348,8 +350,8 @@ void gpioEvery5Seconds(void) { for(uint8_t i = 0; i < HASP_NUM_GPIO_CONFIG; i++) { if(gpio_is_input(&gpioConfig[i])) { - gpioConfig[i].val = !gpioConfig[i].val; - event_gpio_input(gpioConfig[i].pin, gpioConfig[i].val); + gpioConfig[i].power = !gpioConfig[i].power; + event_gpio_input(gpioConfig[i].pin, gpioConfig[i].power); } } } @@ -368,6 +370,11 @@ bool gpio_get_pin_state(uint8_t pin, bool& power, int32_t& val) return false; } +static inline void gpio_input_state(hasp_gpio_config_t* gpio) +{ + event_gpio_input(gpio->pin, gpio->power); +} + void gpio_output_state(hasp_gpio_config_t* gpio) { char payload[32]; @@ -378,6 +385,17 @@ void gpio_output_state(hasp_gpio_config_t* gpio) dispatch_state_subtopic(topic, payload); } +bool gpio_input_pin_state(uint8_t pin) +{ + for(uint8_t i = 0; i < HASP_NUM_GPIO_CONFIG; i++) { + if(gpioConfig[i].pin == pin && gpioConfigInUse(i)) { + gpio_input_state(&gpioConfig[i]); + return true; + } + } + return false; +} + bool gpio_output_pin_state(uint8_t pin) { for(uint8_t i = 0; i < HASP_NUM_GPIO_CONFIG; i++) { diff --git a/src/sys/gpio/hasp_gpio.h b/src/sys/gpio/hasp_gpio.h index 68bccfe2..9003a9d8 100644 --- a/src/sys/gpio/hasp_gpio.h +++ b/src/sys/gpio/hasp_gpio.h @@ -40,6 +40,7 @@ void gpioEvery5Seconds(void); void gpio_set_normalized_group_values(hasp_update_value_t& value); void gpio_output_group_values(uint8_t group); +bool gpio_input_pin_state(uint8_t pin); bool gpio_output_pin_state(uint8_t pin); bool gpio_get_pin_state(uint8_t pin, bool& power, int32_t& val); bool gpio_set_pin_state(uint8_t pin, bool power, int32_t val);