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:
Tue Jul 28 14:59:19 2015 +0000
Revision:
0:41ca27337c2b
Child:
1:23d0a615756a
sloppy Arduino port, but (mostly) running.  Ready to test motor drive.

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 0:41ca27337c2b 62 case '^':
Mr_What 0:41ca27337c2b 63 case '?':
Mr_What 0:41ca27337c2b 64 case 'a': // command to set Autonomous in manual mode
Mr_What 0:41ca27337c2b 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 case 'p':
Mr_What 0:41ca27337c2b 74 case 't':
Mr_What 0:41ca27337c2b 75 case 'm':
Mr_What 0:41ca27337c2b 76 case 'C':
Mr_What 0:41ca27337c2b 77 case 'c':
Mr_What 0:41ca27337c2b 78 case 'S':
Mr_What 0:41ca27337c2b 79 case 'T':
Mr_What 0:41ca27337c2b 80 case 'G':
Mr_What 0:41ca27337c2b 81 case 'g':
Mr_What 0:41ca27337c2b 82 case 'r':
Mr_What 0:41ca27337c2b 83 case 'd':
Mr_What 0:41ca27337c2b 84 begin(); // clear old command, if any
Mr_What 0:41ca27337c2b 85 code = c; // remember command for wich the following value applies
Mr_What 0:41ca27337c2b 86 return(0); // wait for value
Mr_What 0:41ca27337c2b 87 // seperator
Mr_What 0:41ca27337c2b 88 case ' ':
Mr_What 0:41ca27337c2b 89 case '\t':
Mr_What 0:41ca27337c2b 90 case '\r':
Mr_What 0:41ca27337c2b 91 case '\n':
Mr_What 0:41ca27337c2b 92 case 0:
Mr_What 0:41ca27337c2b 93 case ',':
Mr_What 0:41ca27337c2b 94 case ';':
Mr_What 0:41ca27337c2b 95 if ( code > (char)0 )
Mr_What 0:41ca27337c2b 96 { // command was in progress, close it out
Mr_What 0:41ca27337c2b 97 cmdCode = code;
Mr_What 0:41ca27337c2b 98 cmdVal = neg ? -val : val;
Mr_What 0:41ca27337c2b 99 begin(); // clear for next command
Mr_What 0:41ca27337c2b 100 return(1); // had a complete command
Mr_What 0:41ca27337c2b 101 }
Mr_What 0:41ca27337c2b 102 default: // treat any other character as a seperator
Mr_What 0:41ca27337c2b 103 begin(); // clear any partial command
Mr_What 0:41ca27337c2b 104 return(0); // prev command not complete
Mr_What 0:41ca27337c2b 105 }
Mr_What 0:41ca27337c2b 106 }
Mr_What 0:41ca27337c2b 107
Mr_What 0:41ca27337c2b 108 protected:
Mr_What 0:41ca27337c2b 109 void begin()
Mr_What 0:41ca27337c2b 110 {
Mr_What 0:41ca27337c2b 111 nDig=val=0;
Mr_What 0:41ca27337c2b 112 code=0;
Mr_What 0:41ca27337c2b 113 neg = false;
Mr_What 0:41ca27337c2b 114 }
Mr_What 0:41ca27337c2b 115
Mr_What 0:41ca27337c2b 116 };