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
OEM615.h@29:dead10cce6e9, 2014-01-09 (annotated)
- 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?
User | Revision | Line number | New 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 |