#include "Motor.h"
#include "tim.h"
#include "common.h"

/*Set Motors Values and regulate them*/

/*Global variables*/
uint32_t coderValue = 0;


/*Local Prototype function*/
void SET_STATEMOTORR(uint8_t state);
void SET_STATEMOTORL(uint8_t state);
uint16_t tempsRoueD;
uint16_t tempsRoueG;
uint16_t distanceR;
uint16_t distanceL;
float speedR;
float speedL;

/*Local variable*/
uint16_t speedSensorR[2];
uint16_t speedSensorL[2];
/*Function*/

void SpeedSensor_Right_Callback(DMA_HandleTypeDef * _hdma);
void SpeedSensor_Left_Callback(DMA_HandleTypeDef * _hdma);

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/*Init Function*/
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

void ENCODER_INIT(void){
	HAL_TIM_Base_Start_IT(&htim1);
	
	//HAL_DMA_RegisterCallback(&hdma_tim1_ch1,0x00, SpeedSensor_Right_Callback);
	//HAL_DMA_RegisterCallback(&hdma_tim1_ch3,0x00, SpeedSensor_Left_Callback);
	HAL_TIM_IC_Start_DMA(&htim1,TIM_CHANNEL_1,(uint32_t *)speedSensorR,2);
	htim1.State = HAL_TIM_STATE_READY;
	HAL_TIM_IC_Start_DMA(&htim1,TIM_CHANNEL_3,(uint32_t *)speedSensorL,2);
	//HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_1);
	//HAL_TIM_IC_Start_IT(&htim1, TIM_CHANNEL_3);
	HAL_GPIO_WritePin(enableEncoders_GPIO_Port,enableEncoders_Pin, GPIO_PIN_RESET);
}

void MOTOR_INIT(uint8_t motor){
	if(motor == MOTOR_RIGHT)	
		HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);
	else if(motor == MOTOR_LEFT)
		HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
		
}


/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/*Motor commande function*/
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

void MOTORS_SET(uint8_t state, uint16_t speed){
	MOTOR_RIGHT_SET(state, speed);
	MOTOR_LEFT_SET(state, speed);
}

void MOTOR_LEFT_SET(uint8_t state, uint16_t speed){
		SET_STATEMOTORL(state);
		__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, speed);
}

void MOTOR_RIGHT_SET(uint8_t state, uint16_t speed){
		SET_STATEMOTORR(state);
		__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, speed);
		
}




/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
/*Private Function declaration*/
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/

void SET_STATEMOTORL(uint8_t state){
	switch (state) {
		case MOTOR_BREAK:
			HAL_GPIO_WritePin(cmdStateMotorR_A_GPIO_Port,cmdStateMotorR_A_Pin,GPIO_PIN_SET);
			HAL_GPIO_WritePin(cmdStateMotorR_B_GPIO_Port,cmdStateMotorR_B_Pin,GPIO_PIN_SET);
			break;

		case MOTOR_FORWARD:
			HAL_GPIO_WritePin(cmdStateMotorR_A_GPIO_Port,cmdStateMotorR_A_Pin,GPIO_PIN_RESET);
			HAL_GPIO_WritePin(cmdStateMotorR_B_GPIO_Port,cmdStateMotorR_B_Pin,GPIO_PIN_SET);
			break;

		case MOTOR_BACKWARD:
			HAL_GPIO_WritePin(cmdStateMotorR_A_GPIO_Port,cmdStateMotorR_A_Pin,GPIO_PIN_SET);
			HAL_GPIO_WritePin(cmdStateMotorR_B_GPIO_Port,cmdStateMotorR_B_Pin,GPIO_PIN_RESET);
			break;

		default:
			HAL_GPIO_WritePin(cmdStateMotorR_A_GPIO_Port,cmdStateMotorR_A_Pin,GPIO_PIN_RESET);
			HAL_GPIO_WritePin(cmdStateMotorR_B_GPIO_Port,cmdStateMotorR_B_Pin,GPIO_PIN_RESET);
		}
}


void SET_STATEMOTORR(uint8_t state){
	switch (state) {
		case MOTOR_BREAK:
			HAL_GPIO_WritePin(cmdStateMotorL_A_GPIO_Port,cmdStateMotorL_A_Pin,GPIO_PIN_SET);
			HAL_GPIO_WritePin(cmdStateMotorL_B_GPIO_Port,cmdStateMotorL_B_Pin,GPIO_PIN_SET);
			break;

		case MOTOR_FORWARD:
			HAL_GPIO_WritePin(cmdStateMotorL_A_GPIO_Port,cmdStateMotorL_A_Pin,GPIO_PIN_SET);
			HAL_GPIO_WritePin(cmdStateMotorL_B_GPIO_Port,cmdStateMotorL_B_Pin,GPIO_PIN_RESET);
			break;

		case MOTOR_BACKWARD:
			HAL_GPIO_WritePin(cmdStateMotorL_A_GPIO_Port,cmdStateMotorL_A_Pin,GPIO_PIN_RESET);
			HAL_GPIO_WritePin(cmdStateMotorL_B_GPIO_Port,cmdStateMotorL_B_Pin,GPIO_PIN_SET);
			break;

		default:
			HAL_GPIO_WritePin(cmdStateMotorL_A_GPIO_Port,cmdStateMotorL_A_Pin,GPIO_PIN_RESET);
			HAL_GPIO_WritePin(cmdStateMotorL_B_GPIO_Port,cmdStateMotorL_B_Pin,GPIO_PIN_RESET);
		}
}
unsigned int valabs(int val){
	if (val < 0) return -val;
	else return val;
}


uint8_t borneVitesse(int vitesse){
			if(vitesse <= 0)
				return 0;
			else if(vitesse >=100)
				return 100;
			else
				return (uint8_t)vitesse;
}


void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){
	/*
	 * htim retourne une valeur de channel de 0x01 ou 0x04 selon que l'information vient de la roue droite ou gauche
	 */
	if(htim1.Instance==TIM1 && htim1.Channel==0x01){  // Roue droite
		distanceR++;
		if(speedSensorR[1] - speedSensorR[0] > 0){
			tempsRoueD = speedSensorR[1] - speedSensorR[0];
			if(tempsRoueD <= SPEED_MAX)
				speedR=100;
			else if(tempsRoueD >=SPEED_MIN)
				speedR=0;
			else{
				speedR = (SPEED_MIN-SPEED_MAX) - tempsRoueD;
				speedR = (speedR/(SPEED_MIN-SPEED_MAX))*100;
			}
		}
	}
	if(htim1.Instance==TIM1 && htim1.Channel==0x04){ // Roue gauche
		distanceL++;
		if(speedSensorR[1] - speedSensorR[0] > 0){
			
			tempsRoueG = speedSensorL[1] - speedSensorL[0];
			// Borne de la valeur;
			if(tempsRoueG <= SPEED_MAX)
				speedL=100;
			else if(tempsRoueG >=SPEED_MIN)
				speedL=0;
			else{
				speedL = (SPEED_MIN-SPEED_MAX) - tempsRoueG;
				speedL = (speedL/(SPEED_MIN-SPEED_MAX))*100;
			}
			
			/*if(tempsRoueD>100)
				tempsRoueD=100;*/
		}
	}
}

