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
- Committer:
- jekain314
- Date:
- 2014-03-03
- Revision:
- 30:96d133f3008e
- Parent:
- 29:dead10cce6e9
File content as of revision 30:96d133f3008e:
//these are defines for the messages that are sent from the PC across the USB //these messages produce reactions on the mbed //currently there is only a single message -- the trigger command const unsigned char FIRE_TRIGGER_MSG = 1; const unsigned short msgBuffSize = 28; char messageBuffer[msgBuffSize+1]; //the +1 allows for a null-terminated string //flags to control the mbed actions (in main) in response to the PC command bool fireTrigger = false; unsigned char CR = 0x0d; //ASCII Carriage Return unsigned char LF = 0x0a; //ASCII Line Feed int totalNumChars = 0; bool validMessage = false; /* void readFromPC() { //read all available PC serial bytes and test the sequence for a command string if (toPC.readable()) { loopsThroughPCreadable++; //reset to zero when we detect a valid message //wait_ms(5); } while (toPC.readable()) { /////////////////////////////////////////////////////////////////////////////////// //PC-to-mbed and mbed-to-PC message format // 1) preamble: "mbedmessage " (note the space) // 2) messageType "trig " (note the space // 3) 10-char dataValue "0000000000" (ASCI integer representation //0123456789012345678901234567890123456789 //mbedmessage trig 0000000000 CR/LF /////////////////////////////////////////////////////////////////////////////////// // Read in next character // we get through the main loop at > 500,000 times a sec unsigned char inChar = 0; inChar = toPC.getc(); //read char from the USB serial link to the PC totalNumChars++; //slide all the characters back by one place -- oldest char in the buffer gets discarded for (int i=0; i<(msgBuffSize-1); i++) messageBuffer[i] = messageBuffer[i+1]; //now fill in the last entry to the buffer with the most recent received char messageBuffer[msgBuffSize-1] = inChar; //locate the proper message signature in the saved buffer: "mbedmessage " if (messageBuffer[0] != 'm') continue; else if( messageBuffer[1] != 'b') continue; else if( messageBuffer[2] != 'e') continue; else if( messageBuffer[3] != 'd') continue; else if( messageBuffer[4] != 'm') continue; else if( messageBuffer[5] != 'e') continue; else if( messageBuffer[6] != 's') continue; else if( messageBuffer[7] != 's') continue; else if( messageBuffer[8] != 'a') continue; else if( messageBuffer[9] != 'g') continue; else if( messageBuffer[10] != 'e') continue; else if( messageBuffer[11] != ' ') continue; //else if( messageBuffer[28] != CR) return; //else if( messageBuffer[29] != LF) return; //from testing: this always activates on inChar multiple of 28 //if ( inChar == 0x0a ) toPC.printf("%d LF received: %s\n",totalNumChars, messageBuffer); //if we get here. we have the proper signature of an incoming message //now test for the message types //why do we do this?? //messageBuffer[msgBuffSize]= '/0'; //make the message buffer a null-terminated ASCII string //if (toPC.writeable()) toPC.printf(messageBuffer); if ( messageBuffer[12] == 't' && messageBuffer[13] == 'r' && messageBuffer[14] == 'i' && messageBuffer[15] == 'g' ) { //we have detected a trigger command message: "trig" //send back a response to this message if (toPC.writeable()) { toPC.printf("FromMbed %s \n", messageBuffer); toPC.printf("FromMbed %d %d \n", loopsThroughPCreadable, totalNumChars); } fireTrigger = true; loopsThroughPCreadable = 0; } } //end pc.readable }; */ void readFromPC() { //if there is no chars to read -- just return; if (!toPC.readable()) return; totalNumChars = 0; if (toPC.writeable()) { toPC.printf("FromMbed testing for Trigger \n"); } bool timeOutInRead = false; timeInMessageRead.reset(); while (totalNumChars < 16) { /////////////////////////////////////////////////////////////////////////////////// //PC-to-mbed and mbed-to-PC message format // 1) preamble: "mbedmessage " (note the space) // 2) messageType "trig " (note the space // 3) 10-char dataValue "0000000000" (ASCI integer representation //0123456789012345678901234567890123456789 //mbedmessage trig 0000000000 CR/LF /////////////////////////////////////////////////////////////////////////////////// // we get through the main loop at > 500,000 times a sec if ( toPC.readable() ) { messageBuffer[totalNumChars] = toPC.getc(); totalNumChars++; } if (timeInMessageRead.read_us() > 500) { timeOutInRead = true; break; } } messageBuffer[28] = '\0'; //make a null-terminated string if (timeOutInRead) { if (toPC.writeable()) { toPC.printf("FromMbed TimeOut %s \n", messageBuffer); } } if (messageBuffer[0] == 'm' && messageBuffer[1] == 'b' && messageBuffer[2] == 'e' && messageBuffer[3] == 'd' && messageBuffer[4] == 'm' && messageBuffer[5] == 'e' && messageBuffer[6] == 's' && messageBuffer[7] == 's' && messageBuffer[8] == 'a' && messageBuffer[9] == 'g' && messageBuffer[10] == 'e' && messageBuffer[11] == ' ' && messageBuffer[12] == 't' && messageBuffer[13] == 'r' && messageBuffer[14] == 'i' && messageBuffer[15] == 'g' ) { //we have detected a trigger command message: "trig" //send back a response to this message if (toPC.writeable()) { toPC.printf("FromMbed %s %d\n", messageBuffer, timeInMessageRead.read_us()); } for (int i=0; i<=msgBuffSize; i++) messageBuffer[i] = 0; fireTrigger = true; } else { toPC.printf("FromMbed badMsg %s \n", messageBuffer); for (int i=0; i<=msgBuffSize; i++) messageBuffer[i] = 0; } };