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:
Sun Aug 16 22:46:25 2015 +0000
Revision:
4:7620d21baef3
Parent:
3:502f90649834
seems to be running from app with reduced diagnostics

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 3:502f90649834 11 int _nDig,_val;
Mr_What 3:502f90649834 12 BOOL _neg;
Mr_What 3:502f90649834 13 char _code;
Mr_What 3:502f90649834 14
Mr_What 3:502f90649834 15 static BOOL hasValue(const char c)
Mr_What 3:502f90649834 16 {
Mr_What 3:502f90649834 17 if ( (c == 'L') || (c == 'R') )
Mr_What 3:502f90649834 18 return(true);
Mr_What 3:502f90649834 19 return(false);
Mr_What 3:502f90649834 20 }
Mr_What 2:54d27fdcbe5c 21
Mr_What 2:54d27fdcbe5c 22 void begin(const char c=0)
Mr_What 0:41ca27337c2b 23 {
Mr_What 3:502f90649834 24 _nDig=_val=0;
Mr_What 3:502f90649834 25 _code= hasValue(c) ? c : 0;
Mr_What 3:502f90649834 26 _neg = false;
Mr_What 0:41ca27337c2b 27 }
Mr_What 3:502f90649834 28
Mr_What 3:502f90649834 29 BOOL get(char &cmdCode, int &cmdVal)
Mr_What 0:41ca27337c2b 30 {
Mr_What 2:54d27fdcbe5c 31 int i = cSerial.cread();
Mr_What 2:54d27fdcbe5c 32 if (i < 0) return(false); // no command yet
Mr_What 0:41ca27337c2b 33 char c = i;
Mr_What 4:7620d21baef3 34 //static int nc=0;DiagSerial.printf("%d got %d(%c)\r\n",nc++,i,i);
Mr_What 0:41ca27337c2b 35 //Serial.print('[');Serial.print(i);Serial.print(',');Serial.print(c);Serial.println(']');
Mr_What 0:41ca27337c2b 36 switch(c)
Mr_What 0:41ca27337c2b 37 {
Mr_What 0:41ca27337c2b 38 case '~' :
Mr_What 2:54d27fdcbe5c 39 CmdSerial.puts("Command Stream RESET!\r\n");
Mr_What 0:41ca27337c2b 40 begin();
Mr_What 2:54d27fdcbe5c 41 return(false);
Mr_What 0:41ca27337c2b 42
Mr_What 0:41ca27337c2b 43 case '0':
Mr_What 0:41ca27337c2b 44 case '1':
Mr_What 0:41ca27337c2b 45 case '2':
Mr_What 0:41ca27337c2b 46 case '3':
Mr_What 0:41ca27337c2b 47 case '4':
Mr_What 0:41ca27337c2b 48 case '5':
Mr_What 0:41ca27337c2b 49 case '6':
Mr_What 0:41ca27337c2b 50 case '7':
Mr_What 0:41ca27337c2b 51 case '8':
Mr_What 0:41ca27337c2b 52 case '9':
Mr_What 3:502f90649834 53 _val = _val*10 + (i-((int)('0')));
Mr_What 3:502f90649834 54 _nDig++;
Mr_What 0:41ca27337c2b 55 //Serial.print(nDig);Serial.print(")");Serial.println(val);
Mr_What 2:54d27fdcbe5c 56 return(false);
Mr_What 0:41ca27337c2b 57 case '-':
Mr_What 3:502f90649834 58 if ((_nDig == 0) && ((int)_code>0))
Mr_What 0:41ca27337c2b 59 {
Mr_What 0:41ca27337c2b 60 //Serial.println(F("negative command value follows:"));
Mr_What 3:502f90649834 61 _neg = true; // value is negative
Mr_What 0:41ca27337c2b 62 }
Mr_What 0:41ca27337c2b 63 else
Mr_What 0:41ca27337c2b 64 {
Mr_What 3:502f90649834 65 DiagSerial.puts("Not expecting a value. '-' char ignored.\r\n");
Mr_What 0:41ca27337c2b 66 begin(); // clear bad entry
Mr_What 0:41ca27337c2b 67 }
Mr_What 2:54d27fdcbe5c 68 return(false);
Mr_What 0:41ca27337c2b 69 // commands without values
Mr_What 0:41ca27337c2b 70 case '!':
Mr_What 0:41ca27337c2b 71 case '?':
Mr_What 2:54d27fdcbe5c 72 case '^':
Mr_What 2:54d27fdcbe5c 73 case 'a': // command to set Autonomous in manual mode
Mr_What 2:54d27fdcbe5c 74 case 'A':
Mr_What 0:41ca27337c2b 75 cmdCode = c; // return prev command code (if any)
Mr_What 0:41ca27337c2b 76 cmdVal = 0;
Mr_What 2:54d27fdcbe5c 77 return(true);
Mr_What 3:502f90649834 78 /*
Mr_What 2:54d27fdcbe5c 79 // codes with values follow :
Mr_What 2:54d27fdcbe5c 80 // might want to leave some of these in here to keep car app from
Mr_What 2:54d27fdcbe5c 81 // throwing error messages, which could saturate the serial connection
Mr_What 2:54d27fdcbe5c 82 case 'p':
Mr_What 2:54d27fdcbe5c 83 case 't':
Mr_What 2:54d27fdcbe5c 84 case 'm':
Mr_What 2:54d27fdcbe5c 85 case 'C':
Mr_What 2:54d27fdcbe5c 86 case 'c':
Mr_What 2:54d27fdcbe5c 87 case 'S':
Mr_What 2:54d27fdcbe5c 88 case 'T':
Mr_What 2:54d27fdcbe5c 89 case 'G':
Mr_What 2:54d27fdcbe5c 90 case 'g':
Mr_What 2:54d27fdcbe5c 91 case 'r':
Mr_What 2:54d27fdcbe5c 92 case 'd':
Mr_What 2:54d27fdcbe5c 93 begin(); // clear old command, if any
Mr_What 2:54d27fdcbe5c 94 code = c; // remember command for wich the following value applies
Mr_What 2:54d27fdcbe5c 95 return(false); // wait for value
Mr_What 3:502f90649834 96 */
Mr_What 2:54d27fdcbe5c 97
Mr_What 2:54d27fdcbe5c 98 // some android version/settings, there is no seperator.
Mr_What 2:54d27fdcbe5c 99 // be robust to this
Mr_What 0:41ca27337c2b 100 case 'L':
Mr_What 0:41ca27337c2b 101 case 'R':
Mr_What 2:54d27fdcbe5c 102
Mr_What 0:41ca27337c2b 103 // seperator
Mr_What 0:41ca27337c2b 104 case ' ':
Mr_What 0:41ca27337c2b 105 case '\t':
Mr_What 0:41ca27337c2b 106 case '\r':
Mr_What 0:41ca27337c2b 107 case '\n':
Mr_What 0:41ca27337c2b 108 case 0:
Mr_What 0:41ca27337c2b 109 case ',':
Mr_What 0:41ca27337c2b 110 case ';':
Mr_What 3:502f90649834 111 if ( _code > (char)0 )
Mr_What 3:502f90649834 112 { // command was in progress, close it out
Mr_What 3:502f90649834 113 cmdCode = _code;
Mr_What 3:502f90649834 114 cmdVal = _neg ? -_val : _val;
Mr_What 2:54d27fdcbe5c 115 begin(c); // clear for next command
Mr_What 2:54d27fdcbe5c 116 return(true); // had a complete command
Mr_What 3:502f90649834 117 }
Mr_What 0:41ca27337c2b 118 default: // treat any other character as a seperator
Mr_What 3:502f90649834 119 begin(c); // clear any partial command
Mr_What 2:54d27fdcbe5c 120 return(false); // prev command not complete
Mr_What 0:41ca27337c2b 121 }
Mr_What 0:41ca27337c2b 122 }
Mr_What 0:41ca27337c2b 123
Mr_What 0:41ca27337c2b 124 };