diff --git a/apps/main.c b/apps/main.c index b5c6364080..af84a46984 100644 --- a/apps/main.c +++ b/apps/main.c @@ -58,7 +58,7 @@ #include "power.h" #include "talk.h" #include "plugin.h" - +#include "misc.h" #if (CONFIG_HWCODEC == MASNONE) #include "pcm_playback.h" @@ -271,6 +271,9 @@ void init(void) #if (CONFIG_HWCODEC == MASNONE) pcm_init(); #endif +#ifdef HAVE_CHARGING + car_adapter_mode_init(); +#endif } int main(void) diff --git a/apps/misc.c b/apps/misc.c index af1c417fd6..e7438d673e 100644 --- a/apps/misc.c +++ b/apps/misc.c @@ -31,6 +31,7 @@ #include "screens.h" #include "talk.h" #include "mpeg.h" +#include "audio.h" #include "mp3_playback.h" #include "settings.h" #include "ata.h" @@ -289,6 +290,61 @@ bool clean_shutdown(void) return false; } +#ifdef HAVE_CHARGING +static bool waiting_to_resume_play = false; +static long play_resume_tick; + +static void car_adapter_mode_processing(bool inserted) +{ + if (global_settings.car_adapter_mode) + { + if(inserted) + { + /* + * Just got plugged in, delay & resume if we were playing + */ + if (audio_status() & AUDIO_STATUS_PAUSE) + { + /* delay resume a bit while the engine is cranking */ + play_resume_tick = current_tick + HZ*5; + waiting_to_resume_play = true; + } + } + else + { + /* + * Just got unplugged, pause if playing + */ + if ((audio_status() & AUDIO_STATUS_PLAY) && + !(audio_status() & AUDIO_STATUS_PAUSE)) + { + audio_pause(); + } + } + } +} + +static void car_adapter_tick(void) +{ + if (waiting_to_resume_play) + { + if (TIME_AFTER(current_tick, play_resume_tick)) + { + if (audio_status() & AUDIO_STATUS_PAUSE) + { + audio_resume(); + } + waiting_to_resume_play = false; + } + } +} + +void car_adapter_mode_init(void) +{ + tick_add_task(car_adapter_tick); +} +#endif + long default_event_handler_ex(long event, void (*callback)(void *), void *parameter) { switch(event) @@ -307,6 +363,15 @@ long default_event_handler_ex(long event, void (*callback)(void *), void *parame if (!clean_shutdown()) return SYS_POWEROFF; break; +#ifdef HAVE_CHARGING + case SYS_CHARGER_CONNECTED: + car_adapter_mode_processing(true); + return SYS_CHARGER_CONNECTED; + + case SYS_CHARGER_DISCONNECTED: + car_adapter_mode_processing(false); + return SYS_CHARGER_DISCONNECTED; +#endif } return 0; } @@ -315,4 +380,3 @@ long default_event_handler(long event) { return default_event_handler_ex(event, NULL, NULL); } - diff --git a/apps/misc.h b/apps/misc.h index 956a8fcd5e..105f65732a 100644 --- a/apps/misc.h +++ b/apps/misc.h @@ -44,5 +44,6 @@ bool settings_parseline(char* line, char** name, char** value); bool clean_shutdown(void); long default_event_handler_ex(long event, void (*callback)(void *), void *parameter); long default_event_handler(long event); +void car_adapter_mode_init(void); #endif diff --git a/apps/settings.c b/apps/settings.c index 56dcd0af09..bbfdd54d93 100644 --- a/apps/settings.c +++ b/apps/settings.c @@ -825,8 +825,6 @@ void settings_apply(void) lang_load(buf); talk_init(); /* use voice of same language */ } - - set_car_adapter_mode(global_settings.car_adapter_mode); } diff --git a/apps/settings_menu.c b/apps/settings_menu.c index 9590e15476..5af7470c7d 100644 --- a/apps/settings_menu.c +++ b/apps/settings_menu.c @@ -63,7 +63,7 @@ static bool car_adapter_mode(void) &global_settings.car_adapter_mode, STR(LANG_SET_BOOL_YES), STR(LANG_SET_BOOL_NO), - set_car_adapter_mode); + NULL); } #endif diff --git a/apps/tree.c b/apps/tree.c index 139043ab04..c9f5847ab8 100644 --- a/apps/tree.c +++ b/apps/tree.c @@ -484,7 +484,8 @@ static bool ask_resume(bool ask_once) #endif /* Handle sys events, ignore button releases */ default: - if(default_event_handler(button) || !(button & BUTTON_REL)) + if(default_event_handler(button) == SYS_USB_CONNECTED || + (!(button & SYS_EVENT) && !(button & BUTTON_REL))) stop = true; break; } diff --git a/firmware/export/kernel.h b/firmware/export/kernel.h index 6f2df802be..7b76e74e18 100644 --- a/firmware/export/kernel.h +++ b/firmware/export/kernel.h @@ -43,6 +43,8 @@ #define SYS_MMC_EXTRACTED ((SYS_EVENT | ((long)7 << 27))) #define SYS_POWEROFF ((SYS_EVENT | ((long)8 << 27))) #define SYS_FS_CHANGED ((SYS_EVENT | ((long)9 << 27))) +#define SYS_CHARGER_CONNECTED ((SYS_EVENT | ((long)10 << 27))) +#define SYS_CHARGER_DISCONNECTED ((SYS_EVENT | ((long)11 << 27))) struct event { diff --git a/firmware/powermgmt.c b/firmware/powermgmt.c index 9cfacad9b0..5a1639ca1c 100644 --- a/firmware/powermgmt.c +++ b/firmware/powermgmt.c @@ -89,11 +89,6 @@ void set_battery_capacity(int capacity) (void)capacity; } -void set_car_adapter_mode(bool setting) -{ - (void)setting; -} - void reset_poweroff_timer(void) { } @@ -150,9 +145,6 @@ static enum { CHARGER_PLUGGED, /* transient state */ CHARGER } charger_input_state; - -static bool waiting_to_resume_play = false; -static long play_resume_time; #endif #ifdef HAVE_CHARGE_CTRL @@ -192,8 +184,6 @@ static int battery_type = 0; /* Power history: power_history[0] is the newest sample */ unsigned short power_history[POWER_HISTORY_LEN]; -static bool car_adapter_mode_enabled = false; - static char power_stack[DEFAULT_STACK_SIZE + DEBUG_STACK]; static const char power_thread_name[] = "power"; @@ -401,47 +391,6 @@ static void handle_auto_poweroff(void) } } -void set_car_adapter_mode(bool setting) -{ - car_adapter_mode_enabled = setting; -} - -#ifdef HAVE_CHARGING -static void car_adapter_mode_processing(void) -{ - if (car_adapter_mode_enabled) { - - if (waiting_to_resume_play) { - if (TIME_AFTER(current_tick, play_resume_time)) { - if (audio_status() & AUDIO_STATUS_PAUSE) { - audio_resume(); - } - waiting_to_resume_play = false; - } - } else { - if (charger_input_state == CHARGER_UNPLUGGED) { - /* - * Just got unplugged, pause if playing - */ - if ((audio_status() & AUDIO_STATUS_PLAY) && - !(audio_status() & AUDIO_STATUS_PAUSE)) { - audio_pause(); - } - } else if(charger_input_state == CHARGER_PLUGGED) { - /* - * Just got plugged in, delay & resume if we were playing - */ - if (audio_status() & AUDIO_STATUS_PAUSE) { - /* delay resume a bit while the engine is cranking */ - play_resume_time = current_tick + HZ*5; - waiting_to_resume_play = true; - } - } - } - } -} -#endif - /* * Estimate how much current we are drawing just to run. */ @@ -507,6 +456,7 @@ static void power_thread_sleep(int ticks) charger_input_state = CHARGER_PLUGGED; return; case CHARGER_PLUGGED: + queue_broadcast(SYS_CHARGER_CONNECTED, NULL); charger_input_state = CHARGER; break; case CHARGER: @@ -517,6 +467,7 @@ static void power_thread_sleep(int ticks) case NO_CHARGER: break; case CHARGER_UNPLUGGED: + queue_broadcast(SYS_CHARGER_DISCONNECTED, NULL); charger_input_state = NO_CHARGER; break; case CHARGER_PLUGGED: @@ -531,9 +482,6 @@ static void power_thread_sleep(int ticks) sleep(small_ticks); ticks -= small_ticks; -#ifdef HAVE_CHARGING - car_adapter_mode_processing(); -#endif #ifdef HAVE_ALARM_MOD power_thread_rtc_process(); #endif