this version has all of Jim's fixes for reading the GPS and IMU data synchronously
Dependencies: MODSERIAL SDFileSystem mbed SDShell CRC CommHandler FP LinkedList LogUtil
PCMessaging.h@30:96d133f3008e, 2014-03-03 (annotated)
- Committer:
- jekain314
- Date:
- Mon Mar 03 13:19:31 2014 +0000
- Revision:
- 30:96d133f3008e
- Parent:
- 29:dead10cce6e9
commit of RT_Download.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jekain314 | 0:432b860b6ff7 | 1 | //these are defines for the messages that are sent from the PC across the USB |
jekain314 | 0:432b860b6ff7 | 2 | //these messages produce reactions on the mbed |
jekain314 | 30:96d133f3008e | 3 | //currently there is only a single message -- the trigger command |
jekain314 | 29:dead10cce6e9 | 4 | const unsigned char FIRE_TRIGGER_MSG = 1; |
jekain314 | 0:432b860b6ff7 | 5 | |
jekain314 | 30:96d133f3008e | 6 | const unsigned short msgBuffSize = 28; |
jekain314 | 30:96d133f3008e | 7 | char messageBuffer[msgBuffSize+1]; //the +1 allows for a null-terminated string |
jekain314 | 0:432b860b6ff7 | 8 | |
jekain314 | 30:96d133f3008e | 9 | //flags to control the mbed actions (in main) in response to the PC command |
jekain314 | 30:96d133f3008e | 10 | bool fireTrigger = false; |
jekain314 | 0:432b860b6ff7 | 11 | |
jekain314 | 0:432b860b6ff7 | 12 | unsigned char CR = 0x0d; //ASCII Carriage Return |
jekain314 | 0:432b860b6ff7 | 13 | unsigned char LF = 0x0a; //ASCII Line Feed |
jekain314 | 0:432b860b6ff7 | 14 | |
jekain314 | 30:96d133f3008e | 15 | int totalNumChars = 0; |
jekain314 | 30:96d133f3008e | 16 | |
jekain314 | 17:71900da6ced6 | 17 | bool validMessage = false; |
jekain314 | 17:71900da6ced6 | 18 | |
jekain314 | 30:96d133f3008e | 19 | /* |
jekain314 | 0:432b860b6ff7 | 20 | void readFromPC() |
jekain314 | 0:432b860b6ff7 | 21 | { |
jekain314 | 30:96d133f3008e | 22 | //read all available PC serial bytes and test the sequence for a command string |
jekain314 | 30:96d133f3008e | 23 | if (toPC.readable()) |
jekain314 | 30:96d133f3008e | 24 | { loopsThroughPCreadable++; //reset to zero when we detect a valid message |
jekain314 | 30:96d133f3008e | 25 | //wait_ms(5); |
jekain314 | 30:96d133f3008e | 26 | } |
jekain314 | 30:96d133f3008e | 27 | while (toPC.readable()) |
jekain314 | 0:432b860b6ff7 | 28 | { |
jekain314 | 30:96d133f3008e | 29 | /////////////////////////////////////////////////////////////////////////////////// |
jekain314 | 30:96d133f3008e | 30 | //PC-to-mbed and mbed-to-PC message format |
jekain314 | 30:96d133f3008e | 31 | // 1) preamble: "mbedmessage " (note the space) |
jekain314 | 30:96d133f3008e | 32 | // 2) messageType "trig " (note the space |
jekain314 | 30:96d133f3008e | 33 | // 3) 10-char dataValue "0000000000" (ASCI integer representation |
jekain314 | 30:96d133f3008e | 34 | //0123456789012345678901234567890123456789 |
jekain314 | 30:96d133f3008e | 35 | //mbedmessage trig 0000000000 CR/LF |
jekain314 | 30:96d133f3008e | 36 | /////////////////////////////////////////////////////////////////////////////////// |
jekain314 | 30:96d133f3008e | 37 | |
jekain314 | 29:dead10cce6e9 | 38 | // Read in next character |
jekain314 | 30:96d133f3008e | 39 | // we get through the main loop at > 500,000 times a sec |
jekain314 | 1:8e24e633f8d8 | 40 | unsigned char inChar = 0; |
jekain314 | 6:71da5b99de97 | 41 | inChar = toPC.getc(); //read char from the USB serial link to the PC |
jekain314 | 0:432b860b6ff7 | 42 | |
jekain314 | 30:96d133f3008e | 43 | totalNumChars++; |
jekain314 | 30:96d133f3008e | 44 | |
jekain314 | 30:96d133f3008e | 45 | //slide all the characters back by one place -- oldest char in the buffer gets discarded |
jekain314 | 30:96d133f3008e | 46 | for (int i=0; i<(msgBuffSize-1); i++) messageBuffer[i] = messageBuffer[i+1]; |
jekain314 | 30:96d133f3008e | 47 | //now fill in the last entry to the buffer with the most recent received char |
jekain314 | 30:96d133f3008e | 48 | messageBuffer[msgBuffSize-1] = inChar; |
jekain314 | 30:96d133f3008e | 49 | |
jekain314 | 30:96d133f3008e | 50 | //locate the proper message signature in the saved buffer: "mbedmessage " |
jekain314 | 30:96d133f3008e | 51 | if (messageBuffer[0] != 'm') continue; |
jekain314 | 30:96d133f3008e | 52 | else if( messageBuffer[1] != 'b') continue; |
jekain314 | 30:96d133f3008e | 53 | else if( messageBuffer[2] != 'e') continue; |
jekain314 | 30:96d133f3008e | 54 | else if( messageBuffer[3] != 'd') continue; |
jekain314 | 30:96d133f3008e | 55 | else if( messageBuffer[4] != 'm') continue; |
jekain314 | 30:96d133f3008e | 56 | else if( messageBuffer[5] != 'e') continue; |
jekain314 | 30:96d133f3008e | 57 | else if( messageBuffer[6] != 's') continue; |
jekain314 | 30:96d133f3008e | 58 | else if( messageBuffer[7] != 's') continue; |
jekain314 | 30:96d133f3008e | 59 | else if( messageBuffer[8] != 'a') continue; |
jekain314 | 30:96d133f3008e | 60 | else if( messageBuffer[9] != 'g') continue; |
jekain314 | 30:96d133f3008e | 61 | else if( messageBuffer[10] != 'e') continue; |
jekain314 | 30:96d133f3008e | 62 | else if( messageBuffer[11] != ' ') continue; |
jekain314 | 30:96d133f3008e | 63 | //else if( messageBuffer[28] != CR) return; |
jekain314 | 30:96d133f3008e | 64 | //else if( messageBuffer[29] != LF) return; |
jekain314 | 0:432b860b6ff7 | 65 | |
jekain314 | 30:96d133f3008e | 66 | //from testing: this always activates on inChar multiple of 28 |
jekain314 | 30:96d133f3008e | 67 | //if ( inChar == 0x0a ) toPC.printf("%d LF received: %s\n",totalNumChars, messageBuffer); |
jekain314 | 30:96d133f3008e | 68 | |
jekain314 | 30:96d133f3008e | 69 | //if we get here. we have the proper signature of an incoming message |
jekain314 | 30:96d133f3008e | 70 | //now test for the message types |
jekain314 | 30:96d133f3008e | 71 | |
jekain314 | 30:96d133f3008e | 72 | //why do we do this?? |
jekain314 | 30:96d133f3008e | 73 | //messageBuffer[msgBuffSize]= '/0'; //make the message buffer a null-terminated ASCII string |
jekain314 | 30:96d133f3008e | 74 | |
jekain314 | 30:96d133f3008e | 75 | //if (toPC.writeable()) toPC.printf(messageBuffer); |
jekain314 | 30:96d133f3008e | 76 | |
jekain314 | 30:96d133f3008e | 77 | if ( messageBuffer[12] == 't' && |
jekain314 | 30:96d133f3008e | 78 | messageBuffer[13] == 'r' && |
jekain314 | 30:96d133f3008e | 79 | messageBuffer[14] == 'i' && |
jekain314 | 30:96d133f3008e | 80 | messageBuffer[15] == 'g' ) |
jekain314 | 30:96d133f3008e | 81 | { |
jekain314 | 30:96d133f3008e | 82 | //we have detected a trigger command message: "trig" |
jekain314 | 30:96d133f3008e | 83 | //send back a response to this message |
jekain314 | 30:96d133f3008e | 84 | if (toPC.writeable()) |
jekain314 | 30:96d133f3008e | 85 | { |
jekain314 | 30:96d133f3008e | 86 | toPC.printf("FromMbed %s \n", messageBuffer); |
jekain314 | 30:96d133f3008e | 87 | toPC.printf("FromMbed %d %d \n", loopsThroughPCreadable, totalNumChars); |
jekain314 | 30:96d133f3008e | 88 | } |
jekain314 | 30:96d133f3008e | 89 | fireTrigger = true; |
jekain314 | 30:96d133f3008e | 90 | loopsThroughPCreadable = 0; |
jekain314 | 30:96d133f3008e | 91 | } |
jekain314 | 6:71da5b99de97 | 92 | |
jekain314 | 0:432b860b6ff7 | 93 | } //end pc.readable |
jekain314 | 0:432b860b6ff7 | 94 | }; |
jekain314 | 30:96d133f3008e | 95 | */ |
jekain314 | 0:432b860b6ff7 | 96 | |
jekain314 | 30:96d133f3008e | 97 | void readFromPC() |
jekain314 | 30:96d133f3008e | 98 | { |
jekain314 | 30:96d133f3008e | 99 | |
jekain314 | 30:96d133f3008e | 100 | //if there is no chars to read -- just return; |
jekain314 | 30:96d133f3008e | 101 | if (!toPC.readable()) return; |
jekain314 | 30:96d133f3008e | 102 | |
jekain314 | 30:96d133f3008e | 103 | totalNumChars = 0; |
jekain314 | 30:96d133f3008e | 104 | |
jekain314 | 30:96d133f3008e | 105 | if (toPC.writeable()) |
jekain314 | 30:96d133f3008e | 106 | { |
jekain314 | 30:96d133f3008e | 107 | toPC.printf("FromMbed testing for Trigger \n"); |
jekain314 | 30:96d133f3008e | 108 | } |
jekain314 | 30:96d133f3008e | 109 | |
jekain314 | 30:96d133f3008e | 110 | bool timeOutInRead = false; |
jekain314 | 30:96d133f3008e | 111 | |
jekain314 | 30:96d133f3008e | 112 | timeInMessageRead.reset(); |
jekain314 | 30:96d133f3008e | 113 | |
jekain314 | 30:96d133f3008e | 114 | while (totalNumChars < 16) |
jekain314 | 30:96d133f3008e | 115 | { |
jekain314 | 30:96d133f3008e | 116 | /////////////////////////////////////////////////////////////////////////////////// |
jekain314 | 30:96d133f3008e | 117 | //PC-to-mbed and mbed-to-PC message format |
jekain314 | 30:96d133f3008e | 118 | // 1) preamble: "mbedmessage " (note the space) |
jekain314 | 30:96d133f3008e | 119 | // 2) messageType "trig " (note the space |
jekain314 | 30:96d133f3008e | 120 | // 3) 10-char dataValue "0000000000" (ASCI integer representation |
jekain314 | 30:96d133f3008e | 121 | //0123456789012345678901234567890123456789 |
jekain314 | 30:96d133f3008e | 122 | //mbedmessage trig 0000000000 CR/LF |
jekain314 | 30:96d133f3008e | 123 | /////////////////////////////////////////////////////////////////////////////////// |
jekain314 | 30:96d133f3008e | 124 | |
jekain314 | 30:96d133f3008e | 125 | // we get through the main loop at > 500,000 times a sec |
jekain314 | 30:96d133f3008e | 126 | |
jekain314 | 30:96d133f3008e | 127 | if ( toPC.readable() ) |
jekain314 | 30:96d133f3008e | 128 | { |
jekain314 | 30:96d133f3008e | 129 | messageBuffer[totalNumChars] = toPC.getc(); |
jekain314 | 30:96d133f3008e | 130 | totalNumChars++; |
jekain314 | 30:96d133f3008e | 131 | } |
jekain314 | 30:96d133f3008e | 132 | |
jekain314 | 30:96d133f3008e | 133 | if (timeInMessageRead.read_us() > 500) |
jekain314 | 30:96d133f3008e | 134 | { |
jekain314 | 30:96d133f3008e | 135 | timeOutInRead = true; |
jekain314 | 30:96d133f3008e | 136 | break; |
jekain314 | 30:96d133f3008e | 137 | } |
jekain314 | 30:96d133f3008e | 138 | } |
jekain314 | 30:96d133f3008e | 139 | |
jekain314 | 30:96d133f3008e | 140 | messageBuffer[28] = '\0'; //make a null-terminated string |
jekain314 | 30:96d133f3008e | 141 | |
jekain314 | 30:96d133f3008e | 142 | if (timeOutInRead) |
jekain314 | 30:96d133f3008e | 143 | { |
jekain314 | 30:96d133f3008e | 144 | if (toPC.writeable()) |
jekain314 | 30:96d133f3008e | 145 | { |
jekain314 | 30:96d133f3008e | 146 | toPC.printf("FromMbed TimeOut %s \n", messageBuffer); |
jekain314 | 30:96d133f3008e | 147 | } |
jekain314 | 30:96d133f3008e | 148 | } |
jekain314 | 30:96d133f3008e | 149 | |
jekain314 | 30:96d133f3008e | 150 | |
jekain314 | 30:96d133f3008e | 151 | |
jekain314 | 30:96d133f3008e | 152 | if (messageBuffer[0] == 'm' && |
jekain314 | 30:96d133f3008e | 153 | messageBuffer[1] == 'b' && |
jekain314 | 30:96d133f3008e | 154 | messageBuffer[2] == 'e' && |
jekain314 | 30:96d133f3008e | 155 | messageBuffer[3] == 'd' && |
jekain314 | 30:96d133f3008e | 156 | messageBuffer[4] == 'm' && |
jekain314 | 30:96d133f3008e | 157 | messageBuffer[5] == 'e' && |
jekain314 | 30:96d133f3008e | 158 | messageBuffer[6] == 's' && |
jekain314 | 30:96d133f3008e | 159 | messageBuffer[7] == 's' && |
jekain314 | 30:96d133f3008e | 160 | messageBuffer[8] == 'a' && |
jekain314 | 30:96d133f3008e | 161 | messageBuffer[9] == 'g' && |
jekain314 | 30:96d133f3008e | 162 | messageBuffer[10] == 'e' && |
jekain314 | 30:96d133f3008e | 163 | messageBuffer[11] == ' ' && |
jekain314 | 30:96d133f3008e | 164 | messageBuffer[12] == 't' && |
jekain314 | 30:96d133f3008e | 165 | messageBuffer[13] == 'r' && |
jekain314 | 30:96d133f3008e | 166 | messageBuffer[14] == 'i' && |
jekain314 | 30:96d133f3008e | 167 | messageBuffer[15] == 'g' ) |
jekain314 | 30:96d133f3008e | 168 | { |
jekain314 | 30:96d133f3008e | 169 | |
jekain314 | 30:96d133f3008e | 170 | |
jekain314 | 30:96d133f3008e | 171 | //we have detected a trigger command message: "trig" |
jekain314 | 30:96d133f3008e | 172 | //send back a response to this message |
jekain314 | 30:96d133f3008e | 173 | if (toPC.writeable()) |
jekain314 | 30:96d133f3008e | 174 | { |
jekain314 | 30:96d133f3008e | 175 | toPC.printf("FromMbed %s %d\n", messageBuffer, timeInMessageRead.read_us()); |
jekain314 | 30:96d133f3008e | 176 | } |
jekain314 | 30:96d133f3008e | 177 | |
jekain314 | 30:96d133f3008e | 178 | for (int i=0; i<=msgBuffSize; i++) messageBuffer[i] = 0; |
jekain314 | 30:96d133f3008e | 179 | fireTrigger = true; |
jekain314 | 30:96d133f3008e | 180 | } |
jekain314 | 30:96d133f3008e | 181 | else |
jekain314 | 30:96d133f3008e | 182 | { |
jekain314 | 30:96d133f3008e | 183 | toPC.printf("FromMbed badMsg %s \n", messageBuffer); |
jekain314 | 30:96d133f3008e | 184 | for (int i=0; i<=msgBuffSize; i++) messageBuffer[i] = 0; |
jekain314 | 30:96d133f3008e | 185 | } |
jekain314 | 30:96d133f3008e | 186 | }; |
jekain314 | 30:96d133f3008e | 187 |