summaryrefslogtreecommitdiff
path: root/apps/debug_menu.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/debug_menu.c')
-rw-r--r--apps/debug_menu.c130
1 files changed, 128 insertions, 2 deletions
diff --git a/apps/debug_menu.c b/apps/debug_menu.c
index 1c1a8170d7..d4d08bc673 100644
--- a/apps/debug_menu.c
+++ b/apps/debug_menu.c
@@ -33,6 +33,8 @@
33#include "rtc.h" 33#include "rtc.h"
34#include "debug.h" 34#include "debug.h"
35#include "thread.h" 35#include "thread.h"
36#include "powermgmt.h"
37#include "system.h"
36 38
37/*---------------------------------------------------*/ 39/*---------------------------------------------------*/
38/* SPECIAL DEBUG STUFF */ 40/* SPECIAL DEBUG STUFF */
@@ -154,7 +156,7 @@ void dbg_ports(void)
154 snprintf(buf, 32, "AN3: %03x AN7: %03x", adc_read(3), adc_read(7)); 156 snprintf(buf, 32, "AN3: %03x AN7: %03x", adc_read(3), adc_read(7));
155 lcd_puts(0, 5, buf); 157 lcd_puts(0, 5, buf);
156 158
157 battery_voltage = (adc_read(6) * BATTERY_SCALE_FACTOR) / 10000; 159 battery_voltage = (adc_read(ADC_UNREG_POWER) * BATTERY_SCALE_FACTOR) / 10000;
158 batt_int = battery_voltage / 100; 160 batt_int = battery_voltage / 100;
159 batt_frac = battery_voltage % 100; 161 batt_frac = battery_voltage % 100;
160 162
@@ -255,7 +257,7 @@ void dbg_ports(void)
255 } 257 }
256 lcd_puts(0, 0, buf); 258 lcd_puts(0, 0, buf);
257 259
258 battery_voltage = (adc_read(6) * BATTERY_SCALE_FACTOR) / 10000; 260 battery_voltage = (adc_read(ADC_UNREG_POWER) * BATTERY_SCALE_FACTOR) / 10000;
259 batt_int = battery_voltage / 100; 261 batt_int = battery_voltage / 100;
260 batt_frac = battery_voltage % 100; 262 batt_frac = battery_voltage % 100;
261 263
@@ -426,6 +428,129 @@ void dbg_mas_codec(void)
426 } 428 }
427 } 429 }
428} 430}
431
432/*
433 * view_battery() shows a automatically scaled graph of the battery voltage
434 * over time. Usable for estimating battery life / charging rate.
435 * The power_history array is updated in power_thread of powermgmt.c.
436 */
437
438#define BAT_FIRST_VAL MAX(POWER_HISTORY_LEN - LCD_WIDTH - 1, 0)
439#define BAT_YSPACE (LCD_HEIGHT - 20)
440
441void view_battery(void)
442{
443 int view = 0;
444 int i, x, y;
445 int maxv, minv;
446 char buf[32];
447
448 while(1)
449 {
450 switch (view) {
451 case 0: /* voltage history graph */
452 /* Find maximum and minimum voltage for scaling */
453 maxv = minv = 0;
454 for (i = BAT_FIRST_VAL; i < POWER_HISTORY_LEN; i++) {
455 if (power_history[i] > maxv)
456 maxv = power_history[i];
457 if ((minv == 0) || ((power_history[i]) && (power_history[i] < minv)) )
458 minv = power_history[i];
459 }
460
461 if (minv < 1)
462 minv = 1;
463 if (maxv < 2)
464 maxv = 2;
465
466 lcd_clear_display();
467 lcd_puts(0, 0, "Battery voltage:");
468 snprintf(buf, 30, "scale %d.%02d-%d.%02d V", minv / 100, minv % 100, maxv / 100, maxv % 100);
469 lcd_puts(0, 1, buf);
470
471 x = 0;
472 for (i = BAT_FIRST_VAL+1; i < POWER_HISTORY_LEN; i++) {
473 y = (power_history[i] - minv) * BAT_YSPACE / (maxv - minv);
474 lcd_clearline(x, LCD_HEIGHT-1, x, 20);
475 lcd_drawline(x, LCD_HEIGHT-1, x, MIN(MAX(LCD_HEIGHT-1 - y, 20), LCD_HEIGHT-1));
476 x++;
477 }
478
479 break;
480
481 case 1: /* status: */
482 lcd_clear_display();
483 lcd_puts(0, 0, "Power status:");
484
485 y = (adc_read(ADC_UNREG_POWER) * BATTERY_SCALE_FACTOR) / 10000;
486 snprintf(buf, 30, "Battery: %d.%02d V", y / 100, y % 100);
487 lcd_puts(0, 1, buf);
488 y = (adc_read(ADC_EXT_POWER) * EXT_SCALE_FACTOR) / 10000;
489 snprintf(buf, 30, "External: %d.%02d V", y / 100, y % 100);
490 lcd_puts(0, 2, buf);
491 snprintf(buf, 30, "Charger: %s", charger_inserted() ? "present" : "absent");
492 lcd_puts(0, 3, buf);
493#ifdef HAVE_CHARGE_CTRL
494 snprintf(buf, 30, "Charging: %s", charger_enabled ? "yes" : "no");
495 lcd_puts(0, 4, buf);
496#endif
497 y = 0;
498 for (i = 0; i < CHARGE_END_NEGD; i++)
499 y += power_history[POWER_HISTORY_LEN-1-i]*100 - power_history[POWER_HISTORY_LEN-1-i-1]*100;
500 y = y / CHARGE_END_NEGD;
501
502 snprintf(buf, 30, "short delta: %d", y);
503 lcd_puts(0, 5, buf);
504
505 y = 0;
506 for (i = 0; i < CHARGE_END_ZEROD; i++)
507 y += power_history[POWER_HISTORY_LEN-1-i]*100 - power_history[POWER_HISTORY_LEN-1-i-1]*100;
508 y = y / CHARGE_END_ZEROD;
509
510 snprintf(buf, 30, "long delta: %d", y);
511 lcd_puts(0, 6, buf);
512
513#ifdef HAVE_CHARGE_CTRL
514 lcd_puts(0, 7, power_message);
515#endif
516 break;
517
518 case 2: /* voltage deltas: */
519 lcd_clear_display();
520 lcd_puts(0, 0, "Voltage deltas:");
521
522 for (i = 0; i <= 6; i++) {
523 y = power_history[POWER_HISTORY_LEN-1-i] - power_history[POWER_HISTORY_LEN-1-i-1];
524 snprintf(buf, 30, "-%d min: %s%d.%02d V", i,
525 (y < 0) ? "-" : "",
526 ((y < 0) ? y * -1 : y) / 100, ((y < 0) ? y * -1 : y ) % 100);
527 lcd_puts(0, i+1, buf);
528 }
529 break;
530 }
531
532 lcd_update();
533 sleep(HZ/2);
534
535 switch(button_get(false))
536 {
537 case BUTTON_UP:
538 if (view)
539 view--;
540 break;
541
542 case BUTTON_DOWN:
543 if (view < 2)
544 view++;
545 break;
546
547 case BUTTON_LEFT:
548 case BUTTON_OFF:
549 return;
550 }
551 }
552}
553
429#endif 554#endif
430 555
431void debug_menu(void) 556void debug_menu(void)
@@ -443,6 +568,7 @@ void debug_menu(void)
443 { "View MAS regs", dbg_mas }, 568 { "View MAS regs", dbg_mas },
444#ifdef ARCHOS_RECORDER 569#ifdef ARCHOS_RECORDER
445 { "View MAS codec", dbg_mas_codec }, 570 { "View MAS codec", dbg_mas_codec },
571 { "View battery", view_battery },
446#endif 572#endif
447 }; 573 };
448 574