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

Committer:
Mr_What
Date:
Fri Jul 31 17:37:52 2015 +0000
Revision:
1:23d0a615756a
Parent:
0:41ca27337c2b
Child:
2:54d27fdcbe5c
initial re-port from Arduino298 base

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Mr_What 0:41ca27337c2b 1 /* Aaron Birenboim 26jul15 http://boim.com
Mr_What 0:41ca27337c2b 2
Mr_What 0:41ca27337c2b 3 Feel free to use as you wish, but please include above credits for the original work
Mr_What 0:41ca27337c2b 4
Mr_What 0:41ca27337c2b 5 Command interpreter for serial port
Mr_What 0:41ca27337c2b 6 */
Mr_What 0:41ca27337c2b 7
Mr_What 0:41ca27337c2b 8 class CommandReader
Mr_What 0:41ca27337c2b 9 {
Mr_What 0:41ca27337c2b 10 public:
Mr_What 0:41ca27337c2b 11 int nDig,val;
Mr_What 0:41ca27337c2b 12 bool neg;
Mr_What 0:41ca27337c2b 13 char code;
Mr_What 0:41ca27337c2b 14 ASerial *_serial; // we don't own this, we just use it
Mr_What 0:41ca27337c2b 15
Mr_What 0:41ca27337c2b 16 CommandReader(ASerial s) : _serial(&s)
Mr_What 0:41ca27337c2b 17 {
Mr_What 0:41ca27337c2b 18 begin();
Mr_What 0:41ca27337c2b 19 }
Mr_What 0:41ca27337c2b 20
Mr_What 0:41ca27337c2b 21 int get(char &cmdCode, int &cmdVal)
Mr_What 0:41ca27337c2b 22 {
Mr_What 0:41ca27337c2b 23 int i = _serial->readc();
Mr_What 0:41ca27337c2b 24 if (i < 0) return(0); // no command yet
Mr_What 0:41ca27337c2b 25 char c = i;
Mr_What 0:41ca27337c2b 26 //Serial.print('[');Serial.print(i);Serial.print(',');Serial.print(c);Serial.println(']');
Mr_What 0:41ca27337c2b 27 switch(c)
Mr_What 0:41ca27337c2b 28 {
Mr_What 0:41ca27337c2b 29 case '~' :
Mr_What 0:41ca27337c2b 30 _serial->println("Command Stream RESET!");
Mr_What 0:41ca27337c2b 31 begin();
Mr_What 0:41ca27337c2b 32 return(0);
Mr_What 0:41ca27337c2b 33
Mr_What 0:41ca27337c2b 34 case '0':
Mr_What 0:41ca27337c2b 35 case '1':
Mr_What 0:41ca27337c2b 36 case '2':
Mr_What 0:41ca27337c2b 37 case '3':
Mr_What 0:41ca27337c2b 38 case '4':
Mr_What 0:41ca27337c2b 39 case '5':
Mr_What 0:41ca27337c2b 40 case '6':
Mr_What 0:41ca27337c2b 41 case '7':
Mr_What 0:41ca27337c2b 42 case '8':
Mr_What 0:41ca27337c2b 43 case '9':
Mr_What 0:41ca27337c2b 44 val = val*10 + (i-((int)('0')));
Mr_What 0:41ca27337c2b 45 nDig++;
Mr_What 0:41ca27337c2b 46 //Serial.print(nDig);Serial.print(")");Serial.println(val);
Mr_What 0:41ca27337c2b 47 return(0);
Mr_What 0:41ca27337c2b 48 case '-':
Mr_What 0:41ca27337c2b 49 if ((nDig == 0) && ((int)code>0))
Mr_What 0:41ca27337c2b 50 {
Mr_What 0:41ca27337c2b 51 //Serial.println(F("negative command value follows:"));
Mr_What 0:41ca27337c2b 52 neg = true; // value is negative
Mr_What 0:41ca27337c2b 53 }
Mr_What 0:41ca27337c2b 54 else
Mr_What 0:41ca27337c2b 55 {
Mr_What 0:41ca27337c2b 56 _serial->println("Not expecting a value. '-' char ignored.");
Mr_What 0:41ca27337c2b 57 begin(); // clear bad entry
Mr_What 0:41ca27337c2b 58 }
Mr_What 0:41ca27337c2b 59 return(0);
Mr_What 0:41ca27337c2b 60 // commands without values
Mr_What 0:41ca27337c2b 61 case '!':
Mr_What 1:23d0a615756a 62 // case '^':
Mr_What 0:41ca27337c2b 63 case '?':
Mr_What 1:23d0a615756a 64 // case 'a': // command to set Autonomous in manual mode
Mr_What 1:23d0a615756a 65 // case 'A':
Mr_What 0:41ca27337c2b 66 cmdCode = c; // return prev command code (if any)
Mr_What 0:41ca27337c2b 67 cmdVal = 0;
Mr_What 0:41ca27337c2b 68 return(1);
Mr_What 0:41ca27337c2b 69
Mr_What 0:41ca27337c2b 70 // codes with values follow :
Mr_What 0:41ca27337c2b 71 case 'L':
Mr_What 0:41ca27337c2b 72 case 'R':
Mr_What 0:41ca27337c2b 73 begin(); // clear old command, if any
Mr_What 0:41ca27337c2b 74 code = c; // remember command for wich the following value applies
Mr_What 0:41ca27337c2b 75 return(0); // wait for value
Mr_What 0:41ca27337c2b 76 // seperator
Mr_What 0:41ca27337c2b 77 case ' ':
Mr_What 0:41ca27337c2b 78 case '\t':
Mr_What 0:41ca27337c2b 79 case '\r':
Mr_What 0:41ca27337c2b 80 case '\n':
Mr_What 0:41ca27337c2b 81 case 0:
Mr_What 0:41ca27337c2b 82 case ',':
Mr_What 0:41ca27337c2b 83 case ';':
Mr_What 0:41ca27337c2b 84 if ( code > (char)0 )
Mr_What 0:41ca27337c2b 85 { // command was in progress, close it out
Mr_What 0:41ca27337c2b 86 cmdCode = code;
Mr_What 0:41ca27337c2b 87 cmdVal = neg ? -val : val;
Mr_What 0:41ca27337c2b 88 begin(); // clear for next command
Mr_What 0:41ca27337c2b 89 return(1); // had a complete command
Mr_What 0:41ca27337c2b 90 }
Mr_What 0:41ca27337c2b 91 default: // treat any other character as a seperator
Mr_What 0:41ca27337c2b 92 begin(); // clear any partial command
Mr_What 0:41ca27337c2b 93 return(0); // prev command not complete
Mr_What 0:41ca27337c2b 94 }
Mr_What 0:41ca27337c2b 95 }
Mr_What 0:41ca27337c2b 96
Mr_What 0:41ca27337c2b 97 protected:
Mr_What 0:41ca27337c2b 98 void begin()
Mr_What 0:41ca27337c2b 99 {
Mr_What 0:41ca27337c2b 100 nDig=val=0;
Mr_What 0:41ca27337c2b 101 code=0;
Mr_What 0:41ca27337c2b 102 neg = false;
Mr_What 0:41ca27337c2b 103 }
Mr_What 0:41ca27337c2b 104
Mr_What 0:41ca27337c2b 105 };