Improved, thread compatible. Adds new features

Dependents:   GroveGPS-Example

Fork of GroveGPS by Michael Ray

Committer:
JimCarver
Date:
Thu May 31 17:21:40 2018 +0000
Revision:
4:4615d6e99bb4
Parent:
3:cc5c9faa1cc6
Thread based example

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JimCarver 3:cc5c9faa1cc6 1 // ----------------------------------------------------------------------------
JimCarver 3:cc5c9faa1cc6 2 // Copyright 2016-2017 ARM Ltd.
JimCarver 3:cc5c9faa1cc6 3 //
JimCarver 3:cc5c9faa1cc6 4 // SPDX-License-Identifier: Apache-2.0
JimCarver 3:cc5c9faa1cc6 5 //
JimCarver 3:cc5c9faa1cc6 6 // Licensed under the Apache License, Version 2.0 (the "License");
JimCarver 3:cc5c9faa1cc6 7 // you may not use this file except in compliance with the License.
JimCarver 3:cc5c9faa1cc6 8 // You may obtain a copy of the License at
JimCarver 3:cc5c9faa1cc6 9 //
JimCarver 3:cc5c9faa1cc6 10 // http://www.apache.org/licenses/LICENSE-2.0
JimCarver 3:cc5c9faa1cc6 11 //
JimCarver 3:cc5c9faa1cc6 12 // Unless required by applicable law or agreed to in writing, software
JimCarver 3:cc5c9faa1cc6 13 // distributed under the License is distributed on an "AS IS" BASIS,
JimCarver 3:cc5c9faa1cc6 14 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
JimCarver 3:cc5c9faa1cc6 15 // See the License for the specific language governing permissions and
JimCarver 3:cc5c9faa1cc6 16 // limitations under the License.
JimCarver 3:cc5c9faa1cc6 17 // ----------------------------------------------------------------------------
JimCarver 3:cc5c9faa1cc6 18
JimCarver 3:cc5c9faa1cc6 19 #include "mbed.h"
JimCarver 3:cc5c9faa1cc6 20
JimCarver 3:cc5c9faa1cc6 21 #include "GroveGPS.h"
JimCarver 3:cc5c9faa1cc6 22
JimCarver 4:4615d6e99bb4 23 Serial gps_serial(D1, D0, 9600);
JimCarver 4:4615d6e99bb4 24
JimCarver 4:4615d6e99bb4 25
JimCarver 4:4615d6e99bb4 26
JimCarver 4:4615d6e99bb4 27 //Thread gpsThread;
JimCarver 4:4615d6e99bb4 28 GroveGPS gps;
JimCarver 4:4615d6e99bb4 29
JimCarver 4:4615d6e99bb4 30 Semaphore parse;
JimCarver 4:4615d6e99bb4 31 Thread parsethread(osPriorityBelowNormal);
JimCarver 3:cc5c9faa1cc6 32
JimCarver 3:cc5c9faa1cc6 33
JimCarver 4:4615d6e99bb4 34 static void parseLine() {
JimCarver 4:4615d6e99bb4 35 while(1) {
JimCarver 4:4615d6e99bb4 36 parse.wait();
JimCarver 4:4615d6e99bb4 37 if (gps._last_line.find("GPGGA") != std::string::npos) {
JimCarver 4:4615d6e99bb4 38 gps.parseGGA();
JimCarver 4:4615d6e99bb4 39 }
JimCarver 4:4615d6e99bb4 40 if (gps._last_line.find("GPZDA") != std::string::npos) {
JimCarver 4:4615d6e99bb4 41 gps.parseZDA();
JimCarver 4:4615d6e99bb4 42 }
JimCarver 4:4615d6e99bb4 43 if (gps._last_line.find("GPVTG") != std::string::npos) {
JimCarver 4:4615d6e99bb4 44 gps.parseVTG();
JimCarver 4:4615d6e99bb4 45 }
JimCarver 4:4615d6e99bb4 46 gps._last_line = "";
JimCarver 4:4615d6e99bb4 47 }
JimCarver 4:4615d6e99bb4 48 }
JimCarver 3:cc5c9faa1cc6 49
JimCarver 3:cc5c9faa1cc6 50
JimCarver 4:4615d6e99bb4 51 void readCharacter(char newCharacter) {
JimCarver 4:4615d6e99bb4 52 if (newCharacter == '\n') {
JimCarver 4:4615d6e99bb4 53 parse.release();
JimCarver 4:4615d6e99bb4 54 } else {
JimCarver 4:4615d6e99bb4 55 gps._last_line += newCharacter;
JimCarver 4:4615d6e99bb4 56 }
JimCarver 4:4615d6e99bb4 57 }
JimCarver 4:4615d6e99bb4 58
JimCarver 4:4615d6e99bb4 59
JimCarver 3:cc5c9faa1cc6 60 void service_serial(void) {
JimCarver 4:4615d6e99bb4 61 readCharacter(gps_serial.getc());
JimCarver 3:cc5c9faa1cc6 62 }
JimCarver 3:cc5c9faa1cc6 63
JimCarver 3:cc5c9faa1cc6 64
JimCarver 3:cc5c9faa1cc6 65 int calc_cs(char * str) {
JimCarver 3:cc5c9faa1cc6 66 char cs = 0;
JimCarver 3:cc5c9faa1cc6 67 int x = 1;
JimCarver 3:cc5c9faa1cc6 68
JimCarver 3:cc5c9faa1cc6 69 while(str[x] != '*') {
JimCarver 3:cc5c9faa1cc6 70 cs ^= str[x++];
JimCarver 3:cc5c9faa1cc6 71 }
JimCarver 3:cc5c9faa1cc6 72 return(cs);
JimCarver 3:cc5c9faa1cc6 73 }
JimCarver 3:cc5c9faa1cc6 74
JimCarver 3:cc5c9faa1cc6 75 void nema_send( void ) {
JimCarver 3:cc5c9faa1cc6 76
JimCarver 4:4615d6e99bb4 77 char nema_mode[] = "$PMTK314,0,0,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0*";
JimCarver 3:cc5c9faa1cc6 78 char nema_cmd[64];
JimCarver 3:cc5c9faa1cc6 79 int x = 0;
JimCarver 3:cc5c9faa1cc6 80 sprintf( nema_cmd, "%s%x\r\n", nema_mode, calc_cs(nema_mode));
JimCarver 3:cc5c9faa1cc6 81 while(nema_cmd[x]) {
JimCarver 3:cc5c9faa1cc6 82 gps_serial.putc(nema_cmd[x++]);
JimCarver 3:cc5c9faa1cc6 83 }
JimCarver 3:cc5c9faa1cc6 84 }
JimCarver 3:cc5c9faa1cc6 85
JimCarver 3:cc5c9faa1cc6 86 int GPS_init() {
JimCarver 4:4615d6e99bb4 87 gps._last_line = "";
JimCarver 3:cc5c9faa1cc6 88 gps_serial.attach( &service_serial, Serial::RxIrq );
JimCarver 3:cc5c9faa1cc6 89 gps.gps_gga.new_flag = 0;
JimCarver 3:cc5c9faa1cc6 90 gps.gps_zda.new_flag = 0;
JimCarver 3:cc5c9faa1cc6 91 gps.gps_vtg.new_flag = 0;
JimCarver 3:cc5c9faa1cc6 92 nema_send();
JimCarver 4:4615d6e99bb4 93 printf("\r\nGPS Init\r\n");
JimCarver 4:4615d6e99bb4 94 parsethread.start(parseLine);
JimCarver 4:4615d6e99bb4 95 return 0;
JimCarver 3:cc5c9faa1cc6 96 }