and another way
/*
GPS serial read and sentence detection
Derrived from work by M. Ray Burnette on the PSoC code published on Hackster.io/RayBurne
Compiler board: Nano
Arduino 1.7.3 & 1..7.8 // 6/09/2015 & 1/17/2016
Sketch uses 504 bytes (1%) of program storage space. Maximum is 30,720 bytes.
Global variables use 16 bytes (0%) of dynamic memory, leaving 2,032 bytes for local variables. Maximum is 2,048 bytes
*/
#include <stdlib.h> // for function atoi()
// Global variables
uint8_t hour, minute, seconds; //, year, month, day;
uint8_t day, month, year;
char buffer[9];
char nmea[120];
// double atof(const char *str); // elimited Limor's float implementation
boolean DayLightSavings; // Pin 3.4
uint8_t GMToffset = 4;
uint8_t Flag = 1;
uint32_t c = '\0';
int8_t k = 0 ;
boolean DSTime_Read(void) {
return true;
}
void GLCD_WRITE( char *x ) {
}
void glcd_write(void) {
}
void glcd_clear(void) {
}
void glcd_tiny_draw_string(int x, int y, char* c) {
}
char UART_UartGetChar() {
char i = '\0';
return i;
}
void LED_Write( boolean PinState) {
}
boolean LED_Read(void) {
return ~true;
}
void setup(void)
{
DayLightSavings = DSTime_Read(); // Pin# Normally true (HIGH)
if(! DayLightSavings) GMToffset += 1;
}
void loop(void)
{
if (Flag == 1)
{
GLCD_WRITE("Waiting on GPS") ;
// Flag = 0;
c = UART_UartGetChar(); // Get received character or null
if (c)
{
if(c == '
) // $ start of NMEA sentences
{
for(k=0; k<5; k++) // need 5 characters for sentence type
{
LED_Write( ~LED_Read() ); // flicker LED for activity
do {
c = UART_UartGetChar();
}
while (! (c));
nmea[k] = c; // G + P + R + M + C
// sprintf(buffer + k, "%c", c) ; // only for debug
}
LED_Write( LOW ); // LED off
if (strstr(nmea, "GPRMC"))
{
do {
do {
c = UART_UartGetChar();
LED_Write( ~LED_Read() ); // flicker LED
} while (!(c));
nmea[k] = c;
++k;
} while ( !( c == '*' ) && k < 120) ; // marker
LED_Write( LOW ); // LED off
// Inspiration: Limor Fried's Arduino GPS lib
char *p = nmea;
p = strchr(p, ',') + 1; // position after 1st comma
// float timef = atof(p);
// uint32_t time = timef;
uint32_t time = atoi(p);
hour = time / 10000;
minute = (time % 10000) / 100;
seconds = (time % 100);
// output to GLCD
sprintf(buffer, " %s",""); // clearbuffer
// this corrects time to the West but not the date!!!
if( hour > GMToffset) {
hour = hour - GMToffset;
} else {
hour = (hour + 24) - GMToffset; }
// correct midnight to follow standard format
if (hour == 24) hour = 0;
if (hour < 10) {
if (DayLightSavings) {
sprintf(buffer, "EDT: %d", hour);
} else {
sprintf(buffer, "EST: %d", hour);
}
} else {
if (DayLightSavings) {
sprintf(buffer, "EDT: %d%d", hour);
} else {
sprintf(buffer, "EST: %d%d", hour); }
}
if (minute < 10) {
sprintf(buffer + 7, ":0%d", minute);
} else {
sprintf(buffer + 7, ":%d%d", minute); }
if (seconds < 10) {
sprintf(buffer + 10,":0%d%s", seconds);
} else {
sprintf(buffer + 10, ":%d%d%s", seconds); }
sprintf(buffer + 13, "%s", "\0");
if(Flag == 1)
{
Flag = 0;
glcd_clear() ;
delay(250) ;
}
// OUTPUT the TIME on GLCD
glcd_tiny_draw_string(0, 4, buffer);
glcd_write() ;
// Parse to integer date field
p = strchr(p, ',') +1; // A/V?
p = strchr(p, ',') +1; // lat
p = strchr(p, ',') +1; // N/S?
p = strchr(p, ',') +1; // lon
p = strchr(p, ',') +1; // E/W?
p = strchr(p, ',') +1; // speed
p = strchr(p, ',') +1; // angle
p = strchr(p, ',') +1; // move pass for date DDMMYY
// nmea date field looks like: 090914 (European)
uint32_t fulldate = atoi(p);
day = (fulldate / 10000);
month = (fulldate % 10000) / 100;
year = (fulldate % 100);
sprintf(buffer, " %s",""); // clearbuffer
if (day < 10) {
sprintf(buffer, "0%d", day);
} else {
sprintf(buffer, "%d%d", day); }
if (month < 10) {
sprintf(buffer + 2,"-0%d", month);
} else {
sprintf(buffer + 2,"-%d%d", month); }
sprintf(buffer + 5, "-20%d%d%s", year);
sprintf(buffer + 10,"%s",'\0');
// OUTPUT the DATE on GLCD
glcd_tiny_draw_string(0, 2, buffer);
glcd_write() ;
} // if (strstr(nmea, "GPRMC"))
} // if(c == '
)
} // if(c)
} // flag
} // loop()
/* [] END OF FILE */