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@0:41ca27337c2b, 2015-07-28 (annotated)
- 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?
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 | 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 | }; |