[FL-2019] Battery test application (#940)
* Power: rework API * Applications: introduce battery test application * Power: fix typo * Desktop: cleanup merge artifacts Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
This commit is contained in:
17
applications/power/power_service/power.c
Normal file → Executable file
17
applications/power/power_service/power.c
Normal file → Executable file
@@ -7,11 +7,6 @@
|
||||
#include <gui/view.h>
|
||||
|
||||
#define POWER_OFF_TIMEOUT 90
|
||||
#define POWER_BATTERY_WELL_LEVEL 70
|
||||
|
||||
bool power_is_battery_well(PowerInfo* info) {
|
||||
return info->health > POWER_BATTERY_WELL_LEVEL;
|
||||
}
|
||||
|
||||
void power_draw_battery_callback(Canvas* canvas, void* context) {
|
||||
furi_assert(context);
|
||||
@@ -50,7 +45,7 @@ Power* power_alloc() {
|
||||
power->state = PowerStateNotCharging;
|
||||
power->battery_low = false;
|
||||
power->power_off_timeout = POWER_OFF_TIMEOUT;
|
||||
power->info_mtx = osMutexNew(NULL);
|
||||
power->api_mtx = osMutexNew(NULL);
|
||||
|
||||
// Gui
|
||||
power->view_dispatcher = view_dispatcher_alloc();
|
||||
@@ -66,6 +61,7 @@ Power* power_alloc() {
|
||||
|
||||
// Battery view port
|
||||
power->battery_view_port = power_battery_view_port_alloc(power);
|
||||
power->show_low_bat_level_message = true;
|
||||
|
||||
return power;
|
||||
}
|
||||
@@ -81,7 +77,7 @@ void power_free(Power* power) {
|
||||
view_port_free(power->battery_view_port);
|
||||
|
||||
// State
|
||||
osMutexDelete(power->info_mtx);
|
||||
osMutexDelete(power->api_mtx);
|
||||
|
||||
// FuriPubSub
|
||||
furi_pubsub_free(power->event_pubsub);
|
||||
@@ -135,17 +131,18 @@ static bool power_update_info(Power* power) {
|
||||
info.temperature_charger = furi_hal_power_get_battery_temperature(FuriHalPowerICCharger);
|
||||
info.temperature_gauge = furi_hal_power_get_battery_temperature(FuriHalPowerICFuelGauge);
|
||||
|
||||
osMutexAcquire(power->info_mtx, osWaitForever);
|
||||
osMutexAcquire(power->api_mtx, osWaitForever);
|
||||
bool need_refresh = power->info.charge != info.charge;
|
||||
power->info = info;
|
||||
osMutexRelease(power->info_mtx);
|
||||
osMutexRelease(power->api_mtx);
|
||||
|
||||
return need_refresh;
|
||||
}
|
||||
|
||||
static void power_check_low_battery(Power* power) {
|
||||
// Check battery charge and vbus voltage
|
||||
if((power->info.charge == 0) && (power->info.voltage_vbus < 4.0f)) {
|
||||
if((power->info.charge == 0) && (power->info.voltage_vbus < 4.0f) &&
|
||||
power->show_low_bat_level_message) {
|
||||
if(!power->battery_low) {
|
||||
view_dispatcher_send_to_front(power->view_dispatcher);
|
||||
view_dispatcher_switch_to_view(power->view_dispatcher, PowerViewOff);
|
||||
|
@@ -50,19 +50,35 @@ typedef struct {
|
||||
void power_off(Power* power);
|
||||
|
||||
/** Reboot device
|
||||
* @param mode - PowerBootMode
|
||||
*
|
||||
* @param mode PowerBootMode
|
||||
*/
|
||||
void power_reboot(PowerBootMode mode);
|
||||
|
||||
/** Get power info
|
||||
* @param power - Power instance
|
||||
* @param info - PowerInfo instance
|
||||
*
|
||||
* @param power Power instance
|
||||
* @param info PowerInfo instance
|
||||
*/
|
||||
void power_get_info(Power* power, PowerInfo* info);
|
||||
|
||||
/** Get power event pubsub handler
|
||||
* @param power - Power instance
|
||||
*
|
||||
* @param power Power instance
|
||||
*
|
||||
* @return FuriPubSub instance
|
||||
*/
|
||||
FuriPubSub* power_get_pubsub(Power* power);
|
||||
|
||||
bool power_is_battery_well(PowerInfo* info);
|
||||
/** Check battery health
|
||||
*
|
||||
* @return true if battery is healthy
|
||||
*/
|
||||
bool power_is_battery_healthy(Power* power);
|
||||
|
||||
/** Enable or disable battery low level notification mesage
|
||||
*
|
||||
* @param power Power instance
|
||||
* @param enable true - enable, false - disable
|
||||
*/
|
||||
void power_enable_low_battery_level_notification(Power* power, bool enable);
|
||||
|
@@ -26,12 +26,28 @@ void power_get_info(Power* power, PowerInfo* info) {
|
||||
furi_assert(power);
|
||||
furi_assert(info);
|
||||
|
||||
osMutexAcquire(power->info_mtx, osWaitForever);
|
||||
osMutexAcquire(power->api_mtx, osWaitForever);
|
||||
memcpy(info, &power->info, sizeof(power->info));
|
||||
osMutexRelease(power->info_mtx);
|
||||
osMutexRelease(power->api_mtx);
|
||||
}
|
||||
|
||||
FuriPubSub* power_get_pubsub(Power* power) {
|
||||
furi_assert(power);
|
||||
return power->event_pubsub;
|
||||
}
|
||||
|
||||
bool power_is_battery_healthy(Power* power) {
|
||||
furi_assert(power);
|
||||
bool is_healthy = false;
|
||||
osMutexAcquire(power->api_mtx, osWaitForever);
|
||||
is_healthy = power->info.health > POWER_BATTERY_HEALTHY_LEVEL;
|
||||
osMutexRelease(power->api_mtx);
|
||||
return is_healthy;
|
||||
}
|
||||
|
||||
void power_enable_low_battery_level_notification(Power* power, bool enable) {
|
||||
furi_assert(power);
|
||||
osMutexAcquire(power->api_mtx, osWaitForever);
|
||||
power->show_low_bat_level_message = enable;
|
||||
osMutexRelease(power->api_mtx);
|
||||
}
|
||||
|
@@ -11,6 +11,8 @@
|
||||
|
||||
#include <notification/notification-messages.h>
|
||||
|
||||
#define POWER_BATTERY_HEALTHY_LEVEL 70
|
||||
|
||||
typedef enum {
|
||||
PowerStateNotCharging,
|
||||
PowerStateCharging,
|
||||
@@ -30,11 +32,13 @@ struct Power {
|
||||
|
||||
PowerState state;
|
||||
PowerInfo info;
|
||||
osMutexId_t info_mtx;
|
||||
|
||||
bool battery_low;
|
||||
bool show_low_bat_level_message;
|
||||
uint8_t battery_level;
|
||||
uint8_t power_off_timeout;
|
||||
|
||||
osMutexId_t api_mtx;
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
|
Reference in New Issue
Block a user