/*
 * includes.c
 *
 *  Created on: 2019. 7. 28.
 *      Author: parkyj
 */
#include "includes.h"
#include "zig_operate.h"
#include "main.h"
#include "uart.h"
#include "CRC16.h"
#define MACROSTR(k) #k

uint32_t ADCvalue[ADC_EA];


char *Bluecell_Prot_IndexStr[] = {
    MACROSTR(INDEX_ATT_1_8G_DL1     ),
    MACROSTR(INDEX_ATT_1_8G_DL2     ),
    MACROSTR(INDEX_ATT_1_8G_UL1     ),
    MACROSTR(INDEX_ATT_1_8G_UL2     ),
    MACROSTR(INDEX_ATT_1_8G_UL3     ),
    MACROSTR(INDEX_ATT_1_8G_UL4     ),
    MACROSTR(INDEX_ATT_2_1G_DL1     ),
    MACROSTR(INDEX_ATT_2_1G_DL2     ),
    MACROSTR(INDEX_ATT_2_1G_UL1     ),
    MACROSTR(INDEX_ATT_2_1G_UL2     ),
    MACROSTR(INDEX_ATT_2_1G_UL3     ),
    MACROSTR(INDEX_ATT_2_1G_UL4     ),
    MACROSTR(INDEX_ATT_3_5G_LOW1      ),
    MACROSTR(INDEX_ATT_3_5G_HIGH1      ),
    MACROSTR(INDEX_ATT_3_5G_COM1    ),
    MACROSTR(INDEX_ATT_3_5G_LOW2     ),
    MACROSTR(INDEX_ATT_3_5G_HIGH2      ),
    MACROSTR(INDEX_ATT_3_5G_COM2    ),
    MACROSTR(INDEX_PLL_1_8G_DL_H    ),
    MACROSTR(INDEX_PLL_1_8G_DL_L    ),
    MACROSTR(INDEX_PLL_1_8G_UL_H    ),
    MACROSTR(INDEX_PLL_1_8G_UL_L    ),
    MACROSTR(INDEX_PLL_2_1G_DL_H    ),
    MACROSTR(INDEX_PLL_2_1G_DL_L    ),
    MACROSTR(INDEX_PLL_2_1G_UL_H    ),
    MACROSTR(INDEX_PLL_2_1G_UL_L    ),
    MACROSTR(INDEX_PLL_3_5G_LOW_H    ),
    MACROSTR(INDEX_PLL_3_5G_LOW_M    ),    
    MACROSTR(INDEX_PLL_3_5G_LOW_L    ),
    MACROSTR(INDEX_PLL_3_5G_HIGH_H    ),
    MACROSTR(INDEX_PLL_3_5G_HIGH_M    ),    
    MACROSTR(INDEX_PLL_3_5G_HIGH_L    ),
    MACROSTR(INDEX_PLL_LD_6_BIT     ),
    MACROSTR(INDEX_DET_1_8G_DL_IN_H ),
    MACROSTR(INDEX_DET_1_8G_DL_IN_L ),
    MACROSTR(INDEX_DET_1_8G_DL_OUT_H),
    MACROSTR(INDEX_DET_1_8G_DL_OUT_L),
    MACROSTR(INDEX_DET_1_8G_UL_IN_H ),
    MACROSTR(INDEX_DET_1_8G_UL_IN_L ),
    MACROSTR(INDEX_DET_1_8G_UL_OUT_H),
    MACROSTR(INDEX_DET_1_8G_UL_OUT_L),
    MACROSTR(INDEX_DET_2_1G_DL_IN_H ),
    MACROSTR(INDEX_DET_2_1G_DL_IN_L ),
    MACROSTR(INDEX_DET_2_1G_DL_OUT_H),
    MACROSTR(INDEX_DET_2_1G_DL_OUT_L),
    MACROSTR(INDEX_DET_2_1G_UL_IN_H ),
    MACROSTR(INDEX_DET_2_1G_UL_IN_L ),
    MACROSTR(INDEX_DET_2_1G_UL_OUT_H),
    MACROSTR(INDEX_DET_2_1G_UL_OUT_L),
    MACROSTR(INDEX_DET_3_5G_DL_IN_H ),
    MACROSTR(INDEX_DET_3_5G_DL_IN_L ),
    MACROSTR(INDEX_DET_3_5G_DL_OUT_L),
    MACROSTR(INDEX_DET_3_5G_DL_OUT_H),
    MACROSTR(INDEX_DET_3_5G_UL_IN_H ),
    MACROSTR(INDEX_DET_3_5G_UL_IN_L ),
    MACROSTR(INDEX_DET_3_5G_UL_OUT_H),
    MACROSTR(INDEX_DET_3_5G_UL_OUT_L),
    MACROSTR(INDEX_RFU_TEMP_H       ),
    MACROSTR(INDEX_RFU_TEMP_L       ),
    MACROSTR(INDEX__28V_DET_H       ),
    MACROSTR(INDEX__28V_DET_L       ),
    MACROSTR(INDEX_ALARM_AC         ),
    MACROSTR(INDEX_ALARM_DC         ),
    MACROSTR(INDEX_PATH_EN_1_8G_DL  ),
    MACROSTR(INDEX_PATH_EN_1_8G_UL  ),
    MACROSTR(INDEX_PATH_EN_2_1G_DL  ),
    MACROSTR(INDEX_PATH_EN_2_1G_UL  ),
    MACROSTR(INDEX_PATH_EN_3_5G_L   ),
    MACROSTR(INDEX_PATH_EN_3_5G_H   ),
    MACROSTR(INDEX_PATH_EN_3_5G_DL  ),
    MACROSTR(INDEX_PATH_EN_3_5G_UL  ),
    MACROSTR(INDEX_PLL_ON_OFF_3_5G_H),
    MACROSTR(INDEX_PLL_ON_OFF_3_5G_L),
    MACROSTR(INDEX_T_SYNC_DL        ),
    MACROSTR(INDEX__T_SYNC_DL       ),
    MACROSTR(INDEX_T_SYNC_UL        ),
    MACROSTR(INDEX__T_SYNC_UL       ),   
};

#ifdef DEBUG_PRINT
static void kConstPrinter(Bluecell_Prot_Index k)
{
    printf("%s", Bluecell_Prot_IndexStr[k]);
}
#endif /* DEBUG_PRINT */
void Path_Init(void){
    Prev_data[INDEX_PATH_EN_1_8G_DL]   = HAL_GPIO_ReadPin(PATH_EN_1_8G_DL_GPIO_Port,PATH_EN_1_8G_DL_Pin);
    Prev_data[INDEX_PATH_EN_1_8G_UL]   = HAL_GPIO_ReadPin(PATH_EN_1_8G_UL_GPIO_Port,PATH_EN_1_8G_UL_Pin);
    Prev_data[INDEX_PATH_EN_2_1G_DL]   = HAL_GPIO_ReadPin(PATH_EN_2_1G_DL_GPIO_Port,PATH_EN_2_1G_DL_Pin);
    Prev_data[INDEX_PATH_EN_2_1G_UL]   = HAL_GPIO_ReadPin(PATH_EN_2_1G_UL_GPIO_Port,PATH_EN_2_1G_UL_Pin);
    Prev_data[INDEX_PATH_EN_3_5G_L]    = HAL_GPIO_ReadPin(PATH_EN_3_5G_L_GPIO_Port,PATH_EN_3_5G_L_Pin);
    Prev_data[INDEX_PATH_EN_3_5G_H]    = HAL_GPIO_ReadPin(PATH_EN_3_5G_H_GPIO_Port,PATH_EN_3_5G_H_Pin);
    Prev_data[INDEX_PATH_EN_3_5G_DL]   = HAL_GPIO_ReadPin(PATH_EN_3_5G_DL_GPIO_Port,PATH_EN_3_5G_DL_Pin);
    Prev_data[INDEX_PATH_EN_3_5G_UL]   = HAL_GPIO_ReadPin(PATH_EN_3_5G_UL_GPIO_Port,PATH_EN_3_5G_UL_Pin);
    Prev_data[INDEX_PLL_ON_OFF_3_5G_H] = HAL_GPIO_ReadPin(PLL_ON_OFF_3_5G_H_GPIO_Port,PLL_ON_OFF_3_5G_H_Pin);
    Prev_data[INDEX_PLL_ON_OFF_3_5G_L] = HAL_GPIO_ReadPin(PLL_ON_OFF_3_5G_L_GPIO_Port,PLL_ON_OFF_3_5G_L_Pin);
}
void Power_ON_OFF_Ctrl(uint8_t type,uint8_t cmd){
	static uint32_t pinctrl = 0;
	static uint32_t pintemp = 0;
//    printf("\r\ntype : %s cmd : %d\r\n",Bluecell_Prot_IndexStr[type - 4],cmd);
    switch(type){
        case INDEX_PATH_EN_1_8G_DL  : 
#if 0 // PYJ.2019.07.29_BEGIN -- 
            printf("\r\n LINE %d\r\n",__LINE__);
#endif // PYJ.2019.07.29_END -- 
            if(cmd)
                HAL_GPIO_WritePin(PATH_EN_1_8G_DL_GPIO_Port,PATH_EN_1_8G_DL_Pin, GPIO_PIN_SET);
            else
                HAL_GPIO_WritePin(PATH_EN_1_8G_DL_GPIO_Port,PATH_EN_1_8G_DL_Pin, GPIO_PIN_RESET);
            break; 
        case INDEX_PATH_EN_1_8G_UL  : 
#if 0 // PYJ.2019.07.29_BEGIN -- 
            printf("\r\n LINE %d\r\n",__LINE__);
#endif // PYJ.2019.07.29_END -- 
            if(cmd)
                HAL_GPIO_WritePin(PATH_EN_1_8G_UL_GPIO_Port,PATH_EN_1_8G_UL_Pin, GPIO_PIN_SET);
            else
                HAL_GPIO_WritePin(PATH_EN_1_8G_UL_GPIO_Port,PATH_EN_1_8G_UL_Pin, GPIO_PIN_RESET);
                
            break;
        case INDEX_PATH_EN_2_1G_DL  : 
#ifdef DEBUG_PRINT
            printf("\r\n LINE %d\r\n",__LINE__);
#endif /* DEBUG_PRINT */
            if(cmd)
                HAL_GPIO_WritePin(PATH_EN_2_1G_DL_GPIO_Port,PATH_EN_2_1G_DL_Pin, GPIO_PIN_SET);
            else
                HAL_GPIO_WritePin(PATH_EN_2_1G_DL_GPIO_Port,PATH_EN_2_1G_DL_Pin, GPIO_PIN_RESET);                
            break;
        case INDEX_PATH_EN_2_1G_UL  : 
#ifdef DEBUG_PRINT
            printf("\r\n LINE %d\r\n",__LINE__);
#endif /* DEBUG_PRINT */
            if(cmd)
                HAL_GPIO_WritePin(PATH_EN_2_1G_UL_GPIO_Port,PATH_EN_2_1G_UL_Pin, GPIO_PIN_SET);
            else
                HAL_GPIO_WritePin(PATH_EN_2_1G_UL_GPIO_Port,PATH_EN_2_1G_UL_Pin, GPIO_PIN_RESET);                
            break;
        case INDEX_PATH_EN_3_5G_L   : 
            if(cmd){
                HAL_GPIO_WritePin(PATH_EN_3_5G_L_GPIO_Port,PATH_EN_3_5G_L_Pin, GPIO_PIN_SET);
//                printf("\r\n LINE %d\r\n",__LINE__);
            }
            else{
                HAL_GPIO_WritePin(PATH_EN_3_5G_L_GPIO_Port,PATH_EN_3_5G_L_Pin, GPIO_PIN_RESET);
//                printf("\r\n LINE %d\r\n",__LINE__);
            }
            break;
        case INDEX_PATH_EN_3_5G_H   : 
            if(cmd){
                HAL_GPIO_WritePin(PATH_EN_3_5G_H_GPIO_Port,PATH_EN_3_5G_H_Pin, GPIO_PIN_SET);
//                            printf("\r\n LINE %d\r\n",__LINE__);
            }
            else{
                HAL_GPIO_WritePin(PATH_EN_3_5G_H_GPIO_Port,PATH_EN_3_5G_H_Pin, GPIO_PIN_RESET);
//                            printf("\r\n LINE %d\r\n",__LINE__);
            }
            break;
        case INDEX_PATH_EN_3_5G_DL  : 
#ifdef DEBUG_PRINT
            printf("\r\n LINE %d\r\n",__LINE__);
#endif /* DEBUG_PRINT */
            if(cmd)
                HAL_GPIO_WritePin(PATH_EN_3_5G_DL_GPIO_Port,PATH_EN_3_5G_DL_Pin, GPIO_PIN_SET);
            else
                HAL_GPIO_WritePin(PATH_EN_3_5G_DL_GPIO_Port,PATH_EN_3_5G_DL_Pin, GPIO_PIN_RESET);
            break;
        case INDEX_PATH_EN_3_5G_UL  : 
#ifdef DEBUG_PRINT
            printf("\r\n LINE %d\r\n",__LINE__);
#endif /* DEBUG_PRINT */
            if(cmd)
                HAL_GPIO_WritePin(PATH_EN_3_5G_UL_GPIO_Port,PATH_EN_3_5G_UL_Pin, GPIO_PIN_SET);
            else
                HAL_GPIO_WritePin(PATH_EN_3_5G_UL_GPIO_Port,PATH_EN_3_5G_UL_Pin, GPIO_PIN_RESET);
            break;
        case INDEX_PLL_ON_OFF_3_5G_H: 
//            printf("\r\n LINE %d\r\n",__LINE__);
            if(cmd)
                HAL_GPIO_WritePin(PLL_ON_OFF_3_5G_H_GPIO_Port,PLL_ON_OFF_3_5G_H_Pin, GPIO_PIN_SET);
            else
                HAL_GPIO_WritePin(PLL_ON_OFF_3_5G_H_GPIO_Port,PLL_ON_OFF_3_5G_H_Pin, GPIO_PIN_RESET);
            break;
        case INDEX_PLL_ON_OFF_3_5G_L: 
//            printf("\r\n LINE %d\r\n",__LINE__);
            if(cmd)
                HAL_GPIO_WritePin(PLL_ON_OFF_3_5G_L_GPIO_Port,PLL_ON_OFF_3_5G_L_Pin, GPIO_PIN_SET);  
            else
                HAL_GPIO_WritePin(PLL_ON_OFF_3_5G_L_GPIO_Port,PLL_ON_OFF_3_5G_L_Pin, GPIO_PIN_RESET);
            break;
        case INDEX_T_SYNC_DL:
        case INDEX__T_SYNC_UL:
        case INDEX_T_SYNC_UL:
        case INDEX__T_SYNC_DL:
            if(cmd)
#if 0
            {
                HAL_GPIO_WritePin(_T_SYNC_UL_GPIO_Port,_T_SYNC_UL_Pin, GPIO_PIN_RESET);
                HAL_GPIO_WritePin(T_SYNC_UL_GPIO_Port,T_SYNC_UL_Pin, GPIO_PIN_RESET);
                HAL_GPIO_WritePin(_T_SYNC_DL_GPIO_Port,_T_SYNC_DL_Pin, GPIO_PIN_SET);
                HAL_GPIO_WritePin(T_SYNC_DL_GPIO_Port,T_SYNC_DL_Pin, GPIO_PIN_SET);

            }
            else{
                HAL_GPIO_WritePin(_T_SYNC_UL_GPIO_Port,_T_SYNC_UL_Pin, GPIO_PIN_SET);
                HAL_GPIO_WritePin(T_SYNC_UL_GPIO_Port,T_SYNC_UL_Pin, GPIO_PIN_SET);
                HAL_GPIO_WritePin(_T_SYNC_DL_GPIO_Port,_T_SYNC_DL_Pin, GPIO_PIN_RESET);
                HAL_GPIO_WritePin(T_SYNC_DL_GPIO_Port,T_SYNC_DL_Pin, GPIO_PIN_RESET);                
            }
#else
        {
        	pintemp = (uint32_t)((_T_SYNC_DL_Pin | T_SYNC_DL_Pin) | ((uint32_t)_T_SYNC_UL_Pin << 16U) | ((uint32_t)T_SYNC_UL_Pin << 16U));
        	_T_SYNC_UL_GPIO_Port->BSRR = pintemp;
//            HAL_GPIO_WritePin(_T_SYNC_UL_GPIO_Port,_T_SYNC_UL_Pin|T_SYNC_UL_Pin, GPIO_PIN_RESET);
//            HAL_GPIO_WritePin(_T_SYNC_DL_GPIO_Port,_T_SYNC_DL_Pin|T_SYNC_DL_Pin, GPIO_PIN_SET);
        }
        else
        {
        	pintemp = (uint32_t)((_T_SYNC_UL_Pin | T_SYNC_UL_Pin) | ((uint32_t)_T_SYNC_DL_Pin << 16U) | ((uint32_t)T_SYNC_DL_Pin << 16U));
        	_T_SYNC_UL_GPIO_Port->BSRR = pintemp;
//            HAL_GPIO_WritePin(_T_SYNC_UL_GPIO_Port,_T_SYNC_UL_Pin|T_SYNC_UL_Pin, GPIO_PIN_SET);
//            HAL_GPIO_WritePin(_T_SYNC_DL_GPIO_Port,_T_SYNC_DL_Pin|T_SYNC_DL_Pin, GPIO_PIN_RESET);
        }
#endif
#ifdef DEBUG_PRINT
            printf("TDD SYNC OPERATE ; %d\r\n",cmd);
#endif /* DEBUG_PRINT */
            break;
        default :
#ifdef DEBUG_PRINT
        printf("Function : %s LINE : %d   ERROR \r\n",__func__,__LINE__);
#endif /* DEBUG_PRINT */
    break;

    }
}
void ATTEN_PLL_PATH_Initialize(void){
#if 0 // PYJ.2019.07.31_BEGIN -- 
        for(int i = 0; i < INDEX_BLUE_EOF + 1; i++){
            printf("Data = %x\r\n",  Flash_Save_data[i]);
        }
#endif // PYJ.2019.07.31_END -- 
    Flash_Save_data[INDEX_BLUE_CRC]      = STH30_CreateCrc(&Flash_Save_data[Type], Flash_Save_data[Length]);
    RF_Ctrl_Main(&Flash_Save_data[INDEX_BLUE_HEADER]);
    RF_Status_Get();
}
void Power_ON_OFF_Initialize(void){
  /* * * PATH PLL ON OFF SECTION* * */
  HAL_GPIO_WritePin(PATH_EN_3_5G_L_GPIO_Port   ,PATH_EN_3_5G_L_Pin   , GPIO_PIN_RESET);
  HAL_GPIO_WritePin(PATH_EN_3_5G_H_GPIO_Port   ,PATH_EN_3_5G_H_Pin   , GPIO_PIN_RESET);
  HAL_GPIO_WritePin(PATH_EN_3_5G_DL_GPIO_Port  ,PATH_EN_3_5G_DL_Pin  , GPIO_PIN_RESET);
  HAL_GPIO_WritePin(PATH_EN_3_5G_UL_GPIO_Port  ,PATH_EN_3_5G_UL_Pin  , GPIO_PIN_RESET);
  HAL_GPIO_WritePin(PATH_EN_3_5G_L_GPIO_Port   ,PATH_EN_3_5G_L_Pin   , GPIO_PIN_RESET);  
  HAL_GPIO_WritePin(PLL_ON_OFF_3_5G_H_GPIO_Port,PLL_ON_OFF_3_5G_H_Pin, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(PLL_ON_OFF_3_5G_L_GPIO_Port,PLL_ON_OFF_3_5G_L_Pin, GPIO_PIN_RESET);  
  HAL_GPIO_WritePin(PATH_EN_2_1G_DL_GPIO_Port  ,PATH_EN_2_1G_DL_Pin  , GPIO_PIN_RESET);
  HAL_GPIO_WritePin(PATH_EN_2_1G_UL_GPIO_Port  ,PATH_EN_2_1G_UL_Pin  , GPIO_PIN_RESET);
  HAL_GPIO_WritePin(PATH_EN_1_8G_DL_GPIO_Port  ,PATH_EN_1_8G_DL_Pin  , GPIO_PIN_RESET);
  HAL_GPIO_WritePin(PATH_EN_1_8G_UL_GPIO_Port  ,PATH_EN_1_8G_UL_Pin  , GPIO_PIN_RESET);
  /* * * TDD SECTION* * */
  HAL_GPIO_WritePin(_T_SYNC_UL_GPIO_Port,_T_SYNC_UL_Pin, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(T_SYNC_UL_GPIO_Port,T_SYNC_UL_Pin, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(_T_SYNC_DL_GPIO_Port,_T_SYNC_DL_Pin, GPIO_PIN_SET);
  HAL_GPIO_WritePin(T_SYNC_DL_GPIO_Port,T_SYNC_DL_Pin, GPIO_PIN_SET);   
  HAL_Delay(1);
}

void Error_Message_Occur(PLL_Error mode){
  static uint8_t temp_data[7]; 
  temp_data[INDEX_BLUE_HEADER]       = BLUECELL_HEADER;
  temp_data[INDEX_BLUE_TYPE]         = TYPE_BLUECELL_ERROR;
  temp_data[INDEX_BLUE_LENGTH]       = 4;
  temp_data[INDEX_BLUE_CRCINDEX + 0] = INDEX_BLUE_CRCINDEX + 2;
 
 
  switch(mode){
    case DL_1_8:
      temp_data[INDEX_BLUE_CRCINDEX + 1] = DL_1_8;
      break;
    case UL_1_8:
      temp_data[INDEX_BLUE_CRCINDEX + 1] = UL_1_8;
      break;
    case DL_2_1:
      temp_data[INDEX_BLUE_CRCINDEX + 1] = DL_2_1;
      break;
    case UL_2_1:
      temp_data[INDEX_BLUE_CRCINDEX + 1] = UL_2_1;
      break;
  }
  temp_data[INDEX_BLUE_CRCINDEX + 2] = STH30_CreateCrc(&temp_data[Type], temp_data[Length]);
  temp_data[INDEX_BLUE_CRCINDEX + 3] = BLUECELL_TAILER;
  HAL_UART_Transmit_DMA(&huart1,&temp_data[INDEX_BLUE_HEADER],temp_data[INDEX_BLUE_LENGTH]  + 3); 
}
void Pol_Delay_us(volatile uint32_t microseconds)
{
  /* Go to number of cycles for system */
  microseconds *= (SystemCoreClock / 1000000);
 
  /* Delay till end */
  while (microseconds--);
}
void Boot_LED_Toggle(void){
  if(LedTimerCnt > 500){HAL_GPIO_TogglePin(BOOT_LED_GPIO_Port,GPIO_PIN_14);LedTimerCnt = 0;}
}
void ADC_Check(void){
      if(AdcTimerCnt > 2500){
          for(uint8_t i = 0; i< ADC_EA; i++ ){
          Prev_data[INDEX_DET_1_8G_DL_IN_H + i*2]     = (uint16_t)((ADCvalue[i] & 0xFF00) >> 8);
          Prev_data[INDEX_DET_1_8G_DL_IN_L + i*2]     = (uint16_t)(ADCvalue[i] & 0x00FF);
          AdcTimerCnt = 0;
#if 0 // PYJ.2019.08.09_BEGIN -- 
          printf("Prev_data[%d] : %x",i,Prev_data[INDEX_DET_1_8G_DL_IN_H + i]);
          printf("%x\r\n",i,Prev_data[INDEX_DET_1_8G_DL_IN_L + i]);            
#endif // PYJ.2019.08.09_END -- 
         }
      }
}
void Uart_Check(void){
  while (TerminalQueue.data > 0 && UartRxTimerCnt > 100) GetDataFromUartQueue(&hTerminal);
}

