Laser cutter software

Dependencies:   EthernetNetIf mbed SDFileSystem

Committer:
pbrier
Date:
Thu Aug 11 09:33:15 2011 +0000
Revision:
0:18ead85c200b
Laos server

Who changed what in which revision?

UserRevisionLine numberNew 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 }