summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/bookmark.c69
-rw-r--r--apps/credits.c2
-rw-r--r--apps/debug_menu.c460
-rw-r--r--apps/main.c2
-rw-r--r--apps/main_menu.c15
-rw-r--r--apps/menu.c77
-rw-r--r--apps/menu.h26
-rw-r--r--apps/misc.c5
-rw-r--r--apps/onplay.c71
-rw-r--r--apps/player/keyboard.c17
-rw-r--r--apps/playlist.c18
-rw-r--r--apps/playlist_viewer.c67
-rw-r--r--apps/plugins/calendar.c2
-rw-r--r--apps/recorder/keyboard.c13
-rw-r--r--apps/recorder/radio.c13
-rw-r--r--apps/recorder/recording.c10
-rw-r--r--apps/screens.c157
-rw-r--r--apps/screens.h3
-rw-r--r--apps/settings.c69
-rw-r--r--apps/settings.h25
-rw-r--r--apps/settings_menu.c38
-rw-r--r--apps/sleeptimer.c96
-rw-r--r--apps/sound_menu.c31
-rw-r--r--apps/tree.c115
-rw-r--r--apps/tree.h42
-rw-r--r--apps/wps.c653
-rw-r--r--apps/wps.h1
-rw-r--r--firmware/drivers/button.c11
-rw-r--r--firmware/drivers/serial.c2
-rw-r--r--firmware/export/button.h33
-rw-r--r--firmware/usb.c2
-rw-r--r--uisimulator/common/lcd-playersim.c2
-rw-r--r--uisimulator/win32/Makefile3
-rw-r--r--uisimulator/win32/button.c31
-rw-r--r--uisimulator/x11/Makefile7
-rw-r--r--uisimulator/x11/button-x11.c32
36 files changed, 1053 insertions, 1167 deletions
diff --git a/apps/bookmark.c b/apps/bookmark.c
index ed85ff6222..9488e52d3d 100644
--- a/apps/bookmark.c
+++ b/apps/bookmark.c
@@ -256,33 +256,25 @@ bool bookmark_autobookmark(void)
256 { 256 {
257 /* Wait for a key to be pushed */ 257 /* Wait for a key to be pushed */
258 key = button_get(true); 258 key = button_get(true);
259 switch (key) 259 if (key & BUTTON_REL)
260 { 260 {
261 case BUTTON_DOWN | BUTTON_REL: 261#ifdef BUTTON_PLAY
262 case BUTTON_ON | BUTTON_REL: 262 if (key & BUTTON_PLAY)
263#ifdef HAVE_RECORDER_KEYPAD 263#else
264 case BUTTON_OFF | BUTTON_REL: 264 if (key & BUTTON_RIGHT)
265 case BUTTON_RIGHT | BUTTON_REL:
266 case BUTTON_UP | BUTTON_REL:
267#endif 265#endif
268 case BUTTON_LEFT | BUTTON_REL: 266 {
269 done = true;
270 break;
271
272 case BUTTON_PLAY | BUTTON_REL:
273 if (global_settings.autocreatebookmark == 267 if (global_settings.autocreatebookmark ==
274 BOOKMARK_RECENT_ONLY_ASK) 268 BOOKMARK_RECENT_ONLY_ASK)
275 write_bookmark(false); 269 write_bookmark(false);
276 else 270 else
277 write_bookmark(true); 271 write_bookmark(true);
278 done = true; 272 }
279 break; 273 done = true;
280
281 default:
282 if(default_event_handler(key) == SYS_USB_CONNECTED)
283 return false;
284 break;
285 } 274 }
275
276 if (default_event_handler(key) == SYS_USB_CONNECTED)
277 return false;
286 } 278 }
287 return true; 279 return true;
288} 280}
@@ -520,7 +512,11 @@ bool bookmark_autoload(const char* file)
520 case BUTTON_DOWN: 512 case BUTTON_DOWN:
521 return bookmark_load(global_bookmark_file_name, false); 513 return bookmark_load(global_bookmark_file_name, false);
522#endif 514#endif
515#ifdef BUTTON_PLAY
523 case BUTTON_PLAY: 516 case BUTTON_PLAY:
517#else
518 case BUTTON_RIGHT:
519#endif
524 return bookmark_load(global_bookmark_file_name, true); 520 return bookmark_load(global_bookmark_file_name, true);
525 521
526 default: 522 default:
@@ -668,7 +664,10 @@ static char* select_bookmark(const char* bookmark_file_name)
668 key = button_get(true); 664 key = button_get(true);
669 switch(key) 665 switch(key)
670 { 666 {
671 case BUTTON_PLAY: 667 case SETTINGS_OK:
668#ifdef SETTINGS_OK2
669 case SETTINGS_OK2:
670#endif
672 /* User wants to use this bookmark */ 671 /* User wants to use this bookmark */
673#ifdef HAVE_LCD_BITMAP 672#ifdef HAVE_LCD_BITMAP
674 if (global_settings.statusbar) 673 if (global_settings.statusbar)
@@ -678,7 +677,11 @@ static char* select_bookmark(const char* bookmark_file_name)
678#endif 677#endif
679 return bookmark; 678 return bookmark;
680 679
680#if defined(BUTTON_ON) && defined(BUTTON_PLAY)
681 case BUTTON_ON | BUTTON_PLAY: 681 case BUTTON_ON | BUTTON_PLAY:
682#elif defined(BUTTON_MENU) && defined(BUTTON_RIGHT)
683 case BUTTON_MENU | BUTTON_RIGHT:
684#endif
682 /* User wants to delete this bookmark */ 685 /* User wants to delete this bookmark */
683 delete_bookmark(bookmark_file_name, bookmark_id); 686 delete_bookmark(bookmark_file_name, bookmark_id);
684 bookmark_id_prev=-1; 687 bookmark_id_prev=-1;
@@ -687,36 +690,20 @@ static char* select_bookmark(const char* bookmark_file_name)
687 while (button_get(false)); /* clear button queue */ 690 while (button_get(false)); /* clear button queue */
688 break; 691 break;
689 692
690#ifdef HAVE_RECORDER_KEYPAD 693 case SETTINGS_DEC:
691 case BUTTON_UP:
692 bookmark_id--; 694 bookmark_id--;
693 break; 695 break;
694 696
695 case BUTTON_DOWN: 697 case SETTINGS_INC:
696 bookmark_id++; 698 bookmark_id++;
697 break; 699 break;
698 700
699 case BUTTON_LEFT: 701 case SETTINGS_CANCEL:
700 case BUTTON_OFF: 702#ifdef SETTINGS_CANCEL2
701#ifdef HAVE_LCD_BITMAP 703 case SETTINGS_CANCEL2:
702 if (global_settings.statusbar)
703 lcd_setmargins(0, STATUSBAR_HEIGHT);
704 else
705 lcd_setmargins(0, 0);
706#endif 704#endif
707 return NULL; 705 return NULL;
708#else
709 case BUTTON_LEFT:
710 bookmark_id--;
711 break;
712 706
713 case BUTTON_RIGHT:
714 bookmark_id++;
715 break;
716
717 case BUTTON_STOP:
718 return NULL;
719#endif
720 default: 707 default:
721 if(default_event_handler(key) == SYS_USB_CONNECTED) 708 if(default_event_handler(key) == SYS_USB_CONNECTED)
722 return NULL; 709 return NULL;
diff --git a/apps/credits.c b/apps/credits.c
index d8cda66677..492426ef8d 100644
--- a/apps/credits.c
+++ b/apps/credits.c
@@ -54,7 +54,7 @@ void roll_credits(void)
54 } 54 }
55 55
56 /* abort on keypress */ 56 /* abort on keypress */
57 if (button_get_w_tmo(DISPLAY_TIME)) 57 if (button_get_w_tmo(DISPLAY_TIME) & BUTTON_REL)
58 return; 58 return;
59 } 59 }
60 return; 60 return;
diff --git a/apps/debug_menu.c b/apps/debug_menu.c
index 12ba0c5fbe..7ef531f4df 100644
--- a/apps/debug_menu.c
+++ b/apps/debug_menu.c
@@ -93,10 +93,7 @@ bool dbg_os(void)
93 93
94 switch(button) 94 switch(button)
95 { 95 {
96#ifdef BUTTON_OFF 96 case SETTINGS_CANCEL:
97 case BUTTON_OFF:
98#endif
99 case BUTTON_LEFT:
100 return false; 97 return false;
101 } 98 }
102 } 99 }
@@ -127,16 +124,16 @@ bool dbg_os(void)
127 124
128 switch(button) 125 switch(button)
129 { 126 {
130 case BUTTON_STOP: 127 case SETTINGS_CANCEL:
131 return false; 128 return false;
132 129
133 case BUTTON_LEFT: 130 case SETTINGS_DEC:
134 currval--; 131 currval--;
135 if(currval < 0) 132 if(currval < 0)
136 currval = num_threads-1; 133 currval = num_threads-1;
137 break; 134 break;
138 135
139 case BUTTON_RIGHT: 136 case SETTINGS_INC:
140 currval++; 137 currval++;
141 if(currval > num_threads-1) 138 if(currval > num_threads-1)
142 currval = 0; 139 currval = 0;
@@ -161,7 +158,7 @@ bool dbg_mpeg_thread(void)
161 button = button_get_w_tmo(HZ/5); 158 button = button_get_w_tmo(HZ/5);
162 switch(button) 159 switch(button)
163 { 160 {
164 case BUTTON_OFF | BUTTON_REL: 161 case SETTINGS_CANCEL:
165 return false; 162 return false;
166 } 163 }
167 164
@@ -375,7 +372,7 @@ bool dbg_hw_info(void)
375 while(1) 372 while(1)
376 { 373 {
377 button = button_get(true); 374 button = button_get(true);
378 if(button == (BUTTON_OFF | BUTTON_REL)) 375 if(button == SETTINGS_CANCEL)
379 return false; 376 return false;
380 } 377 }
381 378
@@ -460,16 +457,16 @@ bool dbg_hw_info(void)
460 457
461 switch(button) 458 switch(button)
462 { 459 {
463 case BUTTON_STOP: 460 case SETTINGS_CANCEL:
464 return false; 461 return false;
465 462
466 case BUTTON_LEFT: 463 case SETTINGS_DEC:
467 currval--; 464 currval--;
468 if(currval < 0) 465 if(currval < 0)
469 currval = 5; 466 currval = 5;
470 break; 467 break;
471 468
472 case BUTTON_RIGHT: 469 case SETTINGS_INC:
473 currval++; 470 currval++;
474 if(currval > 5) 471 if(currval > 5)
475 currval = 0; 472 currval = 0;
@@ -507,26 +504,17 @@ bool dbg_partitions(void)
507 504
508 switch(button) 505 switch(button)
509 { 506 {
510#ifdef HAVE_RECORDER_KEYPAD 507 case SETTINGS_OK:
511 case BUTTON_OFF: 508 case SETTINGS_CANCEL:
512#else
513 case BUTTON_STOP:
514#endif
515 return false; 509 return false;
516 510
517#ifdef HAVE_RECORDER_KEYPAD 511 case SETTINGS_DEC:
518 case BUTTON_UP:
519#endif
520 case BUTTON_LEFT:
521 partition--; 512 partition--;
522 if (partition < 0) 513 if (partition < 0)
523 partition = 3; 514 partition = 3;
524 break; 515 break;
525 516
526#ifdef HAVE_RECORDER_KEYPAD 517 case SETTINGS_INC:
527 case BUTTON_DOWN:
528#endif
529 case BUTTON_RIGHT:
530 partition++; 518 partition++;
531 if (partition > 3) 519 if (partition > 3)
532 partition = 0; 520 partition = 0;
@@ -595,7 +583,7 @@ bool dbg_ports(void)
595 583
596 switch(button) 584 switch(button)
597 { 585 {
598 case BUTTON_OFF | BUTTON_REL: 586 case SETTINGS_CANCEL:
599 return false; 587 return false;
600 } 588 }
601 } 589 }
@@ -675,16 +663,16 @@ bool dbg_ports(void)
675 663
676 switch(button) 664 switch(button)
677 { 665 {
678 case BUTTON_STOP | BUTTON_REL: 666 case SETTINGS_CANCEL:
679 return false; 667 return false;
680 668
681 case BUTTON_LEFT: 669 case SETTINGS_DEC:
682 currval--; 670 currval--;
683 if(currval < 0) 671 if(currval < 0)
684 currval = 10; 672 currval = 10;
685 break; 673 break;
686 674
687 case BUTTON_RIGHT: 675 case SETTINGS_INC:
688 currval++; 676 currval++;
689 if(currval > 10) 677 if(currval > 10)
690 currval = 0; 678 currval = 0;
@@ -727,20 +715,25 @@ bool dbg_rtc(void)
727 715
728 switch(button) 716 switch(button)
729 { 717 {
730 case BUTTON_DOWN: 718 case SETTINGS_INC:
731 if (addr < 63-16) { addr += 16; } 719 if (addr < 63-16) { addr += 16; }
732 break; 720 break;
733 case BUTTON_UP: 721
734 if (addr) { addr -= 16; } 722 case SETTINGS_DEC:
735 break; 723 if (addr) { addr -= 16; }
736 case BUTTON_F2: 724 break;
737 /* clear the user RAM space */ 725
738 for (c = 0; c <= 43; c++) 726#ifdef BUTTON_F2
739 rtc_write(0x14 + c, 0); 727 case BUTTON_F2:
740 break; 728 /* clear the user RAM space */
741 case BUTTON_OFF | BUTTON_REL: 729 for (c = 0; c <= 43; c++)
742 case BUTTON_LEFT | BUTTON_REL: 730 rtc_write(0x14 + c, 0);
743 return false; 731 break;
732#endif
733
734 case SETTINGS_OK:
735 case SETTINGS_CANCEL:
736 return false;
744 } 737 }
745 } 738 }
746 return false; 739 return false;
@@ -781,26 +774,17 @@ bool dbg_mas(void)
781 774
782 switch(button_get_w_tmo(HZ/16)) 775 switch(button_get_w_tmo(HZ/16))
783 { 776 {
784#ifdef HAVE_RECORDER_KEYPAD 777 case SETTINGS_INC:
785 case BUTTON_DOWN: 778 addr = (addr + NUMROWS) & 0xFF; /* register addrs are 8 bit */
786#else 779 break;
787 case BUTTON_RIGHT: 780
788#endif 781 case SETTINGS_DEC:
789 addr = (addr + NUMROWS) & 0xFF; /* register addrs are 8 bit */ 782 addr = (addr - NUMROWS) & 0xFF; /* register addrs are 8 bit */
790 break; 783 break;
791#ifdef HAVE_RECORDER_KEYPAD 784
792 case BUTTON_UP: 785 case SETTINGS_OK:
793#else 786 case SETTINGS_CANCEL:
794 case BUTTON_LEFT: 787 return false;
795#endif
796 addr = (addr - NUMROWS) & 0xFF; /* register addrs are 8 bit */
797 break;
798#ifdef HAVE_RECORDER_KEYPAD
799 case BUTTON_LEFT:
800#else
801 case BUTTON_DOWN:
802#endif
803 return false;
804 } 788 }
805 } 789 }
806 return false; 790 return false;
@@ -830,15 +814,16 @@ bool dbg_mas_codec(void)
830 814
831 switch(button_get_w_tmo(HZ/16)) 815 switch(button_get_w_tmo(HZ/16))
832 { 816 {
833 case BUTTON_DOWN: 817 case SETTINGS_INC:
834 addr += 4; 818 addr += 4;
835 break; 819 break;
836 case BUTTON_UP: 820 case SETTINGS_DEC:
837 if (addr) { addr -= 4; } 821 if (addr) { addr -= 4; }
838 break; 822 break;
839 case BUTTON_LEFT | BUTTON_REL: 823
840 case BUTTON_OFF | BUTTON_REL: 824 case SETTINGS_OK:
841 return false; 825 case SETTINGS_CANCEL:
826 return false;
842 } 827 }
843 } 828 }
844 return false; 829 return false;
@@ -994,18 +979,18 @@ bool view_battery(void)
994 979
995 switch(button_get_w_tmo(HZ/2)) 980 switch(button_get_w_tmo(HZ/2))
996 { 981 {
997 case BUTTON_UP: 982 case SETTINGS_DEC:
998 if (view) 983 if (view)
999 view--; 984 view--;
1000 break; 985 break;
1001 986
1002 case BUTTON_DOWN: 987 case SETTINGS_INC:
1003 if (view < 3) 988 if (view < 3)
1004 view++; 989 view++;
1005 break; 990 break;
1006 991
1007 case BUTTON_LEFT | BUTTON_REL: 992 case SETTINGS_OK:
1008 case BUTTON_OFF | BUTTON_REL: 993 case SETTINGS_CANCEL:
1009 return false; 994 return false;
1010 } 995 }
1011 } 996 }
@@ -1031,158 +1016,159 @@ bool dbg_mas_info(void)
1031 { 1016 {
1032 switch(currval) 1017 switch(currval)
1033 { 1018 {
1034 case 0: 1019 case 0:
1035 mas_readmem(MAS_BANK_D1, 0xff7, &val, 1); 1020 mas_readmem(MAS_BANK_D1, 0xff7, &val, 1);
1036 lcd_puts(0, 0, "Design Code"); 1021 lcd_puts(0, 0, "Design Code");
1037 snprintf(buf, 32, "%05x ", val); 1022 snprintf(buf, 32, "%05x ", val);
1038 break; 1023 break;
1039 case 1: 1024 case 1:
1040 lcd_puts(0, 0, "DC/DC mode "); 1025 lcd_puts(0, 0, "DC/DC mode ");
1041 snprintf(buf, 32, "8e: %05x ", mas_readreg(0x8e) & 0xfffff); 1026 snprintf(buf, 32, "8e: %05x ", mas_readreg(0x8e) & 0xfffff);
1042 break; 1027 break;
1043 case 2: 1028 case 2:
1044 lcd_puts(0, 0, "Mute/Bypass"); 1029 lcd_puts(0, 0, "Mute/Bypass");
1045 snprintf(buf, 32, "aa: %05x ", mas_readreg(0xaa) & 0xfffff); 1030 snprintf(buf, 32, "aa: %05x ", mas_readreg(0xaa) & 0xfffff);
1046 break; 1031 break;
1047 case 3: 1032 case 3:
1048 lcd_puts(0, 0, "PIOData "); 1033 lcd_puts(0, 0, "PIOData ");
1049 snprintf(buf, 32, "ed: %05x ", mas_readreg(0xed) & 0xfffff); 1034 snprintf(buf, 32, "ed: %05x ", mas_readreg(0xed) & 0xfffff);
1050 break; 1035 break;
1051 case 4: 1036 case 4:
1052 lcd_puts(0, 0, "Startup Cfg"); 1037 lcd_puts(0, 0, "Startup Cfg");
1053 snprintf(buf, 32, "e6: %05x ", mas_readreg(0xe6) & 0xfffff); 1038 snprintf(buf, 32, "e6: %05x ", mas_readreg(0xe6) & 0xfffff);
1054 break; 1039 break;
1055 case 5: 1040 case 5:
1056 lcd_puts(0, 0, "KPrescale "); 1041 lcd_puts(0, 0, "KPrescale ");
1057 snprintf(buf, 32, "e7: %05x ", mas_readreg(0xe7) & 0xfffff); 1042 snprintf(buf, 32, "e7: %05x ", mas_readreg(0xe7) & 0xfffff);
1058 break; 1043 break;
1059 case 6: 1044 case 6:
1060 lcd_puts(0, 0, "KBass "); 1045 lcd_puts(0, 0, "KBass ");
1061 snprintf(buf, 32, "6b: %05x ", mas_readreg(0x6b) & 0xfffff); 1046 snprintf(buf, 32, "6b: %05x ", mas_readreg(0x6b) & 0xfffff);
1062 break; 1047 break;
1063 case 7: 1048 case 7:
1064 lcd_puts(0, 0, "KTreble "); 1049 lcd_puts(0, 0, "KTreble ");
1065 snprintf(buf, 32, "6f: %05x ", mas_readreg(0x6f) & 0xfffff); 1050 snprintf(buf, 32, "6f: %05x ", mas_readreg(0x6f) & 0xfffff);
1066 break; 1051 break;
1067 case 8: 1052 case 8:
1068 mas_readmem(MAS_BANK_D0, 0x300, &val, 1); 1053 mas_readmem(MAS_BANK_D0, 0x300, &val, 1);
1069 lcd_puts(0, 0, "Frame Count"); 1054 lcd_puts(0, 0, "Frame Count");
1070 snprintf(buf, 32, "0/300: %04x", val & 0xffff); 1055 snprintf(buf, 32, "0/300: %04x", val & 0xffff);
1071 break; 1056 break;
1072 case 9: 1057 case 9:
1073 mas_readmem(MAS_BANK_D0, 0x301, &val, 1); 1058 mas_readmem(MAS_BANK_D0, 0x301, &val, 1);
1074 lcd_puts(0, 0, "Status1 "); 1059 lcd_puts(0, 0, "Status1 ");
1075 snprintf(buf, 32, "0/301: %04x", val & 0xffff); 1060 snprintf(buf, 32, "0/301: %04x", val & 0xffff);
1076 break; 1061 break;
1077 case 10: 1062 case 10:
1078 mas_readmem(MAS_BANK_D0, 0x302, &val, 1); 1063 mas_readmem(MAS_BANK_D0, 0x302, &val, 1);
1079 lcd_puts(0, 0, "Status2 "); 1064 lcd_puts(0, 0, "Status2 ");
1080 snprintf(buf, 32, "0/302: %04x", val & 0xffff); 1065 snprintf(buf, 32, "0/302: %04x", val & 0xffff);
1081 break; 1066 break;
1082 case 11: 1067 case 11:
1083 mas_readmem(MAS_BANK_D0, 0x303, &val, 1); 1068 mas_readmem(MAS_BANK_D0, 0x303, &val, 1);
1084 lcd_puts(0, 0, "CRC Count "); 1069 lcd_puts(0, 0, "CRC Count ");
1085 snprintf(buf, 32, "0/303: %04x", val & 0xffff); 1070 snprintf(buf, 32, "0/303: %04x", val & 0xffff);
1086 break; 1071 break;
1087 case 12: 1072 case 12:
1088 mas_readmem(MAS_BANK_D0, 0x36d, &val, 1); 1073 mas_readmem(MAS_BANK_D0, 0x36d, &val, 1);
1089 lcd_puts(0, 0, "PLLOffset48"); 1074 lcd_puts(0, 0, "PLLOffset48");
1090 snprintf(buf, 32, "0/36d %05x", val & 0xfffff); 1075 snprintf(buf, 32, "0/36d %05x", val & 0xfffff);
1091 break; 1076 break;
1092 case 13: 1077 case 13:
1093 mas_readmem(MAS_BANK_D0, 0x32d, &val, 1); 1078 mas_readmem(MAS_BANK_D0, 0x32d, &val, 1);
1094 lcd_puts(0, 0, "PLLOffset48"); 1079 lcd_puts(0, 0, "PLLOffset48");
1095 snprintf(buf, 32, "0/32d %05x", val & 0xfffff); 1080 snprintf(buf, 32, "0/32d %05x", val & 0xfffff);
1096 break; 1081 break;
1097 case 14: 1082 case 14:
1098 mas_readmem(MAS_BANK_D0, 0x36e, &val, 1); 1083 mas_readmem(MAS_BANK_D0, 0x36e, &val, 1);
1099 lcd_puts(0, 0, "PLLOffset44"); 1084 lcd_puts(0, 0, "PLLOffset44");
1100 snprintf(buf, 32, "0/36e %05x", val & 0xfffff); 1085 snprintf(buf, 32, "0/36e %05x", val & 0xfffff);
1101 break; 1086 break;
1102 case 15: 1087 case 15:
1103 mas_readmem(MAS_BANK_D0, 0x32e, &val, 1); 1088 mas_readmem(MAS_BANK_D0, 0x32e, &val, 1);
1104 lcd_puts(0, 0, "PLLOffset44"); 1089 lcd_puts(0, 0, "PLLOffset44");
1105 snprintf(buf, 32, "0/32e %05x", val & 0xfffff); 1090 snprintf(buf, 32, "0/32e %05x", val & 0xfffff);
1106 break; 1091 break;
1107 case 16: 1092 case 16:
1108 mas_readmem(MAS_BANK_D0, 0x36f, &val, 1); 1093 mas_readmem(MAS_BANK_D0, 0x36f, &val, 1);
1109 lcd_puts(0, 0, "OutputConf "); 1094 lcd_puts(0, 0, "OutputConf ");
1110 snprintf(buf, 32, "0/36f %05x", val & 0xfffff); 1095 snprintf(buf, 32, "0/36f %05x", val & 0xfffff);
1111 break; 1096 break;
1112 case 17: 1097 case 17:
1113 mas_readmem(MAS_BANK_D0, 0x32f, &val, 1); 1098 mas_readmem(MAS_BANK_D0, 0x32f, &val, 1);
1114 lcd_puts(0, 0, "OutputConf "); 1099 lcd_puts(0, 0, "OutputConf ");
1115 snprintf(buf, 32, "0/32f %05x", val & 0xfffff); 1100 snprintf(buf, 32, "0/32f %05x", val & 0xfffff);
1116 break; 1101 break;
1117 case 18: 1102 case 18:
1118 mas_readmem(MAS_BANK_D1, 0x7f8, &val, 1); 1103 mas_readmem(MAS_BANK_D1, 0x7f8, &val, 1);
1119 lcd_puts(0, 0, "LL Gain "); 1104 lcd_puts(0, 0, "LL Gain ");
1120 snprintf(buf, 32, "1/7f8 %05x", val & 0xfffff); 1105 snprintf(buf, 32, "1/7f8 %05x", val & 0xfffff);
1121 break; 1106 break;
1122 case 19: 1107 case 19:
1123 mas_readmem(MAS_BANK_D1, 0x7f9, &val, 1); 1108 mas_readmem(MAS_BANK_D1, 0x7f9, &val, 1);
1124 lcd_puts(0, 0, "LR Gain "); 1109 lcd_puts(0, 0, "LR Gain ");
1125 snprintf(buf, 32, "1/7f9 %05x", val & 0xfffff); 1110 snprintf(buf, 32, "1/7f9 %05x", val & 0xfffff);
1126 break; 1111 break;
1127 case 20: 1112 case 20:
1128 mas_readmem(MAS_BANK_D1, 0x7fa, &val, 1); 1113 mas_readmem(MAS_BANK_D1, 0x7fa, &val, 1);
1129 lcd_puts(0, 0, "RL Gain "); 1114 lcd_puts(0, 0, "RL Gain ");
1130 snprintf(buf, 32, "1/7fa %05x", val & 0xfffff); 1115 snprintf(buf, 32, "1/7fa %05x", val & 0xfffff);
1131 break; 1116 break;
1132 case 21: 1117 case 21:
1133 mas_readmem(MAS_BANK_D1, 0x7fb, &val, 1); 1118 mas_readmem(MAS_BANK_D1, 0x7fb, &val, 1);
1134 lcd_puts(0, 0, "RR Gain "); 1119 lcd_puts(0, 0, "RR Gain ");
1135 snprintf(buf, 32, "1/7fb %05x", val & 0xfffff); 1120 snprintf(buf, 32, "1/7fb %05x", val & 0xfffff);
1136 break; 1121 break;
1137 case 22: 1122 case 22:
1138 lcd_puts(0, 0, "L Trailbits"); 1123 lcd_puts(0, 0, "L Trailbits");
1139 snprintf(buf, 32, "c5: %05x ", mas_readreg(0xc5) & 0xfffff); 1124 snprintf(buf, 32, "c5: %05x ", mas_readreg(0xc5) & 0xfffff);
1140 break; 1125 break;
1141 case 23: 1126 case 23:
1142 lcd_puts(0, 0, "R Trailbits"); 1127 lcd_puts(0, 0, "R Trailbits");
1143 snprintf(buf, 32, "c6: %05x ", mas_readreg(0xc6) & 0xfffff); 1128 snprintf(buf, 32, "c6: %05x ", mas_readreg(0xc6) & 0xfffff);
1144 break; 1129 break;
1145 } 1130 }
1146 lcd_puts(0, 1, buf); 1131 lcd_puts(0, 1, buf);
1147 1132
1148 button = button_get_w_tmo(HZ/5); 1133 button = button_get_w_tmo(HZ/5);
1149 switch(button) 1134 switch(button)
1150 { 1135 {
1151 case BUTTON_STOP: 1136 case SETTINGS_CANCEL:
1152 return false; 1137 return false;
1153 1138
1154 case BUTTON_LEFT: 1139 case SETTINGS_DEC:
1155 currval--; 1140 currval--;
1156 if(currval < 0) 1141 if(currval < 0)
1157 currval = 23; 1142 currval = 23;
1158 break; 1143 break;
1159 1144
1160 case BUTTON_RIGHT: 1145 case SETTINGS_INC:
1161 currval++; 1146 currval++;
1162 if(currval > 23) 1147 if(currval > 23)
1163 currval = 0; 1148 currval = 0;
1164 break; 1149 break;
1165 case BUTTON_PLAY: 1150
1166 pll_toggle = !pll_toggle; 1151 case SETTINGS_OK:
1167 if(pll_toggle) 1152 pll_toggle = !pll_toggle;
1168 { 1153 if(pll_toggle)
1169 /* 14.31818 MHz crystal */ 1154 {
1170 pll48 = 0x5d9d0; 1155 /* 14.31818 MHz crystal */
1171 pll44 = 0xfffceceb; 1156 pll48 = 0x5d9d0;
1172 config = 0; 1157 pll44 = 0xfffceceb;
1173 } 1158 config = 0;
1174 else 1159 }
1175 { 1160 else
1176 /* 14.725 MHz crystal */ 1161 {
1177 pll48 = 0x2d0de; 1162 /* 14.725 MHz crystal */
1178 pll44 = 0xfffa2319; 1163 pll48 = 0x2d0de;
1179 config = 0; 1164 pll44 = 0xfffa2319;
1180 } 1165 config = 0;
1181 mas_writemem(MAS_BANK_D0, 0x32d, &pll48, 1); 1166 }
1182 mas_writemem(MAS_BANK_D0, 0x32e, &pll44, 1); 1167 mas_writemem(MAS_BANK_D0, 0x32d, &pll48, 1);
1183 mas_writemem(MAS_BANK_D0, 0x32f, &config, 1); 1168 mas_writemem(MAS_BANK_D0, 0x32e, &pll44, 1);
1184 mas_run(0x475); 1169 mas_writemem(MAS_BANK_D0, 0x32f, &config, 1);
1185 break; 1170 mas_run(0x475);
1171 break;
1186 } 1172 }
1187 } 1173 }
1188 return false; 1174 return false;
@@ -1233,23 +1219,19 @@ static bool view_runtime(void)
1233 /* Wait for a key to be pushed */ 1219 /* Wait for a key to be pushed */
1234 key = button_get_w_tmo(HZ); 1220 key = button_get_w_tmo(HZ);
1235 switch(key) { 1221 switch(key) {
1236#if defined(HAVE_PLAYER_KEYPAD) || defined(HAVE_NEO_KEYPAD) || defined(HAVE_ONDIO_KEYPAD) 1222 case SETTINGS_CANCEL:
1237 case BUTTON_STOP | BUTTON_REL:
1238#elif HAVE_RECORDER_KEYPAD
1239 case BUTTON_OFF | BUTTON_REL:
1240#endif
1241 done = true; 1223 done = true;
1242 break; 1224 break;
1243 1225
1244 case BUTTON_LEFT: 1226 case SETTINGS_INC:
1245 case BUTTON_RIGHT: 1227 case SETTINGS_DEC:
1246 if (state == 1) 1228 if (state == 1)
1247 state = 2; 1229 state = 2;
1248 else 1230 else
1249 state = 1; 1231 state = 1;
1250 break; 1232 break;
1251 1233
1252 case BUTTON_PLAY: 1234 case SETTINGS_OK:
1253 lcd_clear_display(); 1235 lcd_clear_display();
1254 lcd_puts(0,0,"Clear time?"); 1236 lcd_puts(0,0,"Clear time?");
1255 lcd_puts(0,1,"PLAY = Yes"); 1237 lcd_puts(0,1,"PLAY = Yes");
@@ -1258,7 +1240,7 @@ static bool view_runtime(void)
1258 key = button_get_w_tmo(HZ*10); 1240 key = button_get_w_tmo(HZ*10);
1259 if ( key & BUTTON_REL ) 1241 if ( key & BUTTON_REL )
1260 continue; 1242 continue;
1261 if ( key == BUTTON_PLAY ) { 1243 if ( key == SETTINGS_OK ) {
1262 if ( state == 1 ) 1244 if ( state == 1 )
1263 global_settings.runtime = 0; 1245 global_settings.runtime = 0;
1264 else 1246 else
@@ -1412,25 +1394,21 @@ static bool dbg_disk_info(void)
1412 /* Wait for a key to be pushed */ 1394 /* Wait for a key to be pushed */
1413 key = button_get_w_tmo(HZ*5); 1395 key = button_get_w_tmo(HZ*5);
1414 switch(key) { 1396 switch(key) {
1415#if defined(HAVE_PLAYER_KEYPAD) || defined(HAVE_NEO_KEYPAD) || defined(HAVE_ONDIO_KEYPAD) 1397 case SETTINGS_CANCEL:
1416 case BUTTON_STOP | BUTTON_REL:
1417#else
1418 case BUTTON_OFF | BUTTON_REL:
1419#endif
1420 done = true; 1398 done = true;
1421 break; 1399 break;
1422 1400
1423 case BUTTON_LEFT: 1401 case SETTINGS_DEC:
1424 if (--page < 0) 1402 if (--page < 0)
1425 page = max_page; 1403 page = max_page;
1426 break; 1404 break;
1427 1405
1428 case BUTTON_RIGHT: 1406 case SETTINGS_INC:
1429 if (++page > max_page) 1407 if (++page > max_page)
1430 page = 0; 1408 page = 0;
1431 break; 1409 break;
1432 1410
1433 case BUTTON_PLAY: 1411 case SETTINGS_OK:
1434 if (page == 3) { 1412 if (page == 3) {
1435 mpeg_stop(); /* stop playback, to avoid disk access */ 1413 mpeg_stop(); /* stop playback, to avoid disk access */
1436 lcd_clear_display(); 1414 lcd_clear_display();
@@ -1498,11 +1476,7 @@ bool dbg_fm_radio(void)
1498 1476
1499 switch(button) 1477 switch(button)
1500 { 1478 {
1501#ifdef HAVE_RECORDER_KEYPAD 1479 case SETTINGS_CANCEL:
1502 case BUTTON_OFF:
1503#else
1504 case BUTTON_STOP:
1505#endif
1506 return false; 1480 return false;
1507 } 1481 }
1508 } 1482 }
diff --git a/apps/main.c b/apps/main.c
index 54d3955f4d..70dc9e2fed 100644
--- a/apps/main.c
+++ b/apps/main.c
@@ -169,7 +169,7 @@ void init(void)
169 lcd_puts(0, 1, str); 169 lcd_puts(0, 1, str);
170 lcd_puts(0, 3, "Press ON to debug"); 170 lcd_puts(0, 3, "Press ON to debug");
171 lcd_update(); 171 lcd_update();
172 while(button_get(true) != BUTTON_ON); 172 while(!(button_get(true) & BUTTON_REL));
173 dbg_ports(); 173 dbg_ports();
174#endif 174#endif
175 panicf("ata: %d", rc); 175 panicf("ata: %d", rc);
diff --git a/apps/main_menu.c b/apps/main_menu.c
index 1d2978e65e..da3d8ad5c1 100644
--- a/apps/main_menu.c
+++ b/apps/main_menu.c
@@ -231,24 +231,19 @@ bool show_info(void)
231 /* Wait for a key to be pushed */ 231 /* Wait for a key to be pushed */
232 key = button_get_w_tmo(HZ*5); 232 key = button_get_w_tmo(HZ*5);
233 switch(key) { 233 switch(key) {
234#if defined(HAVE_PLAYER_KEYPAD) || defined(HAVE_NEO_KEYPAD) || defined(HAVE_ONDIO_KEYPAD) 234 case SETTINGS_OK:
235 case BUTTON_STOP | BUTTON_REL: 235 case SETTINGS_CANCEL:
236#else
237 case BUTTON_LEFT | BUTTON_REL:
238 case BUTTON_OFF | BUTTON_REL:
239#endif
240 done = true; 236 done = true;
241 break; 237 break;
242 238
243#if defined(HAVE_RECORDER_KEYPAD) || defined(HAVE_ONDIO_KEYPAD) 239 case SETTINGS_INC:
244 case BUTTON_LEFT: 240 case SETTINGS_DEC:
245 case BUTTON_RIGHT:
246 if (state == 1) 241 if (state == 1)
247 state = 2; 242 state = 2;
248 else 243 else
249 state = 1; 244 state = 1;
250 break; 245 break;
251#endif 246
252 default: 247 default:
253 if(default_event_handler(key) == SYS_USB_CONNECTED) 248 if(default_event_handler(key) == SYS_USB_CONNECTED)
254 return true; 249 return true;
diff --git a/apps/menu.c b/apps/menu.c
index fccc88479b..e999c5f774 100644
--- a/apps/menu.c
+++ b/apps/menu.c
@@ -288,11 +288,17 @@ int menu_show(int m)
288 } 288 }
289 289
290 menu_lines = height / fh; 290 menu_lines = height / fh;
291#else
292 int menu_lines = MENU_LINES;
291#endif 293#endif
292 294
293 /* Put the cursor on the first line and draw the menu */ 295 /* Put the cursor on the first line and draw the menu */
294 put_cursor(m, menus[m].cursor); 296 put_cursor(m, menus[m].cursor);
295 297
298 /* wait until all keys are released */
299 while (button_get(false) != BUTTON_NONE)
300 yield();
301
296 while (!exit) { 302 while (!exit) {
297 key = button_get_w_tmo(HZ/2); 303 key = button_get_w_tmo(HZ/2);
298 304
@@ -308,25 +314,15 @@ int menu_show(int m)
308 key = menus[m].callback(key, m); 314 key = menus[m].callback(key, m);
309 315
310 switch( key ) { 316 switch( key ) {
311 317 case MENU_PREV:
312#ifdef HAVE_RECORDER_KEYPAD 318 case MENU_PREV | BUTTON_REPEAT:
313 case BUTTON_UP:
314 case BUTTON_UP | BUTTON_REPEAT:
315#else
316 case BUTTON_LEFT:
317 case BUTTON_LEFT | BUTTON_REPEAT:
318#endif
319 if (menus[m].cursor) { 319 if (menus[m].cursor) {
320 /* move up */ 320 /* move up */
321 put_cursor(m, menus[m].cursor-1); 321 put_cursor(m, menus[m].cursor-1);
322 } 322 }
323 else { 323 else {
324 /* move to bottom */ 324 /* move to bottom */
325#ifdef HAVE_RECORDER_KEYPAD
326 menus[m].top = menus[m].itemcount-(menu_lines+1); 325 menus[m].top = menus[m].itemcount-(menu_lines+1);
327#else
328 menus[m].top = menus[m].itemcount-3;
329#endif
330 if (menus[m].top < 0) 326 if (menus[m].top < 0)
331 menus[m].top = 0; 327 menus[m].top = 0;
332 menus[m].cursor = menus[m].itemcount-1; 328 menus[m].cursor = menus[m].itemcount-1;
@@ -334,13 +330,8 @@ int menu_show(int m)
334 } 330 }
335 break; 331 break;
336 332
337#ifdef HAVE_RECORDER_KEYPAD 333 case MENU_NEXT:
338 case BUTTON_DOWN: 334 case MENU_NEXT | BUTTON_REPEAT:
339 case BUTTON_DOWN | BUTTON_REPEAT:
340#else
341 case BUTTON_RIGHT:
342 case BUTTON_RIGHT | BUTTON_REPEAT:
343#endif
344 if (menus[m].cursor < menus[m].itemcount-1) { 335 if (menus[m].cursor < menus[m].itemcount-1) {
345 /* move down */ 336 /* move down */
346 put_cursor(m, menus[m].cursor+1); 337 put_cursor(m, menus[m].cursor+1);
@@ -353,22 +344,23 @@ int menu_show(int m)
353 } 344 }
354 break; 345 break;
355 346
356#ifdef HAVE_RECORDER_KEYPAD 347 case MENU_ENTER:
357 case BUTTON_RIGHT: 348#ifdef MENU_ENTER2
349 case MENU_ENTER2:
358#endif 350#endif
359 case BUTTON_PLAY:
360 /* Erase current display state */ 351 /* Erase current display state */
361 lcd_clear_display(); 352 lcd_clear_display();
362 return menus[m].cursor; 353 return menus[m].cursor;
363 354
364#ifdef HAVE_RECORDER_KEYPAD 355 case MENU_EXIT:
365 case BUTTON_LEFT: 356 case MENU_EXIT | BUTTON_REPEAT:
366 case BUTTON_F1: 357#ifdef MENU_EXIT2
367 case BUTTON_OFF | BUTTON_REPEAT: 358 case MENU_EXIT2:
368#else 359 case MENU_EXIT2 | BUTTON_REPEAT:
369 case BUTTON_STOP: 360#endif
370 case BUTTON_MENU: 361#ifdef MENU_EXIT3
371 case BUTTON_STOP | BUTTON_REPEAT: 362 case MENU_EXIT3:
363 case MENU_EXIT3 | BUTTON_REPEAT:
372#endif 364#endif
373 lcd_stop_scroll(); 365 lcd_stop_scroll();
374 exit = true; 366 exit = true;
@@ -388,18 +380,21 @@ int menu_show(int m)
388 380
389bool menu_run(int m) 381bool menu_run(int m)
390{ 382{
391 bool stop=false; 383 while (1) {
392 while (!stop) { 384 switch (menu_show(m))
393 int result=menu_show(m); 385 {
394 if (result == MENU_SELECTED_EXIT) 386 case MENU_SELECTED_EXIT:
395 return false; 387 return false;
396 else if (result == MENU_ATTACHED_USB) 388
397 return true; 389 case MENU_ATTACHED_USB:
398 if (menus[m].items[menus[m].cursor].function()) { 390 return true;
399 return true; 391
392 default:
393 if (menus[m].items[menus[m].cursor].function())
394 return true;
395 }
400 } 396 }
401 } 397 return false;
402 return false;
403} 398}
404 399
405/* 400/*
diff --git a/apps/menu.h b/apps/menu.h
index 12d934fc18..99ef3443ba 100644
--- a/apps/menu.h
+++ b/apps/menu.h
@@ -22,6 +22,32 @@
22 22
23#include <stdbool.h> 23#include <stdbool.h>
24 24
25/* button definitions */
26#ifdef HAVE_RECORDER_KEYPAD
27#define MENU_NEXT BUTTON_DOWN
28#define MENU_PREV BUTTON_UP
29#define MENU_EXIT (BUTTON_LEFT | BUTTON_REL)
30#define MENU_EXIT2 (BUTTON_OFF | BUTTON_REL)
31#define MENU_EXIT3 (BUTTON_F1 | BUTTON_REL)
32#define MENU_ENTER (BUTTON_RIGHT | BUTTON_REL)
33#define MENU_ENTER2 (BUTTON_PLAY | BUTTON_REL)
34
35#elif defined HAVE_PLAYER_KEYPAD
36#define MENU_NEXT BUTTON_RIGHT
37#define MENU_PREV BUTTON_LEFT
38#define MENU_EXIT (BUTTON_STOP | BUTTON_REL)
39#define MENU_EXIT2 (BUTTON_MENU | BUTTON_REL)
40#define MENU_ENTER (BUTTON_PLAY | BUTTON_REL)
41
42#elif defined HAVE_ONDIO_KEYPAD
43#define MENU_NEXT BUTTON_DOWN
44#define MENU_PREV BUTTON_UP
45#define MENU_EXIT (BUTTON_LEFT | BUTTON_REL)
46#define MENU_EXIT2 (BUTTON_MENU | BUTTON_REL)
47#define MENU_ENTER (BUTTON_RIGHT | BUTTON_REL)
48
49#endif
50
25struct menu_item { 51struct menu_item {
26 unsigned char *desc; /* string or ID */ 52 unsigned char *desc; /* string or ID */
27 bool (*function) (void); /* return true if USB was connected */ 53 bool (*function) (void); /* return true if USB was connected */
diff --git a/apps/misc.c b/apps/misc.c
index fc84386d56..ced0668ae6 100644
--- a/apps/misc.c
+++ b/apps/misc.c
@@ -16,6 +16,7 @@
16 * KIND, either express or implied. 16 * KIND, either express or implied.
17 * 17 *
18 ****************************************************************************/ 18 ****************************************************************************/
19#include <stdlib.h>
19#include <ctype.h> 20#include <ctype.h>
20#include "lang.h" 21#include "lang.h"
21#include "string.h" 22#include "string.h"
@@ -206,7 +207,9 @@ bool settings_parseline(char* line, char** name, char** value)
206 207
207bool clean_shutdown(void) 208bool clean_shutdown(void)
208{ 209{
209#ifndef SIMULATOR 210#ifdef SIMULATOR
211 exit(0);
212#else
210 if(!charger_inserted()) 213 if(!charger_inserted())
211 { 214 {
212 lcd_clear_display(); 215 lcd_clear_display();
diff --git a/apps/onplay.c b/apps/onplay.c
index 5ef595a774..41e8d2d192 100644
--- a/apps/onplay.c
+++ b/apps/onplay.c
@@ -116,21 +116,22 @@ static bool add_to_playlist(int position, bool queue)
116 while (!exit) { 116 while (!exit) {
117 int btn = button_get(true); 117 int btn = button_get(true);
118 switch (btn) { 118 switch (btn) {
119 case BUTTON_PLAY: 119 case SETTINGS_OK:
120 recurse = true; 120 recurse = true;
121 exit = true;
122 break;
123 default:
124 /* ignore button releases */
125 if (!(btn & BUTTON_REL))
126 exit = true; 121 exit = true;
127 break; 122 break;
123
124 default:
125 /* ignore button releases */
126 if (!(btn & BUTTON_REL))
127 exit = true;
128 break;
128 } 129 }
129 } 130 }
130 } 131 }
131 132
132 playlist_insert_directory(NULL, selected_file, position, queue, 133 playlist_insert_directory(NULL, selected_file, position, queue,
133 recurse); 134 recurse);
134 } 135 }
135 else if ((selected_file_attr & TREE_ATTR_MASK) == TREE_ATTR_M3U) 136 else if ((selected_file_attr & TREE_ATTR_MASK) == TREE_ATTR_M3U)
136 playlist_insert_playlist(NULL, selected_file, position, queue); 137 playlist_insert_playlist(NULL, selected_file, position, queue);
@@ -303,34 +304,34 @@ static bool delete_handler(bool is_dir)
303 while (!exit) { 304 while (!exit) {
304 int btn = button_get(true); 305 int btn = button_get(true);
305 switch (btn) { 306 switch (btn) {
306 case BUTTON_PLAY: 307 case SETTINGS_OK:
307 if (is_dir) 308 if (is_dir)
308 { 309 {
309 char pathname[MAX_PATH]; /* space to go deep */ 310 char pathname[MAX_PATH]; /* space to go deep */
310 strncpy(pathname, selected_file, sizeof pathname); 311 strncpy(pathname, selected_file, sizeof pathname);
311 res = remove_dir(pathname, sizeof(pathname)); 312 res = remove_dir(pathname, sizeof(pathname));
312 } 313 }
313 else 314 else
314 { 315 {
315 res = remove(selected_file); 316 res = remove(selected_file);
316 } 317 }
317 318
318 if (!res) { 319 if (!res) {
319 onplay_result = ONPLAY_RELOAD_DIR; 320 onplay_result = ONPLAY_RELOAD_DIR;
320 lcd_clear_display(); 321 lcd_clear_display();
321 lcd_puts(0,0,str(LANG_DELETED)); 322 lcd_puts(0,0,str(LANG_DELETED));
322 lcd_puts_scroll(0,1,selected_file); 323 lcd_puts_scroll(0,1,selected_file);
323 lcd_update(); 324 lcd_update();
324 sleep(HZ); 325 sleep(HZ);
325 exit = true; 326 exit = true;
326 } 327 }
327 break; 328 break;
328 329
329 default: 330 default:
330 /* ignore button releases */ 331 /* ignore button releases */
331 if (!(btn & BUTTON_REL)) 332 if (!(btn & BUTTON_REL))
332 exit = true; 333 exit = true;
333 break; 334 break;
334 } 335 }
335 } 336 }
336 return false; 337 return false;
diff --git a/apps/player/keyboard.c b/apps/player/keyboard.c
index 495102b29a..7752ce3ff7 100644
--- a/apps/player/keyboard.c
+++ b/apps/player/keyboard.c
@@ -181,14 +181,15 @@ int kbd_input(char* text, int buflen)
181 case MENU_LINE_INPUT: 181 case MENU_LINE_INPUT:
182 switch (button_pressed) 182 switch (button_pressed)
183 { 183 {
184 case BUTTON_UP: 184 case BUTTON_PLAY:
185 case BUTTON_UP | BUTTON_REPEAT: 185 case BUTTON_PLAY | BUTTON_REPEAT:
186 if (cursor_pos<len) 186 if (cursor_pos<len)
187 cursor_pos++; 187 cursor_pos++;
188 button_pressed=BUTTON_NONE; 188 button_pressed=BUTTON_NONE;
189 break; 189 break;
190 case BUTTON_DOWN: 190
191 case BUTTON_DOWN | BUTTON_REPEAT: 191 case BUTTON_STOP:
192 case BUTTON_STOP | BUTTON_REPEAT:
192 if (cursor_pos>0) 193 if (cursor_pos>0)
193 cursor_pos--; 194 cursor_pos--;
194 button_pressed=BUTTON_NONE; 195 button_pressed=BUTTON_NONE;
@@ -199,13 +200,13 @@ int kbd_input(char* text, int buflen)
199 case MENU_LINE_NEWCHARS: 200 case MENU_LINE_NEWCHARS:
200 switch (button_pressed) 201 switch (button_pressed)
201 { 202 {
202 case BUTTON_UP: 203 case BUTTON_PLAY:
203 case BUTTON_UP | BUTTON_REPEAT: 204 case BUTTON_PLAY | BUTTON_REPEAT:
204 x=(x+1+linelen)%linelen; 205 x=(x+1+linelen)%linelen;
205 button_pressed=BUTTON_NONE; 206 button_pressed=BUTTON_NONE;
206 break; 207 break;
207 case BUTTON_DOWN: 208 case BUTTON_STOP:
208 case BUTTON_DOWN | BUTTON_REPEAT: 209 case BUTTON_STOP | BUTTON_REPEAT:
209 x=(x-1+linelen)%linelen; 210 x=(x-1+linelen)%linelen;
210 button_pressed=BUTTON_NONE; 211 button_pressed=BUTTON_NONE;
211 break; 212 break;
diff --git a/apps/playlist.c b/apps/playlist.c
index 5725c4be85..ecdb45c104 100644
--- a/apps/playlist.c
+++ b/apps/playlist.c
@@ -564,11 +564,7 @@ static int add_directory_to_playlist(struct playlist_info* playlist,
564 for (i=0; i<num_files; i++) 564 for (i=0; i<num_files; i++)
565 { 565 {
566 /* user abort */ 566 /* user abort */
567#if defined(HAVE_PLAYER_KEYPAD) || defined(HAVE_NEO_KEYPAD) || defined(HAVE_ONDIO_KEYPAD) 567 if (button_get(false) == SETTINGS_CANCEL)
568 if (button_get(false) == BUTTON_STOP)
569#else
570 if (button_get(false) == BUTTON_OFF)
571#endif
572 { 568 {
573 result = -1; 569 result = -1;
574 break; 570 break;
@@ -2016,11 +2012,7 @@ int playlist_insert_playlist(struct playlist_info* playlist, char *filename,
2016 while ((max = read_line(fd, temp_buf, sizeof(temp_buf))) > 0) 2012 while ((max = read_line(fd, temp_buf, sizeof(temp_buf))) > 0)
2017 { 2013 {
2018 /* user abort */ 2014 /* user abort */
2019#if defined(HAVE_PLAYER_KEYPAD) || defined(HAVE_NEO_KEYPAD) || defined(HAVE_ONDIO_KEYPAD) 2015 if (button_get(false) == SETTINGS_CANCEL)
2020 if (button_get(false) == BUTTON_STOP)
2021#else
2022 if (button_get(false) == BUTTON_OFF)
2023#endif
2024 break; 2016 break;
2025 2017
2026 if (temp_buf[0] != '#' && temp_buf[0] != '\0') 2018 if (temp_buf[0] != '#' && temp_buf[0] != '\0')
@@ -2384,11 +2376,7 @@ int playlist_save(struct playlist_info* playlist, char *filename)
2384 int seek; 2376 int seek;
2385 2377
2386 /* user abort */ 2378 /* user abort */
2387#if defined(HAVE_PLAYER_KEYPAD) || defined(HAVE_NEO_KEYPAD) || defined(HAVE_ONDIO_KEYPAD) 2379 if (button_get(false) == SETTINGS_CANCEL)
2388 if (button_get(false) == BUTTON_STOP)
2389#else
2390 if (button_get(false) == BUTTON_OFF)
2391#endif
2392 break; 2380 break;
2393 2381
2394 control_file = playlist->indices[index] & PLAYLIST_INSERT_TYPE_MASK; 2382 control_file = playlist->indices[index] & PLAYLIST_INSERT_TYPE_MASK;
diff --git a/apps/playlist_viewer.c b/apps/playlist_viewer.c
index f093efd172..4268a28c86 100644
--- a/apps/playlist_viewer.c
+++ b/apps/playlist_viewer.c
@@ -130,7 +130,7 @@ static void update_display_line(int line, bool scroll);
130static void scroll_display(int lines); 130static void scroll_display(int lines);
131static void update_first_index(void); 131static void update_first_index(void);
132static bool update_playlist(bool force); 132static bool update_playlist(bool force);
133#ifdef BUTTON_ON 133#ifdef TREE_SHIFT
134static int onplay_menu(int index); 134static int onplay_menu(int index);
135#endif 135#endif
136static bool viewer_menu(void); 136static bool viewer_menu(void);
@@ -672,7 +672,7 @@ static bool update_playlist(bool force)
672 return true; 672 return true;
673} 673}
674 674
675#ifdef BUTTON_ON 675#ifdef TREE_SHIFT
676/* Menu of playlist commands. Invoked via ON+PLAY on main viewer screen. 676/* Menu of playlist commands. Invoked via ON+PLAY on main viewer screen.
677 Returns -1 if USB attached, 0 if no playlist change, and 1 if playlist 677 Returns -1 if USB attached, 0 if no playlist change, and 1 if playlist
678 changed. */ 678 changed. */
@@ -902,67 +902,37 @@ bool playlist_viewer_ex(char* filename)
902 902
903 switch (button) 903 switch (button)
904 { 904 {
905#ifdef HAVE_RECORDER_KEYPAD 905 case TREE_EXIT:
906 case BUTTON_OFF:
907 case BUTTON_LEFT:
908#else
909 case BUTTON_STOP:
910#endif
911 exit = true; 906 exit = true;
912 break; 907 break;
913 908
914#ifdef HAVE_RECORDER_KEYPAD 909 case TREE_PREV:
915 case BUTTON_UP: 910 case TREE_PREV | BUTTON_REPEAT:
916 case BUTTON_UP | BUTTON_REPEAT:
917#else
918 case BUTTON_LEFT:
919 case BUTTON_LEFT | BUTTON_REPEAT:
920#endif
921 scroll_display(-1); 911 scroll_display(-1);
922 update = true; 912 update = true;
923 break; 913 break;
924 914
925#ifdef HAVE_RECORDER_KEYPAD 915 case TREE_NEXT:
926 case BUTTON_DOWN: 916 case TREE_NEXT | BUTTON_REPEAT:
927 case BUTTON_DOWN | BUTTON_REPEAT:
928#else
929 case BUTTON_RIGHT:
930 case BUTTON_RIGHT | BUTTON_REPEAT:
931#endif
932 scroll_display(1); 917 scroll_display(1);
933 update = true; 918 update = true;
934 break; 919 break;
935 920
936#ifdef BUTTON_ON 921 case TREE_SHIFT | TREE_PREV:
937#ifdef HAVE_RECORDER_KEYPAD 922 case TREE_SHIFT | TREE_PREV | BUTTON_REPEAT:
938 case BUTTON_ON | BUTTON_UP:
939 case BUTTON_ON | BUTTON_UP | BUTTON_REPEAT:
940#else
941 case BUTTON_ON | BUTTON_LEFT:
942 case BUTTON_ON | BUTTON_LEFT | BUTTON_REPEAT:
943#endif
944 /* Pageup */ 923 /* Pageup */
945 scroll_display(-viewer.num_display_lines); 924 scroll_display(-viewer.num_display_lines);
946 update = true; 925 update = true;
947 break; 926 break;
948 927
949#ifdef HAVE_RECORDER_KEYPAD 928 case TREE_SHIFT | TREE_NEXT:
950 case BUTTON_ON | BUTTON_DOWN: 929 case TREE_SHIFT | TREE_NEXT | BUTTON_REPEAT:
951 case BUTTON_ON | BUTTON_DOWN | BUTTON_REPEAT:
952#else
953 case BUTTON_ON | BUTTON_RIGHT:
954 case BUTTON_ON | BUTTON_RIGHT | BUTTON_REPEAT:
955#endif
956 /* Pagedown */ 930 /* Pagedown */
957 scroll_display(viewer.num_display_lines); 931 scroll_display(viewer.num_display_lines);
958 update = true; 932 update = true;
959 break; 933 break;
960#endif /* BUTTON_ON */ 934
961 935 case TREE_RUN:
962#ifdef HAVE_RECORDER_KEYPAD
963 case BUTTON_RIGHT:
964#endif
965 case BUTTON_PLAY:
966 if (viewer.move_track >= 0) 936 if (viewer.move_track >= 0)
967 { 937 {
968 /* Move track */ 938 /* Move track */
@@ -1003,8 +973,7 @@ bool playlist_viewer_ex(char* filename)
1003 update = true; 973 update = true;
1004 break; 974 break;
1005 975
1006#ifdef BUTTON_ON 976 case TREE_SHIFT | TREE_RUN:
1007 case BUTTON_ON | BUTTON_PLAY:
1008 { 977 {
1009 /* ON+PLAY menu */ 978 /* ON+PLAY menu */
1010 int ret; 979 int ret;
@@ -1030,12 +999,8 @@ bool playlist_viewer_ex(char* filename)
1030 update = true; 999 update = true;
1031 break; 1000 break;
1032 } 1001 }
1033#endif /* BUTTON_ON */ 1002
1034#ifdef HAVE_RECORDER_KEYPAD 1003 case TREE_MENU:
1035 case BUTTON_F1:
1036#else
1037 case BUTTON_MENU:
1038#endif
1039 if (viewer_menu()) 1004 if (viewer_menu())
1040 { 1005 {
1041 ret = true; 1006 ret = true;
diff --git a/apps/plugins/calendar.c b/apps/plugins/calendar.c
index f3ee8d82db..b501115618 100644
--- a/apps/plugins/calendar.c
+++ b/apps/plugins/calendar.c
@@ -71,6 +71,8 @@ static void calendar_init(struct today *today, struct shown *shown)
71 int w,h; 71 int w,h;
72#ifdef HAVE_RTC 72#ifdef HAVE_RTC
73 struct tm *tm; 73 struct tm *tm;
74#else
75 (void)today;
74#endif 76#endif
75 rb->lcd_getstringsize("A",&w,&h); 77 rb->lcd_getstringsize("A",&w,&h);
76 if ( ((w * 14) > LCD_WIDTH) || ((h * 7) > LCD_HEIGHT) ) 78 if ( ((w * 14) > LCD_WIDTH) || ((h * 7) > LCD_HEIGHT) )
diff --git a/apps/recorder/keyboard.c b/apps/recorder/keyboard.c
index 1c9ba7bed4..c1bd25e0aa 100644
--- a/apps/recorder/keyboard.c
+++ b/apps/recorder/keyboard.c
@@ -33,6 +33,7 @@
33#define KEYBOARD_LINES 4 33#define KEYBOARD_LINES 4
34#define KEYBOARD_PAGES 3 34#define KEYBOARD_PAGES 3
35 35
36#ifdef HAVE_RECORDER_KEYPAD
36static void kbd_setupkeys(const char* line[KEYBOARD_LINES], int page) 37static void kbd_setupkeys(const char* line[KEYBOARD_LINES], int page)
37{ 38{
38 switch (page) { 39 switch (page) {
@@ -58,6 +59,7 @@ static void kbd_setupkeys(const char* line[KEYBOARD_LINES], int page)
58 break; 59 break;
59 } 60 }
60} 61}
62#endif
61 63
62/* helper function to spell a char if voice UI is enabled */ 64/* helper function to spell a char if voice UI is enabled */
63void kbd_spellchar(char c) 65void kbd_spellchar(char c)
@@ -75,6 +77,12 @@ void kbd_spellchar(char c)
75 77
76int kbd_input(char* text, int buflen) 78int kbd_input(char* text, int buflen)
77{ 79{
80#ifndef HAVE_RECORDER_KEYPAD
81 (void)text;
82 (void)buflen;
83 splash(HZ*2, true, "Keyboard not implemented yet");
84 return 0;
85#else
78 bool done = false; 86 bool done = false;
79 int page = 0; 87 int page = 0;
80 88
@@ -240,7 +248,6 @@ int kbd_input(char* text, int buflen)
240 kbd_spellchar(line[y][x]); 248 kbd_spellchar(line[y][x]);
241 break; 249 break;
242 250
243#if (BUTTON_UP != BUTTON_PLAY) /* FixMe, this is just to make the Ondio compile */
244 case BUTTON_UP: 251 case BUTTON_UP:
245 case BUTTON_UP | BUTTON_REPEAT: 252 case BUTTON_UP | BUTTON_REPEAT:
246 if (y) 253 if (y)
@@ -249,7 +256,7 @@ int kbd_input(char* text, int buflen)
249 y = KEYBOARD_LINES - 1; 256 y = KEYBOARD_LINES - 1;
250 kbd_spellchar(line[y][x]); 257 kbd_spellchar(line[y][x]);
251 break; 258 break;
252#endif 259
253 case BUTTON_F3: 260 case BUTTON_F3:
254 case BUTTON_F3 | BUTTON_REPEAT: 261 case BUTTON_F3 | BUTTON_REPEAT:
255 /* backspace */ 262 /* backspace */
@@ -326,5 +333,7 @@ int kbd_input(char* text, int buflen)
326 } 333 }
327 } 334 }
328 lcd_setfont(FONT_UI); 335 lcd_setfont(FONT_UI);
336
329 return 0; 337 return 0;
338#endif /* ONDIO */
330} 339}
diff --git a/apps/recorder/radio.c b/apps/recorder/radio.c
index 6b056dfe31..c163cc4552 100644
--- a/apps/recorder/radio.c
+++ b/apps/recorder/radio.c
@@ -167,6 +167,10 @@ static void remember_frequency(void)
167 167
168bool radio_screen(void) 168bool radio_screen(void)
169{ 169{
170#ifndef HAVE_RECORDER_KEYPAD
171 splash(HZ*2, true, "Radio not supported yet");
172 return false;
173#else
170 char buf[MAX_PATH]; 174 char buf[MAX_PATH];
171 bool done = false; 175 bool done = false;
172 int button; 176 int button;
@@ -554,6 +558,7 @@ bool radio_screen(void)
554 } 558 }
555#endif 559#endif
556 return have_recorded; 560 return have_recorded;
561#endif /* ONDIO */
557} 562}
558 563
559void radio_save_presets(void) 564void radio_save_presets(void)
@@ -663,12 +668,14 @@ static bool radio_add_preset(void)
663static int handle_radio_presets_menu_cb(int key, int m) 668static int handle_radio_presets_menu_cb(int key, int m)
664{ 669{
665 (void)m; 670 (void)m;
671#ifdef HAVE_RECORDER_KEYPAD
666 switch(key) 672 switch(key)
667 { 673 {
668 case BUTTON_F3: 674 case BUTTON_F3:
669 key = BUTTON_LEFT; /* Fake an exit */ 675 key = BUTTON_LEFT; /* Fake an exit */
670 break; 676 break;
671 } 677 }
678#endif
672 return key; 679 return key;
673} 680}
674 681
@@ -725,6 +732,11 @@ bool handle_radio_presets_menu(void)
725 732
726int handle_radio_presets_cb(int key, int m) 733int handle_radio_presets_cb(int key, int m)
727{ 734{
735#ifdef HAVE_ONDIO_KEYPAD
736 (void)key;
737 (void)m;
738 return BUTTON_NONE;
739#else
728 bool ret; 740 bool ret;
729 741
730 switch(key) 742 switch(key)
@@ -750,6 +762,7 @@ int handle_radio_presets_cb(int key, int m)
750 break; 762 break;
751 } 763 }
752 return key; 764 return key;
765#endif
753} 766}
754 767
755bool handle_radio_presets(void) 768bool handle_radio_presets(void)
diff --git a/apps/recorder/recording.c b/apps/recorder/recording.c
index 392f20d9ed..2c39c367b8 100644
--- a/apps/recorder/recording.c
+++ b/apps/recorder/recording.c
@@ -166,6 +166,10 @@ int rec_create_directory(void)
166 166
167bool recording_screen(void) 167bool recording_screen(void)
168{ 168{
169#ifndef HAVE_RECORDING_KEYPAD
170 splash(HZ*2, true, "Recording not supported yet");
171 return false;
172#else
169 int button; 173 int button;
170 bool done = false; 174 bool done = false;
171 char buf[32]; 175 char buf[32];
@@ -280,13 +284,12 @@ bool recording_screen(void)
280 } 284 }
281 break; 285 break;
282 286
283#if (BUTTON_UP != BUTTON_PLAY) /* FixMe, this is just to make the Ondio compile */
284 case BUTTON_UP: 287 case BUTTON_UP:
285 cursor--; 288 cursor--;
286 adjust_cursor(); 289 adjust_cursor();
287 update_countdown = 1; /* Update immediately */ 290 update_countdown = 1; /* Update immediately */
288 break; 291 break;
289#endif 292
290 case BUTTON_DOWN: 293 case BUTTON_DOWN:
291 cursor++; 294 cursor++;
292 adjust_cursor(); 295 adjust_cursor();
@@ -619,8 +622,10 @@ bool recording_screen(void)
619 reload_directory(); 622 reload_directory();
620 623
621 return been_in_usb_mode; 624 return been_in_usb_mode;
625#endif
622} 626}
623 627
628#ifdef HAVE_RECORDER_KEYPAD
624bool f2_rec_screen(void) 629bool f2_rec_screen(void)
625{ 630{
626 bool exit = false; 631 bool exit = false;
@@ -813,3 +818,4 @@ bool f3_rec_screen(void)
813 818
814 return false; 819 return false;
815} 820}
821#endif
diff --git a/apps/screens.c b/apps/screens.c
index ebb7981bd1..b0d95e0a7a 100644
--- a/apps/screens.c
+++ b/apps/screens.c
@@ -40,6 +40,7 @@
40#include "action.h" 40#include "action.h"
41#include "talk.h" 41#include "talk.h"
42#include "misc.h" 42#include "misc.h"
43#include "id3.h"
43 44
44#ifdef HAVE_LCD_BITMAP 45#ifdef HAVE_LCD_BITMAP
45#define BMPHEIGHT_usb_logo 32 46#define BMPHEIGHT_usb_logo 32
@@ -240,7 +241,7 @@ int charging_screen(void)
240{ 241{
241 int button; 242 int button;
242 int rc = 0; 243 int rc = 0;
243#ifdef HAVE_RECORDER_KEYPAD 244#ifdef BUTTON_OFF
244 const int offbutton = BUTTON_OFF; 245 const int offbutton = BUTTON_OFF;
245#else 246#else
246 const int offbutton = BUTTON_STOP; 247 const int offbutton = BUTTON_STOP;
@@ -263,7 +264,11 @@ int charging_screen(void)
263 status_draw(false); 264 status_draw(false);
264 charging_display_info(true); 265 charging_display_info(true);
265 button = button_get_w_tmo(HZ/3); 266 button = button_get_w_tmo(HZ/3);
267#ifdef BUTTON_ON
266 if (button == (BUTTON_ON | BUTTON_REL)) 268 if (button == (BUTTON_ON | BUTTON_REL))
269#else
270 if (button == (BUTTON_RIGHT | BUTTON_REL))
271#endif
267 rc = 3; 272 rc = 3;
268 else if (button == offbutton) 273 else if (button == offbutton)
269 rc = 2; 274 rc = 2;
@@ -286,7 +291,7 @@ int charging_screen(void)
286 0 if no key was pressed 291 0 if no key was pressed
287 1 if a key was pressed (or if ON was held down long enough to repeat) 292 1 if a key was pressed (or if ON was held down long enough to repeat)
288 2 if USB was connected */ 293 2 if USB was connected */
289int on_screen(void) 294int pitch_screen(void)
290{ 295{
291 int button; 296 int button;
292 static int pitch = 1000; 297 static int pitch = 1000;
@@ -1082,15 +1087,19 @@ bool set_time_screen(const char* string, struct tm *tm)
1082 *valptr = min; 1087 *valptr = min;
1083 say_time(cursorpos, tm); 1088 say_time(cursorpos, tm);
1084 break; 1089 break;
1090
1091#ifdef BUTTON_ON
1085 case BUTTON_ON: 1092 case BUTTON_ON:
1093#elif defined BUTTON_MENU
1094 case BUTTON_MENU:
1095#endif
1086 done = true; 1096 done = true;
1087 break; 1097 break;
1088#if (BUTTON_ON != BUTTON_OFF) /* FixMe, this is just to make the Ondio compile */ 1098
1089 case BUTTON_OFF: 1099 case BUTTON_OFF:
1090 done = true; 1100 done = true;
1091 tm->tm_year = -1; 1101 tm->tm_year = -1;
1092 break; 1102 break;
1093#endif
1094 1103
1095 default: 1104 default:
1096 if (default_event_handler(button) == SYS_USB_CONNECTED) 1105 if (default_event_handler(button) == SYS_USB_CONNECTED)
@@ -1140,3 +1149,143 @@ bool shutdown_screen(void)
1140 return false; 1149 return false;
1141} 1150}
1142#endif 1151#endif
1152
1153bool browse_id3(void)
1154{
1155 struct mp3entry* id3 = mpeg_current_track();
1156 int button;
1157 int menu_pos = 0;
1158 int menu_max = 8;
1159 bool exit = false;
1160 char scroll_text[MAX_PATH];
1161
1162 if (!(mpeg_status() & MPEG_STATUS_PLAY))
1163 return false;
1164
1165 while (!exit)
1166 {
1167 lcd_clear_display();
1168
1169 switch (menu_pos)
1170 {
1171 case 0:
1172 lcd_puts(0, 0, str(LANG_ID3_TITLE));
1173 lcd_puts_scroll(0, 1, id3->title ? id3->title :
1174 (char*)str(LANG_ID3_NO_TITLE));
1175 break;
1176
1177 case 1:
1178 lcd_puts(0, 0, str(LANG_ID3_ARTIST));
1179 lcd_puts_scroll(0, 1,
1180 id3->artist ? id3->artist :
1181 (char*)str(LANG_ID3_NO_ARTIST));
1182 break;
1183
1184 case 2:
1185 lcd_puts(0, 0, str(LANG_ID3_ALBUM));
1186 lcd_puts_scroll(0, 1, id3->album ? id3->album :
1187 (char*)str(LANG_ID3_NO_ALBUM));
1188 break;
1189
1190 case 3:
1191 lcd_puts(0, 0, str(LANG_ID3_TRACKNUM));
1192
1193 if (id3->tracknum) {
1194 snprintf(scroll_text,sizeof(scroll_text), "%d",
1195 id3->tracknum);
1196 lcd_puts_scroll(0, 1, scroll_text);
1197 }
1198 else
1199 lcd_puts_scroll(0, 1, str(LANG_ID3_NO_TRACKNUM));
1200 break;
1201
1202 case 4:
1203 lcd_puts(0, 0, str(LANG_ID3_GENRE));
1204 lcd_puts_scroll(0, 1,
1205 id3_get_genre(id3) ?
1206 id3_get_genre(id3) :
1207 (char*)str(LANG_ID3_NO_INFO));
1208 break;
1209
1210 case 5:
1211 lcd_puts(0, 0, str(LANG_ID3_YEAR));
1212 if (id3->year) {
1213 snprintf(scroll_text,sizeof(scroll_text), "%d",
1214 id3->year);
1215 lcd_puts_scroll(0, 1, scroll_text);
1216 }
1217 else
1218 lcd_puts_scroll(0, 1, str(LANG_ID3_NO_INFO));
1219 break;
1220
1221 case 6:
1222 lcd_puts(0, 0, str(LANG_ID3_LENGHT));
1223 snprintf(scroll_text,sizeof(scroll_text), "%d:%02d",
1224 id3->length / 60000,
1225 id3->length % 60000 / 1000 );
1226 lcd_puts(0, 1, scroll_text);
1227 break;
1228
1229 case 7:
1230 lcd_puts(0, 0, str(LANG_ID3_PLAYLIST));
1231 snprintf(scroll_text,sizeof(scroll_text), "%d/%d",
1232 playlist_get_display_index(), playlist_amount());
1233 lcd_puts_scroll(0, 1, scroll_text);
1234 break;
1235
1236
1237 case 8:
1238 lcd_puts(0, 0, str(LANG_ID3_BITRATE));
1239 snprintf(scroll_text,sizeof(scroll_text), "%d kbps",
1240 id3->bitrate);
1241 lcd_puts(0, 1, scroll_text);
1242 break;
1243
1244 case 9:
1245 lcd_puts(0, 0, str(LANG_ID3_FRECUENCY));
1246 snprintf(scroll_text,sizeof(scroll_text), "%d Hz",
1247 id3->frequency);
1248 lcd_puts(0, 1, scroll_text);
1249 break;
1250
1251 case 10:
1252 lcd_puts(0, 0, str(LANG_ID3_PATH));
1253 lcd_puts_scroll(0, 1, id3->path);
1254 break;
1255 }
1256 lcd_update();
1257
1258 button = button_get(true);
1259
1260 switch(button)
1261 {
1262 case SETTINGS_DEC:
1263 if (menu_pos > 0)
1264 menu_pos--;
1265 else
1266 menu_pos = menu_max;
1267 break;
1268
1269 case SETTINGS_INC:
1270 if (menu_pos < menu_max)
1271 menu_pos++;
1272 else
1273 menu_pos = 0;
1274 break;
1275
1276 case SETTINGS_CANCEL:
1277 lcd_stop_scroll();
1278 /* eat release event */
1279 button_get(true);
1280 exit = true;
1281 break;
1282
1283 default:
1284 if(default_event_handler(button) == SYS_USB_CONNECTED)
1285 return true;
1286 break;
1287 }
1288 }
1289 return false;
1290}
1291
diff --git a/apps/screens.h b/apps/screens.h
index a119a9b853..9f15ff3228 100644
--- a/apps/screens.h
+++ b/apps/screens.h
@@ -27,7 +27,7 @@ int charging_screen(void);
27void charging_splash(void); 27void charging_splash(void);
28 28
29#ifdef HAVE_RECORDER_KEYPAD 29#ifdef HAVE_RECORDER_KEYPAD
30int on_screen(void); 30int pitch_screen(void);
31bool quick_screen(const int, const int); 31bool quick_screen(const int, const int);
32#endif 32#endif
33 33
@@ -42,6 +42,7 @@ bool set_time_screen(const char* string, struct tm *tm);
42#endif 42#endif
43 43
44bool shutdown_screen(void); 44bool shutdown_screen(void);
45bool browse_id3(void);
45 46
46#endif 47#endif
47 48
diff --git a/apps/settings.c b/apps/settings.c
index ccb7703ab2..708a38b678 100644
--- a/apps/settings.c
+++ b/apps/settings.c
@@ -70,6 +70,7 @@ struct user_settings global_settings;
70const char rec_base_directory[] = REC_BASE_DIR; 70const char rec_base_directory[] = REC_BASE_DIR;
71 71
72 72
73
73#define CONFIG_BLOCK_VERSION 16 74#define CONFIG_BLOCK_VERSION 16
74#define CONFIG_BLOCK_SIZE 512 75#define CONFIG_BLOCK_SIZE 512
75#define RTC_BLOCK_SIZE 44 76#define RTC_BLOCK_SIZE 44
@@ -1319,40 +1320,26 @@ bool set_int(const char* string,
1319 1320
1320 button = button_get_w_tmo(HZ/2); 1321 button = button_get_w_tmo(HZ/2);
1321 switch(button) { 1322 switch(button) {
1322#ifdef HAVE_RECORDER_KEYPAD 1323 case SETTINGS_INC:
1323 case BUTTON_UP: 1324 case SETTINGS_INC | BUTTON_REPEAT:
1324 case BUTTON_UP | BUTTON_REPEAT:
1325#else
1326 case BUTTON_RIGHT:
1327 case BUTTON_RIGHT | BUTTON_REPEAT:
1328#endif
1329 *variable += step; 1325 *variable += step;
1330 break; 1326 break;
1331 1327
1332#ifdef HAVE_RECORDER_KEYPAD 1328 case SETTINGS_DEC:
1333 case BUTTON_DOWN: 1329 case SETTINGS_DEC | BUTTON_REPEAT:
1334 case BUTTON_DOWN | BUTTON_REPEAT:
1335#else
1336 case BUTTON_LEFT:
1337 case BUTTON_LEFT | BUTTON_REPEAT:
1338#endif
1339 *variable -= step; 1330 *variable -= step;
1340 break; 1331 break;
1341 1332
1342#ifdef HAVE_RECORDER_KEYPAD 1333 case SETTINGS_OK:
1343 case BUTTON_LEFT: 1334#ifdef SETTINGS_OK2
1344 case BUTTON_PLAY: 1335 case SETTINGS_OK2:
1345#else
1346 case BUTTON_PLAY:
1347#endif 1336#endif
1348 done = true; 1337 done = true;
1349 break; 1338 break;
1350 1339
1351#ifdef HAVE_RECORDER_KEYPAD 1340 case SETTINGS_CANCEL:
1352 case BUTTON_OFF: 1341#ifdef SETTINGS_CANCEL2
1353#else 1342 case SETTINGS_CANCEL2:
1354 case BUTTON_STOP:
1355 case BUTTON_MENU:
1356#endif 1343#endif
1357 if (*variable != org_value) { 1344 if (*variable != org_value) {
1358 *variable=org_value; 1345 *variable=org_value;
@@ -1431,13 +1418,8 @@ bool set_option(const char* string, void* variable, enum optiontype type,
1431 1418
1432 button = button_get_w_tmo(HZ/2); 1419 button = button_get_w_tmo(HZ/2);
1433 switch (button) { 1420 switch (button) {
1434#ifdef HAVE_RECORDER_KEYPAD 1421 case SETTINGS_INC:
1435 case BUTTON_UP: 1422 case SETTINGS_INC | BUTTON_REPEAT:
1436 case BUTTON_UP | BUTTON_REPEAT:
1437#else
1438 case BUTTON_RIGHT:
1439 case BUTTON_RIGHT | BUTTON_REPEAT:
1440#endif
1441 if (type == INT) { 1423 if (type == INT) {
1442 if ( *intvar < (numoptions-1) ) 1424 if ( *intvar < (numoptions-1) )
1443 (*intvar)++; 1425 (*intvar)++;
@@ -1448,13 +1430,8 @@ bool set_option(const char* string, void* variable, enum optiontype type,
1448 *boolvar = !*boolvar; 1430 *boolvar = !*boolvar;
1449 break; 1431 break;
1450 1432
1451#ifdef HAVE_RECORDER_KEYPAD 1433 case SETTINGS_DEC:
1452 case BUTTON_DOWN: 1434 case SETTINGS_DEC | BUTTON_REPEAT:
1453 case BUTTON_DOWN | BUTTON_REPEAT:
1454#else
1455 case BUTTON_LEFT:
1456 case BUTTON_LEFT | BUTTON_REPEAT:
1457#endif
1458 if (type == INT) { 1435 if (type == INT) {
1459 if ( *intvar > 0 ) 1436 if ( *intvar > 0 )
1460 (*intvar)--; 1437 (*intvar)--;
@@ -1465,20 +1442,16 @@ bool set_option(const char* string, void* variable, enum optiontype type,
1465 *boolvar = !*boolvar; 1442 *boolvar = !*boolvar;
1466 break; 1443 break;
1467 1444
1468#ifdef HAVE_RECORDER_KEYPAD 1445 case SETTINGS_OK:
1469 case BUTTON_LEFT: 1446#ifdef SETTINGS_OK2
1470 case BUTTON_PLAY: 1447 case SETTINGS_OK2:
1471#else
1472 case BUTTON_PLAY:
1473#endif 1448#endif
1474 done = true; 1449 done = true;
1475 break; 1450 break;
1476 1451
1477#ifdef HAVE_RECORDER_KEYPAD 1452 case SETTINGS_CANCEL:
1478 case BUTTON_OFF: 1453#ifdef SETTINGS_CANCEL2
1479#else 1454 case SETTINGS_CANCEL2:
1480 case BUTTON_STOP:
1481 case BUTTON_MENU:
1482#endif 1455#endif
1483 if (((type==INT) && (*intvar != oldval)) || 1456 if (((type==INT) && (*intvar != oldval)) ||
1484 ((type==BOOL) && (*boolvar != (bool)oldval))) { 1457 ((type==BOOL) && (*boolvar != (bool)oldval))) {
diff --git a/apps/settings.h b/apps/settings.h
index 331e8dc904..0af466c5f7 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -33,6 +33,31 @@
33 33
34#define MAX_FILENAME 20 34#define MAX_FILENAME 20
35 35
36/* button definitions */
37#ifdef HAVE_RECORDER_KEYPAD
38#define SETTINGS_INC BUTTON_UP
39#define SETTINGS_DEC BUTTON_DOWN
40#define SETTINGS_OK (BUTTON_PLAY|BUTTON_REL)
41#define SETTINGS_OK2 (BUTTON_LEFT|BUTTON_REL)
42#define SETTINGS_CANCEL (BUTTON_OFF|BUTTON_REL)
43#define SETTINGS_CANCEL2 (BUTTON_F1|BUTTON_REL)
44
45#elif defined HAVE_PLAYER_KEYPAD
46#define SETTINGS_INC BUTTON_RIGHT
47#define SETTINGS_DEC BUTTON_LEFT
48#define SETTINGS_OK (BUTTON_PLAY|BUTTON_REL)
49#define SETTINGS_CANCEL (BUTTON_STOP|BUTTON_REL)
50#define SETTINGS_CANCEL2 (BUTTON_MENU|BUTTON_REL)
51
52#elif defined HAVE_ONDIO_KEYPAD
53#define SETTINGS_INC BUTTON_UP
54#define SETTINGS_DEC BUTTON_DOWN
55#define SETTINGS_OK (BUTTON_RIGHT|BUTTON_REL)
56#define SETTINGS_OK2 (BUTTON_LEFT|BUTTON_REL)
57#define SETTINGS_CANCEL (BUTTON_MENU|BUTTON_REL)
58
59#endif
60
36/* data structures */ 61/* data structures */
37 62
38#define RESUME_OFF 0 63#define RESUME_OFF 0
diff --git a/apps/settings_menu.c b/apps/settings_menu.c
index 4d2e2f9a44..9e95fe9d9a 100644
--- a/apps/settings_menu.c
+++ b/apps/settings_menu.c
@@ -1066,27 +1066,23 @@ static bool reset_settings(void)
1066 while(!done) { 1066 while(!done) {
1067 button = button_get(true); 1067 button = button_get(true);
1068 switch(button) { 1068 switch(button) {
1069 case BUTTON_PLAY: 1069 case SETTINGS_OK:
1070 settings_reset(); 1070 settings_reset();
1071 settings_apply(); 1071 settings_apply();
1072 lcd_clear_display(); 1072 lcd_clear_display();
1073 lcd_puts(0,1,str(LANG_RESET_DONE_CLEAR)); 1073 lcd_puts(0,1,str(LANG_RESET_DONE_CLEAR));
1074 done = true; 1074 done = true;
1075 break; 1075 break;
1076 1076
1077#ifdef HAVE_RECORDER_KEYPAD 1077 case SETTINGS_CANCEL:
1078 case BUTTON_OFF: 1078 lcd_clear_display();
1079#else 1079 lcd_puts(0,1,str(LANG_RESET_DONE_CANCEL));
1080 case BUTTON_STOP: 1080 done = true;
1081#endif 1081 break;
1082 lcd_clear_display(); 1082
1083 lcd_puts(0,1,str(LANG_RESET_DONE_CANCEL)); 1083 default:
1084 done = true; 1084 if(default_event_handler(button) == SYS_USB_CONNECTED)
1085 break; 1085 return true;
1086
1087 default:
1088 if(default_event_handler(button) == SYS_USB_CONNECTED)
1089 return true;
1090 } 1086 }
1091 } 1087 }
1092 1088
diff --git a/apps/sleeptimer.c b/apps/sleeptimer.c
index 4fc7515ac0..55599bf7b3 100644
--- a/apps/sleeptimer.c
+++ b/apps/sleeptimer.c
@@ -69,68 +69,50 @@ bool sleeptimer_screen(void)
69 button = button_get_w_tmo(HZ); 69 button = button_get_w_tmo(HZ);
70 switch(button) 70 switch(button)
71 { 71 {
72#ifdef HAVE_RECORDER_KEYPAD 72 case SETTINGS_OK:
73 case BUTTON_LEFT: 73 done = true;
74 case BUTTON_PLAY: 74 break;
75#else 75
76 case BUTTON_PLAY: 76 case SETTINGS_CANCEL:
77#endif 77 if (changed) {
78 done = true; 78 lcd_stop_scroll();
79 break; 79 lcd_puts(0, 0, str(LANG_MENU_SETTING_CANCEL));
80 80 lcd_update();
81#ifdef HAVE_RECORDER_KEYPAD 81 set_sleep_timer(org_timer);
82 case BUTTON_OFF: 82 sleep(HZ/2);
83#else 83 }
84 case BUTTON_STOP: 84 done = true;
85 case BUTTON_MENU: 85 break;
86#endif 86
87 if (changed) { 87 case SETTINGS_INC:
88 lcd_stop_scroll(); 88 oldtime = (get_sleep_timer()+59) / 60;
89 lcd_puts(0, 0, str(LANG_MENU_SETTING_CANCEL)); 89 if(oldtime < THRESHOLD)
90 lcd_update(); 90 amount = SMALL_STEP_SIZE;
91 set_sleep_timer(org_timer); 91 else
92 sleep(HZ/2); 92 amount = LARGE_STEP_SIZE;
93 }
94 done = true;
95 break;
96
97#if defined(HAVE_PLAYER_KEYPAD) || defined(HAVE_NEO_KEYPAD) || defined(HAVE_ONDIO_KEYPAD)
98 case BUTTON_RIGHT:
99#else
100 case BUTTON_UP:
101#endif
102 oldtime = (get_sleep_timer()+59) / 60;
103 if(oldtime < THRESHOLD)
104 amount = SMALL_STEP_SIZE;
105 else
106 amount = LARGE_STEP_SIZE;
107 93
108 newtime = oldtime * 60 + amount; 94 newtime = oldtime * 60 + amount;
109 if(newtime > MAX_TIME) 95 if(newtime > MAX_TIME)
110 newtime = MAX_TIME; 96 newtime = MAX_TIME;
111 97
112 changed = sayit = true; 98 changed = sayit = true;
113 set_sleep_timer(newtime); 99 set_sleep_timer(newtime);
114 break; 100 break;
115 101
116#if defined(HAVE_PLAYER_KEYPAD) || defined(HAVE_ONDIO_KEYPAD) 102 case SETTINGS_DEC:
117 case BUTTON_LEFT: 103 oldtime = (get_sleep_timer()+59) / 60;
118#else 104 if(oldtime <= THRESHOLD)
119 case BUTTON_DOWN: 105 amount = SMALL_STEP_SIZE;
120#endif 106 else
121 oldtime = (get_sleep_timer()+59) / 60; 107 amount = LARGE_STEP_SIZE;
122 if(oldtime <= THRESHOLD)
123 amount = SMALL_STEP_SIZE;
124 else
125 amount = LARGE_STEP_SIZE;
126 108
127 newtime = oldtime*60 - amount; 109 newtime = oldtime*60 - amount;
128 if(newtime < 0) 110 if(newtime < 0)
129 newtime = 0; 111 newtime = 0;
130 112
131 changed = sayit = true; 113 changed = sayit = true;
132 set_sleep_timer(newtime); 114 set_sleep_timer(newtime);
133 break; 115 break;
134 } 116 }
135 117
136 seconds = get_sleep_timer(); 118 seconds = get_sleep_timer();
diff --git a/apps/sound_menu.c b/apps/sound_menu.c
index a037c94084..fdb2043171 100644
--- a/apps/sound_menu.c
+++ b/apps/sound_menu.c
@@ -103,38 +103,29 @@ bool set_sound(const char* string,
103 changed = false; 103 changed = false;
104 button = button_get_w_tmo(HZ/2); 104 button = button_get_w_tmo(HZ/2);
105 switch( button ) { 105 switch( button ) {
106#ifdef HAVE_RECORDER_KEYPAD 106 case SETTINGS_INC:
107 case BUTTON_UP: 107 case SETTINGS_INC | BUTTON_REPEAT:
108 case BUTTON_UP | BUTTON_REPEAT:
109#else
110 case BUTTON_RIGHT:
111 case BUTTON_RIGHT | BUTTON_REPEAT:
112#endif
113 (*variable)+=steps; 108 (*variable)+=steps;
114 if(*variable > max ) 109 if(*variable > max )
115 *variable = max; 110 *variable = max;
116 changed = true; 111 changed = true;
117 break; 112 break;
118 113
119#ifdef HAVE_RECORDER_KEYPAD 114 case SETTINGS_DEC:
120 case BUTTON_DOWN: 115 case SETTINGS_DEC | BUTTON_REPEAT:
121 case BUTTON_DOWN | BUTTON_REPEAT:
122#else
123 case BUTTON_LEFT:
124 case BUTTON_LEFT | BUTTON_REPEAT:
125#endif
126 (*variable)-=steps; 116 (*variable)-=steps;
127 if(*variable < min ) 117 if(*variable < min )
128 *variable = min; 118 *variable = min;
129 changed = true; 119 changed = true;
130 break; 120 break;
131 121
132#ifdef HAVE_RECORDER_KEYPAD 122 case SETTINGS_OK:
133 case BUTTON_LEFT: 123 case SETTINGS_CANCEL:
134#else 124#ifdef SETTINGS_OK2
135 case BUTTON_STOP: 125 case SETTINGS_OK2:
136 case BUTTON_MENU: 126#endif
137 case BUTTON_PLAY: 127#ifdef SETTINGS_CANCEL2
128 case SETTINGS_CANCEL2:
138#endif 129#endif
139 done = true; 130 done = true;
140 break; 131 break;
diff --git a/apps/tree.c b/apps/tree.c
index 90d7010d03..a83346b8d2 100644
--- a/apps/tree.c
+++ b/apps/tree.c
@@ -194,20 +194,6 @@ void tree_get_filetypes(const struct filetype** types, int* count)
194 194
195#endif /* HAVE_LCD_BITMAP */ 195#endif /* HAVE_LCD_BITMAP */
196 196
197#ifdef HAVE_RECORDER_KEYPAD
198#define TREE_NEXT BUTTON_DOWN
199#define TREE_PREV BUTTON_UP
200#define TREE_EXIT BUTTON_LEFT
201#define TREE_ENTER BUTTON_RIGHT
202#define TREE_MENU BUTTON_F1
203#else
204#define TREE_NEXT BUTTON_RIGHT
205#define TREE_PREV BUTTON_LEFT
206#define TREE_EXIT BUTTON_STOP
207#define TREE_ENTER BUTTON_PLAY
208#define TREE_MENU BUTTON_MENU
209#endif /* HAVE_RECORDER_KEYPAD */
210
211/* talkbox hovering delay, to avoid immediate disk activity */ 197/* talkbox hovering delay, to avoid immediate disk activity */
212#define HOVER_DELAY (HZ/2) 198#define HOVER_DELAY (HZ/2)
213 199
@@ -641,9 +627,9 @@ static bool ask_resume(bool ask_once)
641 while (!stop) { 627 while (!stop) {
642 button = button_get(true); 628 button = button_get(true);
643 switch (button) { 629 switch (button) {
644 case BUTTON_PLAY: 630 case TREE_RUN:
645#ifdef BUTTON_RC_PLAY 631#ifdef TREE_RC_RUN
646 case BUTTON_RC_PLAY: 632 case TREE_RC_RUN:
647#endif 633#endif
648 return true; 634 return true;
649 635
@@ -771,9 +757,10 @@ void set_current_file(char *path)
771 } 757 }
772} 758}
773 759
774#ifdef BUTTON_ON 760#ifdef TREE_SHIFT
775static bool handle_on(int *ds, int *dc, int numentries, int tree_max_on_screen, 761static bool handle_shift(int *ds, int *dc, int numentries,
776 const int *dirfilter) 762 int tree_max_on_screen,
763 const int *dirfilter)
777{ 764{
778 bool exit = false; 765 bool exit = false;
779 bool used = false; 766 bool used = false;
@@ -790,12 +777,12 @@ static bool handle_on(int *ds, int *dc, int numentries, int tree_max_on_screen,
790 while (!exit) { 777 while (!exit) {
791 switch (button_get(true)) { 778 switch (button_get(true)) {
792 case TREE_PREV: 779 case TREE_PREV:
793#ifdef BUTTON_RC_LEFT 780#ifdef TREE_RC_PREV
794 case BUTTON_RC_LEFT: 781 case TREE_RC_PREV:
795#endif 782#endif
796#ifdef BUTTON_ON 783#ifdef TREE_SHIFT
797 case BUTTON_ON | TREE_PREV: 784 case TREE_SHIFT | TREE_PREV:
798 case BUTTON_ON | TREE_PREV | BUTTON_REPEAT: 785 case TREE_SHIFT | TREE_PREV | BUTTON_REPEAT:
799#endif 786#endif
800 used = true; 787 used = true;
801 if ( dirstart ) { 788 if ( dirstart ) {
@@ -808,12 +795,12 @@ static bool handle_on(int *ds, int *dc, int numentries, int tree_max_on_screen,
808 break; 795 break;
809 796
810 case TREE_NEXT: 797 case TREE_NEXT:
811#ifdef BUTTON_RC_RIGHT 798#ifdef TREE_RC_NEXT
812 case BUTTON_RC_RIGHT: 799 case TREE_RC_NEXT:
813#endif 800#endif
814#ifdef BUTTON_ON 801#ifdef TREE_SHIFT
815 case BUTTON_ON | TREE_NEXT: 802 case TREE_SHIFT | TREE_NEXT:
816 case BUTTON_ON | TREE_NEXT | BUTTON_REPEAT: 803 case TREE_SHIFT | TREE_NEXT | BUTTON_REPEAT:
817#endif 804#endif
818 used = true; 805 used = true;
819 if ( dirstart < numentries - tree_max_on_screen ) { 806 if ( dirstart < numentries - tree_max_on_screen ) {
@@ -827,12 +814,12 @@ static bool handle_on(int *ds, int *dc, int numentries, int tree_max_on_screen,
827 break; 814 break;
828 815
829 816
830 case BUTTON_PLAY: 817 case TREE_RUN:
831#ifdef BUTTON_RC_PLAY 818#ifdef TREE_RC_PLAY
832 case BUTTON_RC_PLAY: 819 case TREE_RC_RUN:
833#endif 820#endif
834#ifdef BUTTON_ON 821#ifdef TREE_SHIFT
835 case BUTTON_ON | BUTTON_PLAY: 822 case TREE_SHIFT | TREE_RUN:
836#endif 823#endif
837 { 824 {
838 int onplay_result; 825 int onplay_result;
@@ -866,10 +853,10 @@ static bool handle_on(int *ds, int *dc, int numentries, int tree_max_on_screen,
866 exit = true; 853 exit = true;
867 break; 854 break;
868 } 855 }
869#ifdef BUTTON_ON 856#ifdef TREE_SHIFT
870 case BUTTON_ON | BUTTON_REL: 857 case TREE_SHIFT | BUTTON_REL:
871 case BUTTON_ON | TREE_PREV | BUTTON_REL: 858 case TREE_SHIFT | TREE_PREV | BUTTON_REL:
872 case BUTTON_ON | TREE_NEXT | BUTTON_REL: 859 case TREE_SHIFT | TREE_NEXT | BUTTON_REL:
873 exit = true; 860 exit = true;
874 break; 861 break;
875#endif 862#endif
@@ -969,7 +956,7 @@ static bool dirbrowse(const char *root, const int *dirfilter)
969 while (!stop) { 956 while (!stop) {
970 button = button_get(true); 957 button = button_get(true);
971 switch (button) { 958 switch (button) {
972 case BUTTON_PLAY: 959 case TREE_RUN:
973 rolo_load("/" BOOTFILE); 960 rolo_load("/" BOOTFILE);
974 stop = true; 961 stop = true;
975 break; 962 break;
@@ -988,11 +975,9 @@ static bool dirbrowse(const char *root, const int *dirfilter)
988 975
989 switch ( button ) { 976 switch ( button ) {
990 case TREE_EXIT: 977 case TREE_EXIT:
991#ifdef BUTTON_RC_STOP 978 case TREE_EXIT | BUTTON_REPEAT:
992 case BUTTON_RC_STOP: 979#ifdef TREE_RC_EXIT
993#endif 980 case TREE_RC_EXIT:
994#ifdef HAVE_RECORDER_KEYPAD
995 case BUTTON_LEFT | BUTTON_REPEAT:
996#endif 981#endif
997 i=strlen(currdir); 982 i=strlen(currdir);
998 if (i>1) { 983 if (i>1) {
@@ -1027,8 +1012,8 @@ static bool dirbrowse(const char *root, const int *dirfilter)
1027 } 1012 }
1028 break; 1013 break;
1029 1014
1030#ifdef HAVE_RECORDER_KEYPAD 1015#ifdef TREE_OFF
1031 case BUTTON_OFF: 1016 case TREE_OFF:
1032 /* Stop the music if it is playing, else show the shutdown 1017 /* Stop the music if it is playing, else show the shutdown
1033 screen */ 1018 screen */
1034 if(mpeg_status()) 1019 if(mpeg_status())
@@ -1042,27 +1027,23 @@ static bool dirbrowse(const char *root, const int *dirfilter)
1042 restore = true; 1027 restore = true;
1043 } 1028 }
1044 break; 1029 break;
1045#endif
1046 1030
1047#ifdef HAVE_RECORDER_KEYPAD 1031 case TREE_OFF | BUTTON_REPEAT:
1048 case BUTTON_OFF | BUTTON_REPEAT:
1049#else
1050 case BUTTON_STOP | BUTTON_REPEAT:
1051#endif
1052 if (charger_inserted()) { 1032 if (charger_inserted()) {
1053 charging_splash(); 1033 charging_splash();
1054 restore = true; 1034 restore = true;
1055 } 1035 }
1056 break; 1036 break;
1037#endif
1057 1038
1058 case TREE_ENTER: 1039 case TREE_ENTER:
1059 case TREE_ENTER | BUTTON_REPEAT: 1040 case TREE_ENTER | BUTTON_REPEAT:
1060#ifdef BUTTON_RC_PLAY 1041#if defined TREE_RC_ENTER && (TREE_RC_ENTER != TREE_RC_RUN)
1061 case BUTTON_RC_PLAY: 1042 case TREE_RC_ENTER:
1062#endif 1043#endif
1063#ifdef HAVE_RECORDER_KEYPAD 1044#if defined TREE_RUN && (TREE_RUN != TREE_ENTER)
1064 case BUTTON_PLAY: 1045 case TREE_RUN:
1065 case BUTTON_PLAY | BUTTON_REPEAT: 1046 case TREE_RUN | BUTTON_REPEAT:
1066#endif 1047#endif
1067 if ( !numentries ) 1048 if ( !numentries )
1068 break; 1049 break;
@@ -1255,8 +1236,9 @@ static bool dirbrowse(const char *root, const int *dirfilter)
1255 1236
1256 case TREE_PREV: 1237 case TREE_PREV:
1257 case TREE_PREV | BUTTON_REPEAT: 1238 case TREE_PREV | BUTTON_REPEAT:
1258#ifdef BUTTON_RC_LEFT 1239#ifdef TREE_RC_PREV
1259 case BUTTON_RC_LEFT: 1240 case TREE_RC_PREV:
1241 case TREE_RC_PREV | BUTTON_REPEAT:
1260#endif 1242#endif
1261 if(filesindir) { 1243 if(filesindir) {
1262 if(dircursor) { 1244 if(dircursor) {
@@ -1295,8 +1277,9 @@ static bool dirbrowse(const char *root, const int *dirfilter)
1295 1277
1296 case TREE_NEXT: 1278 case TREE_NEXT:
1297 case TREE_NEXT | BUTTON_REPEAT: 1279 case TREE_NEXT | BUTTON_REPEAT:
1298#ifdef BUTTON_RC_RIGHT 1280#ifdef TREE_RC_NEXT
1299 case BUTTON_RC_RIGHT: 1281 case TREE_RC_NEXT:
1282 case TREE_RC_NEXT | BUTTON_REPEAT:
1300#endif 1283#endif
1301 if(filesindir) 1284 if(filesindir)
1302 { 1285 {
@@ -1340,11 +1323,11 @@ static bool dirbrowse(const char *root, const int *dirfilter)
1340 } 1323 }
1341 break; 1324 break;
1342 1325
1343#ifdef BUTTON_ON /* I bet the folks without ON-button want this to 1326#ifdef TREE_SHIFT /* I bet the folks without ON-button want this to
1344 work on a different button */ 1327 work on a different button */
1345 case BUTTON_ON: 1328 case TREE_SHIFT:
1346 if (handle_on(&dirstart, &dircursor, numentries, 1329 if (handle_shift(&dirstart, &dircursor, numentries,
1347 tree_max_on_screen, dirfilter)) 1330 tree_max_on_screen, dirfilter))
1348 { 1331 {
1349 /* start scroll */ 1332 /* start scroll */
1350 restore = true; 1333 restore = true;
diff --git a/apps/tree.h b/apps/tree.h
index dd08ca9392..eb4f0cd00c 100644
--- a/apps/tree.h
+++ b/apps/tree.h
@@ -21,6 +21,48 @@
21 21
22#include <stdbool.h> 22#include <stdbool.h>
23 23
24#ifdef HAVE_RECORDER_KEYPAD
25#define TREE_NEXT BUTTON_DOWN
26#define TREE_PREV BUTTON_UP
27#define TREE_EXIT BUTTON_LEFT
28#define TREE_ENTER BUTTON_RIGHT
29#define TREE_RUN BUTTON_PLAY
30#define TREE_MENU (BUTTON_F1 | BUTTON_REL)
31#define TREE_SHIFT BUTTON_ON
32#define TREE_OFF BUTTON_OFF
33
34#define TREE_RC_NEXT BUTTON_RC_RIGHT
35#define TREE_RC_REV BUTTON_RC_LEFT
36#define TREE_RC_EXIT BUTTON_RC_STOP
37#define TREE_RC_ENTER BUTTON_RC_PLAY
38#define TREE_RC_RUN BUTTON_RC_PLAY
39
40#elif defined HAVE_PLAYER_KEYPAD
41#define TREE_NEXT BUTTON_RIGHT
42#define TREE_PREV BUTTON_LEFT
43#define TREE_EXIT BUTTON_STOP
44#define TREE_ENTER BUTTON_PLAY
45#define TREE_RUN BUTTON_PLAY
46#define TREE_MENU (BUTTON_MENU | BUTTON_REL)
47#define TREE_SHIFT BUTTON_ON
48
49#define TREE_RC_NEXT BUTTON_RC_RIGHT
50#define TREE_RC_REV BUTTON_RC_LEFT
51#define TREE_RC_EXIT BUTTON_RC_STOP
52#define TREE_RC_ENTER BUTTON_RC_PLAY
53#define TREE_RC_RUN BUTTON_RC_PLAY
54
55#elif defined HAVE_ONDIO_KEYPAD
56#define TREE_NEXT BUTTON_DOWN
57#define TREE_PREV BUTTON_UP
58#define TREE_EXIT BUTTON_LEFT
59#define TREE_ENTER BUTTON_RIGHT
60#define TREE_RUN BUTTON_RIGHT
61#define TREE_MENU (BUTTON_MENU | BUTTON_REPEAT)
62#define TREE_SHIFT BUTTON_MENU
63
64#endif
65
24struct entry { 66struct entry {
25 short attr; /* FAT attributes + file type flags */ 67 short attr; /* FAT attributes + file type flags */
26 unsigned long time_write; /* Last write time */ 68 unsigned long time_write; /* Last write time */
diff --git a/apps/wps.c b/apps/wps.c
index 92b4e008b8..49d7d3db36 100644
--- a/apps/wps.c
+++ b/apps/wps.c
@@ -61,63 +61,86 @@ static struct mp3entry* id3 = NULL;
61static struct mp3entry* nid3 = NULL; 61static struct mp3entry* nid3 = NULL;
62static char current_track_path[MAX_PATH+1]; 62static char current_track_path[MAX_PATH+1];
63 63
64#if defined(HAVE_PLAYER_KEYPAD) || defined(HAVE_NEO_KEYPAD) || defined(HAVE_ONDIO_KEYPAD) 64/* button definitions */
65void player_change_volume(int button) 65#ifdef HAVE_RECORDER_KEYPAD
66#define WPS_NEXT (BUTTON_RIGHT | BUTTON_REL)
67#define WPS_PREV (BUTTON_LEFT | BUTTON_REL)
68#define WPS_FFWD (BUTTON_RIGHT | BUTTON_REPEAT)
69#define WPS_REW (BUTTON_LEFT | BUTTON_REPEAT)
70#define WPS_INCVOL BUTTON_UP
71#define WPS_DECVOL BUTTON_DOWN
72#define WPS_PAUSE BUTTON_PLAY
73#define WPS_MENU (BUTTON_F1 | BUTTON_REL)
74#define WPS_MENU_PRE BUTTON_F1
75#define WPS_BROWSE (BUTTON_ON | BUTTON_REL)
76#define WPS_EXIT BUTTON_OFF
77#define WPS_KEYLOCK (BUTTON_F1 | BUTTON_DOWN)
78#define WPS_ID3 (BUTTON_F1 | BUTTON_ON)
79
80#define WPS_RC_NEXT BUTTON_RC_RIGHT
81#define WPS_RC_PREV BUTTON_RC_LEFT
82#define WPS_RC_PAUSE BUTTON_RC_PLAY
83#define WPS_RC_INCVOL BUTTON_RC_VOL_UP
84#define WPS_RC_DECVOL BUTTON_RC_VOL_DOWN
85#define WPS_RC_EXIT BUTTON_RC_STOP
86
87#elif defined HAVE_PLAYER_KEYPAD
88#define WPS_NEXT BUTTON_RIGHT
89#define WPS_PREV BUTTON_LEFT
90#define WPS_FFWD (BUTTON_RIGHT | BUTTON_REPEAT)
91#define WPS_REW (BUTTON_LEFT | BUTTON_REPEAT)
92#define WPS_INCVOL (BUTTON_MENU | BUTTON_RIGHT)
93#define WPS_DECVOL (BUTTON_MENU | BUTTON_LEFT)
94#define WPS_PAUSE BUTTON_PLAY
95#define WPS_MENU (BUTTON_MENU | BUTTON_REL)
96#define WPS_MENU_PRE BUTTON_MENU
97#define WPS_BROWSE (BUTTON_ON | BUTTON_REL)
98#define WPS_EXIT BUTTON_STOP
99#define WPS_KEYLOCK (BUTTON_MENU | BUTTON_STOP)
100#define WPS_ID3 (BUTTON_MENU | BUTTON_ON)
101
102#define WPS_RC_NEXT BUTTON_RC_RIGHT
103#define WPS_RC_PREV BUTTON_RC_LEFT
104#define WPS_RC_PAUSE BUTTON_RC_PLAY
105#define WPS_RC_INCVOL BUTTON_RC_VOL_UP
106#define WPS_RC_DECVOL BUTTON_RC_VOL_DOWN
107#define WPS_RC_EXIT BUTTON_RC_STOP
108
109#elif defined HAVE_ONDIO_KEYPAD
110#define WPS_NEXT (BUTTON_RIGHT | BUTTON_REL)
111#define WPS_PREV (BUTTON_LEFT | BUTTON_REL)
112#define WPS_FFWD (BUTTON_RIGHT | BUTTON_REPEAT)
113#define WPS_REW (BUTTON_LEFT | BUTTON_REPEAT)
114#define WPS_INCVOL BUTTON_UP
115#define WPS_DECVOL BUTTON_DOWN
116#define WPS_PAUSE BUTTON_OFF
117#define WPS_MENU (BUTTON_MENU | BUTTON_REPEAT)
118#define WPS_BROWSE (BUTTON_MENU | BUTTON_REL)
119#define WPS_KEYLOCK (BUTTON_MENU | BUTTON_DOWN)
120
121#endif
122
123/* set volume
124 return true if screen restore is needed
125 return false otherwise
126*/
127static bool setvol(void)
66{ 128{
67 bool exit = false; 129 if (global_settings.volume < mpeg_sound_min(SOUND_VOLUME))
68 char buffer[32]; 130 global_settings.volume = mpeg_sound_min(SOUND_VOLUME);
69 131 mpeg_sound_set(SOUND_VOLUME, global_settings.volume);
70 lcd_stop_scroll(); 132 status_draw(false);
71 while (!exit) 133 wps_refresh(id3, nid3, 0, WPS_REFRESH_NON_STATIC);
72 { 134 settings_save();
73 switch (button)
74 {
75 case BUTTON_MENU | BUTTON_RIGHT:
76 case BUTTON_MENU | BUTTON_RIGHT | BUTTON_REPEAT:
77 global_settings.volume++;
78 if(global_settings.volume > mpeg_sound_max(SOUND_VOLUME))
79 global_settings.volume = mpeg_sound_max(SOUND_VOLUME);
80 mpeg_sound_set(SOUND_VOLUME, global_settings.volume);
81 wps_refresh(id3, nid3, 0, WPS_REFRESH_NON_STATIC);
82 settings_save();
83 break;
84
85 case BUTTON_MENU | BUTTON_LEFT:
86 case BUTTON_MENU | BUTTON_LEFT | BUTTON_REPEAT:
87 global_settings.volume--;
88 if(global_settings.volume < mpeg_sound_min(SOUND_VOLUME))
89 global_settings.volume = mpeg_sound_min(SOUND_VOLUME);
90 mpeg_sound_set(SOUND_VOLUME, global_settings.volume);
91 wps_refresh(id3, nid3, 0, WPS_REFRESH_NON_STATIC);
92 settings_save();
93 break;
94
95 case BUTTON_MENU | BUTTON_REL:
96 case BUTTON_MENU | BUTTON_LEFT | BUTTON_REL:
97 case BUTTON_MENU | BUTTON_RIGHT | BUTTON_REL:
98 exit = true;
99 break;
100 }
101
102 snprintf(buffer,sizeof(buffer),"Vol: %d %% ",
103 mpeg_val2phys(SOUND_VOLUME, global_settings.volume));
104
105#ifdef HAVE_LCD_CHARCELLS 135#ifdef HAVE_LCD_CHARCELLS
106 lcd_puts(0, 0, buffer); 136 splash(0, false, "Vol: %d %% ",
107#else 137 mpeg_val2phys(SOUND_VOLUME, global_settings.volume));
108 lcd_puts(2, 3, buffer); 138 return true;
109 lcd_update();
110#endif 139#endif
111 status_draw(false); 140 return false;
112
113 if (!exit)
114 button = button_get(true);
115 }
116 wps_refresh(id3, nid3, 0, WPS_REFRESH_ALL);
117} 141}
118#endif
119 142
120void display_keylock_text(bool locked) 143static void display_keylock_text(bool locked)
121{ 144{
122 char* s; 145 char* s;
123 lcd_stop_scroll(); 146 lcd_stop_scroll();
@@ -135,176 +158,6 @@ void display_keylock_text(bool locked)
135 splash(HZ, true, s); 158 splash(HZ, true, s);
136} 159}
137 160
138void display_mute_text(bool muted)
139{
140 char *s;
141 lcd_stop_scroll();
142#ifdef HAVE_LCD_CHARCELLS
143 if (muted)
144 s = str(LANG_MUTE_ON_PLAYER);
145 else
146 s = str(LANG_MUTE_OFF_PLAYER);
147#else
148 if (muted)
149 s = str(LANG_MUTE_ON_RECORDER);
150 else
151 s = str(LANG_MUTE_OFF_RECORDER);
152#endif
153 splash(HZ, true, s);
154}
155
156bool browse_id3(void)
157{
158 int button;
159 int menu_pos = 0;
160 int menu_max = 8;
161 bool exit = false;
162 char scroll_text[MAX_PATH];
163
164 if (!(mpeg_status() & MPEG_STATUS_PLAY))
165 return false;
166
167 while (!exit)
168 {
169 lcd_clear_display();
170
171 switch (menu_pos)
172 {
173 case 0:
174 lcd_puts(0, 0, str(LANG_ID3_TITLE));
175 lcd_puts_scroll(0, 1, id3->title ? id3->title :
176 (char*)str(LANG_ID3_NO_TITLE));
177 break;
178
179 case 1:
180 lcd_puts(0, 0, str(LANG_ID3_ARTIST));
181 lcd_puts_scroll(0, 1,
182 id3->artist ? id3->artist :
183 (char*)str(LANG_ID3_NO_ARTIST));
184 break;
185
186 case 2:
187 lcd_puts(0, 0, str(LANG_ID3_ALBUM));
188 lcd_puts_scroll(0, 1, id3->album ? id3->album :
189 (char*)str(LANG_ID3_NO_ALBUM));
190 break;
191
192 case 3:
193 lcd_puts(0, 0, str(LANG_ID3_TRACKNUM));
194
195 if (id3->tracknum) {
196 snprintf(scroll_text,sizeof(scroll_text), "%d",
197 id3->tracknum);
198 lcd_puts_scroll(0, 1, scroll_text);
199 }
200 else
201 lcd_puts_scroll(0, 1, str(LANG_ID3_NO_TRACKNUM));
202 break;
203
204 case 4:
205 lcd_puts(0, 0, str(LANG_ID3_GENRE));
206 lcd_puts_scroll(0, 1,
207 id3_get_genre(id3) ?
208 id3_get_genre(id3) :
209 (char*)str(LANG_ID3_NO_INFO));
210 break;
211
212 case 5:
213 lcd_puts(0, 0, str(LANG_ID3_YEAR));
214 if (id3->year) {
215 snprintf(scroll_text,sizeof(scroll_text), "%d",
216 id3->year);
217 lcd_puts_scroll(0, 1, scroll_text);
218 }
219 else
220 lcd_puts_scroll(0, 1, str(LANG_ID3_NO_INFO));
221 break;
222
223 case 6:
224 lcd_puts(0, 0, str(LANG_ID3_LENGHT));
225 snprintf(scroll_text,sizeof(scroll_text), "%d:%02d",
226 id3->length / 60000,
227 id3->length % 60000 / 1000 );
228 lcd_puts(0, 1, scroll_text);
229 break;
230
231 case 7:
232 lcd_puts(0, 0, str(LANG_ID3_PLAYLIST));
233 snprintf(scroll_text,sizeof(scroll_text), "%d/%d",
234 playlist_get_display_index(), playlist_amount());
235 lcd_puts_scroll(0, 1, scroll_text);
236 break;
237
238
239 case 8:
240 lcd_puts(0, 0, str(LANG_ID3_BITRATE));
241 snprintf(scroll_text,sizeof(scroll_text), "%d kbps",
242 id3->bitrate);
243 lcd_puts(0, 1, scroll_text);
244 break;
245
246 case 9:
247 lcd_puts(0, 0, str(LANG_ID3_FRECUENCY));
248 snprintf(scroll_text,sizeof(scroll_text), "%d Hz",
249 id3->frequency);
250 lcd_puts(0, 1, scroll_text);
251 break;
252
253 case 10:
254 lcd_puts(0, 0, str(LANG_ID3_PATH));
255 lcd_puts_scroll(0, 1, id3->path);
256 break;
257 }
258 lcd_update();
259
260 button = button_get(true);
261
262 switch(button)
263 {
264 case BUTTON_LEFT:
265#ifdef HAVE_RECORDER_KEYPAD
266 case BUTTON_UP:
267#endif
268 if (menu_pos > 0)
269 menu_pos--;
270 else
271 menu_pos = menu_max;
272 break;
273
274 case BUTTON_RIGHT:
275#ifdef HAVE_RECORDER_KEYPAD
276 case BUTTON_DOWN:
277#endif
278 if (menu_pos < menu_max)
279 menu_pos++;
280 else
281 menu_pos = 0;
282 break;
283
284 case BUTTON_REPEAT:
285 break;
286
287#ifdef BUTTON_STOP
288 case BUTTON_STOP:
289#else
290 case BUTTON_OFF:
291#endif
292 case BUTTON_PLAY:
293 lcd_stop_scroll();
294 /* eat release event */
295 button_get(true);
296 exit = true;
297 break;
298
299 default:
300 if(default_event_handler(button) == SYS_USB_CONNECTED)
301 return true;
302 break;
303 }
304 }
305 return false;
306}
307
308static bool ffwd_rew(int button) 161static bool ffwd_rew(int button)
309{ 162{
310 static const int ff_rew_steps[] = { 163 static const int ff_rew_steps[] = {
@@ -324,8 +177,8 @@ static bool ffwd_rew(int button)
324 177
325 while (!exit) { 178 while (!exit) {
326 switch ( button ) { 179 switch ( button ) {
327 case BUTTON_LEFT | BUTTON_REPEAT: 180 case WPS_FFWD:
328 case BUTTON_RIGHT | BUTTON_REPEAT: 181 case WPS_REW:
329 if (ff_rewind) 182 if (ff_rewind)
330 { 183 {
331 if (direction == 1) 184 if (direction == 1)
@@ -367,7 +220,7 @@ static bool ffwd_rew(int button)
367#ifdef HAVE_PLAYER_KEYPAD 220#ifdef HAVE_PLAYER_KEYPAD
368 lcd_stop_scroll(); 221 lcd_stop_scroll();
369#endif 222#endif
370 direction = (button & BUTTON_RIGHT) ? 1 : -1; 223 direction = (button & WPS_FFWD) ? 1 : -1;
371 224
372 if (direction > 0) 225 if (direction > 0)
373 status_set_ffmode(STATUS_FASTFORWARD); 226 status_set_ffmode(STATUS_FASTFORWARD);
@@ -405,8 +258,8 @@ static bool ffwd_rew(int button)
405 258
406 break; 259 break;
407 260
408 case BUTTON_LEFT | BUTTON_REL: 261 case WPS_PREV:
409 case BUTTON_RIGHT | BUTTON_REL: 262 case WPS_NEXT:
410 mpeg_ff_rewind(id3->elapsed+ff_rewind_count); 263 mpeg_ff_rewind(id3->elapsed+ff_rewind_count);
411 ff_rewind_count = 0; 264 ff_rewind_count = 0;
412 ff_rewind = false; 265 ff_rewind = false;
@@ -483,133 +336,6 @@ static bool update(void)
483 return retcode; 336 return retcode;
484} 337}
485 338
486static bool menu(void)
487{
488 static bool muted = false;
489 bool exit = false;
490 int last_button = 0;
491
492#ifdef HAVE_LCD_CHARCELLS
493 status_set_param(true);
494 status_draw(false);
495#endif
496
497 while (!exit) {
498 int button = button_get(true);
499
500 /* these are never locked */
501 switch (button)
502 {
503 /* key lock */
504#ifdef HAVE_RECORDER_KEYPAD
505 case BUTTON_F1 | BUTTON_DOWN:
506#else
507 case BUTTON_MENU | BUTTON_STOP:
508#endif
509 keys_locked = !keys_locked;
510 display_keylock_text(keys_locked);
511 exit = true;
512 while (button_get(false)); /* clear button queue */
513 break;
514
515 default:
516 if(default_event_handler(button) == SYS_USB_CONNECTED) {
517 keys_locked = false;
518 return true;
519 }
520 break;
521 }
522
523 if (keys_locked) {
524 display_keylock_text(true);
525 break;
526 }
527
528 switch ( button ) {
529 /* go into menu */
530#ifdef HAVE_RECORDER_KEYPAD
531 case BUTTON_F1 | BUTTON_REL:
532#else
533 case BUTTON_MENU | BUTTON_REL:
534#endif
535 exit = true;
536 if ( !last_button && !keys_locked ) {
537 lcd_stop_scroll();
538
539 if (main_menu())
540 return true;
541#ifdef HAVE_LCD_BITMAP
542 if(global_settings.statusbar)
543 lcd_setmargins(0, STATUSBAR_HEIGHT);
544 else
545 lcd_setmargins(0, 0);
546#endif
547 }
548 break;
549
550 /* mute */
551#ifdef BUTTON_MENU
552 case BUTTON_MENU | BUTTON_PLAY:
553#else
554 case BUTTON_F1 | BUTTON_PLAY:
555#endif
556 if ( muted )
557 mpeg_sound_set(SOUND_VOLUME, global_settings.volume);
558 else
559 mpeg_sound_set(SOUND_VOLUME, 0);
560 muted = !muted;
561#ifdef HAVE_LCD_CHARCELLS
562 status_set_param(false);
563#endif
564 display_mute_text(muted);
565 break;
566
567#ifdef BUTTON_MENU
568 /* change volume */
569 case BUTTON_MENU | BUTTON_LEFT:
570 case BUTTON_MENU | BUTTON_LEFT | BUTTON_REPEAT:
571 case BUTTON_MENU | BUTTON_RIGHT:
572 case BUTTON_MENU | BUTTON_RIGHT | BUTTON_REPEAT:
573 player_change_volume(button);
574 exit = true;
575 break;
576
577 /* show id3 tags */
578#ifdef BUTTON_ON
579 case BUTTON_MENU | BUTTON_ON:
580#ifdef HAVE_LCD_CHARCELLS
581 status_set_param(true);
582 status_set_audio(true);
583#endif
584#endif
585#else
586 case BUTTON_F1 | BUTTON_ON:
587#endif
588 lcd_clear_display();
589 lcd_puts(0, 0, str(LANG_ID3_INFO));
590 lcd_puts(0, 1, str(LANG_ID3_SCREEN));
591 lcd_update();
592 sleep(HZ);
593
594 if(browse_id3())
595 return true;
596#ifdef HAVE_PLAYER_KEYPAD
597 status_set_param(false);
598 status_set_audio(true);
599#endif
600 exit = true;
601 break;
602 }
603 last_button = button;
604 }
605
606#ifdef HAVE_LCD_CHARCELLS
607 status_set_param(false);
608#endif
609
610 return false;
611}
612
613static void fade(bool fade_in) 339static void fade(bool fade_in)
614{ 340{
615 if (fade_in) { 341 if (fade_in) {
@@ -647,12 +373,20 @@ static void fade(bool fade_in)
647} 373}
648 374
649 375
376static void waitfor_nokey(void)
377{
378 /* wait until all keys are released */
379 while (button_get(false) != BUTTON_NONE)
380 yield();
381}
382
650/* demonstrates showing different formats from playtune */ 383/* demonstrates showing different formats from playtune */
651int wps_show(void) 384int wps_show(void)
652{ 385{
653 int button = 0, lastbutton = 0; 386 int button = 0, lastbutton = 0;
654 bool ignore_keyup = true; 387 bool ignore_keyup = true;
655 bool restore = false; 388 bool restore = false;
389 long restoretimer = 0; /* timer to delay screen redraw temporarily */
656 bool exit = false; 390 bool exit = false;
657 bool update_track = false; 391 bool update_track = false;
658 392
@@ -763,26 +497,22 @@ int wps_show(void)
763 if (button >= 0 && button & BUTTON_REL ) 497 if (button >= 0 && button & BUTTON_REL )
764 continue; 498 continue;
765 } 499 }
766 500
501#ifdef WPS_KEYLOCK
767 /* ignore non-remote buttons when keys are locked */ 502 /* ignore non-remote buttons when keys are locked */
768 if (keys_locked && 503 if (keys_locked &&
769 ! ((button < 0) || 504 ! ((button < 0) ||
770#ifdef HAVE_RECORDER_KEYPAD 505 (button == BUTTON_NONE) ||
771 (button & BUTTON_F1) || 506 ((button & WPS_KEYLOCK) == WPS_KEYLOCK) ||
772#else 507 (button & BUTTON_REMOTE)
773 (button & BUTTON_MENU) || 508 ))
774#endif
775 (button == BUTTON_NONE)
776#ifdef BUTTON_REMOTE
777 || (button & BUTTON_REMOTE)
778#endif
779 ))
780 { 509 {
781 while (button_get(false)); /* clear button queue */ 510 if (!(button & BUTTON_REL))
782 display_keylock_text(true); 511 display_keylock_text(true);
783 restore = true; 512 restore = true;
784 continue; 513 button = BUTTON_NONE;
785 } 514 }
515#endif
786 516
787 /* Exit if mpeg has stopped playing. This can happen if using the 517 /* Exit if mpeg has stopped playing. This can happen if using the
788 sleep timer with the charger plugged or if starting a recording 518 sleep timer with the charger plugged or if starting a recording
@@ -792,49 +522,25 @@ int wps_show(void)
792 522
793 switch(button) 523 switch(button)
794 { 524 {
795#ifdef BUTTON_ON 525 case WPS_BROWSE:
796 case BUTTON_ON:
797#ifdef HAVE_RECORDER_KEYPAD
798 switch (on_screen()) {
799 case 2:
800 /* usb connected? */
801 return SYS_USB_CONNECTED;
802
803 case 1:
804 /* was on_screen used? */
805 restore = true;
806
807 /* pause may have been turned off by pitch screen */
808 if (paused && !(mpeg_status() & MPEG_STATUS_PAUSE)) {
809 paused = false;
810 }
811 break;
812
813 case 0:
814 /* otherwise, exit to browser */
815#else
816#ifdef HAVE_LCD_CHARCELLS 526#ifdef HAVE_LCD_CHARCELLS
817 status_set_record(false); 527 status_set_record(false);
818 status_set_audio(false); 528 status_set_audio(false);
819#endif
820#endif 529#endif
821 lcd_stop_scroll(); 530 lcd_stop_scroll();
822 531
823 /* set dir browser to current playing song */ 532 /* set dir browser to current playing song */
824 if (global_settings.browse_current && 533 if (global_settings.browse_current &&
825 current_track_path[0] != '\0') 534 current_track_path[0] != '\0')
826 set_current_file(current_track_path); 535 set_current_file(current_track_path);
827 536
828 return 0; 537 return 0;
829#ifdef HAVE_RECORDER_KEYPAD
830 }
831 break; 538 break;
832#endif 539
833#endif /* BUTTON_ON */
834 /* play/pause */ 540 /* play/pause */
835 case BUTTON_PLAY: 541 case WPS_PAUSE:
836#ifdef BUTTON_RC_PLAY 542#ifdef WPS_RC_PAUSE
837 case BUTTON_RC_PLAY: 543 case WPS_RC_PAUSE:
838#endif 544#endif
839 if ( paused ) 545 if ( paused )
840 { 546 {
@@ -861,53 +567,50 @@ int wps_show(void)
861 break; 567 break;
862 568
863 /* volume up */ 569 /* volume up */
864#ifdef HAVE_RECORDER_KEYPAD 570 case WPS_INCVOL:
865 case BUTTON_UP: 571 case WPS_INCVOL | BUTTON_REPEAT:
866 case BUTTON_UP | BUTTON_REPEAT: 572#ifdef WPS_RC_INCVOL
867#endif 573 case WPS_RC_INCVOL:
868#ifdef BUTTON_RC_VOL_UP
869 case BUTTON_RC_VOL_UP:
870#endif 574#endif
871 global_settings.volume++; 575 global_settings.volume++;
872 if(global_settings.volume > mpeg_sound_max(SOUND_VOLUME)) 576 if (setvol()) {
873 global_settings.volume = mpeg_sound_max(SOUND_VOLUME); 577 restore = true;
874 mpeg_sound_set(SOUND_VOLUME, global_settings.volume); 578 restoretimer = current_tick + HZ;
875 status_draw(false); 579 }
876 settings_save();
877 break; 580 break;
878 581
879 /* volume down */ 582 /* volume down */
880#ifdef HAVE_RECORDER_KEYPAD 583 case WPS_DECVOL:
881 case BUTTON_DOWN: 584 case WPS_DECVOL | BUTTON_REPEAT:
882 case BUTTON_DOWN | BUTTON_REPEAT: 585#ifdef WPS_RC_DECVOL
883#endif 586 case WPS_RC_DECVOL:
884#ifdef BUTTON_RC_VOL_DOWN
885 case BUTTON_RC_VOL_DOWN:
886#endif 587#endif
887 global_settings.volume--; 588 global_settings.volume--;
888 if(global_settings.volume < mpeg_sound_min(SOUND_VOLUME)) 589 if (setvol()) {
889 global_settings.volume = mpeg_sound_min(SOUND_VOLUME); 590 restore = true;
890 mpeg_sound_set(SOUND_VOLUME, global_settings.volume); 591 restoretimer = current_tick + HZ;
891 status_draw(false); 592 }
892 settings_save();
893 break; 593 break;
894 594
895 /* fast forward / rewind */ 595 /* fast forward / rewind */
896 case BUTTON_LEFT | BUTTON_REPEAT: 596 case WPS_FFWD:
897 case BUTTON_RIGHT | BUTTON_REPEAT: 597 case WPS_REW:
598#ifdef WPS_RC_FFWD
599 case WPS_RC_FFWD:
600 case WPS_RC_RWD:
601#endif
898 ffwd_rew(button); 602 ffwd_rew(button);
899 break; 603 break;
900 604
901 /* prev / restart */ 605 /* prev / restart */
902#ifdef BUTTON_RC_LEFT 606#ifdef WPS_RC_PREV
903 case BUTTON_RC_LEFT: 607 case WPS_RC_PREV:
904#endif 608#endif
905 case BUTTON_LEFT | BUTTON_REL: 609 case WPS_PREV:
906#ifdef HAVE_RECORDER_KEYPAD 610 /* ignore release event after rewind */
907 if ((button == (BUTTON_LEFT | BUTTON_REL)) && 611 if (lastbutton & BUTTON_REPEAT)
908 (lastbutton != BUTTON_LEFT ))
909 break; 612 break;
910#endif 613
911 if (!id3 || (id3->elapsed < 3*1000)) { 614 if (!id3 || (id3->elapsed < 3*1000)) {
912 mpeg_prev(); 615 mpeg_prev();
913 } 616 }
@@ -923,29 +626,43 @@ int wps_show(void)
923 break; 626 break;
924 627
925 /* next */ 628 /* next */
926#ifdef BUTTON_RC_RIGHT 629#ifdef WPS_RC_NEXT
927 case BUTTON_RC_RIGHT: 630 case WPS_RC_NEXT:
928#endif 631#endif
929 case BUTTON_RIGHT | BUTTON_REL: 632 case WPS_NEXT:
930#ifdef HAVE_RECORDER_KEYPAD 633#ifdef HAVE_RECORDER_KEYPAD
931 if ((button == (BUTTON_RIGHT | BUTTON_REL)) && 634 if (lastbutton & BUTTON_REPEAT)
932 (lastbutton != BUTTON_RIGHT)) 635 break;
933 break;
934#endif 636#endif
935 mpeg_next(); 637 mpeg_next();
936 break; 638 break;
937 639
938 /* menu key functions */ 640 /* menu key functions */
939#ifdef BUTTON_MENU 641 case WPS_MENU:
940 case BUTTON_MENU: 642#ifdef WPS_MENU_PRE
941#else 643 if (lastbutton != WPS_MENU_PRE)
942 case BUTTON_F1: 644 break;
943#endif 645#endif
944 if (menu()) 646 lcd_stop_scroll();
945 return SYS_USB_CONNECTED;
946 647
947 update_track = true; 648 if (main_menu())
649 return true;
650#ifdef HAVE_LCD_BITMAP
651 if (global_settings.statusbar)
652 lcd_setmargins(0, STATUSBAR_HEIGHT);
653 else
654 lcd_setmargins(0, 0);
655#endif
656 restore = true;
657 break;
658
659 /* key lock */
660 case WPS_KEYLOCK:
661 case WPS_KEYLOCK | BUTTON_REPEAT:
662 keys_locked = !keys_locked;
663 display_keylock_text(keys_locked);
948 restore = true; 664 restore = true;
665 waitfor_nokey();
949 break; 666 break;
950 667
951#ifdef HAVE_RECORDER_KEYPAD 668#ifdef HAVE_RECORDER_KEYPAD
@@ -962,22 +679,32 @@ int wps_show(void)
962 return SYS_USB_CONNECTED; 679 return SYS_USB_CONNECTED;
963 restore = true; 680 restore = true;
964 break; 681 break;
682
683 /* pitch screen */
684 case BUTTON_ON | BUTTON_REPEAT:
685 if (2 == pitch_screen())
686 return SYS_USB_CONNECTED;
687 restore = true;
688 break;
965#endif 689#endif
966 690
967 /* stop and exit wps */ 691 /* stop and exit wps */
968#ifdef BUTTON_OFF 692#ifdef WPS_EXIT
969 case BUTTON_OFF | BUTTON_REL: 693 case WPS_EXIT:
970#else 694#ifdef WPS_RC_EXIT
971 case BUTTON_STOP | BUTTON_REL: 695 case WPS_RC_EXIT:
972 if ( lastbutton != BUTTON_STOP )
973 break;
974#endif
975#ifdef BUTTON_RC_STOP
976 case BUTTON_RC_STOP:
977#endif 696#endif
978 exit = true; 697 exit = true;
979 break; 698 break;
699#endif
980 700
701#ifdef WPS_ID3
702 case WPS_ID3:
703 browse_id3();
704 restore = true;
705 break;
706#endif
707
981 case BUTTON_NONE: /* Timeout */ 708 case BUTTON_NONE: /* Timeout */
982 update_track = true; 709 update_track = true;
983 break; 710 break;
@@ -1029,8 +756,12 @@ int wps_show(void)
1029 if ( button ) 756 if ( button )
1030 ata_spin(); 757 ata_spin();
1031 758
1032 if (restore) { 759 if (restore &&
760 ((restoretimer == 0) ||
761 (restoretimer < current_tick)))
762 {
1033 restore = false; 763 restore = false;
764 restoretimer = 0;
1034 if (wps_display(id3, nid3)) 765 if (wps_display(id3, nid3))
1035 { 766 {
1036 /* set dir browser to current playing song */ 767 /* set dir browser to current playing song */
@@ -1044,7 +775,7 @@ int wps_show(void)
1044 if (id3) 775 if (id3)
1045 wps_refresh(id3, nid3, 0, WPS_REFRESH_NON_STATIC); 776 wps_refresh(id3, nid3, 0, WPS_REFRESH_NON_STATIC);
1046 } 777 }
1047 if(button != BUTTON_NONE) 778 if (button != BUTTON_NONE)
1048 lastbutton = button; 779 lastbutton = button;
1049 } 780 }
1050 return 0; /* unreachable - just to reduce compiler warnings */ 781 return 0; /* unreachable - just to reduce compiler warnings */
diff --git a/apps/wps.h b/apps/wps.h
index 3680515951..c6cec3fdce 100644
--- a/apps/wps.h
+++ b/apps/wps.h
@@ -27,7 +27,6 @@ extern bool wps_time_countup;
27int wps_show(void); 27int wps_show(void);
28bool refresh_wps(bool refresh_scroll); 28bool refresh_wps(bool refresh_scroll);
29void handle_usb(void); 29void handle_usb(void);
30bool browse_id3(void);
31 30
32#ifdef HAVE_RECORDER_KEYPAD 31#ifdef HAVE_RECORDER_KEYPAD
33bool f2_screen(void); 32bool f2_screen(void);
diff --git a/firmware/drivers/button.c b/firmware/drivers/button.c
index f934052746..25cdd3d96b 100644
--- a/firmware/drivers/button.c
+++ b/firmware/drivers/button.c
@@ -267,7 +267,6 @@ void button_set_flip(bool flip)
267 } 267 }
268} 268}
269 269
270
271/* 270/*
272 * Get button pressed from hardware 271 * Get button pressed from hardware
273 */ 272 */
@@ -376,12 +375,12 @@ static int button_read(void)
376 if(adc_read(2) < 0x180) 375 if(adc_read(2) < 0x180)
377 btn |= BUTTON_RIGHT; 376 btn |= BUTTON_RIGHT;
378 if(adc_read(3) < 0x180) 377 if(adc_read(3) < 0x180)
379 btn |= BUTTON_PLAY | BUTTON_UP; 378 btn |= BUTTON_PLAY;
380 379
381 if ( !(porta & 0x20) ) 380 if ( !(porta & 0x20) )
382 btn |= BUTTON_ON; 381 btn |= BUTTON_ON;
383 if ( !(porta & 0x800) ) 382 if ( !(porta & 0x800) )
384 btn |= BUTTON_STOP | BUTTON_DOWN; 383 btn |= BUTTON_STOP;
385 384
386 return btn; 385 return btn;
387} 386}
@@ -488,7 +487,7 @@ static int button_read(void)
488 if(adc_read(ADC_BUTTON_OPTION) > 0x200) /* active high */ 487 if(adc_read(ADC_BUTTON_OPTION) > 0x200) /* active high */
489 btn |= BUTTON_MENU; 488 btn |= BUTTON_MENU;
490 if(adc_read(ADC_BUTTON_ONOFF) < 0x120) /* active low */ 489 if(adc_read(ADC_BUTTON_ONOFF) < 0x120) /* active low */
491 btn |= BUTTON_ON; 490 btn |= BUTTON_OFF;
492 491
493 /* Check the 4 direction keys, hard-coded analog limits for now */ 492 /* Check the 4 direction keys, hard-coded analog limits for now */
494 if (data >= 0x2EF) 493 if (data >= 0x2EF)
@@ -496,9 +495,9 @@ static int button_read(void)
496 else if (data >= 0x246) 495 else if (data >= 0x246)
497 btn |= BUTTON_RIGHT; 496 btn |= BUTTON_RIGHT;
498 else if (data >= 0x19D) 497 else if (data >= 0x19D)
499 btn |= BUTTON_PLAY | BUTTON_UP; 498 btn |= BUTTON_UP;
500 else if (data >= 0x0A1) 499 else if (data >= 0x0A1)
501 btn |= BUTTON_STOP | BUTTON_DOWN; 500 btn |= BUTTON_DOWN;
502 501
503 return btn; 502 return btn;
504} 503}
diff --git a/firmware/drivers/serial.c b/firmware/drivers/serial.c
index 11dadc6f19..e1e0eb82e9 100644
--- a/firmware/drivers/serial.c
+++ b/firmware/drivers/serial.c
@@ -85,7 +85,7 @@ int remote_control_rx(void)
85 } 85 }
86 else 86 else
87 { 87 {
88#ifndef HAVE_NEO_KEYPAD /* This needs to be fixed for Neo */ 88#if !defined(HAVE_NEO_KEYPAD) && !defined(HAVE_ONDIO_KEYPAD)
89 switch (btn) 89 switch (btn)
90 { 90 {
91 case STOP: 91 case STOP:
diff --git a/firmware/export/button.h b/firmware/export/button.h
index 7f4998f48d..7ec484440f 100644
--- a/firmware/export/button.h
+++ b/firmware/export/button.h
@@ -37,7 +37,7 @@ void button_set_flip(bool flip); /* turn 180 degrees */
37#define BUTTON_NONE 0x0000 37#define BUTTON_NONE 0x0000
38 38
39#ifdef HAVE_NEO_KEYPAD 39#ifdef HAVE_NEO_KEYPAD
40 40/* neo button codes */
41#define BUTTON_UP 0x0080 41#define BUTTON_UP 0x0080
42#define BUTTON_DOWN 0x0010 42#define BUTTON_DOWN 0x0010
43#define BUTTON_LEFT 0x0001 43#define BUTTON_LEFT 0x0001
@@ -80,9 +80,6 @@ void button_set_flip(bool flip); /* turn 180 degrees */
80#else 80#else
81 81
82/* Shared button codes */ 82/* Shared button codes */
83#define BUTTON_ON 0x0001
84#define BUTTON_UP 0x0010
85#define BUTTON_DOWN 0x0020
86#define BUTTON_LEFT 0x0040 83#define BUTTON_LEFT 0x0040
87#define BUTTON_RIGHT 0x0080 84#define BUTTON_RIGHT 0x0080
88 85
@@ -94,38 +91,42 @@ void button_set_flip(bool flip); /* turn 180 degrees */
94/* remote control buttons */ 91/* remote control buttons */
95#define BUTTON_RC_VOL_UP (0x0008 | BUTTON_REMOTE) 92#define BUTTON_RC_VOL_UP (0x0008 | BUTTON_REMOTE)
96#define BUTTON_RC_VOL_DOWN (0x0800 | BUTTON_REMOTE) 93#define BUTTON_RC_VOL_DOWN (0x0800 | BUTTON_REMOTE)
97#define BUTTON_RC_PLAY (BUTTON_UP | BUTTON_REMOTE)
98#define BUTTON_RC_STOP (BUTTON_DOWN | BUTTON_REMOTE)
99#define BUTTON_RC_LEFT (BUTTON_LEFT | BUTTON_REMOTE) 94#define BUTTON_RC_LEFT (BUTTON_LEFT | BUTTON_REMOTE)
100#define BUTTON_RC_RIGHT (BUTTON_RIGHT| BUTTON_REMOTE) 95#define BUTTON_RC_RIGHT (BUTTON_RIGHT| BUTTON_REMOTE)
101 96
102#ifdef HAVE_RECORDER_KEYPAD 97#ifdef HAVE_RECORDER_KEYPAD
103 98
104/* Recorder specific button codes */ 99/* Recorder specific button codes */
100#define BUTTON_ON 0x0001
105#define BUTTON_OFF 0x0002 101#define BUTTON_OFF 0x0002
106#define BUTTON_PLAY 0x0004 102#define BUTTON_PLAY 0x0004
103#define BUTTON_UP 0x0010
104#define BUTTON_DOWN 0x0020
107#define BUTTON_F1 0x0100 105#define BUTTON_F1 0x0100
108#define BUTTON_F2 0x0200 106#define BUTTON_F2 0x0200
109#define BUTTON_F3 0x0400 107#define BUTTON_F3 0x0400
110 108
109#define BUTTON_RC_PLAY (BUTTON_PLAY | BUTTON_REMOTE)
110#define BUTTON_RC_STOP (BUTTON_OFF | BUTTON_REMOTE)
111
111#elif defined(HAVE_PLAYER_KEYPAD) 112#elif defined(HAVE_PLAYER_KEYPAD)
112 113
113/* Jukebox 6000 and Studio specific button codes */ 114/* Jukebox 6000 and Studio specific button codes */
115#define BUTTON_ON 0x0001
114#define BUTTON_MENU 0x0002 116#define BUTTON_MENU 0x0002
115#define BUTTON_PLAY BUTTON_UP 117#define BUTTON_PLAY 0x0010
116#define BUTTON_STOP BUTTON_DOWN 118#define BUTTON_STOP 0x0020
119
120#define BUTTON_RC_PLAY (BUTTON_PLAY | BUTTON_REMOTE)
121#define BUTTON_RC_STOP (BUTTON_STOP | BUTTON_REMOTE)
117 122
118#elif defined HAVE_ONDIO_KEYPAD 123#elif defined HAVE_ONDIO_KEYPAD
119 124
120/* Ondio specific button codes */ 125/* Ondio specific button codes */
121#define BUTTON_MENU 0x0002 126#define BUTTON_OFF 0x0002
122#define BUTTON_PLAY BUTTON_UP 127#define BUTTON_UP 0x0010
123#define BUTTON_STOP BUTTON_DOWN 128#define BUTTON_DOWN 0x0020
124/* ON is also interpreted as OFF, let's see if that helps a bit */ 129#define BUTTON_MENU 0x0100
125#define BUTTON_OFF BUTTON_ON
126#define BUTTON_F1 0x0100 /* unreacheable */
127#define BUTTON_F2 0x0200 /* unreacheable */
128#define BUTTON_F3 0x0400 /* unreacheable */
129 130
130#endif /* HAVE_RECORDER/PLAYER/ONDIO_KEYPAD */ 131#endif /* HAVE_RECORDER/PLAYER/ONDIO_KEYPAD */
131 132
diff --git a/firmware/usb.c b/firmware/usb.c
index 566f9c43d2..6c14b75f19 100644
--- a/firmware/usb.c
+++ b/firmware/usb.c
@@ -135,7 +135,7 @@ static void usb_slave_mode(bool on)
135 lcd_puts(0, 0, str); 135 lcd_puts(0, 0, str);
136 lcd_puts(0, 1, "Press ON to debug"); 136 lcd_puts(0, 1, "Press ON to debug");
137 lcd_update(); 137 lcd_update();
138 while(button_get(true) != BUTTON_ON) {}; 138 while(!(button_get(true) & BUTTON_REL)) {};
139 dbg_ports(); 139 dbg_ports();
140 panicf("ata: %d",rc); 140 panicf("ata: %d",rc);
141 } 141 }
diff --git a/uisimulator/common/lcd-playersim.c b/uisimulator/common/lcd-playersim.c
index 3f3453b9a1..5c8ca92f32 100644
--- a/uisimulator/common/lcd-playersim.c
+++ b/uisimulator/common/lcd-playersim.c
@@ -102,7 +102,7 @@ void lcd_print_char(int x, int y)
102 static char bitmap_content[11*8][2*8]; 102 static char bitmap_content[11*8][2*8];
103 103
104 if (double_height == 2 && y == 1) 104 if (double_height == 2 && y == 1)
105 return; /* Second row can't be printed in double height. ??*/ 105 return; /* only one row available if text is double height */
106 106
107 for (col=0; col<5; col++) { 107 for (col=0; col<5; col++) {
108 unsigned char fontbitmap=(*font_player)[ch][col]; 108 unsigned char fontbitmap=(*font_player)[ch][col];
diff --git a/uisimulator/win32/Makefile b/uisimulator/win32/Makefile
index d105076f85..22ce4d65d1 100644
--- a/uisimulator/win32/Makefile
+++ b/uisimulator/win32/Makefile
@@ -23,6 +23,7 @@ PLAYDIR = $(APPDIR)/player
23PLUGINDIR = $(APPDIR)/plugins 23PLUGINDIR = $(APPDIR)/plugins
24SIMCOMMON = ../common 24SIMCOMMON = ../common
25 25
26ISONDIO := $(findstring ONDIO, $(TARGET))
26ISPLAYER := $(findstring PLAYER, $(TARGET)) 27ISPLAYER := $(findstring PLAYER, $(TARGET))
27ifeq ($(ISPLAYER), PLAYER) 28ifeq ($(ISPLAYER), PLAYER)
28 MACHINEDIR = $(PLAYDIR) 29 MACHINEDIR = $(PLAYDIR)
@@ -124,8 +125,10 @@ SRCS = button.c lcd-win32.c panic-win32.c thread-win32.c \
124 125
125OBJS := $(OBJDIR)/lang.o $(SRCS:%.c=$(OBJDIR)/%.o) $(OBJDIR)/uisw32-res.o 126OBJS := $(OBJDIR)/lang.o $(SRCS:%.c=$(OBJDIR)/%.o) $(OBJDIR)/uisw32-res.o
126 127
128ifneq ($(ISONDIO),ONDIO)
127ROCKS := $(patsubst $(PLUGINDIR)/%.c,$(OBJDIR)/%.rock,$(wildcard $(PLUGINDIR)/*.c)) 129ROCKS := $(patsubst $(PLUGINDIR)/%.c,$(OBJDIR)/%.rock,$(wildcard $(PLUGINDIR)/*.c))
128PLUGINLIBOBJS := $(patsubst $(PLUGINDIR)/lib/%.c,$(OBJDIR)/%.o,$(wildcard $(PLUGINDIR)/lib/*.c)) 130PLUGINLIBOBJS := $(patsubst $(PLUGINDIR)/lib/%.c,$(OBJDIR)/%.o,$(wildcard $(PLUGINDIR)/lib/*.c))
131endif
129 132
130all: $(TOOLSDIR)/convbdf $(EXEFILE) $(ROCKS) 133all: $(TOOLSDIR)/convbdf $(EXEFILE) $(ROCKS)
131 134
diff --git a/uisimulator/win32/button.c b/uisimulator/win32/button.c
index 0af6ff40a6..5d56456f6e 100644
--- a/uisimulator/win32/button.c
+++ b/uisimulator/win32/button.c
@@ -59,22 +59,38 @@ void button_event(int key, bool pressed)
59 case VK_RIGHT: 59 case VK_RIGHT:
60 new_btn = BUTTON_RIGHT; 60 new_btn = BUTTON_RIGHT;
61 break; 61 break;
62
62 case VK_NUMPAD8: 63 case VK_NUMPAD8:
63 case VK_UP: 64 case VK_UP:
65#ifdef BUTTON_UP
64 new_btn = BUTTON_UP; 66 new_btn = BUTTON_UP;
67#elif defined BUTTON_PLAY
68 new_btn = BUTTON_PLAY;
69#endif
65 break; 70 break;
71
66 case VK_NUMPAD2: 72 case VK_NUMPAD2:
67 case VK_DOWN: 73 case VK_DOWN:
74#ifdef BUTTON_DOWN
68 new_btn = BUTTON_DOWN; 75 new_btn = BUTTON_DOWN;
76#elif defined BUTTON_STOP
77 new_btn = BUTTON_STOP;
78#endif
69 break; 79 break;
80
81#ifdef BUTTON_ON
70 case VK_ADD: 82 case VK_ADD:
71 new_btn = BUTTON_ON; 83 new_btn = BUTTON_ON;
72 break; 84 break;
85#endif
73 86
74#ifdef HAVE_RECORDER_KEYPAD 87#ifdef BUTTON_OFF
75 case VK_RETURN: 88 case VK_RETURN:
76 new_btn = BUTTON_OFF; 89 new_btn = BUTTON_OFF;
77 break; 90 break;
91#endif
92
93#ifdef BUTTON_F1
78 case VK_DIVIDE: 94 case VK_DIVIDE:
79 case VK_F1: 95 case VK_F1:
80 new_btn = BUTTON_F1; 96 new_btn = BUTTON_F1;
@@ -87,11 +103,16 @@ void button_event(int key, bool pressed)
87 case VK_F3: 103 case VK_F3:
88 new_btn = BUTTON_F3; 104 new_btn = BUTTON_F3;
89 break; 105 break;
106#endif
107
108#ifdef BUTTON_PLAY
90 case VK_NUMPAD5: 109 case VK_NUMPAD5:
91 case VK_SPACE: 110 case VK_SPACE:
92 new_btn = BUTTON_PLAY; 111 new_btn = BUTTON_PLAY;
93 break; 112 break;
113#endif
94 114
115#ifdef HAVE_LCD_BITMAP
95 case VK_NUMPAD0: 116 case VK_NUMPAD0:
96 case VK_F5: 117 case VK_F5:
97 if(pressed) 118 if(pressed)
@@ -100,8 +121,14 @@ void button_event(int key, bool pressed)
100 return; 121 return;
101 } 122 }
102 break; 123 break;
103#else 124#endif
125
126#ifdef BUTTON_MENU
127#ifdef HAVE_PLAYER_KEYPAD
104 case VK_RETURN: 128 case VK_RETURN:
129#elif defined HAVE_ONDIO_KEYPAD
130 case VK_INSERT:
131#endif
105 new_btn = BUTTON_MENU; 132 new_btn = BUTTON_MENU;
106 break; 133 break;
107#endif 134#endif
diff --git a/uisimulator/x11/Makefile b/uisimulator/x11/Makefile
index 785e590623..2bc2cba267 100644
--- a/uisimulator/x11/Makefile
+++ b/uisimulator/x11/Makefile
@@ -23,6 +23,7 @@ PLAYDIR = $(APPDIR)/player
23PLUGINDIR = $(APPDIR)/plugins 23PLUGINDIR = $(APPDIR)/plugins
24SIMCOMMON = ../common 24SIMCOMMON = ../common
25 25
26ISONDIO := $(findstring ONDIO, $(TARGET))
26ISPLAYER := $(findstring PLAYER, $(TARGET)) 27ISPLAYER := $(findstring PLAYER, $(TARGET))
27ifeq ($(ISPLAYER), PLAYER) 28ifeq ($(ISPLAYER), PLAYER)
28 MACHINEDIR = $(PLAYDIR) 29 MACHINEDIR = $(PLAYDIR)
@@ -142,8 +143,10 @@ SRCS = screenhack.c uibasic.c resources.c visual.c lcd-x11.c \
142 143
143OBJS := $(OBJDIR)/lang.o $(SRCS:%.c=$(OBJDIR)/%.o) 144OBJS := $(OBJDIR)/lang.o $(SRCS:%.c=$(OBJDIR)/%.o)
144 145
146ifneq ($(ISONDIO),ONDIO)
145ROCKS := $(patsubst $(PLUGINDIR)/%.c,$(OBJDIR)/%.rock,$(wildcard $(PLUGINDIR)/*.c)) 147ROCKS := $(patsubst $(PLUGINDIR)/%.c,$(OBJDIR)/%.rock,$(wildcard $(PLUGINDIR)/*.c))
146PLUGINLIBOBJS := $(patsubst $(PLUGINDIR)/lib/%.c,$(OBJDIR)/%.o,$(wildcard $(PLUGINDIR)/lib/*.c)) 148PLUGINLIBOBJS := $(patsubst $(PLUGINDIR)/lib/%.c,$(OBJDIR)/%.o,$(wildcard $(PLUGINDIR)/lib/*.c))
149endif
147 150
148all: $(TOOLSDIR)/convbdf $(EXEFILE) $(ROCKS) 151all: $(TOOLSDIR)/convbdf $(EXEFILE) $(ROCKS)
149 152
@@ -249,11 +252,11 @@ $(OBJDIR)/%.o: %.c
249 $(CC) $(CFLAGS) -c $< -o $@ 252 $(CC) $(CFLAGS) -c $< -o $@
250 253
251ifeq ($(UNAME),CYGWIN) 254ifeq ($(UNAME),CYGWIN)
252$(EXEFILE): $(OBJS) $(OBJDIR)/libplugin.a 255$(EXEFILE): $(OBJS)
253 @echo LD $@ 256 @echo LD $@
254 @$(CC) -g -o $(EXEFILE) $(OBJS) $(LIBDIRS) $(LDFLAGS) $(LIBS) 257 @$(CC) -g -o $(EXEFILE) $(OBJS) $(LIBDIRS) $(LDFLAGS) $(LIBS)
255else 258else
256$(EXEFILE): $(OBJS) $(OBJDIR)/libplugin.a 259$(EXEFILE): $(OBJS)
257 @echo LD $@ 260 @echo LD $@
258 @$(CC) -g -o $(EXEFILE) $(LIBDIRS) $(LDFLAGS) $(OBJS) $(LIBS) 261 @$(CC) -g -o $(EXEFILE) $(LIBDIRS) $(LDFLAGS) $(OBJS) $(LIBS)
259endif 262endif
diff --git a/uisimulator/x11/button-x11.c b/uisimulator/x11/button-x11.c
index 951bf730c5..534568b658 100644
--- a/uisimulator/x11/button-x11.c
+++ b/uisimulator/x11/button-x11.c
@@ -75,35 +75,49 @@ static int get_raw_button (void)
75 case XK_KP_Up: 75 case XK_KP_Up:
76 case XK_Up: 76 case XK_Up:
77 case XK_KP_8: 77 case XK_KP_8:
78#ifdef BUTTON_UP
78 k = BUTTON_UP; 79 k = BUTTON_UP;
80#elif defined BUTTON_PLAY
81 k = BUTTON_PLAY;
82#endif
79 break; 83 break;
80 84
81 case XK_KP_Down: 85 case XK_KP_Down:
82 case XK_Down: 86 case XK_Down:
83 case XK_KP_2: 87 case XK_KP_2:
88#ifdef BUTTON_DOWN
84 k = BUTTON_DOWN; 89 k = BUTTON_DOWN;
90#elif defined BUTTON_STOP
91 k = BUTTON_STOP;
92#endif
85 break; 93 break;
86 94
87#ifdef HAVE_RECORDER_KEYPAD 95#ifdef BUTTON_PLAY
88 case XK_KP_Space: 96 case XK_KP_Space:
89 case XK_KP_5: 97 case XK_KP_5:
90 case XK_KP_Begin: 98 case XK_KP_Begin:
91 case XK_space: 99 case XK_space:
92 k = BUTTON_PLAY; 100 k = BUTTON_PLAY;
93 break; 101 break;
102#endif
94 103
104#ifdef BUTTON_OFF
95 case XK_KP_Enter: 105 case XK_KP_Enter:
96 case XK_A: 106 case XK_A:
97 case XK_a: 107 case XK_a:
98 k = BUTTON_OFF; 108 k = BUTTON_OFF;
99 break; 109 break;
110#endif
100 111
112#ifdef BUTTON_ON
101 case XK_KP_Add: 113 case XK_KP_Add:
102 case XK_Q: 114 case XK_Q:
103 case XK_q: 115 case XK_q:
104 k = BUTTON_ON; 116 k = BUTTON_ON;
105 break; 117 break;
118#endif
106 119
120#ifdef BUTTON_F1
107 case XK_KP_Divide: 121 case XK_KP_Divide:
108 case XK_1: 122 case XK_1:
109 k = BUTTON_F1; 123 k = BUTTON_F1;
@@ -118,7 +132,9 @@ static int get_raw_button (void)
118 case XK_3: 132 case XK_3:
119 k = BUTTON_F3; 133 k = BUTTON_F3;
120 break; 134 break;
135#endif
121 136
137#ifdef HAVE_LCD_BITMAP
122 case XK_5: 138 case XK_5:
123 if(!release) 139 if(!release)
124 { 140 {
@@ -126,16 +142,16 @@ static int get_raw_button (void)
126 return 0; 142 return 0;
127 } 143 }
128 break; 144 break;
145#endif
129 146
130#else 147#ifdef BUTTON_MENU
131 case XK_KP_Add: 148#ifdef HAVE_PLAYER_KEYPAD
132 case XK_Q:
133 case XK_q:
134 k = BUTTON_ON;
135 break;
136
137 case XK_KP_Enter: 149 case XK_KP_Enter:
138 case XK_Return: 150 case XK_Return:
151#elif defined HAVE_ONDIO_KEYPAD
152 case XK_KP_Insert:
153 case XK_Control_R:
154#endif
139 k = BUTTON_MENU; 155 k = BUTTON_MENU;
140 break; 156 break;
141#endif 157#endif