#include "stm32f1xx_hal.h"
#include <string.h>
#include "cmsis_os.h"


#include "rampabus_hal.h"
#include "herramienta_hal.h"


void (*Funcs[MaxFuncion])(EstadoFun *edo);
uint8_t INFUC=0;

Cap_Data cap_data;


uint8_t Capsula_Igual(Capsula A,Capsula B){
		if(A.Direccion==B.Direccion && A.Funcion==B.Funcion &&
			  A.Grupos==B.Grupos && A.Normas==B.Normas &&
			  A.Tamdatas==B.Tamdatas){
					
				return 1;	
		}
		else return 0;
}
/*
void Proceder_Funcion(void){
	RBUS_Funcion[0]=RBUS_Vacio;
	RBUS_Funcion[1]=RBUS_ResPing;
	RBUS_Funcion[2]=RBUS_ObtenerDatos;
	RBUS_Funcion[3]=RBUS_Prueba;
	
}
*/
void LimpiarCapsula(void){
	memset((uint8_t*)cap_data.Data,0,sizeof(cap_data.Data));
}
void Proceder_RBUS_Funcs(void){
	
	Funcs[0]=RBUS_Vacio;
	Funcs[1]=RBUS_IN_Comm_LedRGB;
	Funcs[2]=RBUS_IN_Comm_LedRGB_Porcent;
	Funcs[3]=RBUS_OUT_Env_ADC;
	Funcs[4]=RBUS_Prueba;
	Funcs[5]=RBUS_Prueba2;
	//Funcs[3]=RBUS_autosintonia1PID;
	//Funcs[4]=RBUS_autosintonia2PID;
	//Funcs[5]=RBUS_setpointPID;
	//Funcs[6]=RBUS_sensoresPID;
	//Funcs[7]=RBUS_sensores2PID;
	//Funcs[8]=RBUS_status;
	//Funcs[9]=RBUS_guardarmemPID;
	//Funcs[10]=RBUS_leermemPID;
	//Funcs[11]=RBUS_time_pc_rtc;
	//Funcs[12]=RBUS_mostrar_timertc;
	//Funcs[13]=RBUS_setalarmaRTC;
	//Funcs[14]=RBUS_timeiniRTC;
	//Funcs[15]=RBUS_timefinRTC;
	//Funcs[16]=RBUS_timeperiodoRTC;
	//Funcs[17]=RBUS_idcontrolador;
	//Funcs[18]=RBUS_memgrabar;
	//Funcs[19]=RBUS_memleer;
	/*
	Funcs[6]=RBUS_izquierda;
	Funcs[7]=RBUS_cambio_periodo;
	Funcs[8]=RBUS_cambio_senopwm;
	Funcs[9]=RBUS_cambio_preescalar;
	Funcs[10]=RBUS_ResPing;
	Funcs[11]=RBUS_prueba1;
	Funcs[12]=RBUS_prueba2;
	Funcs[13]=RBUS_status;
	Funcs[14]=RBUS_prueba3;
	*/
	
}

void RBUS_Vacio(EstadoFun *edo){
	
	*edo=fun_ok;
}
void RBUS_IN_Comm_LedRGB(EstadoFun *edo){
	*edo=fun_ocupado;
	//uint16_t vcon=0;
	Cap_Data capfun;
	//uint16_t ok=PINGDAT;
	uint16_t icur=5;//despues de la primera capsula;
	uint16_t R,G,B,UV;
	
	__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_TC);
	
	DesModularMem(&R,(uint8_t*)DataRx,sizeof(R),icur);//extraer en DataRx valor para R
	icur=icur+sizeof(R);//incrementa posicion icur para DataRx
	DesModularMem(&G,(uint8_t*)DataRx,sizeof(G),icur);//extraer en DataRX valor para G
	icur=icur+sizeof(G);
	DesModularMem(&B,(uint8_t*)DataRx,sizeof(B),icur);
	icur=icur+sizeof(B);
	DesModularMem(&UV,(uint8_t*)DataRx,sizeof(UV),icur);
	icur=icur+sizeof(UV);
	DesModularMem(&capfun,(uint8_t*)DataRx,sizeof(capfun),icur);
	icur=icur+sizeof(capfun);
	
	Pwm_LedRGB(R,G,B);
	Pwm_LedUV(UV);
	
	
	
	huart1.State=HAL_UART_STATE_READY;
	if (HAL_UART_Receive_DMA(&huart1, (uint8_t *)DataRx, 5) != HAL_OK) {
		Error_Handler();
	}
	HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_12);
		
	__HAL_DMA_ENABLE_IT(&hdma_usart1_rx,DMA_IT_TC);
	*edo=fun_ok;
	
}

void RBUS_IN_Comm_LedRGB_Porcent(EstadoFun *edo){
	*edo=fun_ocupado;
	//uint16_t vcon=0;
	Cap_Data capfun;
	//uint16_t ok=PINGDAT;
	uint16_t icur=5;//despues de la primera capsula;
	float_t R,G,B,UV;
	
	__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_TC);
	
	DesModularMem(&R,(uint8_t*)DataRx,sizeof(R),icur);//extraer en DataRx valor para R
	icur=icur+sizeof(R);//incrementa posicion icur para DataRx
	DesModularMem(&G,(uint8_t*)DataRx,sizeof(G),icur);//extraer en DataRX valor para G
	icur=icur+sizeof(G);
	DesModularMem(&B,(uint8_t*)DataRx,sizeof(B),icur);
	icur=icur+sizeof(B);
	DesModularMem(&UV,(uint8_t*)DataRx,sizeof(UV),icur);
	icur=icur+sizeof(UV);
	DesModularMem(&capfun,(uint8_t*)DataRx,sizeof(capfun),icur);
	icur=icur+sizeof(capfun);
	
	Pwm_LedRGB_Porcent(R,G,B);
	Pwm_LedUV_Porcent(UV);
	
	huart1.State=HAL_UART_STATE_READY;
	if (HAL_UART_Receive_DMA(&huart1, (uint8_t *)DataRx, 5) != HAL_OK) {
		Error_Handler();
	}
	HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_12);
	
	__HAL_DMA_ENABLE_IT(&hdma_usart1_rx,DMA_IT_TC);
	*edo=fun_ok;
	
}

void RBUS_OUT_Env_ADC(EstadoFun *edo){
	*edo=fun_ocupado;
	uint16_t vcon=0;
	//__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_TC);
	
	if(osSemaphoreWait(Sem1_Adc1,0)==osOK){
		
		
		//
		//__HAL_DMA_DISABLE_IT(&hdma_adc1,DMA_IT_TC);
	 __HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_TC);
		//HAL_ADC_Stop_IT(&hadc1);
		//taskDISABLE_INTERRUPTS();
		MemSecuencial(DataTx,(uint8_t*)DATA_ADC,tam_adc*2,&vcon);//bytes*2=16bit
		//taskENABLE_INTERRUPTS();
		//__HAL_DMA_ENABLE_IT(&hdma_adc1,DMA_IT_TC);
		//HAL_ADC_Start_IT(&hadc1);
		
		rs485_ON();
		osDelay(40);
		Enviar_DMA_TX(DataTx,Multiplo(tam_adc*2,5));
		osDelay(40);
		rs485_OFF();
		
		__HAL_DMA_ENABLE_IT(&hdma_usart1_rx,DMA_IT_TC);
		
		
	}
	*edo=fun_ok;
}

void RBUS_Prueba(EstadoFun *edo){
	*edo=fun_ocupado;
	__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_TC);
	HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_11);
	
	Pwm_LedRGB(157,200,225);
	__HAL_DMA_ENABLE_IT(&hdma_usart1_rx,DMA_IT_TC);
	*edo=fun_ok;
	
}

void RBUS_Prueba2(EstadoFun *edo){
	*edo=fun_ocupado;
	//uint16_t vcon=0;
	Cap_Data capfun;
	//uint16_t ok=PINGDAT;
	uint16_t icur=5;//despues de la primera capsula;
	uint16_t R,G,B,UV;
	
	
	DesModularMem(&R,(uint8_t*)DataRx,sizeof(uint16_t),icur);//extraer en DataRx valor para R
	icur=icur+sizeof(uint16_t);//incrementa posicion icur para DataRx
	DesModularMem(&G,(uint8_t*)DataRx,sizeof(uint16_t),icur);//extraer en DataRX valor para G
	icur=icur+sizeof(uint16_t);
	DesModularMem(&B,(uint8_t*)DataRx,sizeof(uint16_t),icur);
	icur=icur+sizeof(uint16_t);
	DesModularMem(&UV,(uint8_t*)DataRx,sizeof(uint16_t),icur);
	icur=icur+sizeof(int16_t);
	DesModularMem(&capfun,(uint8_t*)DataRx,sizeof(capfun),icur);
	icur=icur+sizeof(capfun);
	
	Pwm_LedRGB(R,G,B);
	Pwm_LedUV(UV);
	
	huart1.State=HAL_UART_STATE_READY;
	if (HAL_UART_Receive_DMA(&huart1, (uint8_t *)DataRx, 5) != HAL_OK) {
		Error_Handler();
	}
	HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_12);
		
	*edo=fun_ok;
	
}

void RBUS_idcontrolador(void){
	uint16_t tam=0;
	uint16_t kb=(*(volatile uint16_t*)U_KB);
	uint16_t u_id1=(*(volatile uint16_t*)U_ID);
	uint16_t u_id2=(*(volatile uint16_t*)U_ID+0x02);
	uint32_t u_id3=(*(volatile uint16_t*)U_ID+0x04);
	uint32_t u_id4=(*(volatile uint16_t*)U_ID+0x08);
	
	MemSecuencial((uint8_t*)DataTx,(uint32_t*)&kb,sizeof(uint16_t),&tam);
	MemSecuencial((uint8_t*)DataTx,(uint32_t*)&u_id1,sizeof(uint16_t),&tam);
	MemSecuencial((uint8_t*)DataTx,(uint32_t*)&u_id2,sizeof(uint16_t),&tam);
	MemSecuencial((uint8_t*)DataTx,(uint32_t*)&u_id3,sizeof(uint32_t),&tam);
	MemSecuencial((uint8_t*)DataTx,(uint32_t*)&u_id4,sizeof(uint32_t),&tam);
	/*
	
	GPIO_WriteBit(GPIOB,GPIO_Pin_5,Bit_SET);
	
	vTaskDelay(35/portTICK_RATE_MS);//Delay(35000);//40
	SendDmaTx((uint8_t*)G_Buf,Multiplo(tam,5)); //ojo falta secuencia de activacion para envio rs485
	
	vTaskDelay(35/portTICK_RATE_MS);//Delay(35000);//40
	GPIO_WriteBit(GPIOB,GPIO_Pin_5,Bit_RESET);
	
	id_cmd=0;
	INFUC=0;
	*/
}



