add widget_battery() which shows the LiPo state of charge

This commit is contained in:
Pim van Pelt
2017-11-27 22:36:38 +01:00
parent d07a0e053c
commit 4aa8c56f40
4 changed files with 74 additions and 3 deletions

View File

@ -70,19 +70,24 @@ void tft_demo(void)
return;
}
w = widget_create("name", 0, 0, 198, 20);
w = widget_create("name", 0, 0, 185, 20);
widget_set_handler(w, widget_name_ev, NULL);
screen_widget_add(screen, w);
w = widget_create("network", 198, 0, 22, 20);
w = widget_create("network", 185, 0, 22, 20);
widget_set_handler(w, widget_network_ev, NULL);
screen_widget_add(screen, w);
w = widget_create("wifi", 220, 0, 20, 20);
w = widget_create("wifi", 207, 0, 20, 20);
widget_set_handler(w, widget_wifi_ev, NULL);
widget_set_timer(w, 5000);
screen_widget_add(screen, w);
w = widget_create("battery", 227, 0, 13, 20);
widget_set_handler(w, widget_battery_ev, NULL);
widget_set_timer(w, 10000);
screen_widget_add(screen, w);
w = widget_create("time", 240, 0, 80, 20);
widget_set_handler(w, widget_time_ev, NULL);
widget_set_timer(w, 1000);

62
src/widget_battery.c Normal file
View File

@ -0,0 +1,62 @@
#include "mgos.h"
#include "mgos_adc.h"
#include "tft.h"
#include "mongoose-touch.h"
#define WIDGET_BATTERY_ADC_PIN 35
// Returns millivolts - Huzzah32 has a 1:1 voltage divider on I35 (A13)
// so it returns half of the battery voltage. LiPo's are full at 4200mV
// and critically empty at 3000mV.
static int widget_battery_getvoltage() {
// Value is between 0..4096 which maps to 0..6600mV
return (6600*mgos_adc_read(WIDGET_BATTERY_ADC_PIN))/4096;
}
static void widget_battery_render(struct widget_t *w, void *ev_data) {
int mvolts;
color_t color;
uint8_t h;
if (!w)
return;
mgos_ili9341_setclipwin(w->x, w->y, w->x+w->w, w->y+w->h);
mvolts=widget_battery_getvoltage();
color=ILI9341_RED;
if (mvolts<3200) mvolts=3200;
if (mvolts>3500) color=ILI9341_YELLOW;
if (mvolts>3900) color=ILI9341_GREEN;
if (mvolts>4200) mvolts=4200;
h=12-12*(mvolts-3200)/(4200-3200);
mgos_ili9341_fillRect(5, 2, 3, 2, color);
mgos_ili9341_fillRect(2, 4, 9, 14, color);
mgos_ili9341_fillRect(3, 5, 7, h, ILI9341_BLACK);
mgos_ili9341_resetclipwin();
(void) ev_data;
}
void widget_battery_ev(int ev, struct widget_t *w, void *ev_data) {
if (!w)
return;
switch(ev) {
case EV_WIDGET_CREATE:
LOG(LL_INFO, ("Monitoring LiPo voltage on gpio=%d", WIDGET_BATTERY_ADC_PIN));
mgos_adc_enable(WIDGET_BATTERY_ADC_PIN);
case EV_WIDGET_DRAW:
case EV_WIDGET_REDRAW:
case EV_WIDGET_TIMER:
widget_battery_render(w, ev_data);
break;
case EV_WIDGET_TOUCH_UP:
case EV_WIDGET_TOUCH_DOWN:
case EV_WIDGET_DESTROY:
default: // EV_WIDGET_NONE
break;
}
}