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@3:502f90649834, 2015-08-13 (annotated)
- Committer:
- Mr_What
- Date:
- Thu Aug 13 17:50:28 2015 +0000
- Revision:
- 3:502f90649834
- Parent:
- 2:54d27fdcbe5c
- Child:
- 4:7620d21baef3
seems to be working from terminal, but locks up from app. I guess it can't handle the fast commands.
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 | 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 | 3:502f90649834 | 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 | }; |