Add arc and gauge properties

This commit is contained in:
fvanroie 2021-01-01 21:37:08 +01:00
parent 55c85ca571
commit 2205de607d
6 changed files with 198 additions and 134 deletions

View File

@ -5,9 +5,7 @@
#if LVGL_VERSION_MAJOR != 7 #if LVGL_VERSION_MAJOR != 7
#include "../lv_components.h" #include "../lv_components.h"
#endif #endif
#include "ArduinoLog.h" #include "ArduinoLog.h"
//#include "hasp_conf.h"
#include "hasp.h" #include "hasp.h"
#include "hasp_object.h" #include "hasp_object.h"
@ -399,6 +397,26 @@ static lv_font_t * haspPayloadToFont(const char * payload)
} }
} }
static void gauge_format_10(lv_obj_t * gauge, char * buf, int bufsize, int32_t value)
{
snprintf(buf, bufsize, PSTR("%d"), value / 10);
}
static void gauge_format_100(lv_obj_t * gauge, char * buf, int bufsize, int32_t value)
{
snprintf(buf, bufsize, PSTR("%d"), value / 100);
}
static void gauge_format_1k(lv_obj_t * gauge, char * buf, int bufsize, int32_t value)
{
snprintf(buf, bufsize, PSTR("%d"), value / 1000);
}
static void gauge_format_10k(lv_obj_t * gauge, char * buf, int bufsize, int32_t value)
{
snprintf_P(buf, bufsize, PSTR("%d"), value / 10000);
}
static void hasp_process_label_long_mode(lv_obj_t * obj, const char * payload, bool update) static void hasp_process_label_long_mode(lv_obj_t * obj, const char * payload, bool update)
{ {
if(update) { if(update) {
@ -564,6 +582,18 @@ static void hasp_attribute_get_part_state(lv_obj_t * obj, const char * attr_in,
return; return;
} }
if(check_obj_type(obj, LV_HASP_ARC)) {
if(index == 1) {
part = LV_ARC_PART_INDIC;
} else if(index == 2) {
part = LV_ARC_PART_KNOB;
} else {
part = LV_ARC_PART_BG;
}
state = LV_STATE_DEFAULT;
return;
}
if(check_obj_type(obj, LV_HASP_CHECKBOX)) { if(check_obj_type(obj, LV_HASP_CHECKBOX)) {
if(index == 1) { if(index == 1) {
part = LV_CHECKBOX_PART_BULLET; part = LV_CHECKBOX_PART_BULLET;
@ -857,8 +887,14 @@ static void hasp_process_arc_attribute(lv_obj_t * obj, const char * attr_p, uint
return (update) ? lv_arc_set_rotation(obj, val) : hasp_out_int(obj, attr, lv_arc_get_rotation(obj)); return (update) ? lv_arc_set_rotation(obj, val) : hasp_out_int(obj, attr, lv_arc_get_rotation(obj));
case ATTR_ADJUSTABLE: case ATTR_ADJUSTABLE:
return (update) ? lv_arc_set_adjustable(obj, val != 0) if(update) {
: hasp_out_int(obj, attr, lv_arc_get_adjustable(obj)); bool toggle = is_true(payload);
lv_arc_set_adjustable(obj, toggle);
lv_obj_set_event_cb(obj, toggle ? slider_event_handler : btn_event_handler);
} else {
hasp_out_int(obj, attr, lv_arc_get_adjustable(obj));
}
return;
case ATTR_START_ANGLE: case ATTR_START_ANGLE:
return (update) ? lv_arc_set_bg_start_angle(obj, val) return (update) ? lv_arc_set_bg_start_angle(obj, val)
@ -876,6 +912,7 @@ static void hasp_process_arc_attribute(lv_obj_t * obj, const char * attr_p, uint
Log.warning(TAG_ATTR, F("Unknown property %s"), attr_p); Log.warning(TAG_ATTR, F("Unknown property %s"), attr_p);
} }
static void hasp_process_gauge_attribute(lv_obj_t * obj, const char * attr_p, uint16_t attr_hash, const char * payload, static void hasp_process_gauge_attribute(lv_obj_t * obj, const char * attr_p, uint16_t attr_hash, const char * payload,
bool update) bool update)
{ {
@ -903,6 +940,27 @@ static void hasp_process_gauge_attribute(lv_obj_t * obj, const char * attr_p, ui
case ATTR_LABEL_COUNT: case ATTR_LABEL_COUNT:
return (update) ? lv_gauge_set_scale(obj, angle, line_count, val) : hasp_out_int(obj, attr, label_count); return (update) ? lv_gauge_set_scale(obj, angle, line_count, val) : hasp_out_int(obj, attr, label_count);
case ATTR_FORMAT:
if(update) {
switch(val) {
case 10:
lv_gauge_set_formatter_cb(obj, gauge_format_10);
break;
case 100:
lv_gauge_set_formatter_cb(obj, gauge_format_100);
break;
case 1000:
lv_gauge_set_formatter_cb(obj, gauge_format_1k);
break;
case 10000:
lv_gauge_set_formatter_cb(obj, gauge_format_10k);
break;
default:
lv_gauge_set_formatter_cb(obj, NULL);
}
}
return;
} }
Log.warning(TAG_ATTR, F("Unknown property %s"), attr_p); Log.warning(TAG_ATTR, F("Unknown property %s"), attr_p);

View File

@ -11,6 +11,7 @@
#include "hasp_conf.h" #include "hasp_conf.h"
#include "hasp.h" #include "hasp.h"
#include "hasp_object.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@ -280,6 +281,6 @@ _HASP_ATTRIBUTE(SCALE_END_LINE_WIDTH, scale_end_line_width, lv_style_int_t)
#define ATTR_START_ANGLE1 39067 #define ATTR_START_ANGLE1 39067
#define ATTR_END_ANGLE1 33634 #define ATTR_END_ANGLE1 33634
// Buttonmatric // Buttonmatrix
#define ATTR_MAP 45628 #define ATTR_MAP 45628
#endif #endif

View File

@ -519,14 +519,15 @@ void dispatch_parse_jsonl(std::istringstream & stream)
size_t line = 1; size_t line = 1;
DynamicJsonDocument jsonl(4 * 128u); // max ~256 characters per line DynamicJsonDocument jsonl(4 * 128u); // max ~256 characters per line
DeserializationError err = deserializeJson(jsonl, stream); DeserializationError err = deserializeJson(jsonl, stream);
stream.setTimeout(25);
guiStop(); // guiStop();
while(err == DeserializationError::Ok) { while(err == DeserializationError::Ok) {
hasp_new_object(jsonl.as<JsonObject>(), savedPage); hasp_new_object(jsonl.as<JsonObject>(), savedPage);
err = deserializeJson(jsonl, stream); err = deserializeJson(jsonl, stream);
line++; line++;
} }
guiStart(); // guiStart();
/* For debugging pourposes */ /* For debugging pourposes */
if(err == DeserializationError::EmptyInput) { if(err == DeserializationError::EmptyInput) {
@ -550,6 +551,7 @@ void dispatch_parse_jsonl(const char *, const char * payload)
{ {
#if HASP_USE_CONFIG > 0 #if HASP_USE_CONFIG > 0
CharStream stream((char *)payload); CharStream stream((char *)payload);
// stream.setTimeout(10);
dispatch_parse_jsonl(stream); dispatch_parse_jsonl(stream);
#else #else
std::istringstream stream((char *)payload); std::istringstream stream((char *)payload);

View File

@ -84,72 +84,72 @@ bool hasp_find_id_from_obj(lv_obj_t * obj, uint8_t * pageid, uint8_t * objid)
* @return true or false wether the types match * @return true or false wether the types match
* @note * @note
*/ */
bool check_obj_type_str(const char * lvobjtype, lv_hasp_obj_type_t haspobjtype) // bool check_obj_type_str(const char * lvobjtype, lv_hasp_obj_type_t haspobjtype)
{ // {
lvobjtype += 3; // skip "lv_" // lvobjtype += 3; // skip "lv_"
switch(haspobjtype) { // switch(haspobjtype) {
case LV_HASP_BTNMATRIX: // case LV_HASP_BTNMATRIX:
return (strcmp_P(lvobjtype, PSTR("btnmatrix")) == 0); // return (strcmp_P(lvobjtype, PSTR("btnmatrix")) == 0);
case LV_HASP_TABLE: // case LV_HASP_TABLE:
return (strcmp_P(lvobjtype, PSTR("table")) == 0); // return (strcmp_P(lvobjtype, PSTR("table")) == 0);
case LV_HASP_BUTTON: // case LV_HASP_BUTTON:
return (strcmp_P(lvobjtype, PSTR("btn")) == 0); // return (strcmp_P(lvobjtype, PSTR("btn")) == 0);
case LV_HASP_LABEL: // case LV_HASP_LABEL:
return (strcmp_P(lvobjtype, PSTR("label")) == 0); // return (strcmp_P(lvobjtype, PSTR("label")) == 0);
case LV_HASP_CHECKBOX: // case LV_HASP_CHECKBOX:
return (strcmp_P(lvobjtype, PSTR("checkbox")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_cb")) == 0); // return (strcmp_P(lvobjtype, PSTR("checkbox")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_cb")) == 0);
case LV_HASP_DDLIST: // case LV_HASP_DDLIST:
return (strcmp_P(lvobjtype, PSTR("dropdown")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_ddlist")) == 0); // return (strcmp_P(lvobjtype, PSTR("dropdown")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_ddlist")) == 0);
case LV_HASP_CPICKER: // case LV_HASP_CPICKER:
return (strcmp_P(lvobjtype, PSTR("cpicker")) == 0); // return (strcmp_P(lvobjtype, PSTR("cpicker")) == 0);
case LV_HASP_PRELOADER: // case LV_HASP_PRELOADER:
return (strcmp_P(lvobjtype, PSTR("spinner")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_preload")) == 0); // return (strcmp_P(lvobjtype, PSTR("spinner")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_preload")) == 0);
case LV_HASP_SLIDER: // case LV_HASP_SLIDER:
return (strcmp_P(lvobjtype, PSTR("slider")) == 0); // return (strcmp_P(lvobjtype, PSTR("slider")) == 0);
case LV_HASP_GAUGE: // case LV_HASP_GAUGE:
return (strcmp_P(lvobjtype, PSTR("gauge")) == 0); // return (strcmp_P(lvobjtype, PSTR("gauge")) == 0);
case LV_HASP_ARC: // case LV_HASP_ARC:
return (strcmp_P(lvobjtype, PSTR("arc")) == 0); // return (strcmp_P(lvobjtype, PSTR("arc")) == 0);
case LV_HASP_BAR: // case LV_HASP_BAR:
return (strcmp_P(lvobjtype, PSTR("bar")) == 0); // return (strcmp_P(lvobjtype, PSTR("bar")) == 0);
case LV_HASP_LMETER: // case LV_HASP_LMETER:
return (strcmp_P(lvobjtype, PSTR("linemeter")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_lmeter")) == 0) // return (strcmp_P(lvobjtype, PSTR("linemeter")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_lmeter")) == 0)
case LV_HASP_ROLLER: // case LV_HASP_ROLLER:
return (strcmp_P(lvobjtype, PSTR("roller")) == 0); // return (strcmp_P(lvobjtype, PSTR("roller")) == 0);
case LV_HASP_SWITCH: // case LV_HASP_SWITCH:
return (strcmp_P(lvobjtype, PSTR("switch")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_sw")) == 0) // return (strcmp_P(lvobjtype, PSTR("switch")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_sw")) == 0)
case LV_HASP_LED: // case LV_HASP_LED:
return (strcmp_P(lvobjtype, PSTR("led")) == 0); // return (strcmp_P(lvobjtype, PSTR("led")) == 0);
case LV_HASP_IMAGE: // case LV_HASP_IMAGE:
return (strcmp_P(lvobjtype, PSTR("img")) == 0); // return (strcmp_P(lvobjtype, PSTR("img")) == 0);
case LV_HASP_IMGBTN: // case LV_HASP_IMGBTN:
return (strcmp_P(lvobjtype, PSTR("imgbtn")) == 0); // return (strcmp_P(lvobjtype, PSTR("imgbtn")) == 0);
case LV_HASP_CONTAINER: // case LV_HASP_CONTAINER:
return (strcmp_P(lvobjtype, PSTR("container")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_cont")) == 0) // return (strcmp_P(lvobjtype, PSTR("container")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_cont")) == 0)
case LV_HASP_OBJECT: // case LV_HASP_OBJECT:
return (strcmp_P(lvobjtype, PSTR("page")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_cont")) == 0) // return (strcmp_P(lvobjtype, PSTR("page")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_cont")) == 0)
case LV_HASP_PAGE: // case LV_HASP_PAGE:
return (strcmp_P(lvobjtype, PSTR("obj")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_cont")) == 0) // return (strcmp_P(lvobjtype, PSTR("obj")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_cont")) == 0)
case LV_HASP_TABVIEW: // case LV_HASP_TABVIEW:
return (strcmp_P(lvobjtype, PSTR("tabview")) == 0); // return (strcmp_P(lvobjtype, PSTR("tabview")) == 0);
case LV_HASP_TILEVIEW: // case LV_HASP_TILEVIEW:
return (strcmp_P(lvobjtype, PSTR("tileview")) == 0); // return (strcmp_P(lvobjtype, PSTR("tileview")) == 0);
case LV_HASP_CHART: // case LV_HASP_CHART:
return (strcmp_P(lvobjtype, PSTR("chart")) == 0); // return (strcmp_P(lvobjtype, PSTR("chart")) == 0);
case LV_HASP_CANVAS: // case LV_HASP_CANVAS:
return (strcmp_P(lvobjtype, PSTR("canvas")) == 0); // return (strcmp_P(lvobjtype, PSTR("canvas")) == 0);
case LV_HASP_CALENDER: // case LV_HASP_CALENDER:
return (strcmp_P(lvobjtype, PSTR("calender")) == 0); // return (strcmp_P(lvobjtype, PSTR("calender")) == 0);
case LV_HASP_MSGBOX: // case LV_HASP_MSGBOX:
return (strcmp_P(lvobjtype, PSTR("msgbox")) == 0); // return (strcmp_P(lvobjtype, PSTR("msgbox")) == 0);
case LV_HASP_WINDOW: // case LV_HASP_WINDOW:
return (strcmp_P(lvobjtype, PSTR("win")) == 0); // return (strcmp_P(lvobjtype, PSTR("win")) == 0);
default: // default:
return false; // return false;
} // }
} // }
/** /**
* Check if an lvgl objecttype name corresponds to a given HASP object ID * Check if an lvgl objecttype name corresponds to a given HASP object ID
@ -178,7 +178,7 @@ void hasp_object_tree(lv_obj_t * parent, uint8_t pageid, uint16_t level)
lv_obj_type_t list; lv_obj_type_t list;
lv_obj_get_type(parent, &list); lv_obj_get_type(parent, &list);
const char * objtype = list.type[0]; const char * objtype = list.type[0];
Log.verbose(TAG_HASP, F("[%d] p[%d].b[%d] %s"), level, pageid, parent->user_data, objtype); Log.verbose(TAG_HASP, F("[%d] p[%d].b[%d] %s"), level, pageid, parent->user_data.id, objtype);
lv_obj_t * child; lv_obj_t * child;
child = lv_obj_get_child(parent, NULL); child = lv_obj_get_child(parent, NULL);
@ -427,7 +427,7 @@ static void ddlist_event_handler(lv_obj_t * obj, lv_event_t event)
* @param obj pointer to a slider * @param obj pointer to a slider
* @param event type of event that occured * @param event type of event that occured
*/ */
static void slider_event_handler(lv_obj_t * obj, lv_event_t event) void slider_event_handler(lv_obj_t * obj, lv_event_t event)
{ {
if(event == LV_EVENT_VALUE_CHANGED) hasp_send_obj_attribute_val(obj, lv_slider_get_value(obj)); if(event == LV_EVENT_VALUE_CHANGED) hasp_send_obj_attribute_val(obj, lv_slider_get_value(obj));
} }

View File

@ -50,7 +50,7 @@ void hasp_new_object(const JsonObject & config, uint8_t & saved_page_id);
lv_obj_t * hasp_find_obj_from_parent_id(lv_obj_t * parent, uint8_t objid); lv_obj_t * hasp_find_obj_from_parent_id(lv_obj_t * parent, uint8_t objid);
// lv_obj_t * hasp_find_obj_from_page_id(uint8_t pageid, uint8_t objid); // lv_obj_t * hasp_find_obj_from_page_id(uint8_t pageid, uint8_t objid);
bool hasp_find_id_from_obj(lv_obj_t * obj, uint8_t * pageid, uint8_t * objid); bool hasp_find_id_from_obj(lv_obj_t * obj, uint8_t * pageid, uint8_t * objid);
bool check_obj_type_str(const char * lvobjtype, lv_hasp_obj_type_t haspobjtype); //bool check_obj_type_str(const char * lvobjtype, lv_hasp_obj_type_t haspobjtype);
bool check_obj_type(lv_obj_t * obj, lv_hasp_obj_type_t haspobjtype); bool check_obj_type(lv_obj_t * obj, lv_hasp_obj_type_t haspobjtype);
void hasp_object_tree(lv_obj_t * parent, uint8_t pageid, uint16_t level); void hasp_object_tree(lv_obj_t * parent, uint8_t pageid, uint16_t level);
@ -63,6 +63,7 @@ void object_set_group_state(uint8_t groupid, uint8_t eventid, lv_obj_t * src_obj
void IRAM_ATTR btn_event_handler(lv_obj_t * obj, lv_event_t event); void IRAM_ATTR btn_event_handler(lv_obj_t * obj, lv_event_t event);
void IRAM_ATTR toggle_event_handler(lv_obj_t * obj, lv_event_t event); void IRAM_ATTR toggle_event_handler(lv_obj_t * obj, lv_event_t event);
void slider_event_handler(lv_obj_t * obj, lv_event_t event);
void wakeup_event_handler(lv_obj_t * obj, lv_event_t event); void wakeup_event_handler(lv_obj_t * obj, lv_event_t event);
#endif #endif

View File

@ -355,6 +355,8 @@ void mqttStart()
mqttReconnectCount = 0; mqttReconnectCount = 0;
haspReconnect(); haspReconnect();
haspProgressVal(255);
dispatch_output_current_page(); dispatch_output_current_page();
dispatch_output_statusupdate(NULL, NULL); dispatch_output_statusupdate(NULL, NULL);
} }