MMEx with SPI Slave to allow legacy devices to communicate with modern media such as USB, SD cards, the internet and all of the mbed\'s other interfaces

Dependencies:   NetServices MSCUsbHost mbed TMP102 SDFileSystem

main.cpp

Committer:
DeMein
Date:
2011-02-27
Revision:
0:67a55a82ce06

File content as of revision 0:67a55a82ce06:

/* MMEx for MBED - Main function
 * Copyright (c) 2011 MK
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 *
 */

/**
  \file main.cpp
  \brief main function for the MMEx application
*/

#include "mmex.h"
#include "mbed.h"

/** read data from the commandline until a <CR> is found
 *
 *  @return returns the number of characters read (including the <CR>)
 */
int readin() {
  int i = 0;
  bool go = true;
  unsigned char inp;

  while (go) {                  // as long as we can continue          
    inp = mldl.rxx_read(command_mode);    // read data with protocol    
    switch (inp) {
      case NULL : break;         // do nothing, read next value
      case c_cr : inbuf[i] = NULL;  //terminate string
                  go = false;
                  break;
      default:    inbuf[i] = inp;
                  i++;
                  break;
    }  // switch
    if(i >= bufsize) {               // command is too long!
      // add proper error handling
      go = false;
      inbuf[i] = NULL;          // terminate string 
    }
  }  
  return i;
}

/** MMEx main function, never returns
 *
 */
int main() {
  int numin;
  
  init_handles();
  
  pc.baud(start_baud);
    
  mldl.init();                // initialize spi
  mldl.DBG_set(DBG_ON);
  
  welcome();                 // send welcome message
  
  init_loadp();              // auto load PARAM_A.TXT
  init_xeq();                // auto execute parameter X
  
  while(1) {
    // main loop for parsing commands
    send_prompt();   
    DBG_msg("main", "send prompt");            
    
    // remove comments below for more extended debugging
    // DBG_int("rx_room", mldl.rx_room());
    // DBG_int("tx_room", mldl.tx_room());
    // DBG_int("rx_empty", mldl.rx_empty());
    // DBG_int("rx_full", mldl.rx_full());
    // DBG_int("tx_empty", mldl.tx_empty());
    // DBG_int("tx_full", mldl.tx_full());        

    numin = readin();     // read input command, must end with <CR>      
    // we are interpreting commands, string is in inbuf[]    
    if (inbuf[0] != NULL) { 
      DBG_msg("main", inbuf);
      switch (inbuf[0]) {
        case cmd_f : param[par_C_].assign(inbuf);
                     parse_F();        // File functions                     
                     break;      
        case cmd_m : param[par_C_].assign(inbuf);
                     parse_M();        // MBed functions
                     break;
        case cmd_p : parse_P();        // Parameter functions
                     break;
        case cmd_rpc : 
        case cmd_r:  param[par_C_].assign(inbuf);
                     parse_R();        // RPC functions
                     break;
        case cmd_n : param[par_C_].assign(inbuf);
                     parse_N();        // Network functions
                     break;
        case cmd_u : param[par_C_].assign(inbuf);
                     parse_U();        // User functions
                     break;
        case cmd_c : param[par_C_].assign(inbuf);
                     parse_C();        // User functions
                     break;
                
        default  :   DBG_msg("do_maindefault", inbuf);
                     do_maindefault(); // first char not recognized
                     break;
      }
    }
  }
}