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

main.cpp

Committer:
fablabtruck
Date:
2012-06-08
Revision:
0:3852426a5068

File content as of revision 0:3852426a5068:

/*
 * main.cpp
 * Laos Controller, main function
 *
 * Copyright (c) 2011 Peter Brier & Jaap Vermaas
 *
 *   This file is part of the LaOS project (see: http://wiki.laoslaser.org)
 *
 *   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/>.
 *
 * This program consists of a few parts:
 *
 * ConfigFile   Read configuration files
 * EthConfig    Initialize an ethernet stack, based on a configuration file (includes link status monitoring)
 * LaosDisplay  User interface functions (read keys, display text and menus on LCD)
 * LaosMenu     User interface stuctures (menu navigation)
 * LaosServer   TCP/IP server, accept connections read/write data
 * LaosMotion   Motion control functions (X,Y,Z motion, homing)
 * LaosIO       Input/Output functions
 * LaosFile     File based jobs (read/write/delete)
 *
 * Program functions:
 * 1) Read config file
 * 2) Enable TCP/IP stack (Fixed ip or DHCP)
 * 3) Instantiate tcp/ip port and accept connections
 * 4) Show menus, peform user actions
 * 5) Controll laser
 * 6) Controll motion
 * 7) Set and read IO, check status (e.g. interlocks)
 *
 */
#include "global.h"
#include "ConfigFile.h"
#include "EthConfig.h"
#include "TFTPServer.h"
#include "LaosMenu.h"
#include "LaosMotion.h"
#include "SDFileSystem.h"
#include "laosfilesystem.h"

// MBED blue status leds
DigitalOut led1(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);

// Status and communication
DigitalOut eth_link(p29); // green
DigitalOut eth_speed(p30); // yellow
EthernetNetIf *eth; // Ethernet, tcp/ip

// Filesystems
LocalFileSystem local("local");   //File System
LaosFileSystem sd(p11, p12, p13, p14, "sd");

// Laos objects
LaosDisplay *dsp;
LaosMenu *mnu;
TFTPServer *srv;
LaosMotion *mot;
Timer systime;

// Config
GlobalConfig *cfg;

// Protos
void GetFile(void);
void main_nodisplay();
void main_menu();

// for debugging:
extern void plan_get_current_position_xyz(float *x, float *y, float *z);
extern PwmOut pwm;
extern "C" void mbed_reset();

/**
*** Main function
**/
int main() 
{
  systime.start();
  //float x, y, z;
  eth_speed = 1;
  
  dsp = new LaosDisplay();
  printf( VERSION_STRING "...\nBOOT...\n" ); 
  mnu = new LaosMenu(dsp);
  eth_speed=0;

 printf("TEST SD...\n"); 
  FILE *fp = sd.openfile("test.txt", "wb");
  if ( fp == NULL )
  {
    mnu->SetScreen("SD NOT READY!"); 
    wait(2.0);
    mbed_reset();
  }
  else
  {
    printf("SD: READY...\n");
    fclose(fp);
    removefile("test.txt");
  }
  
  // See if there's a .bin file on the SD
  // if so, put it on the MBED and reboot
  if (SDcheckFirmware()) mbed_reset();
  
  mnu->SetScreen(VERSION_STRING);
  printf("START...\n");
  cfg =  new GlobalConfig("config.txt");
  mnu->SetScreen("CONFIG OK...."); 
  printf("CONFIG OK...\n");
  if (!cfg->nodisplay)
    dsp->testI2C();
  
  printf("MOTION...\n"); 
  mot = new LaosMotion();
    
  eth = EthConfig();
  eth_speed=1;
      
  printf("SERVER...\n");
  srv = new TFTPServer("/sd", cfg->port);
  mnu->SetScreen("SERVER OK...."); 
  wait(0.5);
  mnu->SetScreen(9); // IP
  wait(1.0);
  
  printf("RUN...\n");
  
  // Wait for key, and then home
  
  if ( cfg->autohome )
  {
    printf("HOME...\n");
    wait(1);
  
    mnu->SetScreen("HOME....");
  
  // Start homing
    while ( !mot->isStart() );
    mot->home(cfg->xhome,cfg->yhome, cfg->zhome);
    // if ( !mot->isHome ) exit(1);
    printf("HOME DONE. (%d,%d, %d)\n",cfg->xhome,cfg->yhome,cfg->zhome);
  }
  else
    printf("Homing skipped: %d\n", cfg->autohome);

  // clean sd card?
  if (cfg->cleandir) cleandir();
  mnu->SetScreen(NULL);  

  if (cfg->nodisplay) {
    printf("No display set\n\r");
    main_nodisplay();
  } else {
    printf("Entering display\n\r");
    main_menu();
  }
}

void main_nodisplay() {
  float x, y, z = 0;
  
  // main loop  
   while(1) 
  {  
    led1=led2=led3=led4=0;
    mnu->SetScreen("Wait for file ...");
    while (srv->State() == listen)
        Net::poll();
    GetFile();
    
    plan_get_current_position_xyz(&x, &y, &z);
     printf("%f %f\n", x,y); 
    mnu->SetScreen("Laser BUSY..."); 
    
    char name[32];
    srv->getFilename(name);
    printf("Now processing file: '%s'\n\r", name);
    FILE *in = sd.openfile(name, "r");
    while (!feof(in))
    { 
      while (!mot->ready() );
      mot->write(readint(in));
    }
    fclose(in);
    removefile(name);
    // done
    printf("DONE!...\n");
    mot->moveTo(cfg->xrest, cfg->yrest, cfg->zrest);
  }
}


void main_menu() {
  // main loop  
  while (1) {
        led1=led2=led3=led4=0;
                
        mnu->SetScreen(1);
        while (1) {;
            mnu->Handle();
            Net::poll();
            if (srv->State() != listen) {
                GetFile();
                char myname[32];
                srv->getFilename(myname);
                if (isFirmware(myname)) {
                    installFirmware(myname);
                    mnu->SetScreen(1);
                } else {
                    if (strcmp("config.txt", myname) == 0) {
                        // it's a config file!
                        mnu->SetScreen(1);
                    } else {
                        if (isLaosFile(myname)) {
                            mnu->SetFileName(myname);
                            mnu->SetScreen(2);
                        }
                    }
                }
            }           
        }
    }
}

/**
*** Get file from network and save on SDcard
*** Ascii data is read from the network, and saved on the SD card in binary int32 format
**/
void GetFile(void) {
   Timer t;
   printf("Main::GetFile()\n\r" );
   mnu->SetScreen("Receive file...");
   t.start();
   while (srv->State() != listen) {
     Net::poll();
     switch ((int)t.read()) {
        case 1:
            mnu->SetScreen("Receive file");
            break;
        case 2:
            mnu->SetScreen("Receive file.");
            break;
        case 3:
            mnu->SetScreen("Receive file..");
            break;
        case 4:
            mnu->SetScreen("Receive file...");
            t.reset();
            break;
     }
   }
   mnu->SetScreen("Received file.");
} // GetFile