Michael Spencer / Mbed 2 deprecated LaOS

Dependencies:   mbed

Committer:
Michael J. Spencer
Date:
Sat Mar 08 17:55:59 2014 -0800
Revision:
2:609dd3a73f33
Parent:
1:f5ac63519541
Update.

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 2:609dd3a73f33 66 EthernetInterface *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 main_nodisplay();
Michael J. Spencer 1:f5ac63519541 84 void main_menu();
Michael J. Spencer 1:f5ac63519541 85
Michael J. Spencer 1:f5ac63519541 86 // for debugging:
Michael J. Spencer 1:f5ac63519541 87 extern void plan_get_current_position_xyz(float *x, float *y, float *z);
Michael J. Spencer 1:f5ac63519541 88 extern PwmOut pwm;
Michael J. Spencer 1:f5ac63519541 89 extern "C" void mbed_reset();
Michael J. Spencer 1:f5ac63519541 90
Michael J. Spencer 1:f5ac63519541 91 /**
Michael J. Spencer 1:f5ac63519541 92 *** Main function
Michael J. Spencer 1:f5ac63519541 93 **/
Michael J. Spencer 1:f5ac63519541 94 int main()
Michael J. Spencer 1:f5ac63519541 95 {
Michael J. Spencer 1:f5ac63519541 96 systime.start();
Michael J. Spencer 1:f5ac63519541 97 //float x, y, z;
Michael J. Spencer 1:f5ac63519541 98 eth_speed = 1;
Michael J. Spencer 1:f5ac63519541 99
Michael J. Spencer 1:f5ac63519541 100 dsp = new LaosDisplay();
Michael J. Spencer 1:f5ac63519541 101 printf( VERSION_STRING "...\nBOOT...\n" );
Michael J. Spencer 1:f5ac63519541 102 mnu = new LaosMenu(dsp);
Michael J. Spencer 1:f5ac63519541 103 eth_speed=0;
Michael J. Spencer 1:f5ac63519541 104
Michael J. Spencer 1:f5ac63519541 105 printf("TEST SD...\n");
Michael J. Spencer 1:f5ac63519541 106 FILE *fp = sd.openfile("test.txt", "wb");
Michael J. Spencer 1:f5ac63519541 107 if ( fp == NULL )
Michael J. Spencer 1:f5ac63519541 108 {
Michael J. Spencer 1:f5ac63519541 109 mnu->SetScreen("SD NOT READY!");
Michael J. Spencer 1:f5ac63519541 110 wait(2.0);
Michael J. Spencer 1:f5ac63519541 111 mbed_reset();
Michael J. Spencer 1:f5ac63519541 112 }
Michael J. Spencer 1:f5ac63519541 113 else
Michael J. Spencer 1:f5ac63519541 114 {
Michael J. Spencer 1:f5ac63519541 115 printf("SD: READY...\n");
Michael J. Spencer 1:f5ac63519541 116 fclose(fp);
Michael J. Spencer 1:f5ac63519541 117 removefile("test.txt");
Michael J. Spencer 1:f5ac63519541 118 }
Michael J. Spencer 1:f5ac63519541 119
Michael J. Spencer 1:f5ac63519541 120 // See if there's a .bin file on the SD
Michael J. Spencer 1:f5ac63519541 121 // if so, put it on the MBED and reboot
Michael J. Spencer 1:f5ac63519541 122 if (SDcheckFirmware()) mbed_reset();
Michael J. Spencer 1:f5ac63519541 123
Michael J. Spencer 1:f5ac63519541 124 mnu->SetScreen(VERSION_STRING);
Michael J. Spencer 1:f5ac63519541 125 printf("START...\n");
Michael J. Spencer 1:f5ac63519541 126 cfg = new GlobalConfig("config.txt");
Michael J. Spencer 1:f5ac63519541 127 mnu->SetScreen("CONFIG OK....");
Michael J. Spencer 1:f5ac63519541 128 printf("CONFIG OK...\n");
Michael J. Spencer 1:f5ac63519541 129 if (!cfg->nodisplay)
Michael J. Spencer 1:f5ac63519541 130 dsp->testI2C();
Michael J. Spencer 1:f5ac63519541 131
Michael J. Spencer 1:f5ac63519541 132 printf("MOTION...\n");
Michael J. Spencer 1:f5ac63519541 133 mot = new LaosMotion();
Michael J. Spencer 1:f5ac63519541 134
Michael J. Spencer 1:f5ac63519541 135 eth = EthConfig();
Michael J. Spencer 1:f5ac63519541 136 eth_speed=1;
Michael J. Spencer 1:f5ac63519541 137
Michael J. Spencer 1:f5ac63519541 138 printf("SERVER...\n");
Michael J. Spencer 1:f5ac63519541 139 srv = new TFTPServer("/sd", cfg->port);
Michael J. Spencer 1:f5ac63519541 140 mnu->SetScreen("SERVER OK....");
Michael J. Spencer 1:f5ac63519541 141 wait(0.5);
Michael J. Spencer 1:f5ac63519541 142 mnu->SetScreen(9); // IP
Michael J. Spencer 1:f5ac63519541 143 wait(1.0);
Michael J. Spencer 1:f5ac63519541 144
Michael J. Spencer 1:f5ac63519541 145 printf("RUN...\n");
Michael J. Spencer 1:f5ac63519541 146
Michael J. Spencer 1:f5ac63519541 147 // Wait for key, and then home
Michael J. Spencer 1:f5ac63519541 148
Michael J. Spencer 1:f5ac63519541 149 if ( cfg->autohome )
Michael J. Spencer 1:f5ac63519541 150 {
Michael J. Spencer 1:f5ac63519541 151 printf("WAIT FOR COVER...\n");
Michael J. Spencer 1:f5ac63519541 152 wait(1);
Michael J. Spencer 1:f5ac63519541 153
Michael J. Spencer 1:f5ac63519541 154
Michael J. Spencer 1:f5ac63519541 155 // Start homing
Michael J. Spencer 1:f5ac63519541 156 mnu->SetScreen("WAIT FOR COVER....");
Michael J. Spencer 1:f5ac63519541 157 //if ( cfg->waitforstart )
Michael J. Spencer 1:f5ac63519541 158 while ( !mot->isStart() );
Michael J. Spencer 1:f5ac63519541 159 mnu->SetScreen("HOME....");
Michael J. Spencer 1:f5ac63519541 160 printf("HOME...\n");
Michael J. Spencer 1:f5ac63519541 161
Michael J. Spencer 1:f5ac63519541 162 mot->home(cfg->xhome,cfg->yhome, cfg->zhome);
Michael J. Spencer 1:f5ac63519541 163 // if ( !mot->isHome ) exit(1);
Michael J. Spencer 1:f5ac63519541 164 printf("HOME DONE. (%d,%d, %d)\n",cfg->xhome,cfg->yhome,cfg->zhome);
Michael J. Spencer 1:f5ac63519541 165 }
Michael J. Spencer 1:f5ac63519541 166 else
Michael J. Spencer 1:f5ac63519541 167 printf("Homing skipped: %d\n", cfg->autohome);
Michael J. Spencer 1:f5ac63519541 168
Michael J. Spencer 1:f5ac63519541 169 // clean sd card?
Michael J. Spencer 1:f5ac63519541 170 if (cfg->cleandir) cleandir();
Michael J. Spencer 1:f5ac63519541 171 mnu->SetScreen(NULL);
Michael J. Spencer 1:f5ac63519541 172
Michael J. Spencer 1:f5ac63519541 173 if (cfg->nodisplay) {
Michael J. Spencer 1:f5ac63519541 174 printf("No display set\n\r");
Michael J. Spencer 1:f5ac63519541 175 main_nodisplay();
Michael J. Spencer 1:f5ac63519541 176 } else {
Michael J. Spencer 1:f5ac63519541 177 printf("Entering display\n\r");
Michael J. Spencer 1:f5ac63519541 178 main_menu();
Michael J. Spencer 1:f5ac63519541 179 }
Michael J. Spencer 1:f5ac63519541 180 }
Michael J. Spencer 1:f5ac63519541 181
Michael J. Spencer 1:f5ac63519541 182 void main_nodisplay() {
Michael J. Spencer 1:f5ac63519541 183 float x, y, z = 0;
Michael J. Spencer 2:609dd3a73f33 184 led1=led2=led3=led4=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 2:609dd3a73f33 189 int filecnt = srv->fileCnt();
Michael J. Spencer 1:f5ac63519541 190 mnu->SetScreen("Wait for file ...");
Michael J. Spencer 1:f5ac63519541 191 while (srv->State() == listen)
Michael J. Spencer 2:609dd3a73f33 192 srv->poll();
Michael J. Spencer 2:609dd3a73f33 193 if (srv->State() != listen) {
Michael J. Spencer 2:609dd3a73f33 194 mnu->SetScreen("Receive file");
Michael J. Spencer 2:609dd3a73f33 195 while (srv->State() != listen) srv->poll();
Michael J. Spencer 2:609dd3a73f33 196 }
Michael J. Spencer 2:609dd3a73f33 197 if (filecnt < srv->fileCnt()) {
Michael J. Spencer 2:609dd3a73f33 198 mot->reset();
Michael J. Spencer 2:609dd3a73f33 199 plan_get_current_position_xyz(&x, &y, &z);
Michael J. Spencer 2:609dd3a73f33 200 printf("%f %f\n", x,y);
Michael J. Spencer 2:609dd3a73f33 201 mnu->SetScreen("Laser BUSY...");
Michael J. Spencer 1:f5ac63519541 202
Michael J. Spencer 2:609dd3a73f33 203 char name[32];
Michael J. Spencer 2:609dd3a73f33 204 srv->getFilename(name);
Michael J. Spencer 2:609dd3a73f33 205 printf("Now processing file: '%s'\n\r", name);
Michael J. Spencer 2:609dd3a73f33 206 FILE *in = sd.openfile(name, "r");
Michael J. Spencer 2:609dd3a73f33 207 while (!feof(in))
Michael J. Spencer 2:609dd3a73f33 208 {
Michael J. Spencer 2:609dd3a73f33 209 while (!mot->ready() );
Michael J. Spencer 2:609dd3a73f33 210 mot->write(readint(in));
Michael J. Spencer 2:609dd3a73f33 211 }
Michael J. Spencer 2:609dd3a73f33 212 fclose(in);
Michael J. Spencer 2:609dd3a73f33 213 removefile(name);
Michael J. Spencer 2:609dd3a73f33 214 // done
Michael J. Spencer 2:609dd3a73f33 215 printf("DONE!...\n");
Michael J. Spencer 2:609dd3a73f33 216 while (!mot->ready() );
Michael J. Spencer 2:609dd3a73f33 217 mot->moveTo(cfg->xrest, cfg->yrest, cfg->zrest);
Michael J. Spencer 1:f5ac63519541 218 }
Michael J. Spencer 1:f5ac63519541 219 }
Michael J. Spencer 1:f5ac63519541 220 }
Michael J. Spencer 1:f5ac63519541 221
Michael J. Spencer 1:f5ac63519541 222 void main_menu() {
Michael J. Spencer 1:f5ac63519541 223 // main loop
Michael J. Spencer 2:609dd3a73f33 224 led1=led2=led3=led4=0;
Michael J. Spencer 2:609dd3a73f33 225
Michael J. Spencer 2:609dd3a73f33 226 mnu->SetScreen(1);
Michael J. Spencer 1:f5ac63519541 227 while (1) {
Michael J. Spencer 2:609dd3a73f33 228 int filecnt = srv->fileCnt();
Michael J. Spencer 2:609dd3a73f33 229 mnu->Handle();
Michael J. Spencer 2:609dd3a73f33 230 srv->poll();
Michael J. Spencer 2:609dd3a73f33 231 if (srv->State() != listen) {
Michael J. Spencer 2:609dd3a73f33 232 mnu->SetScreen("Receive file");
Michael J. Spencer 2:609dd3a73f33 233 while (srv->State() != listen) srv->poll();
Michael J. Spencer 2:609dd3a73f33 234 }
Michael J. Spencer 2:609dd3a73f33 235 if (filecnt < srv->fileCnt()) {
Michael J. Spencer 2:609dd3a73f33 236 char myname[32];
Michael J. Spencer 2:609dd3a73f33 237 srv->getFilename(myname);
Michael J. Spencer 2:609dd3a73f33 238 if (isFirmware(myname)) {
Michael J. Spencer 2:609dd3a73f33 239 installFirmware(myname);
Michael J. Spencer 1:f5ac63519541 240 mnu->SetScreen(1);
Michael J. Spencer 2:609dd3a73f33 241 } else {
Michael J. Spencer 2:609dd3a73f33 242 if (strcmp("config.txt", myname) == 0) {
Michael J. Spencer 2:609dd3a73f33 243 // it's a config file!
Michael J. Spencer 2:609dd3a73f33 244 mnu->SetScreen(1);
Michael J. Spencer 2:609dd3a73f33 245 } else {
Michael J. Spencer 2:609dd3a73f33 246 if (isLaosFile(myname)) {
Michael J. Spencer 2:609dd3a73f33 247 mnu->SetFileName(myname);
Michael J. Spencer 2:609dd3a73f33 248 mnu->SetScreen(2);
Michael J. Spencer 2:609dd3a73f33 249 }
Michael J. Spencer 1:f5ac63519541 250 }
Michael J. Spencer 2:609dd3a73f33 251 }
Michael J. Spencer 2:609dd3a73f33 252 }
Michael J. Spencer 2:609dd3a73f33 253 }
Michael J. Spencer 1:f5ac63519541 254 }