Commit 6070d6e4 authored by Projects's avatar Projects

battery: Reworked status update.

Charger status is updated instantly after it is attached.
Battery percentage is updated every 5 minutes.
parent 8e94b3ef
...@@ -72,11 +72,6 @@ enum sensor_type { ...@@ -72,11 +72,6 @@ enum sensor_type {
ACCELEROMETER ACCELEROMETER
}; };
struct battery_info {
uint8_t percentage;
bool charging;
};
/** /**
* Structure describing events received by applications. * Structure describing events received by applications.
*/ */
...@@ -88,8 +83,8 @@ struct event { ...@@ -88,8 +83,8 @@ struct event {
union { union {
enum button_name button; enum button_name button;
enum sensor_type sensor; enum sensor_type sensor;
struct battery_info battery;
enum charger_state charger; enum charger_state charger;
uint8_t battery_charge;
} data; } data;
}; };
......
...@@ -71,10 +71,18 @@ static void status_bar_event(struct ui_widget *w, const struct event *evt) ...@@ -71,10 +71,18 @@ static void status_bar_event(struct ui_widget *w, const struct event *evt)
break; break;
case BATTERY_STATUS: case BATTERY_STATUS:
if(abs(percentage - evt->data.battery.percentage) > 5 || if(abs(percentage - evt->data.battery_charge)) {
charging != evt->data.battery.charging) { percentage = evt->data.battery_charge;
percentage = evt->data.battery.percentage; w->flags |= WF_DIRTY;
charging = evt->data.battery.charging; }
break;
case CHARGER:
if(evt->data.charger == CHARGING) {
charging = true;
w->flags |= WF_DIRTY;
} else if(evt->data.charger == NOT_CHARGING) {
charging = false;
w->flags |= WF_DIRTY; w->flags |= WF_DIRTY;
} }
break; break;
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include "battery_task.h" #include "battery_task.h"
#include <drivers/max17047.h> #include <drivers/max17047.h>
#include <drivers/charger.h>
#include <apps/application.h> #include <apps/application.h>
#include <event.h> #include <event.h>
...@@ -36,12 +37,11 @@ ...@@ -36,12 +37,11 @@
#include <stdbool.h> #include <stdbool.h>
///> Number of ticks between battery status polling ///> Number of ticks between battery status polling
#define BATTERY_TASK_PERIOD (4000 / portTICK_RATE_MS) #define BATTERY_TASK_PERIOD (5 * 60 * 1000 / portTICK_RATE_MS)
///> Timer handle ///> Timer handle
static xTimerHandle timer_handle; static xTimerHandle timer_handle;
static bool cur_charging;
static unsigned cur_percentage; static unsigned cur_percentage;
static void battery_monitor_task(void *params) static void battery_monitor_task(void *params)
...@@ -49,29 +49,32 @@ static void battery_monitor_task(void *params) ...@@ -49,29 +49,32 @@ static void battery_monitor_task(void *params)
(void) params; (void) params;
struct event evt; struct event evt;
bool charging = max17047_is_charging();
unsigned percentage = max17047_get_charge(); unsigned percentage = max17047_get_charge();
// Send an event if measurements are different // Send an event if measurements are different
if(!params || charging != cur_charging || percentage != cur_percentage) { if(params || percentage != cur_percentage) {
evt.type = BATTERY_STATUS; evt.type = BATTERY_STATUS;
evt.data.battery.percentage = percentage; evt.data.battery_charge = percentage;
evt.data.battery.charging = charging;
cur_percentage = percentage; cur_percentage = percentage;
cur_charging = charging;
xQueueSendToBack(appQueue, &evt, 0); xQueueSendToBack(appQueue, &evt, 0);
} }
} }
void battery_update(void) void battery_update(void)
{ {
battery_monitor_task(NULL); // Update charger status
struct event evt;
evt.type = CHARGER;
evt.data.charger = charger_active() ? CHARGING : NOT_CHARGING;
xQueueSendToBack(appQueue, &evt, 0);
// Hackish trick to force update
battery_monitor_task((void*) 1);
} }
void battery_monitor_init(void) void battery_monitor_init(void)
{ {
// Set invalid values to force an update // Set invalid values to force an update
cur_charging = false;
cur_percentage = 255; cur_percentage = 255;
timer_handle = xTimerCreate((signed char*) "battery_monitor", timer_handle = xTimerCreate((signed char*) "battery_monitor",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment