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

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?

UserRevisionLine numberNew 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