Add inputX command to retrieve gpio state

This commit is contained in:
fvanroie 2021-05-24 00:14:47 +02:00
parent 57569e7b06
commit bab84898e0
3 changed files with 45 additions and 6 deletions

View File

@ -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

View File

@ -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++) {

View File

@ -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);