#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <inttypes.h>
#include "parse_nmea.h"

/* returns pointer to allocated memory for data structure */
nmea_data_t parse_nmea_init_data(void)
{
	nmea_data_t p = (nmea_data_t)malloc(sizeof(struct nmea_data_struct));
	return p;
}

/* converts between NMEA and decimal degrees */
void parse_nmea_convert_degrees(char* coord)
{
	int deg;
	double min;
	char* saveptr;

	deg = (int)(atoi(coord)/100);
	/* no atof */
	min = atoi(strtok_r(coord, ".", &saveptr)) + ((atoi(strtok_r(NULL, ".", &saveptr)))/10000.0);
	min = (min-(100.0*deg))/60.0;

	sprintf(coord, "%d.%d", deg, abs(min*10000));
}

/* parses nmea string filling fields of data structure */
int parse_nmea(nmea_data_t data, char* packet)
{

	uint8_t i;
	uint8_t gpindex=0;

	/* start after $GPGGA, */
	i=7;
	
	if((packet[i]==',') & (packet[i+1]==',')) /* empty? */
		return 1; /* error */

	/* time */
	while(packet[i] != ',')	{
		data->time[gpindex]=packet[i];
		i++;
		gpindex++;
	}		
	data->time[gpindex]='\0'; /* end of string */

	i++;
	gpindex=0;

	/* latitude */
	while(packet[i] != ',')
	{
		data->latitude[gpindex]=packet[i];
		i++;
		gpindex++;
	}		
	data->latitude[gpindex]='\0';

	i++;
	gpindex=0;

	/* N/S */
	while(packet[i] != ',')
	{
		data->ns[gpindex]=packet[i];
		i++;
		gpindex++;
	}		
	data->ns[gpindex]='\0';

	i++;
	gpindex=0;

	/* longitude */
	while(packet[i] != ',')
	{
		data->longitude[gpindex]=packet[i];
		i++;
		gpindex++;
	}		
	data->longitude[gpindex]='\0';

	i++;
	gpindex=0;

	/* E/W */
	while(packet[i] != ',')
	{
		data->ew[gpindex]=packet[i];
		i++;
		gpindex++;
	}		
	data->ew[gpindex]='\0';

	i++;
	gpindex=0;

	/* fix quality */
	while(packet[i] != ',')
	{
		data->fix_quality=packet[i];
		i++;
		gpindex++;
	}		

	i++;
	gpindex=0;

	/* number of satellites */
	while(packet[i] != ',')
	{
		data->num_sats=packet[i];
		i++;
		gpindex++;
	}		

	i++;
	gpindex=0;

	/* horizontal dilution */
	while(packet[i] != ',')
	{
		/* do nothing */
		i++;
		gpindex++;
	}		

	i++;
	gpindex=0;

	/* altitude */
	while(packet[i] != ',')
	{
		data->altitude[gpindex]=packet[i];
		i++;
		gpindex++;
	}		
	data->altitude[gpindex]='\0';

	i++;
	gpindex=0;

	/* reached here, nice! */

	/* Ivalid data if fix is 0 */
	if (data->fix_quality == '0')
		return 1;

	/* convert coordinates */
	parse_nmea_convert_degrees(data->latitude);
	parse_nmea_convert_degrees(data->longitude);	

	return 0;
}



















