Laser cutter software
Dependencies: EthernetNetIf mbed SDFileSystem
LaosMenu/LaosMenu.cpp@0:18ead85c200b, 2011-08-11 (annotated)
- Committer:
- pbrier
- Date:
- Thu Aug 11 09:33:15 2011 +0000
- Revision:
- 0:18ead85c200b
Laos server
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pbrier | 0:18ead85c200b | 1 | /* |
pbrier | 0:18ead85c200b | 2 | * LaosMenu.cpp |
pbrier | 0:18ead85c200b | 3 | * Menu structure and user interface. Uses LaosDisplay |
pbrier | 0:18ead85c200b | 4 | * |
pbrier | 0:18ead85c200b | 5 | * Copyright (c) 2011 Peter Brier |
pbrier | 0:18ead85c200b | 6 | * |
pbrier | 0:18ead85c200b | 7 | * This file is part of the LaOS project (see: http://wiki.protospace.nl/index.php/LaOS) |
pbrier | 0:18ead85c200b | 8 | * |
pbrier | 0:18ead85c200b | 9 | * LaOS is free software: you can redistribute it and/or modify |
pbrier | 0:18ead85c200b | 10 | * it under the terms of the GNU General Public License as published by |
pbrier | 0:18ead85c200b | 11 | * the Free Software Foundation, either version 3 of the License, or |
pbrier | 0:18ead85c200b | 12 | * (at your option) any later version. |
pbrier | 0:18ead85c200b | 13 | * |
pbrier | 0:18ead85c200b | 14 | * LaOS is distributed in the hope that it will be useful, |
pbrier | 0:18ead85c200b | 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
pbrier | 0:18ead85c200b | 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
pbrier | 0:18ead85c200b | 17 | * GNU General Public License for more details. |
pbrier | 0:18ead85c200b | 18 | * |
pbrier | 0:18ead85c200b | 19 | * You should have received a copy of the GNU General Public License |
pbrier | 0:18ead85c200b | 20 | * along with LaOS. If not, see <http://www.gnu.org/licenses/>. |
pbrier | 0:18ead85c200b | 21 | * |
pbrier | 0:18ead85c200b | 22 | */ |
pbrier | 0:18ead85c200b | 23 | #include "LaosMenu.h" |
pbrier | 0:18ead85c200b | 24 | |
pbrier | 0:18ead85c200b | 25 | //extern int x0,y0,z0; |
pbrier | 0:18ead85c200b | 26 | |
pbrier | 0:18ead85c200b | 27 | static const char *menus[] = { |
pbrier | 0:18ead85c200b | 28 | "MAIN", //0 |
pbrier | 0:18ead85c200b | 29 | "MOVE", //1 |
pbrier | 0:18ead85c200b | 30 | "FOCUS", //2 |
pbrier | 0:18ead85c200b | 31 | "HOME", //3 |
pbrier | 0:18ead85c200b | 32 | "ORIGIN", //4 |
pbrier | 0:18ead85c200b | 33 | "START JOB", //5 |
pbrier | 0:18ead85c200b | 34 | "DELETE JOB", //6 |
pbrier | 0:18ead85c200b | 35 | "IP", //7 |
pbrier | 0:18ead85c200b | 36 | "POWER / SPEED",//8 |
pbrier | 0:18ead85c200b | 37 | "IO", //9 |
pbrier | 0:18ead85c200b | 38 | }; |
pbrier | 0:18ead85c200b | 39 | |
pbrier | 0:18ead85c200b | 40 | static const char *screens[] = { |
pbrier | 0:18ead85c200b | 41 | //0: main, navigate to MOVE, FOCUS, HOME, ORIGIN, START JOB, IP, DELETE JOB, POWER |
pbrier | 0:18ead85c200b | 42 | #define MAIN (0) |
pbrier | 0:18ead85c200b | 43 | "$$$$$$$$$$$$$$$$" "\n" |
pbrier | 0:18ead85c200b | 44 | "<--- 0 ---> [ok]", |
pbrier | 0:18ead85c200b | 45 | |
pbrier | 0:18ead85c200b | 46 | #define MOVE (MAIN+1) |
pbrier | 0:18ead85c200b | 47 | "X: +6543210 MOVE" "\n" |
pbrier | 0:18ead85c200b | 48 | "Y: +6543210 [ok]", |
pbrier | 0:18ead85c200b | 49 | |
pbrier | 0:18ead85c200b | 50 | #define FOCUS (MOVE+1) |
pbrier | 0:18ead85c200b | 51 | "Z: +543210 FOCUS" "\n" |
pbrier | 0:18ead85c200b | 52 | " [ok]", |
pbrier | 0:18ead85c200b | 53 | |
pbrier | 0:18ead85c200b | 54 | #define HOME (FOCUS+1) |
pbrier | 0:18ead85c200b | 55 | " HOME? " "\n" |
pbrier | 0:18ead85c200b | 56 | "[cancel] [ok]", |
pbrier | 0:18ead85c200b | 57 | |
pbrier | 0:18ead85c200b | 58 | #define ORIGIN (HOME+1) |
pbrier | 0:18ead85c200b | 59 | " SET ORIGIN? " "\n" |
pbrier | 0:18ead85c200b | 60 | "[cancel] [ok]", |
pbrier | 0:18ead85c200b | 61 | |
pbrier | 0:18ead85c200b | 62 | #define RUN (ORIGIN+1) |
pbrier | 0:18ead85c200b | 63 | "RUN: $$$$$$$$$$$" "\n" |
pbrier | 0:18ead85c200b | 64 | "[cancel]<10><ok>", |
pbrier | 0:18ead85c200b | 65 | |
pbrier | 0:18ead85c200b | 66 | #define DELETE (RUN+1) |
pbrier | 0:18ead85c200b | 67 | "DEL: $$$$$$$$$$$" "\n" |
pbrier | 0:18ead85c200b | 68 | "[cancel]<10>[ok]", |
pbrier | 0:18ead85c200b | 69 | |
pbrier | 0:18ead85c200b | 70 | #define IP (DELETE+1) |
pbrier | 0:18ead85c200b | 71 | "210.210.210.210 " "\n" |
pbrier | 0:18ead85c200b | 72 | "$$$$$$$$<0> [ok]", |
pbrier | 0:18ead85c200b | 73 | |
pbrier | 0:18ead85c200b | 74 | #define POWER (IP+1) |
pbrier | 0:18ead85c200b | 75 | "$$$$$$$: 6543210" "\n" |
pbrier | 0:18ead85c200b | 76 | "[cancel] <0>[ok]", |
pbrier | 0:18ead85c200b | 77 | |
pbrier | 0:18ead85c200b | 78 | #define IO (POWER+1) |
pbrier | 0:18ead85c200b | 79 | "$$$$$$$$$$$=0 IO" "\n" |
pbrier | 0:18ead85c200b | 80 | "[cancel] [ok]", |
pbrier | 0:18ead85c200b | 81 | |
pbrier | 0:18ead85c200b | 82 | // Intermediate screens |
pbrier | 0:18ead85c200b | 83 | #define DELETE_OK (POWER+1) |
pbrier | 0:18ead85c200b | 84 | " DELETE 10? " "\n" |
pbrier | 0:18ead85c200b | 85 | "<cancel> [ok]", |
pbrier | 0:18ead85c200b | 86 | |
pbrier | 0:18ead85c200b | 87 | #define HOMING (DELETE_OK+1) |
pbrier | 0:18ead85c200b | 88 | "HOMING...6543210" "\n" |
pbrier | 0:18ead85c200b | 89 | "[cancel] ", |
pbrier | 0:18ead85c200b | 90 | |
pbrier | 0:18ead85c200b | 91 | #define BUSY (HOMING+1) |
pbrier | 0:18ead85c200b | 92 | "BUSY: $$$$$$$$$$" "\n" |
pbrier | 0:18ead85c200b | 93 | "[cancel] [ok]", |
pbrier | 0:18ead85c200b | 94 | |
pbrier | 0:18ead85c200b | 95 | #define PAUSE (BUSY+1) |
pbrier | 0:18ead85c200b | 96 | "PAUSE: $$$$$$$$$" "\n" |
pbrier | 0:18ead85c200b | 97 | "[cancel] [ok]", |
pbrier | 0:18ead85c200b | 98 | |
pbrier | 0:18ead85c200b | 99 | }; |
pbrier | 0:18ead85c200b | 100 | |
pbrier | 0:18ead85c200b | 101 | static const char *ipfields[] = { "IP", "NETMASK", "GATEWAY", "DNS" }; |
pbrier | 0:18ead85c200b | 102 | static const char *powerfields[] = { "Pmin %", "Pmax %", "Voff", "Von" }; |
pbrier | 0:18ead85c200b | 103 | static const char *iofields[] = { "o1:PURGE", "o2:EXHAUST", "o3:PUMP", "i1:COVER", "i2:PUMPOK", "i3:LASEROK", "i4:PURGEOK" }; |
pbrier | 0:18ead85c200b | 104 | |
pbrier | 0:18ead85c200b | 105 | |
pbrier | 0:18ead85c200b | 106 | /** |
pbrier | 0:18ead85c200b | 107 | *** Make new menu object |
pbrier | 0:18ead85c200b | 108 | **/ |
pbrier | 0:18ead85c200b | 109 | // LaosMenu::LaosMenu(const LaosDisplay &display) : dsp(display) |
pbrier | 0:18ead85c200b | 110 | LaosMenu::LaosMenu() |
pbrier | 0:18ead85c200b | 111 | { |
pbrier | 0:18ead85c200b | 112 | waitup=timeout=0; |
pbrier | 0:18ead85c200b | 113 | sarg = NULL; |
pbrier | 0:18ead85c200b | 114 | x=y=z=0; |
pbrier | 0:18ead85c200b | 115 | screen=prevscreen=menu=speed=0; |
pbrier | 0:18ead85c200b | 116 | dsp.cls(); |
pbrier | 0:18ead85c200b | 117 | } |
pbrier | 0:18ead85c200b | 118 | |
pbrier | 0:18ead85c200b | 119 | |
pbrier | 0:18ead85c200b | 120 | |
pbrier | 0:18ead85c200b | 121 | /** |
pbrier | 0:18ead85c200b | 122 | *** Destroy menu object |
pbrier | 0:18ead85c200b | 123 | **/ |
pbrier | 0:18ead85c200b | 124 | LaosMenu::~LaosMenu() |
pbrier | 0:18ead85c200b | 125 | { |
pbrier | 0:18ead85c200b | 126 | |
pbrier | 0:18ead85c200b | 127 | } |
pbrier | 0:18ead85c200b | 128 | |
pbrier | 0:18ead85c200b | 129 | |
pbrier | 0:18ead85c200b | 130 | |
pbrier | 0:18ead85c200b | 131 | /** |
pbrier | 0:18ead85c200b | 132 | *** Handle menu system |
pbrier | 0:18ead85c200b | 133 | *** Read keys, an plan next action on the screen, output screen if something changed |
pbrier | 0:18ead85c200b | 134 | **/ |
pbrier | 0:18ead85c200b | 135 | void LaosMenu::Handle() |
pbrier | 0:18ead85c200b | 136 | { |
pbrier | 0:18ead85c200b | 137 | static int count=0; |
pbrier | 0:18ead85c200b | 138 | int c = dsp.read(); |
pbrier | 0:18ead85c200b | 139 | if ( count++ > 10) count = 0; |
pbrier | 0:18ead85c200b | 140 | if ( c ) |
pbrier | 0:18ead85c200b | 141 | timeout = 10; |
pbrier | 0:18ead85c200b | 142 | else |
pbrier | 0:18ead85c200b | 143 | if ( timeout ) timeout--; |
pbrier | 0:18ead85c200b | 144 | if ( screen != prevscreen ) |
pbrier | 0:18ead85c200b | 145 | waitup = 1; |
pbrier | 0:18ead85c200b | 146 | if ( waitup && timeout) // if we have to wait for key-up, cancel the keypress |
pbrier | 0:18ead85c200b | 147 | c = 0; |
pbrier | 0:18ead85c200b | 148 | if ( waitup && !timeout ) |
pbrier | 0:18ead85c200b | 149 | waitup=0; |
pbrier | 0:18ead85c200b | 150 | if ( !timeout ) // increase speed if we keep button pressed longer |
pbrier | 0:18ead85c200b | 151 | speed = 1; |
pbrier | 0:18ead85c200b | 152 | else |
pbrier | 0:18ead85c200b | 153 | { |
pbrier | 0:18ead85c200b | 154 | speed += 1; |
pbrier | 0:18ead85c200b | 155 | if ( speed >= 500 ) speed = 100; |
pbrier | 0:18ead85c200b | 156 | } |
pbrier | 0:18ead85c200b | 157 | |
pbrier | 0:18ead85c200b | 158 | if ( c || screen != prevscreen || count >9 ) |
pbrier | 0:18ead85c200b | 159 | { |
pbrier | 0:18ead85c200b | 160 | |
pbrier | 0:18ead85c200b | 161 | switch(c) // screen independent handling |
pbrier | 0:18ead85c200b | 162 | { |
pbrier | 0:18ead85c200b | 163 | case K_FUP: screen=FOCUS; break; |
pbrier | 0:18ead85c200b | 164 | case K_FDOWN: screen=FOCUS; break; |
pbrier | 0:18ead85c200b | 165 | case K_ORIGIN: screen=ORIGIN; break; |
pbrier | 0:18ead85c200b | 166 | } |
pbrier | 0:18ead85c200b | 167 | |
pbrier | 0:18ead85c200b | 168 | prevscreen = screen; |
pbrier | 0:18ead85c200b | 169 | |
pbrier | 0:18ead85c200b | 170 | switch ( screen ) |
pbrier | 0:18ead85c200b | 171 | { |
pbrier | 0:18ead85c200b | 172 | case MAIN: |
pbrier | 0:18ead85c200b | 173 | switch ( c ) |
pbrier | 0:18ead85c200b | 174 | { |
pbrier | 0:18ead85c200b | 175 | case K_RIGHT: menu+=1; waitup=1; break; |
pbrier | 0:18ead85c200b | 176 | case K_LEFT: menu-=1; waitup=1; break; |
pbrier | 0:18ead85c200b | 177 | case K_UP: screen=MOVE; break; |
pbrier | 0:18ead85c200b | 178 | case K_DOWN: screen=MOVE; break; |
pbrier | 0:18ead85c200b | 179 | case K_OK: screen=menu; break; |
pbrier | 0:18ead85c200b | 180 | case K_CANCEL: menu=MAIN; break; |
pbrier | 0:18ead85c200b | 181 | } |
pbrier | 0:18ead85c200b | 182 | menu = menu % (sizeof(menus) / sizeof(menus[0])); |
pbrier | 0:18ead85c200b | 183 | sarg = (char*)menus[menu]; |
pbrier | 0:18ead85c200b | 184 | args[0] = menu; |
pbrier | 0:18ead85c200b | 185 | break; |
pbrier | 0:18ead85c200b | 186 | |
pbrier | 0:18ead85c200b | 187 | case MOVE: // pos xy |
pbrier | 0:18ead85c200b | 188 | switch ( c ) |
pbrier | 0:18ead85c200b | 189 | { |
pbrier | 0:18ead85c200b | 190 | case K_UP: y+=speed; break; |
pbrier | 0:18ead85c200b | 191 | case K_DOWN: y-=speed; break; |
pbrier | 0:18ead85c200b | 192 | case K_LEFT: x-=speed; break; |
pbrier | 0:18ead85c200b | 193 | case K_RIGHT: x+=speed; break; |
pbrier | 0:18ead85c200b | 194 | case K_OK: case K_CANCEL: screen=MAIN; waitup=1; break; |
pbrier | 0:18ead85c200b | 195 | } |
pbrier | 0:18ead85c200b | 196 | args[0]=x; args[1]=y; |
pbrier | 0:18ead85c200b | 197 | break; |
pbrier | 0:18ead85c200b | 198 | |
pbrier | 0:18ead85c200b | 199 | case FOCUS: // focus |
pbrier | 0:18ead85c200b | 200 | switch ( c ) |
pbrier | 0:18ead85c200b | 201 | { |
pbrier | 0:18ead85c200b | 202 | case K_FUP: case K_UP: z+=speed; break; |
pbrier | 0:18ead85c200b | 203 | case K_FDOWN: case K_DOWN: z-=speed; break; |
pbrier | 0:18ead85c200b | 204 | case K_LEFT: screen=MAIN; menu -= 1; break; |
pbrier | 0:18ead85c200b | 205 | case K_RIGHT: screen=MAIN; menu += 1; break; |
pbrier | 0:18ead85c200b | 206 | case 0: break; |
pbrier | 0:18ead85c200b | 207 | default: screen=MOVE; break; |
pbrier | 0:18ead85c200b | 208 | } |
pbrier | 0:18ead85c200b | 209 | args[0]=z; |
pbrier | 0:18ead85c200b | 210 | break; |
pbrier | 0:18ead85c200b | 211 | |
pbrier | 0:18ead85c200b | 212 | case HOME:// home |
pbrier | 0:18ead85c200b | 213 | switch ( c ) |
pbrier | 0:18ead85c200b | 214 | { |
pbrier | 0:18ead85c200b | 215 | case K_OK: x=0; y=0; screen=HOMING; break; |
pbrier | 0:18ead85c200b | 216 | case K_CANCEL: screen=MOVE; waitup=1; break; |
pbrier | 0:18ead85c200b | 217 | } |
pbrier | 0:18ead85c200b | 218 | break; |
pbrier | 0:18ead85c200b | 219 | |
pbrier | 0:18ead85c200b | 220 | case ORIGIN: // origin |
pbrier | 0:18ead85c200b | 221 | switch ( c ) |
pbrier | 0:18ead85c200b | 222 | { |
pbrier | 0:18ead85c200b | 223 | case K_OK: x=0; y=0; screen=MOVE; break; |
pbrier | 0:18ead85c200b | 224 | case K_CANCEL: screen=MOVE; break; |
pbrier | 0:18ead85c200b | 225 | } |
pbrier | 0:18ead85c200b | 226 | break; |
pbrier | 0:18ead85c200b | 227 | |
pbrier | 0:18ead85c200b | 228 | case IP: // IP |
pbrier | 0:18ead85c200b | 229 | switch ( c ) |
pbrier | 0:18ead85c200b | 230 | { |
pbrier | 0:18ead85c200b | 231 | case K_RIGHT: ipfield++; waitup=1; break; |
pbrier | 0:18ead85c200b | 232 | case K_LEFT: ipfield--; waitup=1; break; |
pbrier | 0:18ead85c200b | 233 | case K_OK: screen=MAIN; break; |
pbrier | 0:18ead85c200b | 234 | case K_CANCEL: screen=MAIN; break; |
pbrier | 0:18ead85c200b | 235 | } |
pbrier | 0:18ead85c200b | 236 | ipfield %= 4; |
pbrier | 0:18ead85c200b | 237 | sarg = (char*)ipfields[ipfield]; |
pbrier | 0:18ead85c200b | 238 | args[4] = ipfield; |
pbrier | 0:18ead85c200b | 239 | switch(ipfield) |
pbrier | 0:18ead85c200b | 240 | { |
pbrier | 0:18ead85c200b | 241 | case 0: memcpy(args, ipInfo.ip, 4*sizeof(int) ); break; |
pbrier | 0:18ead85c200b | 242 | default: memset(args,0,4*sizeof(int)); break; |
pbrier | 0:18ead85c200b | 243 | } |
pbrier | 0:18ead85c200b | 244 | break; |
pbrier | 0:18ead85c200b | 245 | |
pbrier | 0:18ead85c200b | 246 | case IO: // IO |
pbrier | 0:18ead85c200b | 247 | switch ( c ) |
pbrier | 0:18ead85c200b | 248 | { |
pbrier | 0:18ead85c200b | 249 | case K_RIGHT: iofield++; waitup=1; break; |
pbrier | 0:18ead85c200b | 250 | case K_LEFT: iofield--; waitup=1; break; |
pbrier | 0:18ead85c200b | 251 | case K_OK: screen=MAIN; break; |
pbrier | 0:18ead85c200b | 252 | case K_CANCEL: screen=MAIN; break; |
pbrier | 0:18ead85c200b | 253 | } |
pbrier | 0:18ead85c200b | 254 | iofield %= sizeof(iofields)/sizeof(char*); |
pbrier | 0:18ead85c200b | 255 | sarg = (char*)iofields[iofield]; |
pbrier | 0:18ead85c200b | 256 | args[0] = ipfield; |
pbrier | 0:18ead85c200b | 257 | args[1] = ipfield; |
pbrier | 0:18ead85c200b | 258 | break; |
pbrier | 0:18ead85c200b | 259 | |
pbrier | 0:18ead85c200b | 260 | case POWER: // POWER |
pbrier | 0:18ead85c200b | 261 | switch ( c ) |
pbrier | 0:18ead85c200b | 262 | { |
pbrier | 0:18ead85c200b | 263 | case K_RIGHT: powerfield++; waitup=1; break; |
pbrier | 0:18ead85c200b | 264 | case K_LEFT: powerfield--; waitup=1; break; |
pbrier | 0:18ead85c200b | 265 | case K_UP: power[powerfield % 4] += speed; break; |
pbrier | 0:18ead85c200b | 266 | case K_DOWN: power[powerfield % 4] -= speed; break; |
pbrier | 0:18ead85c200b | 267 | case K_OK: screen=MAIN; break; |
pbrier | 0:18ead85c200b | 268 | case K_CANCEL: screen=MAIN; break; |
pbrier | 0:18ead85c200b | 269 | } |
pbrier | 0:18ead85c200b | 270 | powerfield %= 4; |
pbrier | 0:18ead85c200b | 271 | args[1] = powerfield; |
pbrier | 0:18ead85c200b | 272 | sarg = (char*)powerfields[powerfield]; |
pbrier | 0:18ead85c200b | 273 | args[0] = power[powerfield]; |
pbrier | 0:18ead85c200b | 274 | break; |
pbrier | 0:18ead85c200b | 275 | |
pbrier | 0:18ead85c200b | 276 | |
pbrier | 0:18ead85c200b | 277 | case HOMING: // Homing screen |
pbrier | 0:18ead85c200b | 278 | switch ( c ) |
pbrier | 0:18ead85c200b | 279 | { |
pbrier | 0:18ead85c200b | 280 | case K_CANCEL: screen=MAIN; break; |
pbrier | 0:18ead85c200b | 281 | } |
pbrier | 0:18ead85c200b | 282 | args[0]++; |
pbrier | 0:18ead85c200b | 283 | break; |
pbrier | 0:18ead85c200b | 284 | |
pbrier | 0:18ead85c200b | 285 | default: screen = MAIN; break; |
pbrier | 0:18ead85c200b | 286 | } |
pbrier | 0:18ead85c200b | 287 | dsp.ShowScreen(screens[screen], args, sarg); |
pbrier | 0:18ead85c200b | 288 | } |
pbrier | 0:18ead85c200b | 289 | |
pbrier | 0:18ead85c200b | 290 | } |