This is the firmware for the LaOS - Laser Open Source project. You can use it to drive a laser cutter. For hardware and more information, look at our wiki: http://wiki.laoslaser.org

Dependencies:   EthernetNetIf mbed

Committer:
fablabtruck
Date:
Fri Jun 08 09:26:40 2012 +0000
Revision:
0:3852426a5068
svn revision 379

Who changed what in which revision?

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