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
Command.h@1:23d0a615756a, 2015-07-31 (annotated)
- 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?
User | Revision | Line number | New 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 | }; |