#include "DAVE.h"                 //Declarations from DAVE Code Generation (includes SFR declaration)
#include <stdio.h>

int8_t	teplota;
char	buffer[20], UART_TxBuf[50];
char 	text[20] = "Cvicenie7B\n\r";
uint8_t	rx_data;

XMC_RTC_ALARM_t alarm;
XMC_RTC_TIME_t timeval;
bool	RTCINT, UARTIN, UARTRX;
uint32_t result;

volatile char		UART_RxBuf[35];
volatile uint8_t	iuart;

void buffer_out_UART (char *buffer);
void UART_prikaz (void);
void Meraj (void);

//---------------------------------------------------------------
void RTC_Obsluha (void) {
	RTCINT = 1;
}
//---------------------------------------------------------------
void UART_Recieve_Obsluha (void) {
	//Prijme data, ukalda ich do UART_Rx_buf, kontroluje pocet prijatych dat.
	rx_data = UART_GetReceivedWord(&UART_USB);
	UARTIN = 1;
	UART_RxBuf[iuart++] = rx_data;
	if (iuart == (UART_RxBuf[1]-'0')*10+(UART_RxBuf[2]-'0')) UARTRX = 1;
}
//---------------------------------------------------------------
int main(void)
{
	DAVE_STATUS_t status;

	status = DAVE_Init();           /* Initialization of DAVE APPs  */

	if (status == DAVE_STATUS_SUCCESS) {
		WATCHDOG_Start();
		XMC_SCU_StartTempMeasurement();
	}
	buffer_out_UART (text);

	while(1U)
	{
		if (RTCINT) {
			RTCINT = 0;
			WATCHDOG_Service();
			DIGITAL_IO_ToggleOutput(&LED1);
		}
		if (UARTRX) UART_prikaz();
	}
}
//------------------------------------------------------------------------
void UART_prikaz (void)
{
	UARTIN = 0; UARTRX = 0;
	switch (UART_RxBuf[0]) {
		case 0x7F:	buffer_out_UART("\r\nSoftware Reset\r\n"); while(1);
					break;
		case '?':	buffer_out_UART (text);
					break;
		case 'M':	Meraj();
					break;
		case 'S':	timeval.seconds=(UART_RxBuf[21]-'0')*10+UART_RxBuf[22]-'0';
					timeval.minutes=(UART_RxBuf[18]-'0')*10+UART_RxBuf[19]-'0';
					timeval.hours=(UART_RxBuf[15]-'0')*10+UART_RxBuf[16]-'0';
					timeval.days=(UART_RxBuf[5]-'0')*10+UART_RxBuf[6]-'0';
					timeval.month=(UART_RxBuf[8]-'0')*10+UART_RxBuf[9]-'0';
					timeval.year=(UART_RxBuf[11]-'0')*1000+(UART_RxBuf[12]-'0')*100+(UART_RxBuf[13]-'0')*10+UART_RxBuf[14]-'0';
					RTC_SetTime(&timeval); //Nastavi cas v XMC1100
					sprintf(UART_TxBuf,"%02d.%02d.%04d %02d:%02d:%02d\n\r",
							timeval.days, timeval.month, timeval.year, timeval.hours, timeval.minutes, timeval.seconds);
					buffer_out_UART (UART_TxBuf);
					break;
		case 'R':	sprintf(UART_TxBuf,"%02d.%02d.%04d %02d:%02d:%02d Tmcu=%02d\n\r",
						timeval.days, timeval.month, timeval.year, timeval.hours, timeval.minutes, timeval.seconds, teplota);
					buffer_out_UART (UART_TxBuf);
					break;
		default:	UART_TransmitWord(&UART_USB, '?'); break;
					break;
	}
	iuart = 0; UART_RxBuf[1] = 2;
}
//------------------------------------------------------------------------------
void buffer_out_UART (char *buffer)
{
	UART_Transmit (&UART_USB, (uint8_t*)buffer, strlen(buffer));
	while(UART_USB.runtime->tx_busy);
}
//------------------------------------------------------------------------------
void Meraj (void) {


	typedef struct detailed_result_struct
	{
	  uint8_t channel_num;
	  uint8_t group_num;
	  uint16_t conversion_result;
	} detailed_result_struct_t;

	detailed_result_struct_t detailed_result[2];

	RTC_GetTime(&timeval);
	sprintf (buffer, "%02d.%02d.%04d %02d:%02d:%02d\n\r",timeval.days,timeval.month,timeval.year,timeval.hours,timeval.minutes,timeval.seconds);
	UART_Transmit(&UART_USB, (uint8_t*)buffer, strlen(buffer));

	teplota = XMC_SCU_CalcTemperature() - 273;
	sprintf (buffer, "T = %d%cC  ", teplota, 0xB0);
	UART_Transmit(&UART_USB, (uint8_t*)buffer, strlen(buffer));

	result = ADC_MEASUREMENT_GetGlobalDetailedResult();
	if((bool)(result >> VADC_GLOBRES_VF_Pos))
	{
		detailed_result[0].channel_num = (result & VADC_GLOBRES_CHNR_Msk) >> VADC_GLOBRES_CHNR_Pos;
		detailed_result[0].group_num = ADC_MEASUREMENT_Channel_A.group_index;
		detailed_result[0].conversion_result = (result & VADC_GLOBRES_RESULT_Msk) >>
		                   ((uint32_t)ADC_MEASUREMENT_0.iclass_config_handle->conversion_mode_standard * (uint32_t)2);
	}
	sprintf (buffer, "U0=%1.3fV Channel:%d Group:%d   ", 3.3*detailed_result[0].conversion_result/4096.0, detailed_result[0].channel_num, detailed_result[0].group_num);
	UART_Transmit(&UART_USB, (uint8_t*)buffer, strlen(buffer));

	result = ADC_MEASUREMENT_GetGlobalDetailedResult();
	if((bool)(result >> VADC_GLOBRES_VF_Pos))
	{
		detailed_result[1].channel_num = (result & VADC_GLOBRES_CHNR_Msk) >> VADC_GLOBRES_CHNR_Pos;
		detailed_result[1].group_num = ADC_MEASUREMENT_Channel_B.group_index;
		detailed_result[1].conversion_result = (result & VADC_GLOBRES_RESULT_Msk) >>
		                   ((uint32_t)ADC_MEASUREMENT_0.iclass_config_handle->conversion_mode_standard * (uint32_t)2);
	}
	sprintf (buffer, "U1=%1.3fV Channel:%d Group:%d\n\r", 3.3*detailed_result[1].conversion_result/4096.0, detailed_result[1].channel_num, detailed_result[1].group_num);
	UART_Transmit(&UART_USB, (uint8_t*)buffer, strlen(buffer));
}
