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@2:54d27fdcbe5c, 2015-08-02 (annotated)
- 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?
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 | 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 | }; |