Michael Spencer / Mbed 2 deprecated LaOS

Dependencies:   mbed

Committer:
Michael J. Spencer
Date:
Wed Mar 05 06:14:02 2014 -0800
Revision:
1:f5ac63519541
Child:
2:609dd3a73f33
Initial commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Michael J. Spencer 1:f5ac63519541 1 /*
Michael J. Spencer 1:f5ac63519541 2 * main.cpp
Michael J. Spencer 1:f5ac63519541 3 * Laos Controller, main function
Michael J. Spencer 1:f5ac63519541 4 *
Michael J. Spencer 1:f5ac63519541 5 * Copyright (c) 2011 Peter Brier & Jaap Vermaas
Michael J. Spencer 1:f5ac63519541 6 *
Michael J. Spencer 1:f5ac63519541 7 * This file is part of the LaOS project (see: http://wiki.laoslaser.org)
Michael J. Spencer 1:f5ac63519541 8 *
Michael J. Spencer 1:f5ac63519541 9 * LaOS is free software: you can redistribute it and/or modify
Michael J. Spencer 1:f5ac63519541 10 * it under the terms of the GNU General Public License as published by
Michael J. Spencer 1:f5ac63519541 11 * the Free Software Foundation, either version 3 of the License, or
Michael J. Spencer 1:f5ac63519541 12 * (at your option) any later version.
Michael J. Spencer 1:f5ac63519541 13 *
Michael J. Spencer 1:f5ac63519541 14 * LaOS is distributed in the hope that it will be useful,
Michael J. Spencer 1:f5ac63519541 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Michael J. Spencer 1:f5ac63519541 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Michael J. Spencer 1:f5ac63519541 17 * GNU General Public License for more details.
Michael J. Spencer 1:f5ac63519541 18 *
Michael J. Spencer 1:f5ac63519541 19 * You should have received a copy of the GNU General Public License
Michael J. Spencer 1:f5ac63519541 20 * along with LaOS. If not, see <http://www.gnu.org/licenses/>.
Michael J. Spencer 1:f5ac63519541 21 *
Michael J. Spencer 1:f5ac63519541 22 * This program consists of a few parts:
Michael J. Spencer 1:f5ac63519541 23 *
Michael J. Spencer 1:f5ac63519541 24 * ConfigFile Read configuration files
Michael J. Spencer 1:f5ac63519541 25 * EthConfig Initialize an ethernet stack, based on a configuration file (includes link status monitoring)
Michael J. Spencer 1:f5ac63519541 26 * LaosDisplay User interface functions (read keys, display text and menus on LCD)
Michael J. Spencer 1:f5ac63519541 27 * LaosMenu User interface stuctures (menu navigation)
Michael J. Spencer 1:f5ac63519541 28 * LaosServer TCP/IP server, accept connections read/write data
Michael J. Spencer 1:f5ac63519541 29 * LaosMotion Motion control functions (X,Y,Z motion, homing)
Michael J. Spencer 1:f5ac63519541 30 * LaosIO Input/Output functions
Michael J. Spencer 1:f5ac63519541 31 * LaosFile File based jobs (read/write/delete)
Michael J. Spencer 1:f5ac63519541 32 *
Michael J. Spencer 1:f5ac63519541 33 * Program functions:
Michael J. Spencer 1:f5ac63519541 34 * 1) Read config file
Michael J. Spencer 1:f5ac63519541 35 * 2) Enable TCP/IP stack (Fixed ip or DHCP)
Michael J. Spencer 1:f5ac63519541 36 * 3) Instantiate tcp/ip port and accept connections
Michael J. Spencer 1:f5ac63519541 37 * 4) Show menus, peform user actions
Michael J. Spencer 1:f5ac63519541 38 * 5) Controll laser
Michael J. Spencer 1:f5ac63519541 39 * 6) Controll motion
Michael J. Spencer 1:f5ac63519541 40 * 7) Set and read IO, check status (e.g. interlocks)
Michael J. Spencer 1:f5ac63519541 41 *
Michael J. Spencer 1:f5ac63519541 42 */
Michael J. Spencer 1:f5ac63519541 43
Michael J. Spencer 1:f5ac63519541 44 // uncomment this to get debugging output in file parser
Michael J. Spencer 1:f5ac63519541 45 // #define READ_FILE_DEBUG
Michael J. Spencer 1:f5ac63519541 46 // #define READ_FILE_DEBUG_VERBOSE
Michael J. Spencer 1:f5ac63519541 47
Michael J. Spencer 1:f5ac63519541 48 #include "global.h"
Michael J. Spencer 1:f5ac63519541 49 #include "ConfigFile.h"
Michael J. Spencer 1:f5ac63519541 50 #include "EthConfig.h"
Michael J. Spencer 1:f5ac63519541 51 #include "TFTPServer.h"
Michael J. Spencer 1:f5ac63519541 52 #include "LaosMenu.h"
Michael J. Spencer 1:f5ac63519541 53 #include "LaosMotion.h"
Michael J. Spencer 1:f5ac63519541 54 #include "SDFileSystem.h"
Michael J. Spencer 1:f5ac63519541 55 #include "laosfilesystem.h"
Michael J. Spencer 1:f5ac63519541 56
Michael J. Spencer 1:f5ac63519541 57 // MBED blue status leds
Michael J. Spencer 1:f5ac63519541 58 DigitalOut led1(LED1);
Michael J. Spencer 1:f5ac63519541 59 DigitalOut led2(LED2);
Michael J. Spencer 1:f5ac63519541 60 DigitalOut led3(LED3);
Michael J. Spencer 1:f5ac63519541 61 DigitalOut led4(LED4);
Michael J. Spencer 1:f5ac63519541 62
Michael J. Spencer 1:f5ac63519541 63 // Status and communication
Michael J. Spencer 1:f5ac63519541 64 DigitalOut eth_link(p29); // green
Michael J. Spencer 1:f5ac63519541 65 DigitalOut eth_speed(p30); // yellow
Michael J. Spencer 1:f5ac63519541 66 EthernetNetIf *eth; // Ethernet, tcp/ip
Michael J. Spencer 1:f5ac63519541 67
Michael J. Spencer 1:f5ac63519541 68 // Filesystems
Michael J. Spencer 1:f5ac63519541 69 LocalFileSystem local("local"); //File System
Michael J. Spencer 1:f5ac63519541 70 LaosFileSystem sd(p11, p12, p13, p14, "sd");
Michael J. Spencer 1:f5ac63519541 71
Michael J. Spencer 1:f5ac63519541 72 // Laos objects
Michael J. Spencer 1:f5ac63519541 73 LaosDisplay *dsp;
Michael J. Spencer 1:f5ac63519541 74 LaosMenu *mnu;
Michael J. Spencer 1:f5ac63519541 75 TFTPServer *srv;
Michael J. Spencer 1:f5ac63519541 76 LaosMotion *mot;
Michael J. Spencer 1:f5ac63519541 77 Timer systime;
Michael J. Spencer 1:f5ac63519541 78
Michael J. Spencer 1:f5ac63519541 79 // Config
Michael J. Spencer 1:f5ac63519541 80 GlobalConfig *cfg;
Michael J. Spencer 1:f5ac63519541 81
Michael J. Spencer 1:f5ac63519541 82 // Protos
Michael J. Spencer 1:f5ac63519541 83 void GetFile(void);
Michael J. Spencer 1:f5ac63519541 84 void main_nodisplay();
Michael J. Spencer 1:f5ac63519541 85 void main_menu();
Michael J. Spencer 1:f5ac63519541 86
Michael J. Spencer 1:f5ac63519541 87 // for debugging:
Michael J. Spencer 1:f5ac63519541 88 extern void plan_get_current_position_xyz(float *x, float *y, float *z);
Michael J. Spencer 1:f5ac63519541 89 extern PwmOut pwm;
Michael J. Spencer 1:f5ac63519541 90 extern "C" void mbed_reset();
Michael J. Spencer 1:f5ac63519541 91
Michael J. Spencer 1:f5ac63519541 92 /**
Michael J. Spencer 1:f5ac63519541 93 *** Main function
Michael J. Spencer 1:f5ac63519541 94 **/
Michael J. Spencer 1:f5ac63519541 95 int main()
Michael J. Spencer 1:f5ac63519541 96 {
Michael J. Spencer 1:f5ac63519541 97 systime.start();
Michael J. Spencer 1:f5ac63519541 98 //float x, y, z;
Michael J. Spencer 1:f5ac63519541 99 eth_speed = 1;
Michael J. Spencer 1:f5ac63519541 100
Michael J. Spencer 1:f5ac63519541 101 dsp = new LaosDisplay();
Michael J. Spencer 1:f5ac63519541 102 printf( VERSION_STRING "...\nBOOT...\n" );
Michael J. Spencer 1:f5ac63519541 103 mnu = new LaosMenu(dsp);
Michael J. Spencer 1:f5ac63519541 104 eth_speed=0;
Michael J. Spencer 1:f5ac63519541 105
Michael J. Spencer 1:f5ac63519541 106 printf("TEST SD...\n");
Michael J. Spencer 1:f5ac63519541 107 FILE *fp = sd.openfile("test.txt", "wb");
Michael J. Spencer 1:f5ac63519541 108 if ( fp == NULL )
Michael J. Spencer 1:f5ac63519541 109 {
Michael J. Spencer 1:f5ac63519541 110 mnu->SetScreen("SD NOT READY!");
Michael J. Spencer 1:f5ac63519541 111 wait(2.0);
Michael J. Spencer 1:f5ac63519541 112 mbed_reset();
Michael J. Spencer 1:f5ac63519541 113 }
Michael J. Spencer 1:f5ac63519541 114 else
Michael J. Spencer 1:f5ac63519541 115 {
Michael J. Spencer 1:f5ac63519541 116 printf("SD: READY...\n");
Michael J. Spencer 1:f5ac63519541 117 fclose(fp);
Michael J. Spencer 1:f5ac63519541 118 removefile("test.txt");
Michael J. Spencer 1:f5ac63519541 119 }
Michael J. Spencer 1:f5ac63519541 120
Michael J. Spencer 1:f5ac63519541 121 // See if there's a .bin file on the SD
Michael J. Spencer 1:f5ac63519541 122 // if so, put it on the MBED and reboot
Michael J. Spencer 1:f5ac63519541 123 if (SDcheckFirmware()) mbed_reset();
Michael J. Spencer 1:f5ac63519541 124
Michael J. Spencer 1:f5ac63519541 125 mnu->SetScreen(VERSION_STRING);
Michael J. Spencer 1:f5ac63519541 126 printf("START...\n");
Michael J. Spencer 1:f5ac63519541 127 cfg = new GlobalConfig("config.txt");
Michael J. Spencer 1:f5ac63519541 128 mnu->SetScreen("CONFIG OK....");
Michael J. Spencer 1:f5ac63519541 129 printf("CONFIG OK...\n");
Michael J. Spencer 1:f5ac63519541 130 if (!cfg->nodisplay)
Michael J. Spencer 1:f5ac63519541 131 dsp->testI2C();
Michael J. Spencer 1:f5ac63519541 132
Michael J. Spencer 1:f5ac63519541 133 printf("MOTION...\n");
Michael J. Spencer 1:f5ac63519541 134 mot = new LaosMotion();
Michael J. Spencer 1:f5ac63519541 135
Michael J. Spencer 1:f5ac63519541 136 eth = EthConfig();
Michael J. Spencer 1:f5ac63519541 137 eth_speed=1;
Michael J. Spencer 1:f5ac63519541 138
Michael J. Spencer 1:f5ac63519541 139 printf("SERVER...\n");
Michael J. Spencer 1:f5ac63519541 140 srv = new TFTPServer("/sd", cfg->port);
Michael J. Spencer 1:f5ac63519541 141 mnu->SetScreen("SERVER OK....");
Michael J. Spencer 1:f5ac63519541 142 wait(0.5);
Michael J. Spencer 1:f5ac63519541 143 mnu->SetScreen(9); // IP
Michael J. Spencer 1:f5ac63519541 144 wait(1.0);
Michael J. Spencer 1:f5ac63519541 145
Michael J. Spencer 1:f5ac63519541 146 printf("RUN...\n");
Michael J. Spencer 1:f5ac63519541 147
Michael J. Spencer 1:f5ac63519541 148 // Wait for key, and then home
Michael J. Spencer 1:f5ac63519541 149
Michael J. Spencer 1:f5ac63519541 150 if ( cfg->autohome )
Michael J. Spencer 1:f5ac63519541 151 {
Michael J. Spencer 1:f5ac63519541 152 printf("WAIT FOR COVER...\n");
Michael J. Spencer 1:f5ac63519541 153 wait(1);
Michael J. Spencer 1:f5ac63519541 154
Michael J. Spencer 1:f5ac63519541 155
Michael J. Spencer 1:f5ac63519541 156 // Start homing
Michael J. Spencer 1:f5ac63519541 157 mnu->SetScreen("WAIT FOR COVER....");
Michael J. Spencer 1:f5ac63519541 158 //if ( cfg->waitforstart )
Michael J. Spencer 1:f5ac63519541 159 while ( !mot->isStart() );
Michael J. Spencer 1:f5ac63519541 160 mnu->SetScreen("HOME....");
Michael J. Spencer 1:f5ac63519541 161 printf("HOME...\n");
Michael J. Spencer 1:f5ac63519541 162
Michael J. Spencer 1:f5ac63519541 163 mot->home(cfg->xhome,cfg->yhome, cfg->zhome);
Michael J. Spencer 1:f5ac63519541 164 // if ( !mot->isHome ) exit(1);
Michael J. Spencer 1:f5ac63519541 165 printf("HOME DONE. (%d,%d, %d)\n",cfg->xhome,cfg->yhome,cfg->zhome);
Michael J. Spencer 1:f5ac63519541 166 }
Michael J. Spencer 1:f5ac63519541 167 else
Michael J. Spencer 1:f5ac63519541 168 printf("Homing skipped: %d\n", cfg->autohome);
Michael J. Spencer 1:f5ac63519541 169
Michael J. Spencer 1:f5ac63519541 170 // clean sd card?
Michael J. Spencer 1:f5ac63519541 171 if (cfg->cleandir) cleandir();
Michael J. Spencer 1:f5ac63519541 172 mnu->SetScreen(NULL);
Michael J. Spencer 1:f5ac63519541 173
Michael J. Spencer 1:f5ac63519541 174 if (cfg->nodisplay) {
Michael J. Spencer 1:f5ac63519541 175 printf("No display set\n\r");
Michael J. Spencer 1:f5ac63519541 176 main_nodisplay();
Michael J. Spencer 1:f5ac63519541 177 } else {
Michael J. Spencer 1:f5ac63519541 178 printf("Entering display\n\r");
Michael J. Spencer 1:f5ac63519541 179 main_menu();
Michael J. Spencer 1:f5ac63519541 180 }
Michael J. Spencer 1:f5ac63519541 181 }
Michael J. Spencer 1:f5ac63519541 182
Michael J. Spencer 1:f5ac63519541 183 void main_nodisplay() {
Michael J. Spencer 1:f5ac63519541 184 float x, y, z = 0;
Michael J. Spencer 1:f5ac63519541 185
Michael J. Spencer 1:f5ac63519541 186 // main loop
Michael J. Spencer 1:f5ac63519541 187 while(1)
Michael J. Spencer 1:f5ac63519541 188 {
Michael J. Spencer 1:f5ac63519541 189 led1=led2=led3=led4=0;
Michael J. Spencer 1:f5ac63519541 190 mnu->SetScreen("Wait for file ...");
Michael J. Spencer 1:f5ac63519541 191 while (srv->State() == listen)
Michael J. Spencer 1:f5ac63519541 192 Net::poll();
Michael J. Spencer 1:f5ac63519541 193 GetFile();
Michael J. Spencer 1:f5ac63519541 194 mot->reset();
Michael J. Spencer 1:f5ac63519541 195 plan_get_current_position_xyz(&x, &y, &z);
Michael J. Spencer 1:f5ac63519541 196 printf("%f %f\n", x,y);
Michael J. Spencer 1:f5ac63519541 197 mnu->SetScreen("Laser BUSY...");
Michael J. Spencer 1:f5ac63519541 198
Michael J. Spencer 1:f5ac63519541 199 char name[32];
Michael J. Spencer 1:f5ac63519541 200 srv->getFilename(name);
Michael J. Spencer 1:f5ac63519541 201 printf("Now processing file: '%s'\n\r", name);
Michael J. Spencer 1:f5ac63519541 202 FILE *in = sd.openfile(name, "r");
Michael J. Spencer 1:f5ac63519541 203 while (!feof(in))
Michael J. Spencer 1:f5ac63519541 204 {
Michael J. Spencer 1:f5ac63519541 205 while (!mot->ready() );
Michael J. Spencer 1:f5ac63519541 206 mot->write(readint(in));
Michael J. Spencer 1:f5ac63519541 207 }
Michael J. Spencer 1:f5ac63519541 208 fclose(in);
Michael J. Spencer 1:f5ac63519541 209 removefile(name);
Michael J. Spencer 1:f5ac63519541 210 // done
Michael J. Spencer 1:f5ac63519541 211 printf("DONE!...\n");
Michael J. Spencer 1:f5ac63519541 212 while (!mot->ready() );
Michael J. Spencer 1:f5ac63519541 213 mot->moveTo(cfg->xrest, cfg->yrest, cfg->zrest);
Michael J. Spencer 1:f5ac63519541 214 }
Michael J. Spencer 1:f5ac63519541 215 }
Michael J. Spencer 1:f5ac63519541 216
Michael J. Spencer 1:f5ac63519541 217
Michael J. Spencer 1:f5ac63519541 218 void main_menu() {
Michael J. Spencer 1:f5ac63519541 219 // main loop
Michael J. Spencer 1:f5ac63519541 220 while (1) {
Michael J. Spencer 1:f5ac63519541 221 led1=led2=led3=led4=0;
Michael J. Spencer 1:f5ac63519541 222
Michael J. Spencer 1:f5ac63519541 223 mnu->SetScreen(1);
Michael J. Spencer 1:f5ac63519541 224 while (1) {;
Michael J. Spencer 1:f5ac63519541 225 mnu->Handle();
Michael J. Spencer 1:f5ac63519541 226 Net::poll();
Michael J. Spencer 1:f5ac63519541 227 if (srv->State() != listen) {
Michael J. Spencer 1:f5ac63519541 228 GetFile();
Michael J. Spencer 1:f5ac63519541 229 char myname[32];
Michael J. Spencer 1:f5ac63519541 230 srv->getFilename(myname);
Michael J. Spencer 1:f5ac63519541 231 if (isFirmware(myname)) {
Michael J. Spencer 1:f5ac63519541 232 installFirmware(myname);
Michael J. Spencer 1:f5ac63519541 233 mnu->SetScreen(1);
Michael J. Spencer 1:f5ac63519541 234 } else {
Michael J. Spencer 1:f5ac63519541 235 if (strcmp("config.txt", myname) == 0) {
Michael J. Spencer 1:f5ac63519541 236 // it's a config file!
Michael J. Spencer 1:f5ac63519541 237 mnu->SetScreen(1);
Michael J. Spencer 1:f5ac63519541 238 } else {
Michael J. Spencer 1:f5ac63519541 239 if (isLaosFile(myname)) {
Michael J. Spencer 1:f5ac63519541 240 mnu->SetFileName(myname);
Michael J. Spencer 1:f5ac63519541 241 mnu->SetScreen(2);
Michael J. Spencer 1:f5ac63519541 242 }
Michael J. Spencer 1:f5ac63519541 243 }
Michael J. Spencer 1:f5ac63519541 244 }
Michael J. Spencer 1:f5ac63519541 245 }
Michael J. Spencer 1:f5ac63519541 246 }
Michael J. Spencer 1:f5ac63519541 247 }
Michael J. Spencer 1:f5ac63519541 248 }
Michael J. Spencer 1:f5ac63519541 249
Michael J. Spencer 1:f5ac63519541 250 /**
Michael J. Spencer 1:f5ac63519541 251 *** Get file from network and save on SDcard
Michael J. Spencer 1:f5ac63519541 252 *** Ascii data is read from the network, and saved on the SD card in binary int32 format
Michael J. Spencer 1:f5ac63519541 253 **/
Michael J. Spencer 1:f5ac63519541 254 void GetFile(void) {
Michael J. Spencer 1:f5ac63519541 255 Timer t;
Michael J. Spencer 1:f5ac63519541 256 printf("Main::GetFile()\n\r" );
Michael J. Spencer 1:f5ac63519541 257 mnu->SetScreen("Receive file...");
Michael J. Spencer 1:f5ac63519541 258 t.start();
Michael J. Spencer 1:f5ac63519541 259 while (srv->State() != listen) {
Michael J. Spencer 1:f5ac63519541 260 Net::poll();
Michael J. Spencer 1:f5ac63519541 261 switch ((int)t.read()) {
Michael J. Spencer 1:f5ac63519541 262 case 1:
Michael J. Spencer 1:f5ac63519541 263 mnu->SetScreen("Receive file");
Michael J. Spencer 1:f5ac63519541 264 break;
Michael J. Spencer 1:f5ac63519541 265 case 2:
Michael J. Spencer 1:f5ac63519541 266 mnu->SetScreen("Receive file.");
Michael J. Spencer 1:f5ac63519541 267 break;
Michael J. Spencer 1:f5ac63519541 268 case 3:
Michael J. Spencer 1:f5ac63519541 269 mnu->SetScreen("Receive file..");
Michael J. Spencer 1:f5ac63519541 270 break;
Michael J. Spencer 1:f5ac63519541 271 case 4:
Michael J. Spencer 1:f5ac63519541 272 mnu->SetScreen("Receive file...");
Michael J. Spencer 1:f5ac63519541 273 t.reset();
Michael J. Spencer 1:f5ac63519541 274 break;
Michael J. Spencer 1:f5ac63519541 275 }
Michael J. Spencer 1:f5ac63519541 276 }
Michael J. Spencer 1:f5ac63519541 277 mnu->SetScreen("Received file.");
Michael J. Spencer 1:f5ac63519541 278 } // GetFile
Michael J. Spencer 1:f5ac63519541 279