summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/main.c5
-rw-r--r--apps/misc.c66
-rw-r--r--apps/misc.h1
-rw-r--r--apps/settings.c2
-rw-r--r--apps/settings_menu.c2
-rw-r--r--apps/tree.c3
-rw-r--r--firmware/export/kernel.h2
-rw-r--r--firmware/powermgmt.c56
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
276int main(void) 279int 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
294static bool waiting_to_resume_play = false;
295static long play_resume_tick;
296
297static 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
327static 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
342void car_adapter_mode_init(void)
343{
344 tick_add_task(car_adapter_tick);
345}
346#endif
347
292long default_event_handler_ex(long event, void (*callback)(void *), void *parameter) 348long 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);
44bool clean_shutdown(void); 44bool clean_shutdown(void);
45long default_event_handler_ex(long event, void (*callback)(void *), void *parameter); 45long default_event_handler_ex(long event, void (*callback)(void *), void *parameter);
46long default_event_handler(long event); 46long default_event_handler(long event);
47void 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
47struct event 49struct 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
92void set_car_adapter_mode(bool setting)
93{
94 (void)setting;
95}
96
97void reset_poweroff_timer(void) 92void 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
154static bool waiting_to_resume_play = false;
155static 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 */
193unsigned short power_history[POWER_HISTORY_LEN]; 185unsigned short power_history[POWER_HISTORY_LEN];
194 186
195static bool car_adapter_mode_enabled = false;
196
197static char power_stack[DEFAULT_STACK_SIZE + DEBUG_STACK]; 187static char power_stack[DEFAULT_STACK_SIZE + DEBUG_STACK];
198static const char power_thread_name[] = "power"; 188static const char power_thread_name[] = "power";
199 189
@@ -401,47 +391,6 @@ static void handle_auto_poweroff(void)
401 } 391 }
402} 392}
403 393
404void set_car_adapter_mode(bool setting)
405{
406 car_adapter_mode_enabled = setting;
407}
408
409#ifdef HAVE_CHARGING
410static 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