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 {
ACCELEROMETER
};
struct battery_info {
uint8_t percentage;
bool charging;
};
/**
* Structure describing events received by applications.
*/
......@@ -88,8 +83,8 @@ struct event {
union {
enum button_name button;
enum sensor_type sensor;
struct battery_info battery;
enum charger_state charger;
uint8_t battery_charge;
} data;
};
......
......@@ -71,10 +71,18 @@ static void status_bar_event(struct ui_widget *w, const struct event *evt)
break;
case BATTERY_STATUS:
if(abs(percentage - evt->data.battery.percentage) > 5 ||
charging != evt->data.battery.charging) {
percentage = evt->data.battery.percentage;
charging = evt->data.battery.charging;
if(abs(percentage - evt->data.battery_charge)) {
percentage = evt->data.battery_charge;
w->flags |= WF_DIRTY;
}
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;
}
break;
......
......@@ -27,6 +27,7 @@
#include "battery_task.h"
#include <drivers/max17047.h>
#include <drivers/charger.h>
#include <apps/application.h>
#include <event.h>
......@@ -36,12 +37,11 @@
#include <stdbool.h>
///> 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
static xTimerHandle timer_handle;
static bool cur_charging;
static unsigned cur_percentage;
static void battery_monitor_task(void *params)
......@@ -49,29 +49,32 @@ static void battery_monitor_task(void *params)
(void) params;
struct event evt;
bool charging = max17047_is_charging();
unsigned percentage = max17047_get_charge();
// 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.data.battery.percentage = percentage;
evt.data.battery.charging = charging;
evt.data.battery_charge = percentage;
cur_percentage = percentage;
cur_charging = charging;
xQueueSendToBack(appQueue, &evt, 0);
}
}
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)
{
// Set invalid values to force an update
cur_charging = false;
cur_percentage = 255;
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