#include "UART4.h"

uint8_t cmdPUBX00[] = { "$PUBX,00*33\r\n" };

memset(rxBuffer, 0, sizeof(rxBuffer));
memset(gpsMessage, 0, sizeof(gpsMessage));
msgReceivedUART4 = false;
gpsMsgCount = 0;
	
HAL_UART_Receive_IT(&uart4Handle, rxBuffer, 1);
HAL_UART_Transmit_IT(&uart4Handle, txBuffer, sizeof(txBuffer));

while (1)
{
	//Do other stuff
		
	if(msgReceivedUART4)
	{
		//process UART4msg
		HAL_Delay(1);
	}
}
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *uart4Handle)
{
	if (rxBuffer[0] != 0)
	{
		gpsMessage[gpsMsgCount] = rxBuffer[0];
		gpsMsgCount++;
		if (rxBuffer[0] == '\n')
		{
			fifoEnqueue(rxBuffer);	
			msgReceivedUART4 = true;
		}
		else
			HAL_UART_Receive_IT(uart4Handle, rxBuffer, 1);
	}
	else
	{
		HAL_UART_Receive_IT(uart4Handle, rxBuffer, 1);
	}
}

	
extern "C" void UART4_IRQHandler()
{
	HAL_UART_IRQHandler(&uart4Handle);
}


void initUART4()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	__USART4_CLK_ENABLE();
	__GPIOH_CLK_ENABLE();
    
	GPIO_InitStructure.Pin = GPIO_PIN_13;
	GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
	GPIO_InitStructure.Alternate = GPIO_AF8_UART4;
	GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
	GPIO_InitStructure.Pull = GPIO_NOPULL;
	HAL_GPIO_Init(GPIOH, &GPIO_InitStructure);
    
	GPIO_InitStructure.Pin = GPIO_PIN_14;
	GPIO_InitStructure.Mode = GPIO_MODE_AF_OD;
	HAL_GPIO_Init(GPIOH, &GPIO_InitStructure);
 
	uart4Handle.Instance        = UART4;
	uart4Handle.Init.BaudRate   = 9600;
	uart4Handle.Init.WordLength = UART_WORDLENGTH_8B;
	uart4Handle.Init.StopBits   = UART_STOPBITS_1;
	uart4Handle.Init.Parity     = UART_PARITY_NONE;
	uart4Handle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;
	uart4Handle.Init.Mode       = UART_MODE_TX_RX;
    
	if (HAL_UART_Init(&uart4Handle) != HAL_OK)
		asm("bkpt 255");
	
	NVIC_EnableIRQ(UART4_IRQn);
}

static void fifoEnqueue(uint8_t record[])
{}
