Basic tank-style drive robot control firmware for Freescale FRDM-K64F. Controls motors on a Dual-Full-H-Bridge with EN, like DBH-1x series, from Bluetooth serial commands

Dependencies:   mbed

Command.h

Committer:
Mr_What
Date:
2015-07-31
Revision:
1:23d0a615756a
Parent:
0:41ca27337c2b
Child:
2:54d27fdcbe5c

File content as of revision 1:23d0a615756a:

/* Aaron Birenboim 26jul15   http://boim.com

Feel free to use as you wish, but please include above credits for the original work

Command interpreter for serial port
*/

class CommandReader
{
public:
  int nDig,val;
  bool neg;
  char code;
  ASerial *_serial;  // we don't own this, we just use it
  
  CommandReader(ASerial s) : _serial(&s)
  {
    begin();
  }

  int get(char &cmdCode, int &cmdVal)
  {
    int i = _serial->readc();
    if (i < 0) return(0);  // no command yet
    char c = i;
//Serial.print('[');Serial.print(i);Serial.print(',');Serial.print(c);Serial.println(']');
    switch(c)
      {
      case '~' :
        _serial->println("Command Stream RESET!");
        begin();
        return(0);

      case '0':
      case '1':
      case '2':
      case '3':
      case '4':
      case '5':
      case '6':
      case '7':
      case '8':
      case '9':
        val = val*10 + (i-((int)('0')));
        nDig++;
        //Serial.print(nDig);Serial.print(")");Serial.println(val);
        return(0);
      case '-':
        if ((nDig == 0) && ((int)code>0))
          {
            //Serial.println(F("negative command value follows:"));
            neg = true; // value is negative
          }
        else
          {
            _serial->println("Not expecting a value.  '-' char ignored.");
            begin();  // clear bad entry
          }
        return(0);
      // commands without values
      case '!':
 //     case '^':
      case '?':
 //     case 'a':  // command to set Autonomous in manual mode
 //     case 'A':
        cmdCode = c;  // return prev command code (if any)
        cmdVal = 0;
        return(1);

        // codes with values follow : 
      case 'L':
      case 'R':
        begin();  // clear old command, if any
        code = c; // remember command for wich the following value applies
        return(0);  // wait for value
        // seperator
      case ' ':
      case '\t':
      case '\r':
      case '\n':
      case 0:
      case ',':
      case ';':
        if ( code > (char)0 )
          { // command was in progress, close it out
            cmdCode = code;
            cmdVal = neg ? -val : val;
            begin();  // clear for next command
            return(1);  // had a complete command
          }
      default: // treat any other character as a seperator
        begin();  // clear any partial command
        return(0);  // prev command not complete
      }
  }

protected:
  void begin()
  {
    nDig=val=0;
    code=0;
    neg = false;
  }

};