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

rfuncs.cpp

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

File content as of revision 0:67a55a82ce06:

/* MMEx for MBED - RPC Command processing
 * 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 rfuncs.cpp
  \brief Commands starting with R or / for processing RPC
*/

#include "rfuncs.h"

/** main entry for parsing R- or /-commands
 *
 */ 
void parse_R() {
  DBG_msg("parse_R", inbuf);
  err_num = noerror;

  if (inbuf[1] != NULL) {
    switch (inbuf[1]) {
      case rslash  : do_rslash();
                     break;
      case rresult : do_rresult();
                     break;
      case rxeq    : do_rxeq();
                     break;            
      default      : do_rdefault();    // command not recognized
                     break;
    }
  } else { do_rdefault(); }
}

/** Define the value of the PC command string
 *
 *  syntax:  R/[string]      define new RPX command (same as //)
 *  \n  or: R/>+[string]    appends to existing RPC string
 *
 */   
void do_rslash() {   
  DBG_msg("do_rslash", inbuf);
  
  while (inbuf[2] == c_space) remchar(inbuf, 2, 1);  // remove leading space
  remchar(inbuf, 0, 1);                  // remove the R of 1st slash
  
  // now retrieve string from the command line, i starts at 3

  // if first chars are not ">+" the string will be new
  if ((inbuf[3] == c_escape) && (inbuf[4] == c_append)) {      
    // string is append, >+ from inbuf
    remchar(inbuf, 1, 2);
    DBG_msg("append RPC cmd", inbuf);
    param[par_R_].append(inbuf);    
  } else {    
    DBG_msg("new RPC cmd ", inbuf);
    param[par_R_].assign(inbuf);      // no append, assign string
  }    
}

/** Return the result of the previous RPC operation
 *
 *  syntax:  RR or /R
 */ 
void do_rresult() {
  char * cstr;
  
  DBG_msg("do_rresult", inbuf);
  cstr = new char [param[par_S_].size() + 1];
  strcpy(cstr, param[par_S_].c_str());
  DBG_msg("RPC result", cstr); 
  upstring(cstr);
  mldl.tx_string(cstr);  
  delete[] cstr;
}

/** Execute the current RPC string
 *
 *  syntax:  RX or /X
 */
void do_rxeq() {
  char outbuf[256];
  char * cstr;
      
  DBG_msg("do_rxeq", inbuf);
  
  cstr = new char [param[par_R_].size() + 1];
  strcpy(cstr, param[par_R_].c_str());
  DBG_msg("RPC execute", cstr);    

  rpc(cstr, outbuf);                // do the RPC
  delete[] cstr;
  
  DBG_msg("RPC result", outbuf);  
  param[par_S_].assign(outbuf);     // store result
}

/** send error message, command not recognized
 *
 */    
void do_rdefault() {
  DBG_msg("do_rdefault", inbuf);
  send_error(err_notrecognized); 
}