diff options
-rw-r--r-- | apps/main.c | 5 | ||||
-rw-r--r-- | apps/misc.c | 66 | ||||
-rw-r--r-- | apps/misc.h | 1 | ||||
-rw-r--r-- | apps/settings.c | 2 | ||||
-rw-r--r-- | apps/settings_menu.c | 2 | ||||
-rw-r--r-- | apps/tree.c | 3 | ||||
-rw-r--r-- | firmware/export/kernel.h | 2 | ||||
-rw-r--r-- | firmware/powermgmt.c | 56 |
8 files changed, 77 insertions, 60 deletions
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 @@ | |||
58 | #include "power.h" | 58 | #include "power.h" |
59 | #include "talk.h" | 59 | #include "talk.h" |
60 | #include "plugin.h" | 60 | #include "plugin.h" |
61 | 61 | #include "misc.h" | |
62 | 62 | ||
63 | #if (CONFIG_HWCODEC == MASNONE) | 63 | #if (CONFIG_HWCODEC == MASNONE) |
64 | #include "pcm_playback.h" | 64 | #include "pcm_playback.h" |
@@ -271,6 +271,9 @@ void init(void) | |||
271 | #if (CONFIG_HWCODEC == MASNONE) | 271 | #if (CONFIG_HWCODEC == MASNONE) |
272 | pcm_init(); | 272 | pcm_init(); |
273 | #endif | 273 | #endif |
274 | #ifdef HAVE_CHARGING | ||
275 | car_adapter_mode_init(); | ||
276 | #endif | ||
274 | } | 277 | } |
275 | 278 | ||
276 | int main(void) | 279 | 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 @@ | |||
31 | #include "screens.h" | 31 | #include "screens.h" |
32 | #include "talk.h" | 32 | #include "talk.h" |
33 | #include "mpeg.h" | 33 | #include "mpeg.h" |
34 | #include "audio.h" | ||
34 | #include "mp3_playback.h" | 35 | #include "mp3_playback.h" |
35 | #include "settings.h" | 36 | #include "settings.h" |
36 | #include "ata.h" | 37 | #include "ata.h" |
@@ -289,6 +290,61 @@ bool clean_shutdown(void) | |||
289 | return false; | 290 | return false; |
290 | } | 291 | } |
291 | 292 | ||
293 | #ifdef HAVE_CHARGING | ||
294 | static bool waiting_to_resume_play = false; | ||
295 | static long play_resume_tick; | ||
296 | |||
297 | static void car_adapter_mode_processing(bool inserted) | ||
298 | { | ||
299 | if (global_settings.car_adapter_mode) | ||
300 | { | ||
301 | if(inserted) | ||
302 | { | ||
303 | /* | ||
304 | * Just got plugged in, delay & resume if we were playing | ||
305 | */ | ||
306 | if (audio_status() & AUDIO_STATUS_PAUSE) | ||
307 | { | ||
308 | /* delay resume a bit while the engine is cranking */ | ||
309 | play_resume_tick = current_tick + HZ*5; | ||
310 | waiting_to_resume_play = true; | ||
311 | } | ||
312 | } | ||
313 | else | ||
314 | { | ||
315 | /* | ||
316 | * Just got unplugged, pause if playing | ||
317 | */ | ||
318 | if ((audio_status() & AUDIO_STATUS_PLAY) && | ||
319 | !(audio_status() & AUDIO_STATUS_PAUSE)) | ||
320 | { | ||
321 | audio_pause(); | ||
322 | } | ||
323 | } | ||
324 | } | ||
325 | } | ||
326 | |||
327 | static void car_adapter_tick(void) | ||
328 | { | ||
329 | if (waiting_to_resume_play) | ||
330 | { | ||
331 | if (TIME_AFTER(current_tick, play_resume_tick)) | ||
332 | { | ||
333 | if (audio_status() & AUDIO_STATUS_PAUSE) | ||
334 | { | ||
335 | audio_resume(); | ||
336 | } | ||
337 | waiting_to_resume_play = false; | ||
338 | } | ||
339 | } | ||
340 | } | ||
341 | |||
342 | void car_adapter_mode_init(void) | ||
343 | { | ||
344 | tick_add_task(car_adapter_tick); | ||
345 | } | ||
346 | #endif | ||
347 | |||
292 | long default_event_handler_ex(long event, void (*callback)(void *), void *parameter) | 348 | long default_event_handler_ex(long event, void (*callback)(void *), void *parameter) |
293 | { | 349 | { |
294 | switch(event) | 350 | switch(event) |
@@ -307,6 +363,15 @@ long default_event_handler_ex(long event, void (*callback)(void *), void *parame | |||
307 | if (!clean_shutdown()) | 363 | if (!clean_shutdown()) |
308 | return SYS_POWEROFF; | 364 | return SYS_POWEROFF; |
309 | break; | 365 | break; |
366 | #ifdef HAVE_CHARGING | ||
367 | case SYS_CHARGER_CONNECTED: | ||
368 | car_adapter_mode_processing(true); | ||
369 | return SYS_CHARGER_CONNECTED; | ||
370 | |||
371 | case SYS_CHARGER_DISCONNECTED: | ||
372 | car_adapter_mode_processing(false); | ||
373 | return SYS_CHARGER_DISCONNECTED; | ||
374 | #endif | ||
310 | } | 375 | } |
311 | return 0; | 376 | return 0; |
312 | } | 377 | } |
@@ -315,4 +380,3 @@ long default_event_handler(long event) | |||
315 | { | 380 | { |
316 | return default_event_handler_ex(event, NULL, NULL); | 381 | return default_event_handler_ex(event, NULL, NULL); |
317 | } | 382 | } |
318 | |||
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); | |||
44 | bool clean_shutdown(void); | 44 | bool clean_shutdown(void); |
45 | long default_event_handler_ex(long event, void (*callback)(void *), void *parameter); | 45 | long default_event_handler_ex(long event, void (*callback)(void *), void *parameter); |
46 | long default_event_handler(long event); | 46 | long default_event_handler(long event); |
47 | void car_adapter_mode_init(void); | ||
47 | 48 | ||
48 | #endif | 49 | #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) | |||
825 | lang_load(buf); | 825 | lang_load(buf); |
826 | talk_init(); /* use voice of same language */ | 826 | talk_init(); /* use voice of same language */ |
827 | } | 827 | } |
828 | |||
829 | set_car_adapter_mode(global_settings.car_adapter_mode); | ||
830 | } | 828 | } |
831 | 829 | ||
832 | 830 | ||
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) | |||
63 | &global_settings.car_adapter_mode, | 63 | &global_settings.car_adapter_mode, |
64 | STR(LANG_SET_BOOL_YES), | 64 | STR(LANG_SET_BOOL_YES), |
65 | STR(LANG_SET_BOOL_NO), | 65 | STR(LANG_SET_BOOL_NO), |
66 | set_car_adapter_mode); | 66 | NULL); |
67 | } | 67 | } |
68 | #endif | 68 | #endif |
69 | 69 | ||
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) | |||
484 | #endif | 484 | #endif |
485 | /* Handle sys events, ignore button releases */ | 485 | /* Handle sys events, ignore button releases */ |
486 | default: | 486 | default: |
487 | if(default_event_handler(button) || !(button & BUTTON_REL)) | 487 | if(default_event_handler(button) == SYS_USB_CONNECTED || |
488 | (!(button & SYS_EVENT) && !(button & BUTTON_REL))) | ||
488 | stop = true; | 489 | stop = true; |
489 | break; | 490 | break; |
490 | } | 491 | } |
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 @@ | |||
43 | #define SYS_MMC_EXTRACTED ((SYS_EVENT | ((long)7 << 27))) | 43 | #define SYS_MMC_EXTRACTED ((SYS_EVENT | ((long)7 << 27))) |
44 | #define SYS_POWEROFF ((SYS_EVENT | ((long)8 << 27))) | 44 | #define SYS_POWEROFF ((SYS_EVENT | ((long)8 << 27))) |
45 | #define SYS_FS_CHANGED ((SYS_EVENT | ((long)9 << 27))) | 45 | #define SYS_FS_CHANGED ((SYS_EVENT | ((long)9 << 27))) |
46 | #define SYS_CHARGER_CONNECTED ((SYS_EVENT | ((long)10 << 27))) | ||
47 | #define SYS_CHARGER_DISCONNECTED ((SYS_EVENT | ((long)11 << 27))) | ||
46 | 48 | ||
47 | struct event | 49 | struct event |
48 | { | 50 | { |
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) | |||
89 | (void)capacity; | 89 | (void)capacity; |
90 | } | 90 | } |
91 | 91 | ||
92 | void set_car_adapter_mode(bool setting) | ||
93 | { | ||
94 | (void)setting; | ||
95 | } | ||
96 | |||
97 | void reset_poweroff_timer(void) | 92 | void reset_poweroff_timer(void) |
98 | { | 93 | { |
99 | } | 94 | } |
@@ -150,9 +145,6 @@ static enum { | |||
150 | CHARGER_PLUGGED, /* transient state */ | 145 | CHARGER_PLUGGED, /* transient state */ |
151 | CHARGER | 146 | CHARGER |
152 | } charger_input_state; | 147 | } charger_input_state; |
153 | |||
154 | static bool waiting_to_resume_play = false; | ||
155 | static long play_resume_time; | ||
156 | #endif | 148 | #endif |
157 | 149 | ||
158 | #ifdef HAVE_CHARGE_CTRL | 150 | #ifdef HAVE_CHARGE_CTRL |
@@ -192,8 +184,6 @@ static int battery_type = 0; | |||
192 | /* Power history: power_history[0] is the newest sample */ | 184 | /* Power history: power_history[0] is the newest sample */ |
193 | unsigned short power_history[POWER_HISTORY_LEN]; | 185 | unsigned short power_history[POWER_HISTORY_LEN]; |
194 | 186 | ||
195 | static bool car_adapter_mode_enabled = false; | ||
196 | |||
197 | static char power_stack[DEFAULT_STACK_SIZE + DEBUG_STACK]; | 187 | static char power_stack[DEFAULT_STACK_SIZE + DEBUG_STACK]; |
198 | static const char power_thread_name[] = "power"; | 188 | static const char power_thread_name[] = "power"; |
199 | 189 | ||
@@ -401,47 +391,6 @@ static void handle_auto_poweroff(void) | |||
401 | } | 391 | } |
402 | } | 392 | } |
403 | 393 | ||
404 | void set_car_adapter_mode(bool setting) | ||
405 | { | ||
406 | car_adapter_mode_enabled = setting; | ||
407 | } | ||
408 | |||
409 | #ifdef HAVE_CHARGING | ||
410 | static void car_adapter_mode_processing(void) | ||
411 | { | ||
412 | if (car_adapter_mode_enabled) { | ||
413 | |||
414 | if (waiting_to_resume_play) { | ||
415 | if (TIME_AFTER(current_tick, play_resume_time)) { | ||
416 | if (audio_status() & AUDIO_STATUS_PAUSE) { | ||
417 | audio_resume(); | ||
418 | } | ||
419 | waiting_to_resume_play = false; | ||
420 | } | ||
421 | } else { | ||
422 | if (charger_input_state == CHARGER_UNPLUGGED) { | ||
423 | /* | ||
424 | * Just got unplugged, pause if playing | ||
425 | */ | ||
426 | if ((audio_status() & AUDIO_STATUS_PLAY) && | ||
427 | !(audio_status() & AUDIO_STATUS_PAUSE)) { | ||
428 | audio_pause(); | ||
429 | } | ||
430 | } else if(charger_input_state == CHARGER_PLUGGED) { | ||
431 | /* | ||
432 | * Just got plugged in, delay & resume if we were playing | ||
433 | */ | ||
434 | if (audio_status() & AUDIO_STATUS_PAUSE) { | ||
435 | /* delay resume a bit while the engine is cranking */ | ||
436 | play_resume_time = current_tick + HZ*5; | ||
437 | waiting_to_resume_play = true; | ||
438 | } | ||
439 | } | ||
440 | } | ||
441 | } | ||
442 | } | ||
443 | #endif | ||
444 | |||
445 | /* | 394 | /* |
446 | * Estimate how much current we are drawing just to run. | 395 | * Estimate how much current we are drawing just to run. |
447 | */ | 396 | */ |
@@ -507,6 +456,7 @@ static void power_thread_sleep(int ticks) | |||
507 | charger_input_state = CHARGER_PLUGGED; | 456 | charger_input_state = CHARGER_PLUGGED; |
508 | return; | 457 | return; |
509 | case CHARGER_PLUGGED: | 458 | case CHARGER_PLUGGED: |
459 | queue_broadcast(SYS_CHARGER_CONNECTED, NULL); | ||
510 | charger_input_state = CHARGER; | 460 | charger_input_state = CHARGER; |
511 | break; | 461 | break; |
512 | case CHARGER: | 462 | case CHARGER: |
@@ -517,6 +467,7 @@ static void power_thread_sleep(int ticks) | |||
517 | case NO_CHARGER: | 467 | case NO_CHARGER: |
518 | break; | 468 | break; |
519 | case CHARGER_UNPLUGGED: | 469 | case CHARGER_UNPLUGGED: |
470 | queue_broadcast(SYS_CHARGER_DISCONNECTED, NULL); | ||
520 | charger_input_state = NO_CHARGER; | 471 | charger_input_state = NO_CHARGER; |
521 | break; | 472 | break; |
522 | case CHARGER_PLUGGED: | 473 | case CHARGER_PLUGGED: |
@@ -531,9 +482,6 @@ static void power_thread_sleep(int ticks) | |||
531 | sleep(small_ticks); | 482 | sleep(small_ticks); |
532 | ticks -= small_ticks; | 483 | ticks -= small_ticks; |
533 | 484 | ||
534 | #ifdef HAVE_CHARGING | ||
535 | car_adapter_mode_processing(); | ||
536 | #endif | ||
537 | #ifdef HAVE_ALARM_MOD | 485 | #ifdef HAVE_ALARM_MOD |
538 | power_thread_rtc_process(); | 486 | power_thread_rtc_process(); |
539 | #endif | 487 | #endif |