First start of MQTT buttons

This commit is contained in:
Pim van Pelt
2017-12-02 16:51:09 +01:00
parent c315de560f
commit b8e5637c8b
9 changed files with 97 additions and 13 deletions

View File

@ -81,6 +81,8 @@ struct widget_t *widget_create_from_json(const char *json) {
widget->type=type;
widget->label=label;
widget->img=img;
// Load widget-specific attributes
if (type == WIDGET_TYPE_LOADSCREEN) {
if (json_scanf(json, strlen(json), "{screen:%Q}", &screen) != 1) {
LOG(LL_WARN, ("Widget '%s' is of type LOADSCREEN but does not have attribute 'screen'", widget->name));
@ -88,6 +90,22 @@ struct widget_t *widget_create_from_json(const char *json) {
if (widget->user_data) free(widget->user_data);
widget->user_data = screen;
}
} else if (type == WIDGET_TYPE_MQTT_BUTTON) {
void *h = NULL;
char *mqtt = NULL;
struct json_token val;
int idx;
if (json_scanf(json, strlen(json), "{mqtt:%Q}", &mqtt) != 1) {
LOG(LL_WARN, ("Widget '%s' is of type MQTT_BUTTON but does not have attribute 'mqtt'", widget->name));
} else {
while ((h = json_next_elem(json, strlen(json), h, ".mqtt", &idx, &val)) != NULL) {
LOG(LL_INFO, ("[%d]: [%.*s]", idx, val.len, val.ptr));
if (val.len>0 && val.ptr) {
}
}
if(mqtt) free(mqtt);
}
}
return widget;

View File

@ -78,6 +78,7 @@ void screen_add_default_widgets(struct screen_t *screen) {
static void widget_default_loadscreen(struct widget_t *w, void *ev_data) {
struct screen_t *new_screen;
char *new_screen_fn;
if (!w)
return;
@ -86,8 +87,12 @@ static void widget_default_loadscreen(struct widget_t *w, void *ev_data) {
return;
}
new_screen_fn=strdup(w->user_data);
screen_destroy(&s_screen);
new_screen = screen_create_from_file(new_screen_fn, widget_default_ev, NULL);
free(new_screen_fn);
new_screen = screen_create_from_file(w->user_data, widget_default_ev, NULL);
if (!new_screen) {
LOG(LL_ERROR, ("Could not load screen"));
return;
@ -95,7 +100,6 @@ static void widget_default_loadscreen(struct widget_t *w, void *ev_data) {
screen_add_default_widgets(new_screen);
LOG(LL_INFO, ("Navigating to new screen '%s' which has %d widgets", new_screen->name, screen_get_num_widgets(new_screen)));
screen_destroy(&s_screen);
s_screen = new_screen;
screen_widget_broadcast(s_screen, EV_WIDGET_DRAW, NULL);
@ -109,7 +113,7 @@ void widget_default_ev(int ev, struct widget_t *w, void *ev_data) {
return;
widget_ev_to_str(ev, evname, sizeof(evname)-1);
LOG(LL_INFO, ("Event %s received for widget '%s'", evname, w->name));
LOG(LL_DEBUG, ("Event %s received for widget '%s'", evname, w->name));
switch(ev) {
case EV_WIDGET_CREATE:

View File

@ -7,6 +7,9 @@ static mgos_timer_id recv_timer = 0;
static struct widget_t *widget_network = NULL;
static void widget_network_render(struct widget_t *w, void *ev_data) {
if (!w)
return;
mgos_ili9341_set_window(w->x, w->y, w->x+w->w-1, w->y+w->h-1);
// Send
mgos_ili9341_set_fgcolor565(send_timer?ILI9341_YELLOW:ILI9341_DARKGREY);
@ -34,8 +37,10 @@ static void widget_network_recv_clear(void *arg) {
}
void widget_network_send() {
if (!widget_network)
if (!widget_network) {
LOG(LL_ERROR, ("called without widget_network set"));
return;
}
if (!send_timer)
send_timer=mgos_set_timer(100, 0, widget_network_send_clear, NULL);
@ -43,8 +48,10 @@ void widget_network_send() {
}
void widget_network_recv() {
if (!widget_network)
if (!widget_network) {
LOG(LL_ERROR, ("called without widget_network set"));
return;
}
if (!recv_timer)
recv_timer=mgos_set_timer(100, 0, widget_network_recv_clear, NULL);
@ -52,12 +59,18 @@ void widget_network_recv() {
}
void widget_network_ev(int ev, struct widget_t *w, void *ev_data) {
char evname[15];
if (!w)
return;
widget_ev_to_str(ev, evname, sizeof(evname)-1);
LOG(LL_DEBUG, ("Event %s received for widget '%s'", evname, w->name));
switch(ev) {
case EV_WIDGET_CREATE:
widget_network=w;
send_timer=0;
recv_timer=0;
break;
case EV_WIDGET_DRAW:
case EV_WIDGET_REDRAW:
@ -65,7 +78,11 @@ void widget_network_ev(int ev, struct widget_t *w, void *ev_data) {
break;
case EV_WIDGET_DESTROY:
widget_network=NULL;
if (send_timer)
mgos_clear_timer(send_timer);
send_timer=0;
if (recv_timer)
mgos_clear_timer(recv_timer);
recv_timer=0;
break;
case EV_WIDGET_TIMER: