Laser cutter software
Dependencies: EthernetNetIf mbed SDFileSystem
Diff: LaosMenu/LaosMenu.cpp
- Revision:
- 0:18ead85c200b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LaosMenu/LaosMenu.cpp Thu Aug 11 09:33:15 2011 +0000 @@ -0,0 +1,290 @@ +/* + * LaosMenu.cpp + * Menu structure and user interface. Uses LaosDisplay + * + * Copyright (c) 2011 Peter Brier + * + * This file is part of the LaOS project (see: http://wiki.protospace.nl/index.php/LaOS) + * + * LaOS is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * LaOS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with LaOS. If not, see <http://www.gnu.org/licenses/>. + * + */ +#include "LaosMenu.h" + +//extern int x0,y0,z0; + +static const char *menus[] = { + "MAIN", //0 + "MOVE", //1 + "FOCUS", //2 + "HOME", //3 + "ORIGIN", //4 + "START JOB", //5 + "DELETE JOB", //6 + "IP", //7 + "POWER / SPEED",//8 + "IO", //9 +}; + +static const char *screens[] = { + //0: main, navigate to MOVE, FOCUS, HOME, ORIGIN, START JOB, IP, DELETE JOB, POWER +#define MAIN (0) + "$$$$$$$$$$$$$$$$" "\n" + "<--- 0 ---> [ok]", + +#define MOVE (MAIN+1) + "X: +6543210 MOVE" "\n" + "Y: +6543210 [ok]", + +#define FOCUS (MOVE+1) + "Z: +543210 FOCUS" "\n" + " [ok]", + +#define HOME (FOCUS+1) + " HOME? " "\n" + "[cancel] [ok]", + +#define ORIGIN (HOME+1) + " SET ORIGIN? " "\n" + "[cancel] [ok]", + +#define RUN (ORIGIN+1) + "RUN: $$$$$$$$$$$" "\n" + "[cancel]<10><ok>", + +#define DELETE (RUN+1) + "DEL: $$$$$$$$$$$" "\n" + "[cancel]<10>[ok]", + +#define IP (DELETE+1) + "210.210.210.210 " "\n" + "$$$$$$$$<0> [ok]", + +#define POWER (IP+1) + "$$$$$$$: 6543210" "\n" + "[cancel] <0>[ok]", + +#define IO (POWER+1) + "$$$$$$$$$$$=0 IO" "\n" + "[cancel] [ok]", + +// Intermediate screens +#define DELETE_OK (POWER+1) + " DELETE 10? " "\n" + "<cancel> [ok]", + +#define HOMING (DELETE_OK+1) + "HOMING...6543210" "\n" + "[cancel] ", + +#define BUSY (HOMING+1) + "BUSY: $$$$$$$$$$" "\n" + "[cancel] [ok]", + +#define PAUSE (BUSY+1) + "PAUSE: $$$$$$$$$" "\n" + "[cancel] [ok]", + +}; + +static const char *ipfields[] = { "IP", "NETMASK", "GATEWAY", "DNS" }; +static const char *powerfields[] = { "Pmin %", "Pmax %", "Voff", "Von" }; +static const char *iofields[] = { "o1:PURGE", "o2:EXHAUST", "o3:PUMP", "i1:COVER", "i2:PUMPOK", "i3:LASEROK", "i4:PURGEOK" }; + + +/** +*** Make new menu object +**/ +// LaosMenu::LaosMenu(const LaosDisplay &display) : dsp(display) +LaosMenu::LaosMenu() +{ + waitup=timeout=0; + sarg = NULL; + x=y=z=0; + screen=prevscreen=menu=speed=0; + dsp.cls(); +} + + + +/** +*** Destroy menu object +**/ +LaosMenu::~LaosMenu() +{ + +} + + + +/** +*** Handle menu system +*** Read keys, an plan next action on the screen, output screen if something changed +**/ +void LaosMenu::Handle() +{ + static int count=0; + int c = dsp.read(); + if ( count++ > 10) count = 0; + if ( c ) + timeout = 10; + else + if ( timeout ) timeout--; + if ( screen != prevscreen ) + waitup = 1; + if ( waitup && timeout) // if we have to wait for key-up, cancel the keypress + c = 0; + if ( waitup && !timeout ) + waitup=0; + if ( !timeout ) // increase speed if we keep button pressed longer + speed = 1; + else + { + speed += 1; + if ( speed >= 500 ) speed = 100; + } + + if ( c || screen != prevscreen || count >9 ) + { + + switch(c) // screen independent handling + { + case K_FUP: screen=FOCUS; break; + case K_FDOWN: screen=FOCUS; break; + case K_ORIGIN: screen=ORIGIN; break; + } + + prevscreen = screen; + + switch ( screen ) + { + case MAIN: + switch ( c ) + { + case K_RIGHT: menu+=1; waitup=1; break; + case K_LEFT: menu-=1; waitup=1; break; + case K_UP: screen=MOVE; break; + case K_DOWN: screen=MOVE; break; + case K_OK: screen=menu; break; + case K_CANCEL: menu=MAIN; break; + } + menu = menu % (sizeof(menus) / sizeof(menus[0])); + sarg = (char*)menus[menu]; + args[0] = menu; + break; + + case MOVE: // pos xy + switch ( c ) + { + case K_UP: y+=speed; break; + case K_DOWN: y-=speed; break; + case K_LEFT: x-=speed; break; + case K_RIGHT: x+=speed; break; + case K_OK: case K_CANCEL: screen=MAIN; waitup=1; break; + } + args[0]=x; args[1]=y; + break; + + case FOCUS: // focus + switch ( c ) + { + case K_FUP: case K_UP: z+=speed; break; + case K_FDOWN: case K_DOWN: z-=speed; break; + case K_LEFT: screen=MAIN; menu -= 1; break; + case K_RIGHT: screen=MAIN; menu += 1; break; + case 0: break; + default: screen=MOVE; break; + } + args[0]=z; + break; + + case HOME:// home + switch ( c ) + { + case K_OK: x=0; y=0; screen=HOMING; break; + case K_CANCEL: screen=MOVE; waitup=1; break; + } + break; + + case ORIGIN: // origin + switch ( c ) + { + case K_OK: x=0; y=0; screen=MOVE; break; + case K_CANCEL: screen=MOVE; break; + } + break; + + case IP: // IP + switch ( c ) + { + case K_RIGHT: ipfield++; waitup=1; break; + case K_LEFT: ipfield--; waitup=1; break; + case K_OK: screen=MAIN; break; + case K_CANCEL: screen=MAIN; break; + } + ipfield %= 4; + sarg = (char*)ipfields[ipfield]; + args[4] = ipfield; + switch(ipfield) + { + case 0: memcpy(args, ipInfo.ip, 4*sizeof(int) ); break; + default: memset(args,0,4*sizeof(int)); break; + } + break; + + case IO: // IO + switch ( c ) + { + case K_RIGHT: iofield++; waitup=1; break; + case K_LEFT: iofield--; waitup=1; break; + case K_OK: screen=MAIN; break; + case K_CANCEL: screen=MAIN; break; + } + iofield %= sizeof(iofields)/sizeof(char*); + sarg = (char*)iofields[iofield]; + args[0] = ipfield; + args[1] = ipfield; + break; + + case POWER: // POWER + switch ( c ) + { + case K_RIGHT: powerfield++; waitup=1; break; + case K_LEFT: powerfield--; waitup=1; break; + case K_UP: power[powerfield % 4] += speed; break; + case K_DOWN: power[powerfield % 4] -= speed; break; + case K_OK: screen=MAIN; break; + case K_CANCEL: screen=MAIN; break; + } + powerfield %= 4; + args[1] = powerfield; + sarg = (char*)powerfields[powerfield]; + args[0] = power[powerfield]; + break; + + + case HOMING: // Homing screen + switch ( c ) + { + case K_CANCEL: screen=MAIN; break; + } + args[0]++; + break; + + default: screen = MAIN; break; + } + dsp.ShowScreen(screens[screen], args, sarg); + } + +}