event based check for auto shutdown timer setting

This commit is contained in:
SHxKenzuto
2022-10-10 23:39:29 +02:00
parent d3c1ff5b95
commit 82f2354727
8 changed files with 39 additions and 18 deletions

View File

@@ -42,6 +42,10 @@ static void power_stop_auto_shutdown_timer(Power* power) {
furi_timer_stop(power->auto_shutdown_timer);
}
static uint32_t power_is_running_auto_shutdown_timer(Power* power) {
return furi_timer_is_running(power->auto_shutdown_timer);
}
static void power_input_event_callback(const void* value, void* context) {
furi_assert(value);
furi_assert(context);
@@ -54,8 +58,10 @@ static void power_input_event_callback(const void* value, void* context) {
static void power_auto_shutdown_arm(Power* power) {
if(power->shutdown_idle_delay_ms) {
power->input_events_subscription =
furi_pubsub_subscribe(power->input_events_pubsub, power_input_event_callback, power);
if(power->input_events_subscription == NULL) {
power->input_events_subscription = furi_pubsub_subscribe(
power->input_events_pubsub, power_input_event_callback, power);
}
power_start_auto_shutdown_timer(power);
}
}
@@ -75,18 +81,14 @@ static void power_auto_shutdown_timer_callback(void* context) {
power_off(power);
}
static void auto_shutdown_update(Power* power) {
uint32_t old_time = power->shutdown_idle_delay_ms;
LOAD_POWER_SETTINGS(&power->shutdown_idle_delay_ms);
static void power_shutdown_time_changed_callback(const void* event, void* context) {
furi_assert(event);
furi_assert(context);
Power* power = context;
power->shutdown_idle_delay_ms = *(uint32_t*)event;
if(power->shutdown_idle_delay_ms) {
if(power->shutdown_idle_delay_ms != old_time) {
if(old_time) {
power_start_auto_shutdown_timer(power);
} else {
power_auto_shutdown_arm(power);
}
}
} else if(old_time) {
power_auto_shutdown_arm(power);
} else if(power_is_running_auto_shutdown_timer(power)) {
power_auto_shutdown_inhibit(power);
}
}
@@ -100,7 +102,8 @@ Power* power_alloc() {
// Pubsub
power->event_pubsub = furi_pubsub_alloc();
power->settings_events = furi_pubsub_alloc();
furi_pubsub_subscribe(power->settings_events, power_shutdown_time_changed_callback, power);
power->input_events_pubsub = furi_record_open(RECORD_INPUT_EVENTS);
power->input_events_subscription = NULL;
@@ -150,6 +153,7 @@ void power_free(Power* power) {
// FuriPubSub
furi_pubsub_free(power->event_pubsub);
furi_pubsub_free(power->settings_events);
furi_pubsub_free(power->input_events_pubsub);
if(power->input_events_subscription) {
@@ -285,9 +289,6 @@ int32_t power_srv(void* p) {
furi_record_create(RECORD_POWER, power);
while(1) {
//Check current setting for automatic shutdown
auto_shutdown_update(power);
// Update data from gauge and charger
bool need_refresh = power_update_info(power);

View File

@@ -80,6 +80,14 @@ void power_get_info(Power* power, PowerInfo* info);
*/
FuriPubSub* power_get_pubsub(Power* power);
/** Get power settings events pubsub handler
*
* @param power Power instance
*
* @return FuriPubSub instance
*/
FuriPubSub* power_get_settings_events_pubsub(Power* power);
/** Check battery health
*
* @return true if battery is healthy

View File

@@ -38,6 +38,11 @@ FuriPubSub* power_get_pubsub(Power* power) {
return power->event_pubsub;
}
FuriPubSub* power_get_settings_events_pubsub(Power* power) {
furi_assert(power);
return power->settings_events;
}
bool power_is_battery_healthy(Power* power) {
furi_assert(power);
bool is_healthy = false;

View File

@@ -30,6 +30,7 @@ struct Power {
Gui* gui;
NotificationApp* notification;
FuriPubSub* event_pubsub;
FuriPubSub* settings_events;
FuriPubSub* input_events_pubsub;
FuriPubSubSubscription* input_events_subscription;
PowerEvent event;