Fix disconnected mqtt info not showing up

This commit is contained in:
fvanroie 2021-06-11 18:38:48 +02:00
parent 0d1066e97f
commit 4da628cc68
12 changed files with 222 additions and 86 deletions

View File

@ -1146,14 +1146,21 @@ static hasp_attribute_type_t specific_options_attribute(lv_obj_t* obj, const cha
} else {
strcpy_P(*text, "Not implemented"); // TODO : Literal String
}
return hasp_attribute_type_t::HASP_ATTR_TYPE_METHOD_OK;
return hasp_attribute_type_t::HASP_ATTR_TYPE_STR;
case LV_HASP_MSGBOX:
if(update) {
my_msgbox_set_map(obj, payload);
} else {
strcpy_P(*text, "Not implemented"); // TODO : Literal String
}
return hasp_attribute_type_t::HASP_ATTR_TYPE_METHOD_OK;
return hasp_attribute_type_t::HASP_ATTR_TYPE_STR;
case LV_HASP_LIST:
if(update) {
my_list_set_options(obj, payload);
} else {
strcpy_P(*text, "Not implemented"); // TODO : Literal String
}
return hasp_attribute_type_t::HASP_ATTR_TYPE_STR;
default:
break; // not found
}
@ -1324,6 +1331,11 @@ static bool my_obj_get_range(lv_obj_t* obj, int32_t& min, int32_t& max)
max = my_chart_get_max_value(obj);
break;
case LV_HASP_SPINBOX:
min = my_spinbox_get_min_value(obj);
max = my_spinbox_get_max_value(obj);
break;
case LV_HASP_DROPDOWN:
case LV_HASP_ROLLER:
return false; // not supported yet
@ -1336,70 +1348,102 @@ static bool my_obj_get_range(lv_obj_t* obj, int32_t& min, int32_t& max)
static hasp_attribute_type_t attribute_common_val(lv_obj_t* obj, int32_t& val, bool update)
{
if(obj_check_type(obj, LV_HASP_BUTTON)) {
if(lv_btn_get_checkable(obj)) {
if(update) {
if(val)
lv_obj_add_state(obj, LV_STATE_CHECKED);
else
lv_obj_clear_state(obj, LV_STATE_CHECKED);
switch(obj_get_type(obj)) {
case LV_HASP_BUTTON:
if(lv_btn_get_checkable(obj)) {
if(update) {
if(val)
lv_obj_add_state(obj, LV_STATE_CHECKED);
else
lv_obj_clear_state(obj, LV_STATE_CHECKED);
} else {
val = lv_obj_get_state(obj, LV_BTN_PART_MAIN) & LV_STATE_CHECKED;
}
} else {
val = lv_obj_get_state(obj, LV_BTN_PART_MAIN) & LV_STATE_CHECKED;
return HASP_ATTR_TYPE_NOT_FOUND; // not checkable
}
} else {
return HASP_ATTR_TYPE_NOT_FOUND; // not checkable
}
} else if(obj_check_type(obj, LV_HASP_CHECKBOX)) {
if(update)
lv_checkbox_set_checked(obj, !!val);
else
val = lv_checkbox_is_checked(obj);
} else if(obj_check_type(obj, LV_HASP_SWITCH)) {
if(update)
!val ? lv_switch_off(obj, LV_ANIM_ON) : lv_switch_on(obj, LV_ANIM_ON);
else
val = lv_switch_get_state(obj);
} else if(obj_check_type(obj, LV_HASP_DROPDOWN)) {
lv_dropdown_set_selected(obj, (uint16_t)val);
} else if(obj_check_type(obj, LV_HASP_LINEMETER)) {
if(update)
lv_linemeter_set_value(obj, val);
else
val = lv_linemeter_get_value(obj);
} else if(obj_check_type(obj, LV_HASP_SLIDER)) {
if(update)
lv_slider_set_value(obj, val, LV_ANIM_ON);
else
val = lv_slider_get_value(obj);
} else if(obj_check_type(obj, LV_HASP_LED)) {
if(update)
lv_led_set_bright(obj, (uint8_t)val);
else
val = lv_led_get_bright(obj);
} else if(obj_check_type(obj, LV_HASP_ARC)) {
if(update)
lv_arc_set_value(obj, val);
else
val = lv_arc_get_value(obj);
} else if(obj_check_type(obj, LV_HASP_GAUGE)) {
if(update)
lv_gauge_set_value(obj, 0, val);
else
val = lv_gauge_get_value(obj, 0);
} else if(obj_check_type(obj, LV_HASP_ROLLER)) {
lv_roller_set_selected(obj, (uint16_t)val, LV_ANIM_ON);
} else if(obj_check_type(obj, LV_HASP_BAR)) {
if(update)
lv_bar_set_value(obj, val, LV_ANIM_ON);
else
val = lv_bar_get_value(obj);
} else if(obj_check_type(obj, LV_HASP_TABVIEW)) {
if(update)
lv_tabview_set_tab_act(obj, val, LV_ANIM_ON);
else
val = lv_tabview_get_tab_act(obj);
} else {
return HASP_ATTR_TYPE_NOT_FOUND; // not found
break;
case LV_HASP_CHECKBOX:
if(update)
lv_checkbox_set_checked(obj, !!val);
else
val = lv_checkbox_is_checked(obj);
break;
case LV_HASP_SWITCH:
if(update)
!val ? lv_switch_off(obj, LV_ANIM_ON) : lv_switch_on(obj, LV_ANIM_ON);
else
val = lv_switch_get_state(obj);
break;
case LV_HASP_DROPDOWN:
lv_dropdown_set_selected(obj, (uint16_t)val);
case LV_HASP_LINEMETER:
if(update)
lv_linemeter_set_value(obj, val);
else
val = lv_linemeter_get_value(obj);
break;
case LV_HASP_SLIDER:
if(update)
lv_slider_set_value(obj, val, LV_ANIM_ON);
else
val = lv_slider_get_value(obj);
break;
case LV_HASP_LED:
if(update)
lv_led_set_bright(obj, (uint8_t)val);
else
val = lv_led_get_bright(obj);
break;
case LV_HASP_ARC:
if(update)
lv_arc_set_value(obj, val);
else
val = lv_arc_get_value(obj);
break;
case LV_HASP_GAUGE:
if(update)
lv_gauge_set_value(obj, 0, val);
else
val = lv_gauge_get_value(obj, 0);
break;
case LV_HASP_ROLLER:
lv_roller_set_selected(obj, (uint16_t)val, LV_ANIM_ON);
break;
case LV_HASP_BAR:
if(update)
lv_bar_set_value(obj, val, LV_ANIM_ON);
else
val = lv_bar_get_value(obj);
break;
case LV_HASP_SPINBOX:
if(update)
lv_spinbox_set_value(obj, val);
else
val = lv_spinbox_get_value(obj);
break;
case LV_HASP_TABVIEW:
if(update)
lv_tabview_set_tab_act(obj, val, LV_ANIM_ON);
else
val = lv_tabview_get_tab_act(obj);
break;
default:
return HASP_ATTR_TYPE_NOT_FOUND; // not found
}
return HASP_ATTR_TYPE_INT; // found
@ -1488,13 +1532,22 @@ static hasp_attribute_type_t attribute_common_range(lv_obj_t* obj, int32_t& val,
case LV_HASP_CHART:
if(update && (set_min ? val : min) == (set_max ? val : max))
return HASP_ATTR_TYPE_RANGE_ERROR; // prevent setting min=max
return HASP_ATTR_TYPE_RANGE_ERROR; // prevent setting min=max
if(update)
lv_chart_set_range(obj, set_min ? val : min, set_max ? val : max);
else
val = set_min ? min : max;
break;
case LV_HASP_SPINBOX:
if(update && (set_min ? val : min) == (set_max ? val : max))
return HASP_ATTR_TYPE_RANGE_ERROR; // prevent setting min=max
if(update)
lv_spinbox_set_range(obj, set_min ? val : min, set_max ? val : max);
else
val = set_min ? min : max;
break;
default:
return HASP_ATTR_TYPE_NOT_FOUND;
}
@ -1906,8 +1959,9 @@ void hasp_process_obj_attribute(lv_obj_t* obj, const char* attribute, const char
break;
// case ATTR_SYMBOL:
// (update) ? lv_dropdown_set_symbol(obj, payload) : attr_out_str(obj, attr,
// lv_dropdown_get_symbol(obj)); return true;
// (update) ? lv_dropdown_set_symbol(obj, payload) :
// attr_out_str(obj, attr, lv_dropdown_get_symbol(obj));
// return true;
case ATTR_DELETE:
case ATTR_CLEAR:

View File

@ -76,6 +76,20 @@ lv_chart_series_t* my_chart_get_series(lv_obj_t* chart, uint8_t ser_num)
return ser;
}
// OK - this function is missing in lvgl
static inline int16_t my_spinbox_get_min_value(lv_obj_t* chart)
{
lv_spinbox_ext_t* ext = (lv_spinbox_ext_t*)lv_obj_get_ext_attr(chart);
return ext->range_min;
}
// OK - this function is missing in lvgl
static inline int16_t my_spinbox_get_max_value(lv_obj_t* chart)
{
lv_spinbox_ext_t* ext = (lv_spinbox_ext_t*)lv_obj_get_ext_attr(chart);
return ext->range_max;
}
// OK
static inline lv_color_t haspLogColor(lv_color_t color)
{
@ -280,6 +294,37 @@ void my_obj_set_value_str_text(lv_obj_t* obj, uint8_t part, lv_state_t state, co
// LOG_VERBOSE(TAG_ATTR, F("%s %d"), __FILE__, __LINE__);
}
void my_list_set_options(lv_obj_t* obj, const char* payload)
{ // Reserve memory for JsonDocument
size_t maxsize = (128u * ((strlen(payload) / 128) + 1)) + 256;
DynamicJsonDocument doc(maxsize);
DeserializationError jsonError = deserializeJson(doc, payload);
if(jsonError) { // Couldn't parse incoming JSON payload
dispatch_json_error(TAG_ATTR, jsonError);
return;
}
doc.shrinkToFit();
lv_list_clean(obj);
JsonArray arr = doc.as<JsonArray>(); // Parse payload
lv_obj_t* btn = NULL;
for(JsonVariant v : arr) {
const char* c = v.as<const char*>();
if(*c == 0xee || *c == 0xef) {
char icon[4];
memcpy(icon, c, 3);
icon[3] = '\0';
btn = lv_list_add_btn(obj, icon, c + 3);
} else
btn = lv_list_add_btn(obj, NULL, c);
}
if(btn) lv_obj_set_event_cb(btn, selector_event_handler);
}
void my_tabview_set_text(lv_obj_t* obj, const char* payload)
{
uint16_t id = lv_tabview_get_tab_act(obj);

View File

@ -529,6 +529,25 @@ void hasp_new_object(const JsonObject& config, uint8_t& saved_page_id)
}
break;
case LV_HASP_SPINBOX:
case HASP_OBJ_SPINBOX:
obj = lv_spinbox_create(parent_obj, NULL);
if(obj) {
lv_spinbox_set_range(obj, 0, 100);
lv_obj_set_event_cb(obj, slider_event_handler);
obj->user_data.objid = LV_HASP_SPINBOX;
}
break;
case LV_HASP_LIST:
case HASP_OBJ_LIST:
obj = lv_list_create(parent_obj, NULL);
if(obj) {
// Callbacks are set on the individual buttons
obj->user_data.objid = LV_HASP_LIST;
}
break;
case LV_HASP_CHART:
case HASP_OBJ_CHART:
obj = lv_chart_create(parent_obj, NULL);

View File

@ -43,6 +43,7 @@
#define D_NETWORK_ONLINE "online"
#define D_NETWORK_OFFLINE "offline"
#define D_NETWORK_CONNECTION_FAILED "Connection failed"
#define D_NETWORK_CONNECTION_UNAUTHORIZED "Authorization failed"
#define D_MQTT_DEFAULT_NAME "plate_%s"
#define D_MQTT_CONNECTING "Connecting..."
@ -64,7 +65,6 @@
#define D_TELNET_CLIENT_LOGIN_FROM "Client login from %s"
#define D_TELNET_CLIENT_CONNECT_FROM "Client connected from %s"
#define D_TELNET_CLIENT_NOT_CONNECTED "Client NOT connected"
#define D_TELNET_AUTHENTICATION_FAILED "Authorization failed!"
#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Incorrect login attempt from %s"
#define D_TELNET_STARTED "Telnet console started"
#define D_TELNET_FAILED "Failed to start telnet console"

View File

@ -43,6 +43,7 @@
#define D_NETWORK_ONLINE "en linea"
#define D_NETWORK_OFFLINE "fuera de línea"
#define D_NETWORK_CONNECTION_FAILED "Falló la conexión"
#define D_NETWORK_CONNECTION_UNAUTHORIZED "Falló la autorización"
#define D_MQTT_DEFAULT_NAME "placa_%s"
#define D_MQTT_CONNECTING "Conectando..."
@ -63,7 +64,6 @@
#define D_TELNET_CLOSING_CONNECTION "Cerrando sesión de %s"
#define D_TELNET_CLIENT_LOGIN_FROM "Se ha firmado el cliente %s"
#define D_TELNET_CLIENT_CONNECT_FROM "Se ha conectado el cliente %s"
#define D_TELNET_AUTHENTICATION_FAILED "Falló la autorización!"
#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Intento de conexión incorrecta desde %s"
#define D_TELNET_STARTED "Console Telnet arrancada"
#define D_TELNET_FAILED "Falló el arranque de la consola Telnet"
@ -86,8 +86,8 @@
#define D_ATTRIBUTE_UNKNOWN "Propiedad %s desconocida"
// D_ATTRIBUTE_OBSOLETE D_ATTRIBUTE_INSTEAD can be used together or just D_ATTRIBUTE_OBSOLETE alone
#define D_ATTRIBUTE_OBSOLETE "%s is obsolete" // new
#define D_ATTRIBUTE_INSTEAD ", use %s instead" // new
#define D_ATTRIBUTE_OBSOLETE "%s is obsolete" // new
#define D_ATTRIBUTE_INSTEAD ", use %s instead" // new
#define D_ATTRIBUTE_READ_ONLY "%s es solo lectura"
#define D_ATTRIBUTE_PAGE_METHOD_INVALID "No se puede llamar %s en una página"
#define D_ATTRIBUTE_ALIGN_INVALID "Invalid align property: %s" // new

View File

@ -43,6 +43,7 @@
#define D_NETWORK_ONLINE "en ligne"
#define D_NETWORK_OFFLINE "déconnecté"
#define D_NETWORK_CONNECTION_FAILED "Échec de la connexion "
#define D_NETWORK_CONNECTION_UNAUTHORIZED "Échec de l'autorisation"
#define D_MQTT_DEFAULT_NAME "plaque_%s"
#define D_MQTT_CONNECTING "Connexion..."
@ -64,7 +65,6 @@
#define D_TELNET_CLIENT_LOGIN_FROM "Connexion client depuis %s"
#define D_TELNET_CLIENT_CONNECT_FROM "Client connecté depuis %s"
#define D_TELNET_CLIENT_NOT_CONNECTED "Client NON connecté"
#define D_TELNET_AUTHENTICATION_FAILED "Échec de l'autorisation!"
#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Tentative incorrecte de %s"
#define D_TELNET_STARTED "Console Telnet démarré"
#define D_TELNET_FAILED "Échec du démarrage de la console telnet"

View File

@ -43,6 +43,7 @@
#define D_NETWORK_ONLINE "online"
#define D_NETWORK_OFFLINE "offline"
#define D_NETWORK_CONNECTION_FAILED "A kapcsolódás meghiúsult"
#define D_NETWORK_CONNECTION_UNAUTHORIZED "A hitelesítés sikertelen"
#define D_MQTT_DEFAULT_NAME "plate_%s"
#define D_MQTT_CONNECTING "Csatlakozás..."
@ -64,7 +65,6 @@
#define D_TELNET_CLIENT_LOGIN_FROM "Kliens bejelentkezés innen: %s"
#define D_TELNET_CLIENT_CONNECT_FROM "Kliens csatlakozva innen: %s"
#define D_TELNET_CLIENT_NOT_CONNECTED "Kliens NEM csatlakozik"
#define D_TELNET_AUTHENTICATION_FAILED "A hitelesítés sikertelen!"
#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Helytelen bejelentkezési kísérlet %s-ről"
#define D_TELNET_STARTED "Telnet konzol elindítva"
#define D_TELNET_FAILED "Telnet konzol elindítása meghiúsult"

View File

@ -43,6 +43,7 @@
#define D_NETWORK_ONLINE "online"
#define D_NETWORK_OFFLINE "offline"
#define D_NETWORK_CONNECTION_FAILED "Verbinding mislukt"
#define D_NETWORK_CONNECTION_UNAUTHORIZED "Autorisatie mislukt"
#define D_MQTT_DEFAULT_NAME "plaat_%s"
#define D_MQTT_CONNECTING "Verbinden..."
@ -64,7 +65,6 @@
#define D_TELNET_CLIENT_LOGIN_FROM "Client aangemeld van %s"
#define D_TELNET_CLIENT_CONNECT_FROM "Client verbonden van %s"
#define D_TELNET_CLIENT_NOT_CONNECTED "Client NIET verbonden"
#define D_TELNET_AUTHENTICATION_FAILED "Autorisatie mislukt!"
#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Aanmelding van %s mislukt"
#define D_TELNET_STARTED "Telnet console gestart"
#define D_TELNET_FAILED "Telnet console starten is mislukt"

View File

@ -44,6 +44,7 @@
#define D_NETWORK_ONLINE "Online"
#define D_NETWORK_OFFLINE "Offline"
#define D_NETWORK_CONNECTION_FAILED "Falhou a ligação"
#define D_NETWORK_CONNECTION_UNAUTHORIZED "Falhou a autorização"
#define D_MQTT_DEFAULT_NAME "placa_%s"
#define D_MQTT_CONNECTING "A ligar..."
@ -64,7 +65,6 @@
#define D_TELNET_CLOSING_CONNECTION "A fechar a ligação de %s"
#define D_TELNET_CLIENT_LOGIN_FROM "Foi feito login ao cliente %s"
#define D_TELNET_CLIENT_CONNECT_FROM "Foi conectado ao cliente %s"
#define D_TELNET_AUTHENTICATION_FAILED "Falhou a autorização!"
#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Tentativa de ligação incorreta desde %s"
#define D_TELNET_STARTED "Consola inicializada"
#define D_TELNET_FAILED "Falhou inicialização da consola"

View File

@ -43,6 +43,7 @@
#define D_NETWORK_ONLINE "online"
#define D_NETWORK_OFFLINE "offline"
#define D_NETWORK_CONNECTION_FAILED "Conexiune eșuată"
#define D_NETWORK_CONNECTION_UNAUTHORIZED "Autorizatia a esuat"
#define D_MQTT_DEFAULT_NAME "plate_%s"
#define D_MQTT_CONNECTING "Conectare..."
@ -64,7 +65,6 @@
#define D_TELNET_CLIENT_LOGIN_FROM "Conectare client de la %s"
#define D_TELNET_CLIENT_CONNECT_FROM "Client conectat de la %s"
#define D_TELNET_CLIENT_NOT_CONNECTED "Clientul NU este conectat"
#define D_TELNET_AUTHENTICATION_FAILED "Autorizatia a esuat!"
#define D_TELNET_INCORRECT_LOGIN_ATTEMPT "Încercare incorectă de autentificare de la %s"
#define D_TELNET_STARTED "Consola Telnet pornită"
#define D_TELNET_FAILED "Nu s-a putut porni consola Telnet"

View File

@ -372,7 +372,7 @@ void mqttStop()
void mqtt_get_info(JsonDocument& doc)
{
char mqttClientId[64];
char buffer[64];
String mac((char*)0);
mac.reserve(64);
@ -382,15 +382,33 @@ void mqtt_get_info(JsonDocument& doc)
mac = halGetMacAddress(3, "");
mac.toLowerCase();
snprintf_P(mqttClientId, sizeof(mqttClientId), PSTR("%s-%s"), haspDevice.get_hostname(), mac.c_str());
info[F(D_INFO_CLIENTID)] = mqttClientId;
snprintf_P(buffer, sizeof(buffer), PSTR("%s-%s"), haspDevice.get_hostname(), mac.c_str());
info[F(D_INFO_CLIENTID)] = buffer;
if(mqttIsConnected()) { // Check MQTT connection
info[F(D_INFO_STATUS)] = F(D_INFO_CONNECTED);
} else {
info[F(D_INFO_STATUS)] = F("<font color='red'><b>" D_INFO_DISCONNECTED "</b></font>, return code: ");
// +String(mqttClient.returnCode());
switch(mqttClient.state()) {
case MQTT_CONNECT_UNAUTHORIZED:
snprintf_P(buffer, sizeof(buffer), PSTR(D_NETWORK_CONNECTION_UNAUTHORIZED));
break;
case MQTT_CONNECT_FAILED:
snprintf_P(buffer, sizeof(buffer), PSTR(D_NETWORK_CONNECTION_FAILED));
break;
case MQTT_DISCONNECTED:
snprintf_P(buffer, sizeof(buffer), PSTR(D_INFO_DISCONNECTED));
break;
case MQTT_CONNECTED:
snprintf_P(buffer, sizeof(buffer), PSTR(D_INFO_CONNECTED));
break;
case MQTT_CONNECTION_TIMEOUT:
case MQTT_CONNECTION_LOST:
case MQTT_CONNECT_BAD_PROTOCOL:
case MQTT_CONNECT_BAD_CLIENT_ID:
case MQTT_CONNECT_UNAVAILABLE:
case MQTT_CONNECT_BAD_CREDENTIALS:
default:
snprintf_P(buffer, sizeof(buffer), PSTR(D_INFO_DISCONNECTED " (%d)"), mqttClient.state());
break;
}
info[F(D_INFO_STATUS)] = buffer;
info[F(D_INFO_RECEIVED)] = mqttReceiveCount;
info[F(D_INFO_PUBLISHED)] = mqttPublishCount;

View File

@ -131,7 +131,7 @@ static inline void telnetProcessLine()
} else {
telnetLoginState = TELNET_UNAUTHENTICATED;
telnetLoginAttempt++; // Subsequent attempt
telnetClient.println(F(D_TELNET_AUTHENTICATION_FAILED"\r\n"));
telnetClient.println(F(D_NETWORK_CONNECTION_UNAUTHORIZED"\r\n"));
LOG_WARNING(TAG_TELN, F(D_TELNET_INCORRECT_LOGIN_ATTEMPT), telnetClient.remoteIP().toString().c_str());
if(telnetLoginAttempt >= 3) {
telnetClientDisconnect();
@ -217,7 +217,7 @@ static void telnetProcessLine(const char* input)
} else {
telnetLoginState = TELNET_UNAUTHENTICATED;
telnetLoginAttempt++; // Subsequent attempt
telnetClient.println(F(D_TELNET_AUTHENTICATION_FAILED "\r\n"));
telnetClient.println(F(D_NETWORK_CONNECTION_UNAUTHORIZED "\r\n"));
LOG_WARNING(TAG_TELN, F(D_TELNET_INCORRECT_LOGIN_ATTEMPT), telnetClient.remoteIP().toString().c_str());
if(telnetLoginAttempt >= 3) {
telnetClientDisconnect();