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
#include "../lv_components.h"
#endif
#include "ArduinoLog.h"
//#include "hasp_conf.h"
#include "hasp.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)
{
if(update) {
@ -564,6 +582,18 @@ static void hasp_attribute_get_part_state(lv_obj_t * obj, const char * attr_in,
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(index == 1) {
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));
case ATTR_ADJUSTABLE:
return (update) ? lv_arc_set_adjustable(obj, val != 0)
: hasp_out_int(obj, attr, lv_arc_get_adjustable(obj));
if(update) {
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:
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);
}
static void hasp_process_gauge_attribute(lv_obj_t * obj, const char * attr_p, uint16_t attr_hash, const char * payload,
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:
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);

View File

@ -11,6 +11,7 @@
#include "hasp_conf.h"
#include "hasp.h"
#include "hasp_object.h"
#ifdef __cplusplus
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_END_ANGLE1 33634
// Buttonmatric
// Buttonmatrix
#define ATTR_MAP 45628
#endif

View File

@ -519,14 +519,15 @@ void dispatch_parse_jsonl(std::istringstream & stream)
size_t line = 1;
DynamicJsonDocument jsonl(4 * 128u); // max ~256 characters per line
DeserializationError err = deserializeJson(jsonl, stream);
stream.setTimeout(25);
guiStop();
// guiStop();
while(err == DeserializationError::Ok) {
hasp_new_object(jsonl.as<JsonObject>(), savedPage);
err = deserializeJson(jsonl, stream);
line++;
}
guiStart();
// guiStart();
/* For debugging pourposes */
if(err == DeserializationError::EmptyInput) {
@ -550,6 +551,7 @@ void dispatch_parse_jsonl(const char *, const char * payload)
{
#if HASP_USE_CONFIG > 0
CharStream stream((char *)payload);
// stream.setTimeout(10);
dispatch_parse_jsonl(stream);
#else
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
* @note
*/
bool check_obj_type_str(const char * lvobjtype, lv_hasp_obj_type_t haspobjtype)
{
lvobjtype += 3; // skip "lv_"
// bool check_obj_type_str(const char * lvobjtype, lv_hasp_obj_type_t haspobjtype)
// {
// lvobjtype += 3; // skip "lv_"
switch(haspobjtype) {
case LV_HASP_BTNMATRIX:
return (strcmp_P(lvobjtype, PSTR("btnmatrix")) == 0);
case LV_HASP_TABLE:
return (strcmp_P(lvobjtype, PSTR("table")) == 0);
case LV_HASP_BUTTON:
return (strcmp_P(lvobjtype, PSTR("btn")) == 0);
case LV_HASP_LABEL:
return (strcmp_P(lvobjtype, PSTR("label")) == 0);
case LV_HASP_CHECKBOX:
return (strcmp_P(lvobjtype, PSTR("checkbox")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_cb")) == 0);
case LV_HASP_DDLIST:
return (strcmp_P(lvobjtype, PSTR("dropdown")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_ddlist")) == 0);
case LV_HASP_CPICKER:
return (strcmp_P(lvobjtype, PSTR("cpicker")) == 0);
case LV_HASP_PRELOADER:
return (strcmp_P(lvobjtype, PSTR("spinner")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_preload")) == 0);
case LV_HASP_SLIDER:
return (strcmp_P(lvobjtype, PSTR("slider")) == 0);
case LV_HASP_GAUGE:
return (strcmp_P(lvobjtype, PSTR("gauge")) == 0);
case LV_HASP_ARC:
return (strcmp_P(lvobjtype, PSTR("arc")) == 0);
case LV_HASP_BAR:
return (strcmp_P(lvobjtype, PSTR("bar")) == 0);
case LV_HASP_LMETER:
return (strcmp_P(lvobjtype, PSTR("linemeter")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_lmeter")) == 0)
case LV_HASP_ROLLER:
return (strcmp_P(lvobjtype, PSTR("roller")) == 0);
case LV_HASP_SWITCH:
return (strcmp_P(lvobjtype, PSTR("switch")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_sw")) == 0)
case LV_HASP_LED:
return (strcmp_P(lvobjtype, PSTR("led")) == 0);
case LV_HASP_IMAGE:
return (strcmp_P(lvobjtype, PSTR("img")) == 0);
case LV_HASP_IMGBTN:
return (strcmp_P(lvobjtype, PSTR("imgbtn")) == 0);
case LV_HASP_CONTAINER:
return (strcmp_P(lvobjtype, PSTR("container")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_cont")) == 0)
case LV_HASP_OBJECT:
return (strcmp_P(lvobjtype, PSTR("page")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_cont")) == 0)
case LV_HASP_PAGE:
return (strcmp_P(lvobjtype, PSTR("obj")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_cont")) == 0)
case LV_HASP_TABVIEW:
return (strcmp_P(lvobjtype, PSTR("tabview")) == 0);
case LV_HASP_TILEVIEW:
return (strcmp_P(lvobjtype, PSTR("tileview")) == 0);
case LV_HASP_CHART:
return (strcmp_P(lvobjtype, PSTR("chart")) == 0);
case LV_HASP_CANVAS:
return (strcmp_P(lvobjtype, PSTR("canvas")) == 0);
case LV_HASP_CALENDER:
return (strcmp_P(lvobjtype, PSTR("calender")) == 0);
case LV_HASP_MSGBOX:
return (strcmp_P(lvobjtype, PSTR("msgbox")) == 0);
case LV_HASP_WINDOW:
return (strcmp_P(lvobjtype, PSTR("win")) == 0);
// switch(haspobjtype) {
// case LV_HASP_BTNMATRIX:
// return (strcmp_P(lvobjtype, PSTR("btnmatrix")) == 0);
// case LV_HASP_TABLE:
// return (strcmp_P(lvobjtype, PSTR("table")) == 0);
// case LV_HASP_BUTTON:
// return (strcmp_P(lvobjtype, PSTR("btn")) == 0);
// case LV_HASP_LABEL:
// return (strcmp_P(lvobjtype, PSTR("label")) == 0);
// case LV_HASP_CHECKBOX:
// return (strcmp_P(lvobjtype, PSTR("checkbox")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_cb")) == 0);
// case LV_HASP_DDLIST:
// return (strcmp_P(lvobjtype, PSTR("dropdown")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_ddlist")) == 0);
// case LV_HASP_CPICKER:
// return (strcmp_P(lvobjtype, PSTR("cpicker")) == 0);
// case LV_HASP_PRELOADER:
// return (strcmp_P(lvobjtype, PSTR("spinner")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_preload")) == 0);
// case LV_HASP_SLIDER:
// return (strcmp_P(lvobjtype, PSTR("slider")) == 0);
// case LV_HASP_GAUGE:
// return (strcmp_P(lvobjtype, PSTR("gauge")) == 0);
// case LV_HASP_ARC:
// return (strcmp_P(lvobjtype, PSTR("arc")) == 0);
// case LV_HASP_BAR:
// return (strcmp_P(lvobjtype, PSTR("bar")) == 0);
// case LV_HASP_LMETER:
// return (strcmp_P(lvobjtype, PSTR("linemeter")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_lmeter")) == 0)
// case LV_HASP_ROLLER:
// return (strcmp_P(lvobjtype, PSTR("roller")) == 0);
// case LV_HASP_SWITCH:
// return (strcmp_P(lvobjtype, PSTR("switch")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_sw")) == 0)
// case LV_HASP_LED:
// return (strcmp_P(lvobjtype, PSTR("led")) == 0);
// case LV_HASP_IMAGE:
// return (strcmp_P(lvobjtype, PSTR("img")) == 0);
// case LV_HASP_IMGBTN:
// return (strcmp_P(lvobjtype, PSTR("imgbtn")) == 0);
// case LV_HASP_CONTAINER:
// return (strcmp_P(lvobjtype, PSTR("container")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_cont")) == 0)
// case LV_HASP_OBJECT:
// return (strcmp_P(lvobjtype, PSTR("page")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_cont")) == 0)
// case LV_HASP_PAGE:
// return (strcmp_P(lvobjtype, PSTR("obj")) == 0); // || (strcmp_P(lvobjtype, PSTR("lv_cont")) == 0)
// case LV_HASP_TABVIEW:
// return (strcmp_P(lvobjtype, PSTR("tabview")) == 0);
// case LV_HASP_TILEVIEW:
// return (strcmp_P(lvobjtype, PSTR("tileview")) == 0);
// case LV_HASP_CHART:
// return (strcmp_P(lvobjtype, PSTR("chart")) == 0);
// case LV_HASP_CANVAS:
// return (strcmp_P(lvobjtype, PSTR("canvas")) == 0);
// case LV_HASP_CALENDER:
// return (strcmp_P(lvobjtype, PSTR("calender")) == 0);
// case LV_HASP_MSGBOX:
// return (strcmp_P(lvobjtype, PSTR("msgbox")) == 0);
// case LV_HASP_WINDOW:
// return (strcmp_P(lvobjtype, PSTR("win")) == 0);
default:
return false;
}
}
// default:
// return false;
// }
// }
/**
* 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_get_type(parent, &list);
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;
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 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));
}

View File

@ -12,14 +12,14 @@ enum lv_hasp_obj_type_t {
LV_HASP_OBJECT = 91,
LV_HASP_PAGE = 92,
LV_HASP_LABEL = 12,
LV_HASP_LABEL = 12,
LV_HASP_DDLIST = 50,
LV_HASP_ROLLER = 51,
LV_HASP_BUTTON = 10,
LV_HASP_CHECKBOX = 11,
LV_HASP_SWITCH = 40,
LV_HASP_LED = 41,
LV_HASP_SWITCH = 40,
LV_HASP_LED = 41,
LV_HASP_SLIDER = 30,
LV_HASP_GAUGE = 31,
@ -36,11 +36,11 @@ enum lv_hasp_obj_type_t {
LV_HASP_BTNMATRIX = 1,
LV_HASP_TABLE = 2,
LV_HASP_CALENDER = 81,
LV_HASP_CHART = 80,
LV_HASP_TILEVIEW = 70,
LV_HASP_TABVIEW = 71,
LV_HASP_TAB = 72,
LV_HASP_CALENDER = 81,
LV_HASP_CHART = 80,
LV_HASP_TILEVIEW = 70,
LV_HASP_TABVIEW = 71,
LV_HASP_TAB = 72,
LV_HASP_WINDOW = 94,
LV_HASP_MSGBOX = 93,
};
@ -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_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 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);
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 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);
#endif

View File

@ -4,44 +4,44 @@
#include "hasp_conf.h"
#if HASP_USE_MQTT > 0
#include "PubSubClient.h"
#include "PubSubClient.h"
#include "hasp_mqtt.h"
#include "hasp_mqtt.h"
#if defined(ARDUINO_ARCH_ESP32)
#include <WiFi.h>
#if defined(ARDUINO_ARCH_ESP32)
#include <WiFi.h>
WiFiClient mqttNetworkClient;
#elif defined(ARDUINO_ARCH_ESP8266)
#include <ESP8266WiFi.h>
#include <EEPROM.h>
#include <Esp.h>
#elif defined(ARDUINO_ARCH_ESP8266)
#include <ESP8266WiFi.h>
#include <EEPROM.h>
#include <Esp.h>
WiFiClient mqttNetworkClient;
#else
#if defined(STM32F4xx) && HASP_USE_WIFI > 0
#else
#if defined(STM32F4xx) && HASP_USE_WIFI > 0
// #include <WiFi.h>
WiFiSpiClient mqttNetworkClient;
#else
#if defined(W5500_MOSI) && defined(W5500_MISO) && defined(W5500_SCLK)
#define W5500_LAN
#include <Ethernet.h>
#else
#include <STM32Ethernet.h>
#endif
#else
#if defined(W5500_MOSI) && defined(W5500_MISO) && defined(W5500_SCLK)
#define W5500_LAN
#include <Ethernet.h>
#else
#include <STM32Ethernet.h>
#endif
EthernetClient mqttNetworkClient;
#endif
#endif
#endif
#endif
#include "hasp_hal.h"
#include "hasp_debug.h"
#include "hasp_config.h"
#include "hasp_hal.h"
#include "hasp_debug.h"
#include "hasp_config.h"
#include "../hasp/hasp_dispatch.h"
#include "../hasp/hasp.h"
#include "../hasp/hasp_dispatch.h"
#include "../hasp/hasp.h"
#ifdef USE_CONFIG_OVERRIDE
#include "user_config_override.h"
#endif
#ifdef USE_CONFIG_OVERRIDE
#include "user_config_override.h"
#endif
/*
String mqttGetSubtopic; // MQTT subtopic for incoming commands requesting .val
@ -65,41 +65,41 @@ char mqttNodeTopic[24];
char mqttGroupTopic[24];
bool mqttEnabled;
////////////////////////////////////////////////////////////////////////////////////////////////////
// These defaults may be overwritten with values saved by the web interface
#ifdef MQTT_HOST
////////////////////////////////////////////////////////////////////////////////////////////////////
// These defaults may be overwritten with values saved by the web interface
#ifdef MQTT_HOST
char mqttServer[16] = MQTT_HOST;
#else
#else
char mqttServer[16] = "";
#endif
#ifdef MQTT_PORT
#endif
#ifdef MQTT_PORT
uint16_t mqttPort = MQTT_PORT;
#else
#else
uint16_t mqttPort = 1883;
#endif
#ifdef MQTT_USER
#endif
#ifdef MQTT_USER
char mqttUser[23] = MQTT_USER;
#else
#else
char mqttUser[23] = "";
#endif
#ifdef MQTT_PASSW
#endif
#ifdef MQTT_PASSW
char mqttPassword[32] = MQTT_PASSW;
#else
#else
char mqttPassword[32] = "";
#endif
#ifdef MQTT_NODENAME
#endif
#ifdef MQTT_NODENAME
char mqttNodeName[16] = MQTT_NODENAME;
#else
#else
char mqttNodeName[16] = "";
#endif
#ifdef MQTT_GROUPNAME
#endif
#ifdef MQTT_GROUPNAME
char mqttGroupName[16] = MQTT_GROUPNAME;
#else
#else
char mqttGroupName[16] = "";
#endif
#ifndef MQTT_PREFIX
#define MQTT_PREFIX "hasp"
#endif
#endif
#ifndef MQTT_PREFIX
#define MQTT_PREFIX "hasp"
#endif
PubSubClient mqttClient(mqttNetworkClient);
@ -355,6 +355,8 @@ void mqttStart()
mqttReconnectCount = 0;
haspReconnect();
haspProgressVal(255);
dispatch_output_current_page();
dispatch_output_statusupdate(NULL, NULL);
}
@ -410,7 +412,7 @@ void mqttStop()
}
}
#if HASP_USE_CONFIG > 0
#if HASP_USE_CONFIG > 0
bool mqttGetConfig(const JsonObject & settings)
{
bool changed = false;
@ -495,6 +497,6 @@ bool mqttSetConfig(const JsonObject & settings)
return changed;
}
#endif // HASP_USE_CONFIG
#endif // HASP_USE_CONFIG
#endif // HASP_USE_MQTT