/*
 * PE43711.c
 *
 *  Created on: 2019. 6. 28.
 *      Author: parkyj
 */
 #include "PE43711.h"
#if 1 // PYJ.2019.07.26_BEGIN -- 
#define ATTEN_Initial_Val 0
extern void Pol_Delay_us(volatile uint32_t microseconds);
void PE43711_ALL_atten_ctrl(ALL_PE43711_st ATT);

void PE43711_atten_ctrl(PE43711_st ATT ,uint8_t data);


ALL_PE43711_st ALL_ATT;

volatile PE43711_st ATT_DL1 ={
    ATT_CLOCK1_GPIO_Port,
    ATT_CLOCK1_Pin,
    ATT_DATA1_GPIO_Port,
    ATT_DATA1_Pin,
    ATT_EN_DL1_GPIO_Port,
    ATT_EN_DL1_Pin,
}; 
volatile PE43711_st ATT_UL1 ={
    ATT_CLOCK1_GPIO_Port,
    ATT_CLOCK1_Pin,
    ATT_DATA1_GPIO_Port,
    ATT_DATA1_Pin,
    ATT_EN_UL1_GPIO_Port,
    ATT_EN_UL1_Pin,
}; 
volatile PE43711_st ATT_DL2 ={
    ATT_CLOCK2_GPIO_Port,
    ATT_CLOCK2_Pin,
    ATT_DATA2_GPIO_Port,
    ATT_DATA2_Pin,
    ATT_EN_DL2_GPIO_Port,
    ATT_EN_DL2_Pin,
}; 
volatile PE43711_st ATT_UL2 ={
    ATT_CLOCK2_GPIO_Port,
    ATT_CLOCK2_Pin,
    ATT_DATA2_GPIO_Port,
    ATT_DATA2_Pin,
    ATT_EN_UL2_GPIO_Port,
    ATT_EN_UL2_Pin,
};
volatile PE43711_st ATT_DL3 ={
    ATT_CLOCK3_GPIO_Port,
    ATT_CLOCK3_Pin,
    ATT_DATA3_GPIO_Port,
    ATT_DATA3_Pin,
    ATT_EN_DL3_GPIO_Port,
    ATT_EN_DL3_Pin,
}; 
volatile PE43711_st ATT_UL3 ={
    ATT_CLOCK3_GPIO_Port,
    ATT_CLOCK3_Pin,
    ATT_DATA3_GPIO_Port,
    ATT_DATA3_Pin,
    ATT_EN_UL3_GPIO_Port,
    ATT_EN_UL3_Pin,
}; 
    volatile PE43711_st ATT_DL4 ={
    ATT_CLOCK4_GPIO_Port,
    ATT_CLOCK4_Pin,
    ATT_DATA4_GPIO_Port,
    ATT_DATA4_Pin,
    ATT_EN_DL4_GPIO_Port,
    ATT_EN_DL4_Pin,
}; 
volatile PE43711_st ATT_UL4 ={
    ATT_CLOCK4_GPIO_Port,
    ATT_CLOCK4_Pin,
    ATT_DATA4_GPIO_Port,
    ATT_DATA4_Pin,
    ATT_EN_UL4_GPIO_Port,
    ATT_EN_UL4_Pin,
}; 


void PE43711_PinInit(void){
  ALL_ATT.ATT_DL1 = ATT_DL1;
  ALL_ATT.ATT_UL1 = ATT_UL1;
  
  ALL_ATT.ATT_DL2 = ATT_DL2;
  ALL_ATT.ATT_UL2 = ATT_UL2;
  
  ALL_ATT.ATT_DL3 = ATT_DL3;
  ALL_ATT.ATT_UL3 = ATT_UL3;
  
  ALL_ATT.ATT_DL4 = ATT_DL4;
  ALL_ATT.ATT_UL4 = ATT_UL4;
  ALL_ATT.data_DL1 = ATTEN_Initial_Val;
  ALL_ATT.data_UL1 = ATTEN_Initial_Val;  
  ALL_ATT.data_DL2 = ATTEN_Initial_Val;
  ALL_ATT.data_UL2 = ATTEN_Initial_Val;  
  ALL_ATT.data_DL3 = ATTEN_Initial_Val;
  ALL_ATT.data_UL3 = ATTEN_Initial_Val;  
  ALL_ATT.data_DL4 = ATTEN_Initial_Val;
  ALL_ATT.data_UL4 = ATTEN_Initial_Val;  
//  PE43711_ALL_atten_ctrl(ALL_ATT);
}
#endif // PYJ.2019.07.26_END -- 
void Bit_Compare(PE43711_st ATT,uint8_t data,uint8_t Shift_Index){
    if(data & (0x01 << Shift_Index)){
        HAL_GPIO_WritePin(ATT.DATA_PORT,ATT.DATA_PIN,GPIO_PIN_SET);//DATA
    }
    else{
        HAL_GPIO_WritePin(ATT.DATA_PORT,ATT.DATA_PIN,GPIO_PIN_RESET);//DATA
    }
}

uint8_t PE43711_DataToHexConvert(double val){
	double ref = 16;
	uint8_t ret = 0,shift = 0x40;

//    printf("val : %f \r\n",val);
    
	for(int i = 0; i < 8; i++){
		if(val == 0)
			break;

		if(val < 31.25){
            if(val >= ref){
    			val -= ref;
                ret |= shift;
//                printf("ret : %x \r\n",ret);
            }
            ref /= 2;
		}
		else{
			ret =  0b01111111;
            break;
		}
        shift >>= 1;
	}
//    printf("\r\nPE43711_DataToHexConvert Result : %x\r\n",ret);
    
	return ret;
}

#if 0 // PYJ.2020.04.17_BEGIN -- 
void PE43711_ALL_atten_ctrl(ALL_PE43711_st ATT){
    HAL_GPIO_WritePin(ATT.ATT_DL1.LE_PORT,ATT.ATT_DL1.LE_PIN,GPIO_PIN_RESET);
    
    Pol_Delay_us(10);
//    printf("why not? \r\n");
    for(uint8_t i = 0; i < 8; i++){
      Bit_Compare(ATT.ATT0,ATT.data0,i);
      Bit_Compare(ATT.ATT1,ATT.data1,i);
      Bit_Compare(ATT.ATT2,ATT.data2,i);
      Bit_Compare(ATT.ATT3,ATT.data3,i);
      Bit_Compare(ATT.ATT4,ATT.data4,i);
      Bit_Compare(ATT.ATT5,ATT.data5,i);
  		HAL_GPIO_WritePin(ATT.ATT0.CLK_PORT,ATT.ATT0.CLK_PIN,GPIO_PIN_SET);//CLOCK
  		Pol_Delay_us(10);
  		HAL_GPIO_WritePin(ATT.ATT0.CLK_PORT,ATT.ATT0.CLK_PIN,GPIO_PIN_RESET);//CLOCK
    }
    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET);//DATA
    HAL_GPIO_WritePin(ATT.ATT0.LE_PORT,ATT.ATT0.LE_PIN,GPIO_PIN_SET);//LE
    Pol_Delay_us(10);
    HAL_GPIO_WritePin(ATT.ATT0.LE_PORT,ATT.ATT0.LE_PIN,GPIO_PIN_RESET);
}
#endif // PYJ.2020.04.17_END -- 

void PE43711_atten_ctrl(PE43711_st ATT ,uint8_t data){
    uint8_t i = 0;
    uint8_t temp = 0;
    //data = 4 * data; // ATTEN ERROR 수정 
    temp = (uint8_t)data;
    
    HAL_GPIO_WritePin(ATT.LE_PORT,ATT.LE_PIN,GPIO_PIN_RESET);
    Pol_Delay_us(10);
    for(i = 0; i < 8; i++){
        if((uint8_t)temp & 0x01){
           HAL_GPIO_WritePin(ATT.DATA_PORT,ATT.DATA_PIN,GPIO_PIN_SET);//DATA
        }
           else{
           HAL_GPIO_WritePin(ATT.DATA_PORT,ATT.DATA_PIN,GPIO_PIN_RESET);//DATA
           }

		HAL_GPIO_WritePin(ATT.CLK_PORT,ATT.CLK_PIN,GPIO_PIN_SET);//CLOCK
		Pol_Delay_us(10);
		HAL_GPIO_WritePin(ATT.CLK_PORT,ATT.CLK_PIN,GPIO_PIN_RESET);//CLOCK
		Pol_Delay_us(10);
		temp >>= 1;
    }
    
	HAL_GPIO_WritePin(ATT.CLK_PORT,ATT.CLK_PIN,GPIO_PIN_RESET);//CLOCK
    HAL_GPIO_WritePin(ATT.DATA_PORT,ATT.DATA_PIN,GPIO_PIN_RESET);//DATA
    Pol_Delay_us(10);
    HAL_GPIO_WritePin(ATT.LE_PORT,ATT.LE_PIN,GPIO_PIN_SET);//LE
    Pol_Delay_us(10);
    HAL_GPIO_WritePin(ATT.LE_PORT,ATT.LE_PIN,GPIO_PIN_RESET);
}
void PE43711_atten_ctrl2(PE43711_st* ATT ,uint8_t data){
    uint8_t i = 0;
    uint8_t temp = 0;
    //data = 4 * data; // ATTEN ERROR 수정 
    temp = (uint8_t)data;
    
    HAL_GPIO_WritePin(ATT->LE_PORT,ATT->LE_PIN,GPIO_PIN_RESET);
    Pol_Delay_us(10);
    for(i = 0; i < 8; i++){
        if((uint8_t)temp & 0x01){
           HAL_GPIO_WritePin(ATT->DATA_PORT,ATT->DATA_PIN,GPIO_PIN_SET);//DATA
        }
           else{
           HAL_GPIO_WritePin(ATT->DATA_PORT,ATT->DATA_PIN,GPIO_PIN_RESET);//DATA
           }

		HAL_GPIO_WritePin(ATT->CLK_PORT,ATT->CLK_PIN,GPIO_PIN_SET);//CLOCK
		Pol_Delay_us(10);
		HAL_GPIO_WritePin(ATT->CLK_PORT,ATT->CLK_PIN,GPIO_PIN_RESET);//CLOCK
		Pol_Delay_us(10);
		temp >>= 1;
    }
    
	HAL_GPIO_WritePin(ATT->CLK_PORT,ATT->CLK_PIN,GPIO_PIN_RESET);//CLOCK
    HAL_GPIO_WritePin(ATT->DATA_PORT,ATT->DATA_PIN,GPIO_PIN_RESET);//DATA
    Pol_Delay_us(10);
    HAL_GPIO_WritePin(ATT->LE_PORT,ATT->LE_PIN,GPIO_PIN_SET);//LE
    Pol_Delay_us(10);
    HAL_GPIO_WritePin(ATT->LE_PORT,ATT->LE_PIN,GPIO_PIN_RESET);
}


void PE43711_UL4_atten_ctrl(uint8_t data){
    uint8_t i = 0;
    uint8_t temp = 0;
    //data = 4 * data; // ATTEN ERROR 수정 
    temp = (uint8_t)data;
    
    HAL_GPIO_WritePin(ATT_EN_UL4_GPIO_Port,ATT_EN_UL4_Pin,GPIO_PIN_RESET);
    Pol_Delay_us(10);
    for(i = 0; i < 8; i++){
        if((uint8_t)temp & 0x01){
           HAL_GPIO_WritePin(ATT_DATA4_GPIO_Port,ATT_DATA4_Pin,GPIO_PIN_SET);//DATA
        }
           else{
           HAL_GPIO_WritePin(ATT_DATA4_GPIO_Port,ATT_DATA4_Pin,GPIO_PIN_RESET);//DATA
           }

		HAL_GPIO_WritePin(ATT_CLOCK4_GPIO_Port,ATT_CLOCK4_Pin,GPIO_PIN_SET);//CLOCK
		Pol_Delay_us(10);
		HAL_GPIO_WritePin(ATT_CLOCK4_GPIO_Port,ATT_CLOCK4_Pin,GPIO_PIN_RESET);//CLOCK
		Pol_Delay_us(10);
		temp >>= 1;
    }
    
	HAL_GPIO_WritePin(ATT_CLOCK4_GPIO_Port,ATT_CLOCK4_Pin,GPIO_PIN_RESET);//CLOCK
    HAL_GPIO_WritePin(ATT_DATA4_GPIO_Port,ATT_DATA4_Pin,GPIO_PIN_RESET);//DATA
    Pol_Delay_us(10);
    HAL_GPIO_WritePin(ATT_EN_UL4_GPIO_Port,ATT_EN_UL4_Pin,GPIO_PIN_SET);//LE
    Pol_Delay_us(10);
    HAL_GPIO_WritePin(ATT_EN_UL4_GPIO_Port,ATT_EN_UL4_Pin,GPIO_PIN_RESET);
}

