Daniel Stenberg | 1c0c861 | 2002-05-17 12:22:24 +0000 | [diff] [blame] | 1 | /*************************************************************************** |
| 2 | * __________ __ ___. |
| 3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ |
| 4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / |
| 5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < |
| 6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ |
| 7 | * \/ \/ \/ \/ \/ |
| 8 | * $Id$ |
| 9 | * |
| 10 | * Copyright (C) 2002 Robert E. Hak |
| 11 | * |
| 12 | * All files in this archive are subject to the GNU General Public License. |
| 13 | * See the file COPYING in the source tree root for full license agreement. |
| 14 | * |
| 15 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY |
| 16 | * KIND, either express or implied. |
| 17 | * |
| 18 | ****************************************************************************/ |
Björn Stenberg | 2ac0572 | 2002-05-26 17:03:17 +0000 | [diff] [blame^] | 19 | #include <stdbool.h> |
Daniel Stenberg | 1c0c861 | 2002-05-17 12:22:24 +0000 | [diff] [blame] | 20 | #include "lcd.h" |
| 21 | #include "menu.h" |
Björn Stenberg | b21a3bd | 2002-05-21 14:25:45 +0000 | [diff] [blame] | 22 | #include "button.h" |
| 23 | #include "kernel.h" |
| 24 | #include "debug.h" |
Daniel Stenberg | 1c0c861 | 2002-05-17 12:22:24 +0000 | [diff] [blame] | 25 | |
Björn Stenberg | 2ac0572 | 2002-05-26 17:03:17 +0000 | [diff] [blame^] | 26 | struct menu { |
| 27 | int menu_top; |
| 28 | int menu_bottom; |
| 29 | int cursor; |
| 30 | struct menu_items* items; |
| 31 | int itemcount; |
| 32 | }; |
| 33 | |
| 34 | #define MAX_MENUS 4 |
| 35 | |
| 36 | static struct menu menus[MAX_MENUS]; |
| 37 | static bool inuse[MAX_MENUS] = { false }; |
Daniel Stenberg | 1c0c861 | 2002-05-17 12:22:24 +0000 | [diff] [blame] | 38 | |
Björn Stenberg | b21a3bd | 2002-05-21 14:25:45 +0000 | [diff] [blame] | 39 | /* |
| 40 | * Move the cursor to a particular id, |
| 41 | * target: where you want it to be |
| 42 | */ |
Björn Stenberg | 2ac0572 | 2002-05-26 17:03:17 +0000 | [diff] [blame^] | 43 | static void put_cursor(int m, int target) |
Daniel Stenberg | 1c0c861 | 2002-05-17 12:22:24 +0000 | [diff] [blame] | 44 | { |
Björn Stenberg | 2ac0572 | 2002-05-26 17:03:17 +0000 | [diff] [blame^] | 45 | lcd_puts(0, menus[m].cursor, " "); |
| 46 | menus[m].cursor = target; |
| 47 | lcd_puts(0, menus[m].cursor, "-"); |
Daniel Stenberg | 1c0c861 | 2002-05-17 12:22:24 +0000 | [diff] [blame] | 48 | } |
| 49 | |
Björn Stenberg | 2ac0572 | 2002-05-26 17:03:17 +0000 | [diff] [blame^] | 50 | int menu_init(struct menu_items* mitems, int count) |
Daniel Stenberg | 1c0c861 | 2002-05-17 12:22:24 +0000 | [diff] [blame] | 51 | { |
Björn Stenberg | 2ac0572 | 2002-05-26 17:03:17 +0000 | [diff] [blame^] | 52 | int i; |
| 53 | |
| 54 | for ( i=0; i<MAX_MENUS; i++ ) { |
| 55 | if ( !inuse[i] ) { |
| 56 | inuse[i] = true; |
| 57 | break; |
| 58 | } |
| 59 | } |
| 60 | if ( i == MAX_MENUS ) { |
| 61 | DEBUGF("Out of menus!\n"); |
| 62 | return -1; |
| 63 | } |
| 64 | menus[i].items = mitems; |
| 65 | menus[i].itemcount = count; |
| 66 | menus[i].menu_top = 0; |
| 67 | menus[i].menu_bottom = count-1; |
| 68 | menus[i].cursor = 0; |
| 69 | |
| 70 | return i; |
Daniel Stenberg | 1c0c861 | 2002-05-17 12:22:24 +0000 | [diff] [blame] | 71 | } |
| 72 | |
Björn Stenberg | 2ac0572 | 2002-05-26 17:03:17 +0000 | [diff] [blame^] | 73 | void menu_exit(int m) |
Daniel Stenberg | 1c0c861 | 2002-05-17 12:22:24 +0000 | [diff] [blame] | 74 | { |
Björn Stenberg | 2ac0572 | 2002-05-26 17:03:17 +0000 | [diff] [blame^] | 75 | inuse[m] = false; |
Daniel Stenberg | 1c0c861 | 2002-05-17 12:22:24 +0000 | [diff] [blame] | 76 | } |
| 77 | |
Björn Stenberg | 2ac0572 | 2002-05-26 17:03:17 +0000 | [diff] [blame^] | 78 | static void menu_draw(int m) |
Daniel Stenberg | 1c0c861 | 2002-05-17 12:22:24 +0000 | [diff] [blame] | 79 | { |
| 80 | int i = 0; |
| 81 | |
Björn Stenberg | c42644d | 2002-05-21 15:04:23 +0000 | [diff] [blame] | 82 | lcd_clear_display(); |
| 83 | #ifdef HAVE_LCD_BITMAP |
| 84 | lcd_setmargins(0,0); |
| 85 | lcd_setfont(0); |
| 86 | #endif |
Björn Stenberg | 2ac0572 | 2002-05-26 17:03:17 +0000 | [diff] [blame^] | 87 | for (i = 0; i < menus[m].itemcount; i++) { |
| 88 | lcd_puts(1, i, menus[m].items[i].desc); |
| 89 | if (i < menus[m].menu_top) |
| 90 | menus[m].menu_top = i; |
| 91 | if (i > menus[m].menu_bottom) |
| 92 | menus[m].menu_bottom = i; |
Björn Stenberg | b21a3bd | 2002-05-21 14:25:45 +0000 | [diff] [blame] | 93 | } |
Daniel Stenberg | 1c0c861 | 2002-05-17 12:22:24 +0000 | [diff] [blame] | 94 | |
Björn Stenberg | 2ac0572 | 2002-05-26 17:03:17 +0000 | [diff] [blame^] | 95 | lcd_puts(0, menus[m].cursor, "-"); |
Björn Stenberg | b21a3bd | 2002-05-21 14:25:45 +0000 | [diff] [blame] | 96 | lcd_update(); |
Daniel Stenberg | 1c0c861 | 2002-05-17 12:22:24 +0000 | [diff] [blame] | 97 | } |
| 98 | |
Björn Stenberg | 2ac0572 | 2002-05-26 17:03:17 +0000 | [diff] [blame^] | 99 | void menu_run(int m) |
Robert Hak | 7ec9aa3 | 2002-05-18 11:41:37 +0000 | [diff] [blame] | 100 | { |
Björn Stenberg | b21a3bd | 2002-05-21 14:25:45 +0000 | [diff] [blame] | 101 | int key; |
Robert Hak | dfba210 | 2002-05-21 08:47:34 +0000 | [diff] [blame] | 102 | |
Björn Stenberg | 2ac0572 | 2002-05-26 17:03:17 +0000 | [diff] [blame^] | 103 | menu_draw(m); |
Björn Stenberg | b21a3bd | 2002-05-21 14:25:45 +0000 | [diff] [blame] | 104 | |
| 105 | while(1) { |
| 106 | key = button_get(); |
| 107 | if(!key) { |
| 108 | sleep(1); |
| 109 | continue; |
| 110 | } |
| 111 | |
| 112 | switch(key) { |
| 113 | #ifdef HAVE_RECORDER_KEYPAD |
| 114 | case BUTTON_UP: |
Robert Hak | 7ec9aa3 | 2002-05-18 11:41:37 +0000 | [diff] [blame] | 115 | #else |
Björn Stenberg | b21a3bd | 2002-05-21 14:25:45 +0000 | [diff] [blame] | 116 | case BUTTON_LEFT: |
Robert Hak | 7ec9aa3 | 2002-05-18 11:41:37 +0000 | [diff] [blame] | 117 | #endif |
Björn Stenberg | 2ac0572 | 2002-05-26 17:03:17 +0000 | [diff] [blame^] | 118 | if (menus[m].cursor == menus[m].menu_top) { |
Björn Stenberg | b21a3bd | 2002-05-21 14:25:45 +0000 | [diff] [blame] | 119 | /* wrap around to menu bottom */ |
Björn Stenberg | 2ac0572 | 2002-05-26 17:03:17 +0000 | [diff] [blame^] | 120 | put_cursor(m, menus[m].menu_bottom); |
Björn Stenberg | b21a3bd | 2002-05-21 14:25:45 +0000 | [diff] [blame] | 121 | } else { |
| 122 | /* move up */ |
Björn Stenberg | 2ac0572 | 2002-05-26 17:03:17 +0000 | [diff] [blame^] | 123 | put_cursor(m, menus[m].cursor-1); |
Björn Stenberg | b21a3bd | 2002-05-21 14:25:45 +0000 | [diff] [blame] | 124 | } |
| 125 | break; |
Robert Hak | dfba210 | 2002-05-21 08:47:34 +0000 | [diff] [blame] | 126 | |
Björn Stenberg | b21a3bd | 2002-05-21 14:25:45 +0000 | [diff] [blame] | 127 | #ifdef HAVE_RECORDER_KEYPAD |
| 128 | case BUTTON_DOWN: |
| 129 | #else |
| 130 | case BUTTON_RIGHT: |
| 131 | #endif |
Björn Stenberg | 2ac0572 | 2002-05-26 17:03:17 +0000 | [diff] [blame^] | 132 | if (menus[m].cursor == menus[m].menu_bottom) { |
Björn Stenberg | b21a3bd | 2002-05-21 14:25:45 +0000 | [diff] [blame] | 133 | /* wrap around to menu top */ |
Björn Stenberg | 2ac0572 | 2002-05-26 17:03:17 +0000 | [diff] [blame^] | 134 | put_cursor(m, menus[m].menu_top); |
Björn Stenberg | b21a3bd | 2002-05-21 14:25:45 +0000 | [diff] [blame] | 135 | } else { |
| 136 | /* move down */ |
Björn Stenberg | 2ac0572 | 2002-05-26 17:03:17 +0000 | [diff] [blame^] | 137 | put_cursor(m, menus[m].cursor+1); |
Björn Stenberg | b21a3bd | 2002-05-21 14:25:45 +0000 | [diff] [blame] | 138 | } |
| 139 | break; |
| 140 | |
| 141 | #ifdef HAVE_RECORDER_KEYPAD |
| 142 | case BUTTON_RIGHT: |
| 143 | #endif |
| 144 | case BUTTON_PLAY: |
| 145 | /* Erase current display state */ |
| 146 | lcd_clear_display(); |
| 147 | |
Björn Stenberg | 2ac0572 | 2002-05-26 17:03:17 +0000 | [diff] [blame^] | 148 | menus[m].items[menus[m].cursor].function(); |
Björn Stenberg | b21a3bd | 2002-05-21 14:25:45 +0000 | [diff] [blame] | 149 | |
| 150 | /* Return to previous display state */ |
Björn Stenberg | 2ac0572 | 2002-05-26 17:03:17 +0000 | [diff] [blame^] | 151 | menu_draw(m); |
Björn Stenberg | b21a3bd | 2002-05-21 14:25:45 +0000 | [diff] [blame] | 152 | break; |
| 153 | |
| 154 | #ifdef HAVE_RECORDER_KEYPAD |
| 155 | case BUTTON_LEFT: |
| 156 | #else |
| 157 | case BUTTON_STOP: |
| 158 | #endif |
| 159 | return; |
| 160 | |
| 161 | default: |
| 162 | break; |
| 163 | } |
| 164 | |
| 165 | lcd_update(); |
| 166 | } |
Robert Hak | 7ec9aa3 | 2002-05-18 11:41:37 +0000 | [diff] [blame] | 167 | } |