//*****************************************************************************
// File Name	: gpstest.c
// 
// Title		: example usage of gps processing library functions
// Revision		: 1.0
// Notes		: 
// Target MCU	: Atmel AVR series
// Editor Tabs	: 4
// 
// Revision History:
// When			Who			Description of change
// -----------	-----------	-----------------------
// 10-Sep-2002	pstang		Created the program
//*****************************************************************************

//----- Include Files ---------------------------------------------------------
#include <avr/io.h>		// include I/O definitions (port names, pin names, etc)
#include <avr/interrupt.h>	// include interrupt support
//#include <math.h>
#include <stdlib.h>
#include <stdio.h>

#include "global.h"		// include our global settings
#include "uart2.h"		// include dual-uart function library
#include "rprintf.h"	// include printf function library
#include "timer.h"		// include timer function library (timing, PWM, etc)
#include "gps.h"		// include gps data support
#include "tsip.h"		// include TSIP gps packet handling
#include "nmea.h"		// include NMEA gps packet handling
#include "vt100.h"		// include VT100 terminal commands

#include <util/delay.h>


// LCD Library
#include "lcd_hd44780.h"

static int lcd_putc_stream(char c, FILE *unused)
{
	return lcd_putc(c);
}

// Define Output Stream to LCD
static FILE lcd_stream = FDEV_SETUP_STREAM(lcd_putc_stream, NULL, _FDEV_SETUP_WRITE);

// uartRxOverflow is a global variable defined in uart.c/uart2.c
// we define it here as <extern> here so that we can use its value
// in code contained in this file
extern unsigned short uartRxOverflow[2];

void gpsTsipTest(void);
void gpsNmeaTest(void);


//----- Begin Code ------------------------------------------------------------
int main(void)
{
	sbi(DDRC, 0);		// sets PC0 to be an output
	cbi(PORTC, 0);		// sets PC0 to output a HIGH
	_delay_ms(100);
	sbi(PORTC, 0);		// sets PC0 to output a LOW
	_delay_ms(100);
	cbi(PORTC, 0);		// sets PC0 to output a HIGH
	_delay_ms(100);
	sbi(PORTC, 0);		// sets PC0 to output a LOW
	_delay_ms(100);
	// initialize our libraries
	// initialize the UART (serial port)
//	uartInit();
	uart1Init();

	sbi(DDRC, 1);		// sets PC0 to be an output
	cbi(PORTC, 1);		// sets PC0 to output a HIGH
	_delay_ms(100);
	sbi(PORTC, 1);		// sets PC0 to output a LOW
	_delay_ms(100);
	cbi(PORTC, 1);		// sets PC0 to output a HIGH
	_delay_ms(100);
	sbi(PORTC, 1);		// sets PC0 to output a LOW
	_delay_ms(100);

	// set the baud rate of UART 0 for our debug/reporting output
//	uartSetBaudRate(0,9600);
	// set uart0SendByte as the output for all rprintf statements
//	rprintfInit(uart0SendByte);

	// initialize the timer system
	timerInit();
	// initialize vt100 library
//	vt100Init();
	
	// print a little intro message so we know things are working
//	vt100ClearScreen();
//	rprintf("\r\nWelcome to GPS Test!\r\n");
//	timerPause(1000);

	lcd_init();					// Init LCD (interface and display module)
	rprintfInit(lcd_putc);
	rprintfProgStrM("Ahoj..."); rprintfCRLF();
	_delay_ms(500);
	lcd_clear();

	// run example gps processing loop
	// (pick the one appropriate for your GPS packet format)
	gpsNmeaTest();
	
	return 0;
}


void gpsNmeaTest(void)
{
	// set the baud rate of UART 1 for NMEA
	uartSetBaudRate(1,4800);

	// clear screen
//	vt100ClearScreen();
	// initialize gps library
	gpsInit();
	// initialize gps packet decoder 
	nmeaInit();

/*
	DDRA = 0b11110101;	// sets PA0 O, PA1 I, PA2 O
	cbi(PORTA, 0);		// sets PC0 to output a LOW
	sbi(PORTA, 2);		// sets PC2 to output a HIGH
*/
	DDRD = 0b10100000;	// sets PD7 O, PD6 I, PD5 O
	cbi(PORTD, 7);		// sets PD7 to output a LOW
	sbi(PORTD, 5);		// sets PD5 to output a HIGH

	// begin gps packet processing loop
	while(1)
	{
		// process received gps packets until receive buffer is exhausted
		while( nmeaProcess(uartGetRxBuffer(1))== NMEA_NODATA);
		if((inb(PIND) & 0b01000000)==0)
			gpsInfoPrintLCD();
		else
			gpsInfoPrintLCD2();

		sbi(DDRC, 0);		// sets PC0 to be an output
		cbi(PORTC, 0);		// sets PC0 to output a LOW
		_delay_ms(5);
		sbi(PORTC, 0);		// sets PC0 to output a HIGH
	}
}

