New event handler state senders

This commit is contained in:
fvanroie 2021-02-28 22:04:12 +01:00
parent 9f71460a65
commit 0ef0f8c520
6 changed files with 217 additions and 98 deletions

View File

@ -54,25 +54,63 @@ moodlight_t moodlight;
static void dispatch_config(const char* topic, const char* payload); static void dispatch_config(const char* topic, const char* payload);
// void dispatch_group_value(uint8_t groupid, int16_t state, lv_obj_t * obj); // void dispatch_group_value(uint8_t groupid, int16_t state, lv_obj_t * obj);
static inline void dispatch_state_msg(const __FlashStringHelper* subtopic, const char* payload);
void dispatch_screenshot(const char*, const char* filename) /* Sends the payload out on the state/subtopic
*/
void dispatch_state_subtopic(const char* subtopic, const char* payload)
{ {
#if HASP_USE_SPIFFS > 0 || HASP_USE_LITTLEFS > 0 #if !defined(HASP_USE_MQTT) && !defined(HASP_USE_TASMOTA_CLIENT)
LOG_TRACE(TAG_MSGR, F("%s => %s"), subtopic, payload);
if(strlen(filename) == 0) { // no filename given
char tempfile[32];
memcpy_P(tempfile, PSTR("/screenshot.bmp"), sizeof(tempfile));
guiTakeScreenshot(tempfile);
} else if(strlen(filename) > 31 || filename[0] != '/') { // Invalid filename
LOG_WARNING(TAG_MSGR, "Invalid filename %s", filename);
} else { // Valid filename
guiTakeScreenshot(filename);
}
#else #else
LOG_WARNING(TAG_MSGR, "Failed to save %s, no storage", filename);
#if HASP_USE_MQTT > 0
switch(mqtt_send_state(subtopic, payload)) {
case MQTT_ERR_OK:
LOG_TRACE(TAG_MQTT_PUB, F("%s => %s"), subtopic, payload);
break;
case MQTT_ERR_PUB_FAIL:
LOG_ERROR(TAG_MQTT_PUB, F(D_MQTT_FAILED " %s => %s"), subtopic, payload);
break;
case MQTT_ERR_NO_CONN:
LOG_ERROR(TAG_MQTT, F(D_MQTT_NOT_CONNECTED));
break;
default:
LOG_ERROR(TAG_MQTT, F(D_ERROR_UNKNOWN));
}
#endif #endif
#if HASP_USE_TASMOTA_CLIENT > 0
slave_send_state(subtopic, payload);
#endif
#endif
}
/* Sends the data out on the state/pxby topic
*/
void dispatch_state_object(uint8_t pageid, uint8_t btnid, const char* payload)
{
char topic[16];
snprintf_P(topic, sizeof(topic), PSTR(HASP_OBJECT_NOTATION), pageid, btnid);
dispatch_state_subtopic(topic, payload);
}
/* Takes and lv_obj and finds the pageid and objid
Then sends the data out on the state/pxby topic
*/
void dispatch_obj_data(lv_obj_t* obj, const char* data)
{
uint8_t pageid;
uint8_t objid;
if(hasp_find_id_from_obj(obj, &pageid, &objid)) {
if(!data) return;
#if HASP_USE_MQTT > 0
dispatch_state_object(pageid, objid, data);
#endif
} else {
LOG_ERROR(TAG_MSGR, F(D_OBJECT_UNKNOWN));
}
} }
// Format filesystem and erase EEPROM // Format filesystem and erase EEPROM
@ -319,6 +357,7 @@ void dispatch_text_line(const char* cmnd)
// send idle state to the client // send idle state to the client
void dispatch_output_idle_state(uint8_t state) void dispatch_output_idle_state(uint8_t state)
{ {
char topic[6];
char payload[6]; char payload[6];
switch(state) { switch(state) {
case HASP_SLEEP_LONG: case HASP_SLEEP_LONG:
@ -330,17 +369,20 @@ void dispatch_output_idle_state(uint8_t state)
default: default:
memcpy_P(payload, PSTR("off"), 4); memcpy_P(payload, PSTR("off"), 4);
} }
dispatch_state_msg(F("idle"), payload); memcpy_P(topic, PSTR("idle"), 5);
dispatch_state_subtopic(topic, payload);
} }
void dispatch_output_group_state(uint8_t groupid, uint16_t state) void dispatch_output_group_state(uint8_t groupid, uint16_t state)
{ {
char payload[64]; char payload[64];
char number[16]; // Return the current state char number[16]; // Return the current state
char topic[8];
itoa(state, number, DEC); itoa(state, number, DEC);
snprintf_P(payload, sizeof(payload), PSTR("{\"group\":%d,\"state\":\"%s\"}"), groupid, number); snprintf_P(payload, sizeof(payload), PSTR("{\"group\":%d,\"state\":\"%s\"}"), groupid, number);
dispatch_state_msg(F("output"), payload); memcpy_P(topic, PSTR("output"), 7);
dispatch_state_subtopic(topic, payload);
} }
void dispatch_send_obj_attribute_str(uint8_t pageid, uint8_t btnid, const char* attribute, const char* data) void dispatch_send_obj_attribute_str(uint8_t pageid, uint8_t btnid, const char* attribute, const char* data)
@ -350,7 +392,7 @@ void dispatch_send_obj_attribute_str(uint8_t pageid, uint8_t btnid, const char*
char payload[32 + strlen(data) + strlen(attribute)]; char payload[32 + strlen(data) + strlen(attribute)];
snprintf_P(payload, sizeof(payload), PSTR("{\"%s\":\"%s\"}"), attribute, data); snprintf_P(payload, sizeof(payload), PSTR("{\"%s\":\"%s\"}"), attribute, data);
mqtt_send_object_state(pageid, btnid, payload); dispatch_state_object(pageid, btnid, payload);
} }
void dispatch_send_obj_attribute_int(uint8_t pageid, uint8_t btnid, const char* attribute, int32_t val) void dispatch_send_obj_attribute_int(uint8_t pageid, uint8_t btnid, const char* attribute, int32_t val)
@ -360,7 +402,7 @@ void dispatch_send_obj_attribute_int(uint8_t pageid, uint8_t btnid, const char*
char payload[64 + strlen(attribute)]; char payload[64 + strlen(attribute)];
snprintf_P(payload, sizeof(payload), PSTR("{\"%s\":%d}"), attribute, val); snprintf_P(payload, sizeof(payload), PSTR("{\"%s\":%d}"), attribute, val);
mqtt_send_object_state(pageid, btnid, payload); dispatch_state_object(pageid, btnid, payload);
} }
void dispatch_send_obj_attribute_color(uint8_t pageid, uint8_t btnid, const char* attribute, uint8_t r, uint8_t g, void dispatch_send_obj_attribute_color(uint8_t pageid, uint8_t btnid, const char* attribute, uint8_t r, uint8_t g,
@ -372,7 +414,7 @@ void dispatch_send_obj_attribute_color(uint8_t pageid, uint8_t btnid, const char
snprintf_P(payload, sizeof(payload), PSTR("{\"%s\":\"#%02x%02x%02x\",\"r\":%d,\"g\":%d,\"b\":%d}"), attribute, r, g, snprintf_P(payload, sizeof(payload), PSTR("{\"%s\":\"#%02x%02x%02x\",\"r\":%d,\"g\":%d,\"b\":%d}"), attribute, r, g,
b, r, g, b); b, r, g, b);
mqtt_send_object_state(pageid, btnid, payload); dispatch_state_object(pageid, btnid, payload);
} }
#if HASP_USE_CONFIG > 0 #if HASP_USE_CONFIG > 0
@ -468,9 +510,12 @@ static void dispatch_config(const char* topic, const char* payload)
// Send output // Send output
if(!update) { if(!update) {
char subtopic[8];
settings.remove(F("pass")); // hide password in output settings.remove(F("pass")); // hide password in output
size_t size = serializeJson(doc, buffer, sizeof(buffer)); size_t size = serializeJson(doc, buffer, sizeof(buffer));
dispatch_state_msg(F("config"), buffer); memcpy_P(subtopic, PSTR("config"), 7);
dispatch_state_subtopic(subtopic, buffer);
} }
} }
#endif // HASP_USE_CONFIG #endif // HASP_USE_CONFIG
@ -523,6 +568,9 @@ void dispatch_get_event_name(uint8_t eventid, char* buffer, size_t size)
case HASP_EVENT_LOST: case HASP_EVENT_LOST:
memcpy_P(buffer, PSTR("lost"), size); memcpy_P(buffer, PSTR("lost"), size);
break; break;
case HASP_EVENT_CHANGED:
memcpy_P(buffer, PSTR("changed"), size);
break;
default: default:
memcpy_P(buffer, PSTR("unknown"), size); memcpy_P(buffer, PSTR("unknown"), size);
} }
@ -532,12 +580,14 @@ void dispatch_get_event_name(uint8_t eventid, char* buffer, size_t size)
void dispatch_gpio_input_event(uint8_t pin, uint8_t group, uint8_t eventid) void dispatch_gpio_input_event(uint8_t pin, uint8_t group, uint8_t eventid)
{ {
char payload[64]; char payload[64];
char topic[8];
char event[8]; char event[8];
dispatch_get_event_name(eventid, event, sizeof(event)); dispatch_get_event_name(eventid, event, sizeof(event));
snprintf_P(payload, sizeof(payload), PSTR("{\"pin\":%d,\"group\":%d,\"event\":\"%s\"}"), pin, group, event); snprintf_P(payload, sizeof(payload), PSTR("{\"pin\":%d,\"group\":%d,\"event\":\"%s\"}"), pin, group, event);
#if HASP_USE_MQTT > 0 #if HASP_USE_MQTT > 0
mqtt_send_state(F("input"), payload); memcpy_P(topic, PSTR("input"), 6);
dispatch_state_subtopic(topic, payload);
#endif #endif
// update outputstates // update outputstates
@ -545,45 +595,67 @@ void dispatch_gpio_input_event(uint8_t pin, uint8_t group, uint8_t eventid)
} }
#endif #endif
void dispatch_object_event(lv_obj_t* obj, uint8_t eventid) /* ============================== Event Senders ============================ */
// Send out the event that occured
void dispatch_object_generic_event(lv_obj_t* obj, uint8_t eventid)
{ {
char topic[8]; char data[40];
char payload[8]; char eventname[8];
uint8_t pageid, objid;
snprintf_P(topic, sizeof(topic), PSTR("event")); dispatch_get_event_name(eventid, eventname, sizeof(eventname));
dispatch_get_event_name(eventid, payload, sizeof(payload)); snprintf_P(data, sizeof(data), PSTR("{\"event\":\"%s\"}"), eventname);
dispatch_obj_data(obj, data);
if(hasp_find_id_from_obj(obj, &pageid, &objid)) {
dispatch_send_obj_attribute_str(pageid, objid, topic, payload);
}
// dispatch_group_onoff(obj->user_data.groupid, dispatch_get_event_state(eventid), obj);
} }
// Send out the on/off event, with the val
void dispatch_object_toggle_event(lv_obj_t* obj, bool state)
{
char data[40];
char eventname[8];
dispatch_get_event_name(state, eventname, sizeof(eventname));
snprintf_P(data, sizeof(data), PSTR("{\"event\":\"%s\",\"val\":%d}"), eventname, state);
dispatch_obj_data(obj, data);
}
// Send out the changed event, with the val
void dispatch_object_value_changed(lv_obj_t* obj, int16_t state) void dispatch_object_value_changed(lv_obj_t* obj, int16_t state)
{ {
char topic[4]; char data[48];
hasp_update_sleep_state(); // wakeup? snprintf_P(data, sizeof(data), PSTR("{\"event\":\"changed\",\"val\":%d}"), state);
snprintf_P(topic, sizeof(topic), PSTR("val")); dispatch_obj_data(obj, data);
hasp_send_obj_attribute_int(obj, topic, state); }
// Send out the changed event, with the val and text
void dispatch_object_selection_changed(lv_obj_t* obj, int16_t val, const char* text)
{
char data[200];
snprintf_P(data, sizeof(data), PSTR("{\"event\":\"changed\",\"val\":%d,\"text\":\"%s\"}"), val, text);
dispatch_obj_data(obj, data);
}
// Send out the changed event, with the color
void dispatch_object_color_changed(lv_obj_t* obj, lv_color_t color)
{
char data[80];
lv_color32_t c32;
c32.full = lv_color_to32(color);
snprintf_P(data, sizeof(data),
PSTR("{\"event\":\"changed\",\"color\":\"#%02x%02x%02x\",\"r\":%d,\"g\":%d,\"b\":%d}"), c32.ch.red,
c32.ch.green, c32.ch.blue, c32.ch.red, c32.ch.green, c32.ch.blue);
dispatch_obj_data(obj, data);
} }
/********************************************** Output States ******************************************/ /********************************************** Output States ******************************************/
/*
static inline void dispatch_state_msg(const __FlashStringHelper* subtopic, const char* payload) static inline void dispatch_state_msg(const __FlashStringHelper* subtopic, const char* payload)
{ {
#if !defined(HASP_USE_MQTT) && !defined(HASP_USE_TASMOTA_CLIENT)
LOG_TRACE(TAG_MSGR, F("%s => %s"), String(subtopic).c_str(), payload); }*/
#else
#if HASP_USE_MQTT > 0
mqtt_send_state(subtopic, payload);
#endif
#if HASP_USE_TASMOTA_CLIENT > 0
slave_send_state(subtopic, payload);
#endif
#endif
}
// void dispatch_group_onoff(uint8_t groupid, uint16_t eventid, lv_obj_t * obj) // void dispatch_group_onoff(uint8_t groupid, uint16_t eventid, lv_obj_t * obj)
// { // {
@ -624,6 +696,25 @@ void dispatch_normalized_group_value(uint8_t groupid, uint16_t value, lv_obj_t*
/********************************************** Native Commands ****************************************/ /********************************************** Native Commands ****************************************/
void dispatch_screenshot(const char*, const char* filename)
{
#if HASP_USE_SPIFFS > 0 || HASP_USE_LITTLEFS > 0
if(strlen(filename) == 0) { // no filename given
char tempfile[32];
memcpy_P(tempfile, PSTR("/screenshot.bmp"), sizeof(tempfile));
guiTakeScreenshot(tempfile);
} else if(strlen(filename) > 31 || filename[0] != '/') { // Invalid filename
LOG_WARNING(TAG_MSGR, "Invalid filename %s", filename);
} else { // Valid filename
guiTakeScreenshot(filename);
}
#else
LOG_WARNING(TAG_MSGR, "Failed to save %s, no storage", filename);
#endif
}
void dispatch_parse_json(const char*, const char* payload) void dispatch_parse_json(const char*, const char* payload)
{ // Parse an incoming JSON array into individual commands { // Parse an incoming JSON array into individual commands
/* if(strPayload.endsWith(",]")) { /* if(strPayload.endsWith(",]")) {
@ -719,10 +810,12 @@ void dispatch_parse_jsonl(const char*, const char* payload)
void dispatch_output_current_page() void dispatch_output_current_page()
{ {
// Log result char topic[8];
char payload[4]; char payload[8];
itoa(haspGetPage(), payload, DEC);
dispatch_state_msg(F("page"), payload); memcpy_P(topic, PSTR("page"), 5);
snprintf_P(payload, sizeof(payload), PSTR("%d"), haspGetPage());
dispatch_state_subtopic(topic, payload);
} }
// Get or Set a page // Get or Set a page
@ -785,9 +878,12 @@ void dispatch_dim(const char*, const char* level)
// Set the current state // Set the current state
if(strlen(level) != 0) haspDevice.set_backlight_level(atoi(level)); if(strlen(level) != 0) haspDevice.set_backlight_level(atoi(level));
char payload[5]; char topic[8];
itoa(haspDevice.get_backlight_level(), payload, DEC); char payload[8];
dispatch_state_msg(F("dim"), payload);
memcpy_P(topic, PSTR("dim"), 4);
snprintf_P(payload, sizeof(payload), PSTR("%d"), haspDevice.get_backlight_level());
dispatch_state_subtopic(topic, payload);
} }
void dispatch_moodlight(const char* topic, const char* payload) void dispatch_moodlight(const char* topic, const char* payload)
@ -843,11 +939,14 @@ void dispatch_moodlight(const char* topic, const char* payload)
// Return the current state // Return the current state
char buffer[128]; char buffer[128];
char out_topic[16];
memcpy_P(out_topic, PSTR("moodlight"), 10);
snprintf_P( snprintf_P(
// buffer, sizeof(buffer), PSTR("{\"state\":\"%s\",\"color\":\"#%02x%02x%02x\",\"r\":%u,\"g\":%u,\"b\":%u}"), // buffer, sizeof(buffer),
// PSTR("{\"state\":\"%s\",\"color\":\"#%02x%02x%02x\",\"r\":%u,\"g\":%u,\"b\":%u}"),
buffer, sizeof(buffer), PSTR("{\"state\":\"%s\",\"color\":{\"r\":%u,\"g\":%u,\"b\":%u}}"), buffer, sizeof(buffer), PSTR("{\"state\":\"%s\",\"color\":{\"r\":%u,\"g\":%u,\"b\":%u}}"),
moodlight.power ? "on" : "off", moodlight.r, moodlight.g, moodlight.b); moodlight.power ? "on" : "off", moodlight.r, moodlight.g, moodlight.b);
dispatch_state_msg(F("moodlight"), buffer); dispatch_state_subtopic(out_topic, buffer);
} }
void dispatch_backlight(const char*, const char* payload) void dispatch_backlight(const char*, const char* payload)
@ -856,9 +955,11 @@ void dispatch_backlight(const char*, const char* payload)
if(strlen(payload) != 0) haspDevice.set_backlight_power(Utilities::is_true(payload)); if(strlen(payload) != 0) haspDevice.set_backlight_power(Utilities::is_true(payload));
// Return the current state // Return the current state
char topic[8];
char buffer[4]; char buffer[4];
memcpy_P(topic, PSTR("light"), 6);
memcpy_P(buffer, haspDevice.get_backlight_power() ? PSTR("on") : PSTR("off"), sizeof(buffer)); memcpy_P(buffer, haspDevice.get_backlight_power() ? PSTR("on") : PSTR("off"), sizeof(buffer));
dispatch_state_msg(F("light"), buffer); dispatch_state_subtopic(topic, buffer);
} }
void dispatch_web_update(const char*, const char* espOtaUrl) void dispatch_web_update(const char*, const char* espOtaUrl)
@ -925,12 +1026,12 @@ void dispatch_output_statusupdate(const char*, const char*)
strcat(data, buffer); strcat(data, buffer);
#endif #endif
snprintf_P(buffer, sizeof(buffer), PSTR("\"heapFree\":%u,\"heapFrag\":%u,\"espCore\":\"%s\","), snprintf_P(buffer, sizeof(buffer), PSTR("\"heapFree\":%u,\"heapFrag\":%u,\"core\":\"%s\","),
haspDevice.get_free_heap(), haspDevice.get_heap_fragmentation(), haspDevice.get_core_version()); haspDevice.get_free_heap(), haspDevice.get_heap_fragmentation(), haspDevice.get_core_version());
strcat(data, buffer); strcat(data, buffer);
snprintf_P(buffer, sizeof(buffer), PSTR("\"espCanUpdate\":\"false\",\"page\":%u,\"numPages\":%u,"), snprintf_P(buffer, sizeof(buffer), PSTR("\"canUpdate\":\"false\",\"page\":%u,\"numPages\":%u,"), haspGetPage(),
haspGetPage(), (HASP_NUM_PAGES)); (HASP_NUM_PAGES));
strcat(data, buffer); strcat(data, buffer);
#if defined(ARDUINO_ARCH_ESP8266) #if defined(ARDUINO_ARCH_ESP8266)
@ -942,7 +1043,10 @@ void dispatch_output_statusupdate(const char*, const char*)
Utilities::tft_driver_name().c_str(), (TFT_WIDTH), (TFT_HEIGHT)); Utilities::tft_driver_name().c_str(), (TFT_WIDTH), (TFT_HEIGHT));
strcat(data, buffer); strcat(data, buffer);
} }
mqtt_send_state(F("statusupdate"), data);
char topic[16];
memcpy_P(topic, PSTR("statusupdate"), 13);
dispatch_state_subtopic(topic, data);
dispatchLastMillis = millis(); dispatchLastMillis = millis();
/* if(updateEspAvailable) { /* if(updateEspAvailable) {

View File

@ -22,7 +22,9 @@ enum hasp_event_t { // even = released, odd = pressed
HASP_EVENT_LONG = 5, HASP_EVENT_LONG = 5,
HASP_EVENT_LOST = 6, HASP_EVENT_LOST = 6,
HASP_EVENT_HOLD = 7, HASP_EVENT_HOLD = 7,
HASP_EVENT_DOUBLE = 8 HASP_EVENT_DOUBLE = 8,
HASP_EVENT_CHANGED = 32
}; };
/* ===== Default Event Processors ===== */ /* ===== Default Event Processors ===== */
@ -60,7 +62,6 @@ void dispatch_output_statusupdate(const char*, const char*);
void dispatch_current_state(); void dispatch_current_state();
void dispatch_gpio_input_event(uint8_t pin, uint8_t group, uint8_t eventid); void dispatch_gpio_input_event(uint8_t pin, uint8_t group, uint8_t eventid);
void dispatch_object_event(lv_obj_t* obj, uint8_t eventid);
bool dispatch_get_event_state(uint8_t eventid); bool dispatch_get_event_state(uint8_t eventid);
void dispatch_get_event_name(uint8_t eventid, char* buffer, size_t size); void dispatch_get_event_name(uint8_t eventid, char* buffer, size_t size);
void dispatch_object_value_changed(lv_obj_t* obj, int16_t state); void dispatch_object_value_changed(lv_obj_t* obj, int16_t state);
@ -72,6 +73,12 @@ void dispatch_send_obj_attribute_int(uint8_t pageid, uint8_t btnid, const char*
void dispatch_send_obj_attribute_color(uint8_t pageid, uint8_t btnid, const char* attribute, uint8_t r, uint8_t g, void dispatch_send_obj_attribute_color(uint8_t pageid, uint8_t btnid, const char* attribute, uint8_t r, uint8_t g,
uint8_t b); uint8_t b);
void dispatch_object_generic_event(lv_obj_t* obj, uint8_t eventid);
void dispatch_object_toggle_event(lv_obj_t* obj, bool state);
void dispatch_object_value_changed(lv_obj_t* obj, int16_t state);
void dispatch_object_selection_changed(lv_obj_t* obj, int16_t val, const char* text);
void dispatch_object_color_changed(lv_obj_t* obj, lv_color_t color);
/* ===== Getter and Setter Functions ===== */ /* ===== Getter and Setter Functions ===== */
/* ===== Read/Write Configuration ===== */ /* ===== Read/Write Configuration ===== */

View File

@ -269,6 +269,23 @@ void hasp_send_obj_attribute_color(lv_obj_t* obj, const char* attribute, lv_colo
// ##################### Event Handlers ######################################################## // ##################### Event Handlers ########################################################
/**
* Called when a press on the system layer is detected
* @param obj pointer to a button matrix
* @param event type of event that occured
*/
void wakeup_event_handler(lv_obj_t* obj, lv_event_t event)
{
if(obj == lv_disp_get_layer_sys(NULL)) {
hasp_update_sleep_state(); // wakeup?
if(event == LV_EVENT_CLICKED) {
lv_obj_set_click(obj, false); // disable first touch
LOG_VERBOSE(TAG_HASP, F("Wakeup touch disabled"));
}
}
}
/** /**
* Called when a button-style object is clicked * Called when a button-style object is clicked
* @param obj pointer to a button object * @param obj pointer to a button object
@ -317,7 +334,7 @@ void generic_event_handler(lv_obj_t* obj, lv_event_t event)
return; return;
case LV_EVENT_VALUE_CHANGED: case LV_EVENT_VALUE_CHANGED:
LOG_WARNING(TAG_HASP, F("Value changed Event %d occured"), event); LOG_WARNING(TAG_HASP, F("Value changed Event %d occured"), event); // Shouldn't happen in this event handler
last_press_was_short = false; last_press_was_short = false;
return; return;
@ -333,28 +350,11 @@ void generic_event_handler(lv_obj_t* obj, lv_event_t event)
return; return;
} }
hasp_update_sleep_state(); // wakeup? hasp_update_sleep_state(); // wakeup?
dispatch_object_event(obj, eventid); // send object event dispatch_object_generic_event(obj, eventid); // send object event
dispatch_normalized_group_value(obj->user_data.groupid, NORMALIZE(dispatch_get_event_state(eventid), 0, 1), obj); dispatch_normalized_group_value(obj->user_data.groupid, NORMALIZE(dispatch_get_event_state(eventid), 0, 1), obj);
} }
/**
* Called when a press on the system layer is detected
* @param obj pointer to a button matrix
* @param event type of event that occured
*/
void wakeup_event_handler(lv_obj_t* obj, lv_event_t event)
{
if(obj == lv_disp_get_layer_sys(NULL)) {
hasp_update_sleep_state(); // wakeup?
if(event == LV_EVENT_CLICKED) {
lv_obj_set_click(obj, false); // disable first touch
LOG_VERBOSE(TAG_HASP, F("Wakeup touch disabled"));
}
}
}
/** /**
* Called when a object state is toggled on/off * Called when a object state is toggled on/off
* @param obj pointer to a switch object * @param obj pointer to a switch object
@ -363,7 +363,7 @@ void wakeup_event_handler(lv_obj_t* obj, lv_event_t event)
void toggle_event_handler(lv_obj_t* obj, lv_event_t event) void toggle_event_handler(lv_obj_t* obj, lv_event_t event)
{ {
if(event == LV_EVENT_VALUE_CHANGED) { if(event == LV_EVENT_VALUE_CHANGED) {
char property[4]; char property[36]; // 4 for val only
bool val = 0; bool val = 0;
hasp_update_sleep_state(); // wakeup? hasp_update_sleep_state(); // wakeup?
@ -385,8 +385,11 @@ void toggle_event_handler(lv_obj_t* obj, lv_event_t event)
return; return;
} }
snprintf_P(property, sizeof(property), PSTR("val")); // snprintf_P(property, sizeof(property), PSTR("val"));
hasp_send_obj_attribute_int(obj, property, val); // hasp_send_obj_attribute_int(obj, property, val);
hasp_update_sleep_state(); // wakeup?
dispatch_object_toggle_event(obj, val);
dispatch_normalized_group_value(obj->user_data.groupid, NORMALIZE(val, 0, 1), obj); dispatch_normalized_group_value(obj->user_data.groupid, NORMALIZE(val, 0, 1), obj);
} else if(event == LV_EVENT_DELETE) { } else if(event == LV_EVENT_DELETE) {
@ -437,7 +440,7 @@ static void selector_event_handler(lv_obj_t* obj, lv_event_t event)
const char* txt = lv_table_get_cell_value(obj, row, col); const char* txt = lv_table_get_cell_value(obj, row, col);
strncpy(buffer, txt, sizeof(buffer)); strncpy(buffer, txt, sizeof(buffer));
snprintf_P(property, sizeof(property), PSTR("row\":%d,\"col\":%d,\"txt"), row, col); snprintf_P(property, sizeof(property), PSTR("row\":%d,\"col\":%d,\"text"), row, col);
hasp_send_obj_attribute_str(obj, property, buffer); hasp_send_obj_attribute_str(obj, property, buffer);
return; return;
} }
@ -447,8 +450,10 @@ static void selector_event_handler(lv_obj_t* obj, lv_event_t event)
} }
// set the property // set the property
snprintf_P(property, sizeof(property), PSTR("val\":%d,\"text"), val); // snprintf_P(property, sizeof(property), PSTR("val\":%d,\"text"), val);
hasp_send_obj_attribute_str(obj, property, buffer); // hasp_send_obj_attribute_str(obj, property, buffer);
dispatch_object_selection_changed(obj, val, buffer);
if(max > 0) dispatch_normalized_group_value(obj->user_data.groupid, NORMALIZE(val, 0, max), obj); if(max > 0) dispatch_normalized_group_value(obj->user_data.groupid, NORMALIZE(val, 0, max), obj);
} else if(event == LV_EVENT_DELETE) { } else if(event == LV_EVENT_DELETE) {
@ -481,6 +486,7 @@ void slider_event_handler(lv_obj_t* obj, lv_event_t event)
int16_t val = 0; int16_t val = 0;
int16_t min = 0; int16_t min = 0;
int16_t max = 0; int16_t max = 0;
hasp_update_sleep_state(); // wakeup?
if(obj->user_data.objid == LV_HASP_SLIDER) { if(obj->user_data.objid == LV_HASP_SLIDER) {
val = lv_slider_get_value(obj); val = lv_slider_get_value(obj);
@ -514,7 +520,9 @@ static void cpicker_event_handler(lv_obj_t* obj, lv_event_t event)
if(event == LV_EVENT_VALUE_CHANGED) { if(event == LV_EVENT_VALUE_CHANGED) {
hasp_update_sleep_state(); // wakeup? hasp_update_sleep_state(); // wakeup?
hasp_send_obj_attribute_color(obj, color, lv_cpicker_get_color(obj)); // hasp_send_obj_attribute_color(obj, color, lv_cpicker_get_color(obj));
dispatch_object_color_changed(obj, lv_cpicker_get_color(obj));
} else if(event == LV_EVENT_DELETE) { } else if(event == LV_EVENT_DELETE) {
LOG_VERBOSE(TAG_HASP, F(D_OBJECT_DELETED)); LOG_VERBOSE(TAG_HASP, F(D_OBJECT_DELETED));
hasp_object_delete(obj); hasp_object_delete(obj);

View File

@ -9,9 +9,9 @@
#include "hasp_conf.h" #include "hasp_conf.h"
#ifdef WINDOWS // #ifdef WINDOWS
#define __FlashStringHelper char // #define __FlashStringHelper char
#endif // #endif
enum hasp_mqtt_error_t { enum hasp_mqtt_error_t {
MQTT_ERR_OK = 0, MQTT_ERR_OK = 0,

View File

@ -251,7 +251,7 @@ int mqtt_send_state(const __FlashStringHelper* subtopic, const char* payload)
return mqttPublish(tmp_topic, payload, strlen(payload), false); return mqttPublish(tmp_topic, payload, strlen(payload), false);
} }
int mqtt_send_object_state(uint8_t pageid, uint8_t btnid, char* payload) int mqtt_send_object_state(uint8_t pageid, uint8_t btnid, const char* payload)
{ {
char tmp_topic[strlen(mqttNodeTopic) + 20]; char tmp_topic[strlen(mqttNodeTopic) + 20];
snprintf_P(tmp_topic, sizeof(tmp_topic), PSTR("%sstate/p%ub%u"), mqttNodeTopic, pageid, btnid); snprintf_P(tmp_topic, sizeof(tmp_topic), PSTR("%sstate/p%ub%u"), mqttNodeTopic, pageid, btnid);

View File

@ -128,11 +128,11 @@ void mqtt_send_lwt(bool online)
bool res = mqttPublish(tmp_topic, tmp_payload, len, true); bool res = mqttPublish(tmp_topic, tmp_payload, len, true);
} }
void mqtt_send_object_state(uint8_t pageid, uint8_t btnid, const char* payload) int mqtt_send_object_state(uint8_t pageid, uint8_t btnid, const char* payload)
{ {
char tmp_topic[strlen(mqttNodeTopic) + 16]; char tmp_topic[strlen(mqttNodeTopic) + 16];
snprintf_P(tmp_topic, sizeof(tmp_topic), PSTR("%sstate/" HASP_OBJECT_NOTATION), mqttNodeTopic, pageid, btnid); snprintf_P(tmp_topic, sizeof(tmp_topic), PSTR("%sstate/" HASP_OBJECT_NOTATION), mqttNodeTopic, pageid, btnid);
mqttPublish(tmp_topic, payload, false); return mqttPublish(tmp_topic, payload, false);
} }
int mqtt_send_state(const char* subtopic, const char* payload) int mqtt_send_state(const char* subtopic, const char* payload)