diff --git a/src/hasp/hasp_dispatch.h b/src/hasp/hasp_dispatch.h index 328c2981..1ecb9fc0 100644 --- a/src/hasp/hasp_dispatch.h +++ b/src/hasp/hasp_dispatch.h @@ -13,16 +13,15 @@ struct dispatch_conf_t }; enum hasp_event_t { // even = released, odd = pressed - HASP_EVENT_OFF = 0, - HASP_EVENT_ON = 1, - HASP_EVENT_UP = 2, - HASP_EVENT_DOWN = 3, - - HASP_EVENT_SHORT = 4, - HASP_EVENT_LONG = 5, - HASP_EVENT_LOST = 6, - HASP_EVENT_HOLD = 7, - HASP_EVENT_DOUBLE = 8, + HASP_EVENT_OFF = 0, + HASP_EVENT_ON = 1, + HASP_EVENT_UP = 2, + HASP_EVENT_DOWN = 3, + HASP_EVENT_RELEASE = 4, + HASP_EVENT_HOLD = 5, + HASP_EVENT_LONG = 6, + HASP_EVENT_LOST = 7, + HASP_EVENT_DOUBLE = 8, HASP_EVENT_CHANGED = 32 }; diff --git a/src/hasp/hasp_event.cpp b/src/hasp/hasp_event.cpp index 822e5269..059f01fd 100644 --- a/src/hasp/hasp_event.cpp +++ b/src/hasp/hasp_event.cpp @@ -12,8 +12,6 @@ #include "hasp_conf.h" #include "hasplib.h" -// static unsigned long last_change_event = 0; -static bool last_press_was_short = false; // Avoid SHORT + UP double events static lv_style_int_t last_value_sent; static lv_color_t last_color_sent; @@ -32,9 +30,7 @@ void event_obj_data(lv_obj_t* obj, const char* data) if(hasp_find_id_from_obj(obj, &pageid, &objid)) { if(!data) return; -#if HASP_USE_MQTT > 0 object_dispatch_state(pageid, objid, data); -#endif } else { LOG_ERROR(TAG_MSGR, F(D_OBJECT_UNKNOWN)); } @@ -95,9 +91,9 @@ void event_gpio_input(uint8_t pin, uint8_t group, uint8_t eventid) { char payload[64]; char topic[8]; - char event[8]; - Parser::get_event_name(eventid, event, sizeof(event)); - snprintf_P(payload, sizeof(payload), PSTR("{\"pin\":%d,\"group\":%d,\"event\":\"%s\"}"), pin, group, event); + char eventname[8]; + Parser::get_event_name(eventid, eventname, sizeof(eventname)); + snprintf_P(payload, sizeof(payload), PSTR("{\"pin\":%d,\"group\":%d,\"event\":\"%s\"}"), pin, group, eventname); memcpy_P(topic, PSTR("input"), 6); dispatch_state_subtopic(topic, payload); @@ -165,6 +161,18 @@ void log_event(const char* name, lv_event_t event) LOG_TRACE(TAG_EVENT, "%s Changed", name); break; + case LV_EVENT_GESTURE: + LOG_TRACE(TAG_EVENT, "%s Gesture", name); + break; + + case LV_EVENT_FOCUSED: + LOG_TRACE(TAG_EVENT, "%s Focussed", name); + break; + + case LV_EVENT_DEFOCUSED: + LOG_TRACE(TAG_EVENT, "%s Defocussed", name); + break; + case LV_EVENT_PRESSING: break; @@ -219,70 +227,64 @@ void page_event_handler(lv_obj_t* obj, lv_event_t event) */ void generic_event_handler(lv_obj_t* obj, lv_event_t event) { - uint8_t eventid; log_event("generic", event); switch(event) { case LV_EVENT_PRESSED: - eventid = HASP_EVENT_DOWN; - last_press_was_short = false; + hasp_update_sleep_state(); // wakeup? + last_value_sent = HASP_EVENT_DOWN; break; case LV_EVENT_CLICKED: // UP = the same object was release then was pressed and press was not lost! - eventid = last_press_was_short ? HASP_EVENT_SHORT : HASP_EVENT_UP; - break; - - case LV_EVENT_SHORT_CLICKED: - last_press_was_short = true; // Avoid SHORT + UP double events + // eventid = HASP_EVENT_UP; + if(last_value_sent != HASP_EVENT_LOST && last_value_sent != HASP_EVENT_UP) + last_value_sent = HASP_EVENT_LONG; return; - // eventid = HASP_EVENT_SHORT; - // break; + case LV_EVENT_SHORT_CLICKED: + if(last_value_sent != HASP_EVENT_LOST) last_value_sent = HASP_EVENT_UP; // Avoid SHORT + UP double events + break; + case LV_EVENT_LONG_PRESSED: - eventid = HASP_EVENT_LONG; - last_press_was_short = false; + if(last_value_sent != HASP_EVENT_LOST) last_value_sent = HASP_EVENT_LONG; break; case LV_EVENT_LONG_PRESSED_REPEAT: - // last_press_was_short = false; - return; // we don't care about hold - // eventid = HASP_EVENT_HOLD; - // break; + if(last_value_sent != HASP_EVENT_LOST) last_value_sent = HASP_EVENT_HOLD; + break; // we do care about hold + case LV_EVENT_PRESS_LOST: - eventid = HASP_EVENT_LOST; - last_press_was_short = false; + last_value_sent = HASP_EVENT_LOST; break; case LV_EVENT_PRESSING: case LV_EVENT_FOCUSED: case LV_EVENT_DEFOCUSED: - case LV_EVENT_RELEASED: - return; + case LV_EVENT_GESTURE: + return; // Don't care about these - case LV_EVENT_VALUE_CHANGED: - LOG_WARNING(TAG_EVENT, F("Value changed Event %d occured"), - event); // Shouldn't happen in this event handler - last_press_was_short = false; - return; + case LV_EVENT_RELEASED: + if(last_value_sent == HASP_EVENT_UP) return; + last_value_sent = HASP_EVENT_RELEASE; + break; case LV_EVENT_DELETE: LOG_VERBOSE(TAG_EVENT, F(D_OBJECT_DELETED)); event_delete_object(obj); // free and destroy persistent memory allocated for certain objects - last_press_was_short = false; return; + case LV_EVENT_VALUE_CHANGED: // Should not occur in this event handler default: LOG_WARNING(TAG_EVENT, F(D_OBJECT_EVENT_UNKNOWN), event); - last_press_was_short = false; return; } - hasp_update_sleep_state(); // wakeup? + if(last_value_sent == HASP_EVENT_LOST) return; /* If an actionid is attached, perform that action on UP event only */ if(obj->user_data.actionid) { - if(eventid == HASP_EVENT_UP || eventid == HASP_EVENT_SHORT) { + if(last_value_sent == HASP_EVENT_UP || last_value_sent == HASP_EVENT_RELEASE) { lv_scr_load_anim_t transitionid = (lv_scr_load_anim_t)obj->user_data.transitionid; switch(obj->user_data.actionid) { case HASP_NUM_PAGE_PREV: @@ -300,7 +302,7 @@ void generic_event_handler(lv_obj_t* obj, lv_event_t event) dispatch_output_current_page(); } } else { - event_object_generic_event(obj, eventid); // send normal object event + event_object_generic_event(obj, last_value_sent); // send normal object event } dispatch_normalized_group_value(obj->user_data.groupid, obj, Parser::get_event_state(eventid), HASP_EVENT_OFF, HASP_EVENT_ON); diff --git a/src/hasp/hasp_object.cpp b/src/hasp/hasp_object.cpp index d1cc849e..5e90bdcc 100644 --- a/src/hasp/hasp_object.cpp +++ b/src/hasp/hasp_object.cpp @@ -68,8 +68,7 @@ lv_obj_t* hasp_find_obj_from_parent_id(lv_obj_t* parent, uint8_t objid) bool hasp_find_id_from_obj(lv_obj_t* obj, uint8_t* pageid, uint8_t* objid) { if(!haspPages.get_id(obj, pageid)) return false; - if(!(obj->user_data.id > 0)) return false; - // memcpy(objid, &obj->user_data.id, sizeof(lv_obj_user_data_t)); + if(!obj || obj->user_data.id == 0) return false; *objid = obj->user_data.id; return true; } diff --git a/src/hasp/hasp_parser.cpp b/src/hasp/hasp_parser.cpp index 658b2e6b..e004cb00 100644 --- a/src/hasp/hasp_parser.cpp +++ b/src/hasp/hasp_parser.cpp @@ -122,8 +122,8 @@ void Parser::get_event_name(uint8_t eventid, char* buffer, size_t size) case HASP_EVENT_DOWN: memcpy_P(buffer, PSTR("down"), size); break; - case HASP_EVENT_SHORT: - memcpy_P(buffer, PSTR("short"), size); + case HASP_EVENT_RELEASE: + memcpy_P(buffer, PSTR("release"), size); break; case HASP_EVENT_LONG: memcpy_P(buffer, PSTR("long"), size); diff --git a/src/mqtt/hasp_mqtt_ha.cpp b/src/mqtt/hasp_mqtt_ha.cpp index 59ad7c77..03260e02 100644 --- a/src/mqtt/hasp_mqtt_ha.cpp +++ b/src/mqtt/hasp_mqtt_ha.cpp @@ -118,7 +118,7 @@ void mqtt_ha_register_button(uint8_t page, uint8_t id) discovery_prefix, haspDevice.get_hostname(), page, id, "short_press"); mqtt_ha_send_json(buffer, doc); - Parser::get_event_name(HASP_EVENT_SHORT, buffer, sizeof(buffer)); + Parser::get_event_name(HASP_EVENT_UP, buffer, sizeof(buffer)); doc[F("pl")] = buffer; doc[F("type")] = "button_short_release"; snprintf_P(buffer, sizeof(buffer), PSTR("%s/device_automation/%s/" HASP_OBJECT_NOTATION "_%s/config"), @@ -132,7 +132,7 @@ void mqtt_ha_register_button(uint8_t page, uint8_t id) discovery_prefix, haspDevice.get_hostname(), page, id, "long_press"); mqtt_ha_send_json(buffer, doc); - Parser::get_event_name(HASP_EVENT_UP, buffer, sizeof(buffer)); + Parser::get_event_name(HASP_EVENT_RELEASE, buffer, sizeof(buffer)); doc[F("pl")] = buffer; doc[F("type")] = "button_long_release"; snprintf_P(buffer, sizeof(buffer), PSTR("%s/device_automation/%s/" HASP_OBJECT_NOTATION "_%s/config"),