Luca Antolini / Mbed 2 deprecated AAA_Stabilus322699_LA0021

Dependencies:   mbed QEI PID DmTftLibraryEx

Committer:
GregCr
Date:
Mon Mar 13 15:12:05 2017 +0000
Revision:
0:9c0917bfde97
alpha release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
GregCr 0:9c0917bfde97 1 /*
GregCr 0:9c0917bfde97 2 ______ _
GregCr 0:9c0917bfde97 3 / _____) _ | |
GregCr 0:9c0917bfde97 4 ( (____ _____ ____ _| |_ _____ ____| |__
GregCr 0:9c0917bfde97 5 \____ \| ___ | (_ _) ___ |/ ___) _ \
GregCr 0:9c0917bfde97 6 _____) ) ____| | | || |_| ____( (___| | | |
GregCr 0:9c0917bfde97 7 (______/|_____)_|_|_| \__)_____)\____)_| |_|
GregCr 0:9c0917bfde97 8 (C)2016 Semtech
GregCr 0:9c0917bfde97 9
GregCr 0:9c0917bfde97 10 Description: uBlox MAX7 GPS
GregCr 0:9c0917bfde97 11
GregCr 0:9c0917bfde97 12 Maintainer: Gregory Cristian & Gilbert Menth
GregCr 0:9c0917bfde97 13 */
GregCr 0:9c0917bfde97 14
GregCr 0:9c0917bfde97 15 #include <stdio.h>
GregCr 0:9c0917bfde97 16 #include "mbed.h"
GregCr 0:9c0917bfde97 17 #include "Timers.h"
GregCr 0:9c0917bfde97 18 #include "GpsMax7.h"
GregCr 0:9c0917bfde97 19
GregCr 0:9c0917bfde97 20
GregCr 0:9c0917bfde97 21 #define MAX_NMEA_SENTENCE_LENGTH 100
GregCr 0:9c0917bfde97 22 #define GPS_I2C_ADDR ( 0x84 ) // GPS IC I2C address
GregCr 0:9c0917bfde97 23 #define NUM_SETUP_COMMANDS 7
GregCr 0:9c0917bfde97 24 #define SETUP_COMMAND_LENGTH 16
GregCr 0:9c0917bfde97 25 #define DATA_STREAM_ADDRESS 0xFF
GregCr 0:9c0917bfde97 26 #define I2C_FREQUENCY 100000 //100 kHz
GregCr 0:9c0917bfde97 27
GregCr 0:9c0917bfde97 28
GregCr 0:9c0917bfde97 29 typedef enum
GregCr 0:9c0917bfde97 30 {
GregCr 0:9c0917bfde97 31 GPGGA_NMEA_DOLLAR,
GregCr 0:9c0917bfde97 32 GPGGA_NMEA_G1,
GregCr 0:9c0917bfde97 33 GPGGA_NMEA_P,
GregCr 0:9c0917bfde97 34 GPGGA_NMEA_G2,
GregCr 0:9c0917bfde97 35 GPGGA_NMEA_G3,
GregCr 0:9c0917bfde97 36 GPGGA_NMEA_A,
GregCr 0:9c0917bfde97 37 GPGGA_NMEA_CR,
GregCr 0:9c0917bfde97 38 GPGGA_NMEA_LF
GregCr 0:9c0917bfde97 39 }GpggaNmeaFields_t;
GregCr 0:9c0917bfde97 40
GregCr 0:9c0917bfde97 41 typedef enum
GregCr 0:9c0917bfde97 42 {
GregCr 0:9c0917bfde97 43 GPZDA_NMEA_DOLLAR,
GregCr 0:9c0917bfde97 44 GPZDA_NMEA_G1,
GregCr 0:9c0917bfde97 45 GPZDA_NMEA_P,
GregCr 0:9c0917bfde97 46 GPZDA_NMEA_G2,
GregCr 0:9c0917bfde97 47 GPZDA_NMEA_G3,
GregCr 0:9c0917bfde97 48 GPZDA_NMEA_A,
GregCr 0:9c0917bfde97 49 GPZDA_NMEA_CR,
GregCr 0:9c0917bfde97 50 GPZDA_NMEA_LF
GregCr 0:9c0917bfde97 51 }GpzdaNmeaFields_t;
GregCr 0:9c0917bfde97 52
GregCr 0:9c0917bfde97 53 typedef enum
GregCr 0:9c0917bfde97 54 {
GregCr 0:9c0917bfde97 55 GPS_COMMS_INIT,
GregCr 0:9c0917bfde97 56 GPS_COMMS_WRITE_SETUP,
GregCr 0:9c0917bfde97 57 GPS_COMMS_WAIT_WRITE_SETUP,
GregCr 0:9c0917bfde97 58 GPS_COMMS_READ_DATA_BUFFER,
GregCr 0:9c0917bfde97 59 GPS_COMMS_WAIT_NEXT_READ
GregCr 0:9c0917bfde97 60 }GpsCommsState_t;
GregCr 0:9c0917bfde97 61
GregCr 0:9c0917bfde97 62 union GpsBufferSize
GregCr 0:9c0917bfde97 63 {
GregCr 0:9c0917bfde97 64 uint16_t NumBytes;
GregCr 0:9c0917bfde97 65 char NumBytesBuffer[2];
GregCr 0:9c0917bfde97 66 };
GregCr 0:9c0917bfde97 67
GregCr 0:9c0917bfde97 68
GregCr 0:9c0917bfde97 69 //MAX7 initialisation commands
GregCr 0:9c0917bfde97 70 const char SetupArray[NUM_SETUP_COMMANDS][SETUP_COMMAND_LENGTH] =
GregCr 0:9c0917bfde97 71 {
GregCr 0:9c0917bfde97 72 { 0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29 }, // GxGGA on to I2C
GregCr 0:9c0917bfde97 73 { 0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x09, 0x62 }, // GxZDA on to I2C
GregCr 0:9c0917bfde97 74 { 0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x2B }, // GxGLL not on the I2C
GregCr 0:9c0917bfde97 75 { 0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x40 }, // GxRMC not on the I2C
GregCr 0:9c0917bfde97 76 { 0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x47 }, // GxVTG not on the I2C
GregCr 0:9c0917bfde97 77 { 0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x32 }, // GxGSA not on the I2C
GregCr 0:9c0917bfde97 78 { 0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x39 } // GxGSV not on the I2C
GregCr 0:9c0917bfde97 79 };
GregCr 0:9c0917bfde97 80
GregCr 0:9c0917bfde97 81 I2C GpsI2C( I2C_SDA, I2C_SCL );
GregCr 0:9c0917bfde97 82
GregCr 0:9c0917bfde97 83 GpsStruct Gps;
GregCr 0:9c0917bfde97 84
GregCr 0:9c0917bfde97 85 static uint8_t GpggaSentenceBuffer[MAX_NMEA_SENTENCE_LENGTH];
GregCr 0:9c0917bfde97 86 static int GpggaSentenceBufferPtr = 0;
GregCr 0:9c0917bfde97 87 static uint8_t GpzdaSentenceBuffer[MAX_NMEA_SENTENCE_LENGTH];
GregCr 0:9c0917bfde97 88 static int GpzdaSentenceBufferPtr = 0;
GregCr 0:9c0917bfde97 89
GregCr 0:9c0917bfde97 90 static GpggaNmeaFields_t GpggaNmeaField;
GregCr 0:9c0917bfde97 91 static GpzdaNmeaFields_t GpzdaNmeaField;
GregCr 0:9c0917bfde97 92 static GpsCommsState_t GpsCommsState;
GregCr 0:9c0917bfde97 93 static uint32_t GpsCommsTimer;
GregCr 0:9c0917bfde97 94
GregCr 0:9c0917bfde97 95
GregCr 0:9c0917bfde97 96 static void GpsCheckCommandBufferForGpgga( uint8_t thisChar );
GregCr 0:9c0917bfde97 97 static void GpsCheckCommandBufferForGpzda( uint8_t thisChar );
GregCr 0:9c0917bfde97 98 static void ParseNmeaGpggaSentence( void );
GregCr 0:9c0917bfde97 99 static void ParseNmeaGpzdaSentence( void );
GregCr 0:9c0917bfde97 100 static bool Max7GpsWriteSetupOK( void );
GregCr 0:9c0917bfde97 101 static bool Max7GpsReadDataBuffer( void );
GregCr 0:9c0917bfde97 102 static uint8_t Max7GpsReadRegister( char thisRegAddress );
GregCr 0:9c0917bfde97 103
GregCr 0:9c0917bfde97 104
GregCr 0:9c0917bfde97 105 void Max7GpsInit( void )
GregCr 0:9c0917bfde97 106 {
GregCr 0:9c0917bfde97 107 GpsI2C.frequency( I2C_FREQUENCY );
GregCr 0:9c0917bfde97 108 }
GregCr 0:9c0917bfde97 109
GregCr 0:9c0917bfde97 110 void Max7GpsHandle( void )
GregCr 0:9c0917bfde97 111 {
GregCr 0:9c0917bfde97 112 switch( GpsCommsState )
GregCr 0:9c0917bfde97 113 {
GregCr 0:9c0917bfde97 114 case GPS_COMMS_INIT:
GregCr 0:9c0917bfde97 115 GpsCommsState = GPS_COMMS_WRITE_SETUP;
GregCr 0:9c0917bfde97 116 break;
GregCr 0:9c0917bfde97 117
GregCr 0:9c0917bfde97 118 case GPS_COMMS_WRITE_SETUP:
GregCr 0:9c0917bfde97 119 if( Max7GpsWriteSetupOK( ) )
GregCr 0:9c0917bfde97 120 {
GregCr 0:9c0917bfde97 121 GpsCommsState = GPS_COMMS_READ_DATA_BUFFER;
GregCr 0:9c0917bfde97 122 }
GregCr 0:9c0917bfde97 123 else
GregCr 0:9c0917bfde97 124 {
GregCr 0:9c0917bfde97 125 TimersSetTimer( &GpsCommsTimer, 1 * TIM_SEC );
GregCr 0:9c0917bfde97 126 GpsCommsState = GPS_COMMS_WAIT_WRITE_SETUP;
GregCr 0:9c0917bfde97 127 }
GregCr 0:9c0917bfde97 128 break;
GregCr 0:9c0917bfde97 129
GregCr 0:9c0917bfde97 130 case GPS_COMMS_WAIT_WRITE_SETUP:
GregCr 0:9c0917bfde97 131 if( TimersTimerHasExpired( &GpsCommsTimer ) )
GregCr 0:9c0917bfde97 132 {
GregCr 0:9c0917bfde97 133 GpsCommsState = GPS_COMMS_WRITE_SETUP;
GregCr 0:9c0917bfde97 134 }
GregCr 0:9c0917bfde97 135 break;
GregCr 0:9c0917bfde97 136
GregCr 0:9c0917bfde97 137 case GPS_COMMS_READ_DATA_BUFFER:
GregCr 0:9c0917bfde97 138 Max7GpsReadDataBuffer( );
GregCr 0:9c0917bfde97 139 TimersSetTimer( &GpsCommsTimer, 100 * TIM_MSEC );
GregCr 0:9c0917bfde97 140 GpsCommsState = GPS_COMMS_WAIT_NEXT_READ;
GregCr 0:9c0917bfde97 141 break;
GregCr 0:9c0917bfde97 142
GregCr 0:9c0917bfde97 143 case GPS_COMMS_WAIT_NEXT_READ:
GregCr 0:9c0917bfde97 144 if( TimersTimerHasExpired( &GpsCommsTimer ) )
GregCr 0:9c0917bfde97 145 {
GregCr 0:9c0917bfde97 146 GpsCommsState = GPS_COMMS_READ_DATA_BUFFER;
GregCr 0:9c0917bfde97 147 }
GregCr 0:9c0917bfde97 148 break;
GregCr 0:9c0917bfde97 149 }
GregCr 0:9c0917bfde97 150 }
GregCr 0:9c0917bfde97 151
GregCr 0:9c0917bfde97 152 static bool Max7GpsWriteSetupOK( void )
GregCr 0:9c0917bfde97 153 {
GregCr 0:9c0917bfde97 154 int lineCount;
GregCr 0:9c0917bfde97 155
GregCr 0:9c0917bfde97 156 for( lineCount = 0; lineCount < NUM_SETUP_COMMANDS; lineCount++ )
GregCr 0:9c0917bfde97 157 {
GregCr 0:9c0917bfde97 158 if( GpsI2C.write( GPS_I2C_ADDR, &SetupArray[lineCount][0], \
GregCr 0:9c0917bfde97 159 SETUP_COMMAND_LENGTH, 0 ) )
GregCr 0:9c0917bfde97 160 {
GregCr 0:9c0917bfde97 161 return false;
GregCr 0:9c0917bfde97 162 }
GregCr 0:9c0917bfde97 163 }
GregCr 0:9c0917bfde97 164 return true;
GregCr 0:9c0917bfde97 165 }
GregCr 0:9c0917bfde97 166
GregCr 0:9c0917bfde97 167 static bool Max7GpsReadDataBuffer( void )
GregCr 0:9c0917bfde97 168 {
GregCr 0:9c0917bfde97 169 uint8_t incomingCheck;
GregCr 0:9c0917bfde97 170 bool contFlag = true;
GregCr 0:9c0917bfde97 171
GregCr 0:9c0917bfde97 172 while( contFlag )
GregCr 0:9c0917bfde97 173 {
GregCr 0:9c0917bfde97 174 incomingCheck = Max7GpsReadRegister( DATA_STREAM_ADDRESS );
GregCr 0:9c0917bfde97 175 if( incomingCheck == 0xFF )
GregCr 0:9c0917bfde97 176 {
GregCr 0:9c0917bfde97 177 contFlag = false;
GregCr 0:9c0917bfde97 178 }
GregCr 0:9c0917bfde97 179 else
GregCr 0:9c0917bfde97 180 {
GregCr 0:9c0917bfde97 181 GpsCheckCommandBufferForGpgga( incomingCheck );
GregCr 0:9c0917bfde97 182 GpsCheckCommandBufferForGpzda( incomingCheck );
GregCr 0:9c0917bfde97 183 }
GregCr 0:9c0917bfde97 184 }
GregCr 0:9c0917bfde97 185 return false;
GregCr 0:9c0917bfde97 186 }
GregCr 0:9c0917bfde97 187
GregCr 0:9c0917bfde97 188 static uint8_t Max7GpsReadRegister( char thisRegAddress )
GregCr 0:9c0917bfde97 189 {
GregCr 0:9c0917bfde97 190 char thisValue;
GregCr 0:9c0917bfde97 191 uint8_t retVal;
GregCr 0:9c0917bfde97 192
GregCr 0:9c0917bfde97 193 thisValue = thisRegAddress;
GregCr 0:9c0917bfde97 194 GpsI2C.write( GPS_I2C_ADDR, &thisValue, 1, 0 );
GregCr 0:9c0917bfde97 195 GpsI2C.read( GPS_I2C_ADDR, &thisValue, 1, 0 );
GregCr 0:9c0917bfde97 196 retVal = ( uint8_t )thisValue;
GregCr 0:9c0917bfde97 197 return retVal;
GregCr 0:9c0917bfde97 198 }
GregCr 0:9c0917bfde97 199
GregCr 0:9c0917bfde97 200 static void GpsCheckCommandBufferForGpgga( uint8_t thisChar )
GregCr 0:9c0917bfde97 201 {
GregCr 0:9c0917bfde97 202 switch( GpggaNmeaField )
GregCr 0:9c0917bfde97 203 {
GregCr 0:9c0917bfde97 204 default:
GregCr 0:9c0917bfde97 205 case GPGGA_NMEA_DOLLAR:
GregCr 0:9c0917bfde97 206 if( thisChar == '$' )
GregCr 0:9c0917bfde97 207 {
GregCr 0:9c0917bfde97 208 GpggaSentenceBufferPtr = 0;
GregCr 0:9c0917bfde97 209 GpggaSentenceBuffer[GpggaSentenceBufferPtr++] = thisChar;
GregCr 0:9c0917bfde97 210 GpggaNmeaField = GPGGA_NMEA_G1;
GregCr 0:9c0917bfde97 211 }
GregCr 0:9c0917bfde97 212 break;
GregCr 0:9c0917bfde97 213
GregCr 0:9c0917bfde97 214 case GPGGA_NMEA_G1:
GregCr 0:9c0917bfde97 215 if( thisChar == 'G' )
GregCr 0:9c0917bfde97 216 {
GregCr 0:9c0917bfde97 217 GpggaSentenceBuffer[GpggaSentenceBufferPtr++] = thisChar;
GregCr 0:9c0917bfde97 218 GpggaNmeaField = GPGGA_NMEA_P;
GregCr 0:9c0917bfde97 219 }
GregCr 0:9c0917bfde97 220 else
GregCr 0:9c0917bfde97 221 {
GregCr 0:9c0917bfde97 222 GpggaNmeaField = GPGGA_NMEA_DOLLAR;
GregCr 0:9c0917bfde97 223 }
GregCr 0:9c0917bfde97 224 break;
GregCr 0:9c0917bfde97 225
GregCr 0:9c0917bfde97 226 case GPGGA_NMEA_P:
GregCr 0:9c0917bfde97 227 if( thisChar == 'P' )
GregCr 0:9c0917bfde97 228 {
GregCr 0:9c0917bfde97 229 GpggaSentenceBuffer[GpggaSentenceBufferPtr++] = thisChar;
GregCr 0:9c0917bfde97 230 GpggaNmeaField = GPGGA_NMEA_G2;
GregCr 0:9c0917bfde97 231 }
GregCr 0:9c0917bfde97 232 else
GregCr 0:9c0917bfde97 233 {
GregCr 0:9c0917bfde97 234 GpggaNmeaField = GPGGA_NMEA_DOLLAR;
GregCr 0:9c0917bfde97 235 }
GregCr 0:9c0917bfde97 236 break;
GregCr 0:9c0917bfde97 237
GregCr 0:9c0917bfde97 238 case GPGGA_NMEA_G2:
GregCr 0:9c0917bfde97 239 if( thisChar == 'G' )
GregCr 0:9c0917bfde97 240 {
GregCr 0:9c0917bfde97 241 GpggaSentenceBuffer[GpggaSentenceBufferPtr++] = thisChar;
GregCr 0:9c0917bfde97 242 GpggaNmeaField = GPGGA_NMEA_G3;
GregCr 0:9c0917bfde97 243 }
GregCr 0:9c0917bfde97 244 else
GregCr 0:9c0917bfde97 245 {
GregCr 0:9c0917bfde97 246 GpggaNmeaField = GPGGA_NMEA_DOLLAR;
GregCr 0:9c0917bfde97 247 }
GregCr 0:9c0917bfde97 248 break;
GregCr 0:9c0917bfde97 249
GregCr 0:9c0917bfde97 250 case GPGGA_NMEA_G3:
GregCr 0:9c0917bfde97 251 if( thisChar == 'G' )
GregCr 0:9c0917bfde97 252 {
GregCr 0:9c0917bfde97 253 GpggaSentenceBuffer[GpggaSentenceBufferPtr++] = thisChar;
GregCr 0:9c0917bfde97 254 GpggaNmeaField = GPGGA_NMEA_A;
GregCr 0:9c0917bfde97 255 }
GregCr 0:9c0917bfde97 256 else
GregCr 0:9c0917bfde97 257 {
GregCr 0:9c0917bfde97 258 GpggaNmeaField = GPGGA_NMEA_DOLLAR;
GregCr 0:9c0917bfde97 259 }
GregCr 0:9c0917bfde97 260 break;
GregCr 0:9c0917bfde97 261
GregCr 0:9c0917bfde97 262 case GPGGA_NMEA_A:
GregCr 0:9c0917bfde97 263 if( thisChar == 'A' )
GregCr 0:9c0917bfde97 264 {
GregCr 0:9c0917bfde97 265 GpggaSentenceBuffer[GpggaSentenceBufferPtr++] = thisChar;
GregCr 0:9c0917bfde97 266 GpggaNmeaField = GPGGA_NMEA_CR;
GregCr 0:9c0917bfde97 267 }
GregCr 0:9c0917bfde97 268 else
GregCr 0:9c0917bfde97 269 {
GregCr 0:9c0917bfde97 270 GpggaNmeaField = GPGGA_NMEA_DOLLAR;
GregCr 0:9c0917bfde97 271 }
GregCr 0:9c0917bfde97 272 break;
GregCr 0:9c0917bfde97 273
GregCr 0:9c0917bfde97 274 case GPGGA_NMEA_CR:
GregCr 0:9c0917bfde97 275 GpggaSentenceBuffer[GpggaSentenceBufferPtr++] = thisChar;
GregCr 0:9c0917bfde97 276 if( GpggaSentenceBufferPtr >= MAX_NMEA_SENTENCE_LENGTH )
GregCr 0:9c0917bfde97 277 {
GregCr 0:9c0917bfde97 278 GpggaNmeaField = GPGGA_NMEA_DOLLAR;
GregCr 0:9c0917bfde97 279 }
GregCr 0:9c0917bfde97 280 if( thisChar == 0x0A )
GregCr 0:9c0917bfde97 281 {
GregCr 0:9c0917bfde97 282 ParseNmeaGpggaSentence( );
GregCr 0:9c0917bfde97 283 }
GregCr 0:9c0917bfde97 284 break;
GregCr 0:9c0917bfde97 285
GregCr 0:9c0917bfde97 286 case GPGGA_NMEA_LF:
GregCr 0:9c0917bfde97 287 break;
GregCr 0:9c0917bfde97 288 }
GregCr 0:9c0917bfde97 289 }
GregCr 0:9c0917bfde97 290
GregCr 0:9c0917bfde97 291 static void GpsCheckCommandBufferForGpzda( uint8_t thisChar )
GregCr 0:9c0917bfde97 292 {
GregCr 0:9c0917bfde97 293 switch( GpzdaNmeaField )
GregCr 0:9c0917bfde97 294 {
GregCr 0:9c0917bfde97 295 default:
GregCr 0:9c0917bfde97 296 case GPZDA_NMEA_DOLLAR:
GregCr 0:9c0917bfde97 297 if( thisChar == '$' )
GregCr 0:9c0917bfde97 298 {
GregCr 0:9c0917bfde97 299 GpzdaSentenceBufferPtr = 0;
GregCr 0:9c0917bfde97 300 GpzdaSentenceBuffer[GpzdaSentenceBufferPtr++] = thisChar;
GregCr 0:9c0917bfde97 301 GpzdaNmeaField = GPZDA_NMEA_G1;
GregCr 0:9c0917bfde97 302 }
GregCr 0:9c0917bfde97 303 break;
GregCr 0:9c0917bfde97 304
GregCr 0:9c0917bfde97 305 case GPZDA_NMEA_G1:
GregCr 0:9c0917bfde97 306 if( thisChar == 'G' )
GregCr 0:9c0917bfde97 307 {
GregCr 0:9c0917bfde97 308 GpzdaSentenceBuffer[GpzdaSentenceBufferPtr++] = thisChar;
GregCr 0:9c0917bfde97 309 GpzdaNmeaField = GPZDA_NMEA_P;
GregCr 0:9c0917bfde97 310 }
GregCr 0:9c0917bfde97 311 else
GregCr 0:9c0917bfde97 312 {
GregCr 0:9c0917bfde97 313 GpzdaNmeaField = GPZDA_NMEA_DOLLAR;
GregCr 0:9c0917bfde97 314 }
GregCr 0:9c0917bfde97 315 break;
GregCr 0:9c0917bfde97 316
GregCr 0:9c0917bfde97 317 case GPZDA_NMEA_P:
GregCr 0:9c0917bfde97 318 if( thisChar == 'P' )
GregCr 0:9c0917bfde97 319 {
GregCr 0:9c0917bfde97 320 GpzdaSentenceBuffer[GpzdaSentenceBufferPtr++] = thisChar;
GregCr 0:9c0917bfde97 321 GpzdaNmeaField = GPZDA_NMEA_G2;
GregCr 0:9c0917bfde97 322 }
GregCr 0:9c0917bfde97 323 else
GregCr 0:9c0917bfde97 324 {
GregCr 0:9c0917bfde97 325 GpzdaNmeaField = GPZDA_NMEA_DOLLAR;
GregCr 0:9c0917bfde97 326 }
GregCr 0:9c0917bfde97 327 break;
GregCr 0:9c0917bfde97 328
GregCr 0:9c0917bfde97 329 case GPZDA_NMEA_G2:
GregCr 0:9c0917bfde97 330 if( thisChar == 'Z' )
GregCr 0:9c0917bfde97 331 {
GregCr 0:9c0917bfde97 332 GpzdaSentenceBuffer[GpzdaSentenceBufferPtr++] = thisChar;
GregCr 0:9c0917bfde97 333 GpzdaNmeaField = GPZDA_NMEA_G3;
GregCr 0:9c0917bfde97 334 }
GregCr 0:9c0917bfde97 335 else
GregCr 0:9c0917bfde97 336 {
GregCr 0:9c0917bfde97 337 GpzdaNmeaField = GPZDA_NMEA_DOLLAR;
GregCr 0:9c0917bfde97 338 }
GregCr 0:9c0917bfde97 339 break;
GregCr 0:9c0917bfde97 340
GregCr 0:9c0917bfde97 341 case GPZDA_NMEA_G3:
GregCr 0:9c0917bfde97 342 if( thisChar == 'D' )
GregCr 0:9c0917bfde97 343 {
GregCr 0:9c0917bfde97 344 GpzdaSentenceBuffer[GpzdaSentenceBufferPtr++] = thisChar;
GregCr 0:9c0917bfde97 345 GpzdaNmeaField = GPZDA_NMEA_A;
GregCr 0:9c0917bfde97 346 }
GregCr 0:9c0917bfde97 347 else
GregCr 0:9c0917bfde97 348 {
GregCr 0:9c0917bfde97 349 GpzdaNmeaField = GPZDA_NMEA_DOLLAR;
GregCr 0:9c0917bfde97 350 }
GregCr 0:9c0917bfde97 351 break;
GregCr 0:9c0917bfde97 352
GregCr 0:9c0917bfde97 353 case GPZDA_NMEA_A:
GregCr 0:9c0917bfde97 354 if( thisChar == 'A' )
GregCr 0:9c0917bfde97 355 {
GregCr 0:9c0917bfde97 356 GpzdaSentenceBuffer[GpzdaSentenceBufferPtr++] = thisChar;
GregCr 0:9c0917bfde97 357 GpzdaNmeaField = GPZDA_NMEA_CR;
GregCr 0:9c0917bfde97 358 }
GregCr 0:9c0917bfde97 359 else
GregCr 0:9c0917bfde97 360 {
GregCr 0:9c0917bfde97 361 GpzdaNmeaField = GPZDA_NMEA_DOLLAR;
GregCr 0:9c0917bfde97 362 }
GregCr 0:9c0917bfde97 363 break;
GregCr 0:9c0917bfde97 364
GregCr 0:9c0917bfde97 365 case GPZDA_NMEA_CR:
GregCr 0:9c0917bfde97 366 GpzdaSentenceBuffer[GpzdaSentenceBufferPtr++] = thisChar;
GregCr 0:9c0917bfde97 367 if( GpzdaSentenceBufferPtr >= MAX_NMEA_SENTENCE_LENGTH )
GregCr 0:9c0917bfde97 368 {
GregCr 0:9c0917bfde97 369 GpzdaNmeaField = GPZDA_NMEA_DOLLAR;
GregCr 0:9c0917bfde97 370 }
GregCr 0:9c0917bfde97 371 if( thisChar == 0x0A )
GregCr 0:9c0917bfde97 372 {
GregCr 0:9c0917bfde97 373 ParseNmeaGpzdaSentence( );
GregCr 0:9c0917bfde97 374 }
GregCr 0:9c0917bfde97 375 break;
GregCr 0:9c0917bfde97 376
GregCr 0:9c0917bfde97 377 case GPZDA_NMEA_LF:
GregCr 0:9c0917bfde97 378 break;
GregCr 0:9c0917bfde97 379 }
GregCr 0:9c0917bfde97 380 }
GregCr 0:9c0917bfde97 381
GregCr 0:9c0917bfde97 382 static void ParseNmeaGpggaSentence( void )
GregCr 0:9c0917bfde97 383 {
GregCr 0:9c0917bfde97 384 GpggaStruct thisFix;
GregCr 0:9c0917bfde97 385 int sentencePtr = 1;
GregCr 0:9c0917bfde97 386 int subStrPtr = 0;
GregCr 0:9c0917bfde97 387 int commaCount = 0;
GregCr 0:9c0917bfde97 388 uint8_t checkSum = 0;
GregCr 0:9c0917bfde97 389 uint8_t thisChar;
GregCr 0:9c0917bfde97 390 bool contFlag = true;
GregCr 0:9c0917bfde97 391 char tArray[3];
GregCr 0:9c0917bfde97 392 char compArray[3];
GregCr 0:9c0917bfde97 393
GregCr 0:9c0917bfde97 394 while( contFlag ) //Get the checksum
GregCr 0:9c0917bfde97 395 {
GregCr 0:9c0917bfde97 396 thisChar = GpggaSentenceBuffer[sentencePtr];
GregCr 0:9c0917bfde97 397 if( thisChar == '*' )
GregCr 0:9c0917bfde97 398 {
GregCr 0:9c0917bfde97 399 contFlag = false;
GregCr 0:9c0917bfde97 400 }
GregCr 0:9c0917bfde97 401 else
GregCr 0:9c0917bfde97 402 {
GregCr 0:9c0917bfde97 403 checkSum ^= thisChar;
GregCr 0:9c0917bfde97 404 }
GregCr 0:9c0917bfde97 405 sentencePtr++;
GregCr 0:9c0917bfde97 406 if( sentencePtr >= MAX_NMEA_SENTENCE_LENGTH )
GregCr 0:9c0917bfde97 407 {
GregCr 0:9c0917bfde97 408 thisFix.Fixed = false;
GregCr 0:9c0917bfde97 409 return;
GregCr 0:9c0917bfde97 410 }
GregCr 0:9c0917bfde97 411 }
GregCr 0:9c0917bfde97 412 compArray[0] = GpggaSentenceBuffer[sentencePtr++];
GregCr 0:9c0917bfde97 413 compArray[1] = GpggaSentenceBuffer[sentencePtr];
GregCr 0:9c0917bfde97 414 compArray[2] = 0x00;
GregCr 0:9c0917bfde97 415 sentencePtr = 0;
GregCr 0:9c0917bfde97 416 sprintf( tArray, "%02X", checkSum );
GregCr 0:9c0917bfde97 417 if( strcmp( tArray, compArray ) != 0 ) //Fails checksum
GregCr 0:9c0917bfde97 418 {
GregCr 0:9c0917bfde97 419 thisFix.Fixed = false;
GregCr 0:9c0917bfde97 420 return;
GregCr 0:9c0917bfde97 421 }
GregCr 0:9c0917bfde97 422 while( commaCount < 6 ) //Find fix quality
GregCr 0:9c0917bfde97 423 {
GregCr 0:9c0917bfde97 424 if( GpggaSentenceBuffer[sentencePtr++] == ',' )
GregCr 0:9c0917bfde97 425 {
GregCr 0:9c0917bfde97 426 commaCount++;
GregCr 0:9c0917bfde97 427 }
GregCr 0:9c0917bfde97 428 if( sentencePtr >= MAX_NMEA_SENTENCE_LENGTH )
GregCr 0:9c0917bfde97 429 {
GregCr 0:9c0917bfde97 430 thisFix.Fixed = false;
GregCr 0:9c0917bfde97 431 return;
GregCr 0:9c0917bfde97 432 }
GregCr 0:9c0917bfde97 433 }
GregCr 0:9c0917bfde97 434 switch( GpggaSentenceBuffer[sentencePtr++] )
GregCr 0:9c0917bfde97 435 {
GregCr 0:9c0917bfde97 436 case '1':
GregCr 0:9c0917bfde97 437 case '2':
GregCr 0:9c0917bfde97 438 case '3':
GregCr 0:9c0917bfde97 439 case '4':
GregCr 0:9c0917bfde97 440 thisFix.Fixed = true;
GregCr 0:9c0917bfde97 441 break;
GregCr 0:9c0917bfde97 442
GregCr 0:9c0917bfde97 443 default:
GregCr 0:9c0917bfde97 444 thisFix.Fixed = false;
GregCr 0:9c0917bfde97 445 break;
GregCr 0:9c0917bfde97 446 }
GregCr 0:9c0917bfde97 447 sentencePtr++; //Skip comma after fix
GregCr 0:9c0917bfde97 448 thisFix.NumSats[subStrPtr++] = GpggaSentenceBuffer[sentencePtr++];
GregCr 0:9c0917bfde97 449 thisFix.NumSats[subStrPtr++] = GpggaSentenceBuffer[sentencePtr++];
GregCr 0:9c0917bfde97 450 thisFix.NumSats[subStrPtr] = 0;
GregCr 0:9c0917bfde97 451 if( thisFix.Fixed )
GregCr 0:9c0917bfde97 452 {
GregCr 0:9c0917bfde97 453 sentencePtr = 0;
GregCr 0:9c0917bfde97 454 commaCount = 0;
GregCr 0:9c0917bfde97 455 while( commaCount < 1 ) //Find fix time
GregCr 0:9c0917bfde97 456 {
GregCr 0:9c0917bfde97 457 if( GpggaSentenceBuffer[sentencePtr++] == ',' )
GregCr 0:9c0917bfde97 458 {
GregCr 0:9c0917bfde97 459 commaCount++;
GregCr 0:9c0917bfde97 460 }
GregCr 0:9c0917bfde97 461 if( sentencePtr >= MAX_NMEA_SENTENCE_LENGTH )
GregCr 0:9c0917bfde97 462 {
GregCr 0:9c0917bfde97 463 thisFix.Fixed = false;
GregCr 0:9c0917bfde97 464 return;
GregCr 0:9c0917bfde97 465 }
GregCr 0:9c0917bfde97 466 }
GregCr 0:9c0917bfde97 467 subStrPtr = 0;
GregCr 0:9c0917bfde97 468 // Skip over time field as this can be picked up from the other sentence
GregCr 0:9c0917bfde97 469 sentencePtr += 6;
GregCr 0:9c0917bfde97 470 while( commaCount < 2 ) //Find Latitude
GregCr 0:9c0917bfde97 471 {
GregCr 0:9c0917bfde97 472 if( GpzdaSentenceBuffer[sentencePtr++] == ',' )
GregCr 0:9c0917bfde97 473 {
GregCr 0:9c0917bfde97 474 commaCount++;
GregCr 0:9c0917bfde97 475 }
GregCr 0:9c0917bfde97 476 if( sentencePtr >= MAX_NMEA_SENTENCE_LENGTH )
GregCr 0:9c0917bfde97 477 {
GregCr 0:9c0917bfde97 478 thisFix.Fixed = false;
GregCr 0:9c0917bfde97 479 return;
GregCr 0:9c0917bfde97 480 }
GregCr 0:9c0917bfde97 481 }
GregCr 0:9c0917bfde97 482 subStrPtr = 0;
GregCr 0:9c0917bfde97 483 for( commaCount = 0; commaCount < 10; commaCount++ )
GregCr 0:9c0917bfde97 484 {
GregCr 0:9c0917bfde97 485 thisFix.Lat[subStrPtr++] = GpggaSentenceBuffer[sentencePtr++];
GregCr 0:9c0917bfde97 486 }
GregCr 0:9c0917bfde97 487 sentencePtr++; // Skip next comma
GregCr 0:9c0917bfde97 488 thisFix.Lat[subStrPtr++] = ' '; //Add a space
GregCr 0:9c0917bfde97 489 thisFix.Lat[subStrPtr++] = GpggaSentenceBuffer[sentencePtr++]; //N or S
GregCr 0:9c0917bfde97 490 thisFix.Lat[subStrPtr] = 0x00; //String terminate
GregCr 0:9c0917bfde97 491
GregCr 0:9c0917bfde97 492 while( commaCount < 4 ) //Find Longitude
GregCr 0:9c0917bfde97 493 {
GregCr 0:9c0917bfde97 494 if( GpggaSentenceBuffer[sentencePtr++] == ',' )
GregCr 0:9c0917bfde97 495 {
GregCr 0:9c0917bfde97 496 commaCount++;
GregCr 0:9c0917bfde97 497 }
GregCr 0:9c0917bfde97 498 if( sentencePtr >= MAX_NMEA_SENTENCE_LENGTH )
GregCr 0:9c0917bfde97 499 {
GregCr 0:9c0917bfde97 500 thisFix.Fixed = false;
GregCr 0:9c0917bfde97 501 return;
GregCr 0:9c0917bfde97 502 }
GregCr 0:9c0917bfde97 503 }
GregCr 0:9c0917bfde97 504 sentencePtr++; // Skip this comma
GregCr 0:9c0917bfde97 505 subStrPtr = 0;
GregCr 0:9c0917bfde97 506 for( commaCount = 0; commaCount < 11; commaCount++ )
GregCr 0:9c0917bfde97 507 {
GregCr 0:9c0917bfde97 508 thisFix.Long[subStrPtr++] = GpggaSentenceBuffer[sentencePtr++];
GregCr 0:9c0917bfde97 509 }
GregCr 0:9c0917bfde97 510 sentencePtr++; // Skip next comma
GregCr 0:9c0917bfde97 511 thisFix.Long[subStrPtr++] = ' '; //Add a space
GregCr 0:9c0917bfde97 512 thisFix.Long[subStrPtr++] = GpggaSentenceBuffer[sentencePtr++]; //E or W
GregCr 0:9c0917bfde97 513 thisFix.Long[subStrPtr] = 0x00; //String terminate
GregCr 0:9c0917bfde97 514 }
GregCr 0:9c0917bfde97 515 thisFix.Updated = true;
GregCr 0:9c0917bfde97 516 Gps.Position = thisFix;
GregCr 0:9c0917bfde97 517 }
GregCr 0:9c0917bfde97 518
GregCr 0:9c0917bfde97 519 static void ParseNmeaGpzdaSentence( void )
GregCr 0:9c0917bfde97 520 {
GregCr 0:9c0917bfde97 521 GpzdaStruct thisTime;
GregCr 0:9c0917bfde97 522 int sentencePtr = 1;
GregCr 0:9c0917bfde97 523 int commaCount = 0;
GregCr 0:9c0917bfde97 524 uint8_t checkSum = 0;
GregCr 0:9c0917bfde97 525 uint8_t thisChar;
GregCr 0:9c0917bfde97 526 bool contFlag = true;
GregCr 0:9c0917bfde97 527 char tArray[3];
GregCr 0:9c0917bfde97 528 char compArray[3];
GregCr 0:9c0917bfde97 529
GregCr 0:9c0917bfde97 530 while( contFlag ) //Get the checksum
GregCr 0:9c0917bfde97 531 {
GregCr 0:9c0917bfde97 532 thisChar = GpzdaSentenceBuffer[sentencePtr];
GregCr 0:9c0917bfde97 533 if( thisChar == '*' )
GregCr 0:9c0917bfde97 534 {
GregCr 0:9c0917bfde97 535 contFlag = false;
GregCr 0:9c0917bfde97 536 }
GregCr 0:9c0917bfde97 537 else
GregCr 0:9c0917bfde97 538 {
GregCr 0:9c0917bfde97 539 checkSum ^= thisChar;
GregCr 0:9c0917bfde97 540 }
GregCr 0:9c0917bfde97 541 sentencePtr++;
GregCr 0:9c0917bfde97 542 if( sentencePtr >= MAX_NMEA_SENTENCE_LENGTH )
GregCr 0:9c0917bfde97 543 {
GregCr 0:9c0917bfde97 544 return;
GregCr 0:9c0917bfde97 545 }
GregCr 0:9c0917bfde97 546 }
GregCr 0:9c0917bfde97 547 compArray[0] = GpzdaSentenceBuffer[sentencePtr++];
GregCr 0:9c0917bfde97 548 compArray[1] = GpzdaSentenceBuffer[sentencePtr];
GregCr 0:9c0917bfde97 549 compArray[2] = 0x00;
GregCr 0:9c0917bfde97 550 sentencePtr = 0;
GregCr 0:9c0917bfde97 551 sprintf( tArray, "%02X", checkSum );
GregCr 0:9c0917bfde97 552 if( strcmp( tArray, compArray ) != 0 ) //Fails checksum
GregCr 0:9c0917bfde97 553 {
GregCr 0:9c0917bfde97 554 return;
GregCr 0:9c0917bfde97 555 }
GregCr 0:9c0917bfde97 556 while( commaCount < 1 ) //Start with hours (first field)
GregCr 0:9c0917bfde97 557 {
GregCr 0:9c0917bfde97 558 if( GpzdaSentenceBuffer[sentencePtr++] == ',' )
GregCr 0:9c0917bfde97 559 {
GregCr 0:9c0917bfde97 560 commaCount++;
GregCr 0:9c0917bfde97 561 }
GregCr 0:9c0917bfde97 562 if( sentencePtr >= MAX_NMEA_SENTENCE_LENGTH )
GregCr 0:9c0917bfde97 563 {
GregCr 0:9c0917bfde97 564 return;
GregCr 0:9c0917bfde97 565 }
GregCr 0:9c0917bfde97 566 }
GregCr 0:9c0917bfde97 567 thisTime.Hour[0] = GpzdaSentenceBuffer[sentencePtr++];
GregCr 0:9c0917bfde97 568 thisTime.Hour[1] = GpzdaSentenceBuffer[sentencePtr++];
GregCr 0:9c0917bfde97 569 thisTime.Hour[2] = 0x00;
GregCr 0:9c0917bfde97 570
GregCr 0:9c0917bfde97 571 thisTime.Minute[0] = GpzdaSentenceBuffer[sentencePtr++];
GregCr 0:9c0917bfde97 572 thisTime.Minute[1] = GpzdaSentenceBuffer[sentencePtr++];
GregCr 0:9c0917bfde97 573 thisTime.Minute[2] = 0x00;
GregCr 0:9c0917bfde97 574
GregCr 0:9c0917bfde97 575 thisTime.Second[0] = GpzdaSentenceBuffer[sentencePtr++];
GregCr 0:9c0917bfde97 576 thisTime.Second[1] = GpzdaSentenceBuffer[sentencePtr++];
GregCr 0:9c0917bfde97 577 thisTime.Second[2] = 0x00;
GregCr 0:9c0917bfde97 578 sentencePtr += 4;
GregCr 0:9c0917bfde97 579
GregCr 0:9c0917bfde97 580 thisTime.Day[0] = GpzdaSentenceBuffer[sentencePtr++];
GregCr 0:9c0917bfde97 581 thisTime.Day[1] = GpzdaSentenceBuffer[sentencePtr++];
GregCr 0:9c0917bfde97 582 thisTime.Day[2] = 0x00;
GregCr 0:9c0917bfde97 583 sentencePtr += 1;
GregCr 0:9c0917bfde97 584
GregCr 0:9c0917bfde97 585 thisTime.Month[0] = GpzdaSentenceBuffer[sentencePtr++];
GregCr 0:9c0917bfde97 586 thisTime.Month[1] = GpzdaSentenceBuffer[sentencePtr++];
GregCr 0:9c0917bfde97 587 thisTime.Month[2] = 0x00;
GregCr 0:9c0917bfde97 588 sentencePtr += 1;
GregCr 0:9c0917bfde97 589
GregCr 0:9c0917bfde97 590 thisTime.Year[0] = GpzdaSentenceBuffer[sentencePtr++];
GregCr 0:9c0917bfde97 591 thisTime.Year[1] = GpzdaSentenceBuffer[sentencePtr++];
GregCr 0:9c0917bfde97 592 thisTime.Year[2] = GpzdaSentenceBuffer[sentencePtr++];
GregCr 0:9c0917bfde97 593 thisTime.Year[3] = GpzdaSentenceBuffer[sentencePtr++];
GregCr 0:9c0917bfde97 594 thisTime.Year[4] = 0x00;
GregCr 0:9c0917bfde97 595 thisTime.Updated = true;
GregCr 0:9c0917bfde97 596 Gps.Time = thisTime;
GregCr 0:9c0917bfde97 597 }
GregCr 0:9c0917bfde97 598
GregCr 0:9c0917bfde97 599 GpsStruct* Max7GpsgetData( void )
GregCr 0:9c0917bfde97 600 {
GregCr 0:9c0917bfde97 601 return &Gps ;
GregCr 0:9c0917bfde97 602 }