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 02 18:34:12 2015 +0000
Revision:
2:54d27fdcbe5c
Parent:
1:23d0a615756a
Child:
3:502f90649834
moved to new re-port of modified L298N driver.; still having serial communications issues

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 2:54d27fdcbe5c 12 BOOL neg;
Mr_What 0:41ca27337c2b 13 char code;
Mr_What 2:54d27fdcbe5c 14
Mr_What 2:54d27fdcbe5c 15 void begin(const char c=0)
Mr_What 0:41ca27337c2b 16 {
Mr_What 2:54d27fdcbe5c 17 nDig=val=0;
Mr_What 2:54d27fdcbe5c 18 code=c;
Mr_What 2:54d27fdcbe5c 19 neg = false;
Mr_What 0:41ca27337c2b 20 }
Mr_What 2:54d27fdcbe5c 21 bool get(char &cmdCode, int &cmdVal)
Mr_What 0:41ca27337c2b 22 {
Mr_What 2:54d27fdcbe5c 23 int i = cSerial.cread();
Mr_What 2:54d27fdcbe5c 24 if (i < 0) return(false); // 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 2:54d27fdcbe5c 30 CmdSerial.puts("Command Stream RESET!\r\n");
Mr_What 0:41ca27337c2b 31 begin();
Mr_What 2:54d27fdcbe5c 32 return(false);
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 2:54d27fdcbe5c 47 return(false);
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 2:54d27fdcbe5c 56 CmdSerial.puts("Not expecting a value. '-' char ignored.\r\n");
Mr_What 0:41ca27337c2b 57 begin(); // clear bad entry
Mr_What 0:41ca27337c2b 58 }
Mr_What 2:54d27fdcbe5c 59 return(false);
Mr_What 0:41ca27337c2b 60 // commands without values
Mr_What 0:41ca27337c2b 61 case '!':
Mr_What 0:41ca27337c2b 62 case '?':
Mr_What 2:54d27fdcbe5c 63 case '^':
Mr_What 2:54d27fdcbe5c 64 case 'a': // command to set Autonomous in manual mode
Mr_What 2:54d27fdcbe5c 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 2:54d27fdcbe5c 68 return(true);
Mr_What 0:41ca27337c2b 69
Mr_What 2:54d27fdcbe5c 70 // codes with values follow :
Mr_What 2:54d27fdcbe5c 71 // might want to leave some of these in here to keep car app from
Mr_What 2:54d27fdcbe5c 72 // throwing error messages, which could saturate the serial connection
Mr_What 2:54d27fdcbe5c 73 case 'p':
Mr_What 2:54d27fdcbe5c 74 case 't':
Mr_What 2:54d27fdcbe5c 75 case 'm':
Mr_What 2:54d27fdcbe5c 76 case 'C':
Mr_What 2:54d27fdcbe5c 77 case 'c':
Mr_What 2:54d27fdcbe5c 78 case 'S':
Mr_What 2:54d27fdcbe5c 79 case 'T':
Mr_What 2:54d27fdcbe5c 80 case 'G':
Mr_What 2:54d27fdcbe5c 81 case 'g':
Mr_What 2:54d27fdcbe5c 82 case 'r':
Mr_What 2:54d27fdcbe5c 83 case 'd':
Mr_What 2:54d27fdcbe5c 84 begin(); // clear old command, if any
Mr_What 2:54d27fdcbe5c 85 code = c; // remember command for wich the following value applies
Mr_What 2:54d27fdcbe5c 86 return(false); // wait for value
Mr_What 2:54d27fdcbe5c 87
Mr_What 2:54d27fdcbe5c 88 // some android version/settings, there is no seperator.
Mr_What 2:54d27fdcbe5c 89 // be robust to this
Mr_What 0:41ca27337c2b 90 case 'L':
Mr_What 0:41ca27337c2b 91 case 'R':
Mr_What 2:54d27fdcbe5c 92
Mr_What 0:41ca27337c2b 93 // seperator
Mr_What 0:41ca27337c2b 94 case ' ':
Mr_What 0:41ca27337c2b 95 case '\t':
Mr_What 0:41ca27337c2b 96 case '\r':
Mr_What 0:41ca27337c2b 97 case '\n':
Mr_What 0:41ca27337c2b 98 case 0:
Mr_What 0:41ca27337c2b 99 case ',':
Mr_What 0:41ca27337c2b 100 case ';':
Mr_What 2:54d27fdcbe5c 101 //if ( code > (char)0 )
Mr_What 2:54d27fdcbe5c 102 // { // command was in progress, close it out
Mr_What 0:41ca27337c2b 103 cmdCode = code;
Mr_What 0:41ca27337c2b 104 cmdVal = neg ? -val : val;
Mr_What 2:54d27fdcbe5c 105 begin(c); // clear for next command
Mr_What 2:54d27fdcbe5c 106 return(true); // had a complete command
Mr_What 2:54d27fdcbe5c 107 // }
Mr_What 0:41ca27337c2b 108 default: // treat any other character as a seperator
Mr_What 0:41ca27337c2b 109 begin(); // clear any partial command
Mr_What 2:54d27fdcbe5c 110 return(false); // prev command not complete
Mr_What 0:41ca27337c2b 111 }
Mr_What 0:41ca27337c2b 112 }
Mr_What 0:41ca27337c2b 113
Mr_What 0:41ca27337c2b 114 };