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:
Thu Jan 09 14:09:05 2014 +0000
Revision:
29:dead10cce6e9
Parent:
28:fcea53fcc712
Child:
30:96d133f3008e
initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jekain314 21:37551baf69c6 1 #include "crc.h"
jekain314 21:37551baf69c6 2
jekain314 0:432b860b6ff7 3 //GPS-specific pins
jekain314 0:432b860b6ff7 4 DigitalOut GPS_Reset(p18); //GPS RESET line
jekain314 0:432b860b6ff7 5 InterruptIn PPSInt(p15); // GPS 1PPS (timemark) from the OEM615
jekain314 0:432b860b6ff7 6 InterruptIn IMUClock(p17);
jekain314 0:432b860b6ff7 7
jekain314 0:432b860b6ff7 8 Timer timeFromPPS;
jekain314 0:432b860b6ff7 9 unsigned long GPSTimemsecs = 0;
jekain314 0:432b860b6ff7 10
jekain314 0:432b860b6ff7 11 //mbed tx/rx interface to the GPS COM1 port
jekain314 0:432b860b6ff7 12 MODSERIAL GPS_COM1(p9,p10); //this serial port communicates with the GPS receiver serial port (COM1)
jekain314 0:432b860b6ff7 13
jekain314 29:dead10cce6e9 14 bool loadingMessageBuffer = false;
jekain314 29:dead10cce6e9 15
jekain314 29:dead10cce6e9 16 const unsigned short maxGPSbytesPerSec = 512;
jekain314 0:432b860b6ff7 17
jekain314 29:dead10cce6e9 18 int messagePerSecCounter = 0;
jekain314 29:dead10cce6e9 19 unsigned char msgBuffer0[maxGPSbytesPerSec]; //array to contain one full second of GPS bytes
jekain314 29:dead10cce6e9 20 unsigned char msgBuffer1[maxGPSbytesPerSec]; //array to contain one full second of GPS bytes
jekain314 29:dead10cce6e9 21 unsigned char msgBuffer2[maxGPSbytesPerSec]; //array to contain one full second of GPS bytes
jekain314 29:dead10cce6e9 22 int GPSbyteCounter0 = 0;
jekain314 29:dead10cce6e9 23 int GPSbyteCounter1 = 0;
jekain314 29:dead10cce6e9 24 int GPSbyteCounter2 = 0;
jekain314 29:dead10cce6e9 25 bool message0Complete = false;
jekain314 29:dead10cce6e9 26 bool message1Complete = false;
jekain314 29:dead10cce6e9 27 bool message2Complete = false;
jekain314 0:432b860b6ff7 28
jekain314 0:432b860b6ff7 29 void sendASCII(char* ASCI_message, int numChars)
jekain314 0:432b860b6ff7 30 {
jekain314 0:432b860b6ff7 31 /////////////////////////////////////////////////
jekain314 0:432b860b6ff7 32 //send an ASCII command to the GPS receiver
jekain314 0:432b860b6ff7 33 /////////////////////////////////////////////////
jekain314 0:432b860b6ff7 34
jekain314 0:432b860b6ff7 35 //char ASCI_message[] = "unlogall COM1";
jekain314 0:432b860b6ff7 36 int as = numChars - 1;
jekain314 0:432b860b6ff7 37 unsigned char CR = 0x0d; //ASCII Carriage Return
jekain314 0:432b860b6ff7 38 unsigned char LF = 0x0a; //ASCII Line Feed
jekain314 0:432b860b6ff7 39
jekain314 0:432b860b6ff7 40 //printf("%s", ch);
jekain314 0:432b860b6ff7 41 //printf("\n");
jekain314 0:432b860b6ff7 42
jekain314 0:432b860b6ff7 43 for (int i=0; i<as; i++) GPS_COM1.putc(ASCI_message[i]);
jekain314 0:432b860b6ff7 44 GPS_COM1.putc(CR); //carriage return at end
jekain314 0:432b860b6ff7 45 GPS_COM1.putc(LF); //line feed at end
jekain314 0:432b860b6ff7 46 };
jekain314 0:432b860b6ff7 47
jekain314 0:432b860b6ff7 48
jekain314 0:432b860b6ff7 49 //see the mbed COOKBOOK for MODSERIAL
jekain314 0:432b860b6ff7 50 //MODSERIAL is an easy to use library that extends Serial to add fully buffered input and output.
jekain314 0:432b860b6ff7 51 void readSerialByte(MODSERIAL_IRQ_INFO *q)
jekain314 0:432b860b6ff7 52 {
jekain314 0:432b860b6ff7 53 MODSERIAL *serial = q->serial; //see example of MODSERIAL usage in cookbook
jekain314 0:432b860b6ff7 54 unsigned char synch0 = serial->getc(); //get the next byte
jekain314 0:432b860b6ff7 55
jekain314 29:dead10cce6e9 56 totalGPSBytes++;
jekain314 0:432b860b6ff7 57
jekain314 29:dead10cce6e9 58 //all OEM615 GPS ASCII messages begin with the unique character: "#"
jekain314 29:dead10cce6e9 59 //read til we get a "#" and then start storing the message
jekain314 29:dead10cce6e9 60 if (synch0 == '#')
jekain314 0:432b860b6ff7 61 {
jekain314 29:dead10cce6e9 62 if (messagePerSecCounter == 0) GPSbyteCounter0 = 0;
jekain314 29:dead10cce6e9 63 else if(messagePerSecCounter == 1) GPSbyteCounter1 = 0;
jekain314 29:dead10cce6e9 64 else if(messagePerSecCounter == 2) GPSbyteCounter2 = 0;
jekain314 29:dead10cce6e9 65 loadingMessageBuffer = true;
jekain314 29:dead10cce6e9 66 }
jekain314 29:dead10cce6e9 67
jekain314 29:dead10cce6e9 68 if (messagePerSecCounter == 0) { msgBuffer0[GPSbyteCounter0 % maxGPSbytesPerSec] = synch0; GPSbyteCounter0++; }
jekain314 29:dead10cce6e9 69 else if(messagePerSecCounter == 1) { msgBuffer1[GPSbyteCounter1 % maxGPSbytesPerSec] = synch0; GPSbyteCounter1++; }
jekain314 29:dead10cce6e9 70 else if(messagePerSecCounter == 2) { msgBuffer2[GPSbyteCounter2 % maxGPSbytesPerSec] = synch0; GPSbyteCounter2++; }
jekain314 29:dead10cce6e9 71
jekain314 29:dead10cce6e9 72 //stop storing the message when we get a LF
jekain314 29:dead10cce6e9 73 if (synch0 == 0x0a /* LF*/) //test for line feed
jekain314 29:dead10cce6e9 74 {
jekain314 29:dead10cce6e9 75 if (messagePerSecCounter == 0) message0Complete = true;
jekain314 29:dead10cce6e9 76 else if(messagePerSecCounter == 1) message1Complete = true;
jekain314 29:dead10cce6e9 77 else if(messagePerSecCounter == 2) message2Complete = true;
jekain314 29:dead10cce6e9 78 messagePerSecCounter++; //count the messages per second
jekain314 29:dead10cce6e9 79 }
jekain314 29:dead10cce6e9 80
jekain314 29:dead10cce6e9 81 //how this can fail??
jekain314 29:dead10cce6e9 82 // 1) get noisy # occurrences (unique starting character)
jekain314 29:dead10cce6e9 83 // 2) get noisy LF occurrences (unique ending character)
jekain314 29:dead10cce6e9 84 // 3) get noisy data packet values or extra values
jekain314 29:dead10cce6e9 85 // 4) we will also need to vet the data on the PC side
jekain314 29:dead10cce6e9 86 // 5) here, we should do minimal testing and just pass the data as is
jekain314 29:dead10cce6e9 87
jekain314 0:432b860b6ff7 88 };
jekain314 0:432b860b6ff7 89
jekain314 0:432b860b6ff7 90
jekain314 0:432b860b6ff7 91
jekain314 0:432b860b6ff7 92
jekain314 0:432b860b6ff7 93
jekain314 0:432b860b6ff7 94
jekain314 0:432b860b6ff7 95