/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    gpio.c
  * @brief   This file provides code for the configuration
  *          of all used GPIO pins.
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "gpio.h"

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/*----------------------------------------------------------------------------*/
/* Configure GPIO                                                             */
/*----------------------------------------------------------------------------*/
/* USER CODE BEGIN 1 */

#define GPIO_MAX_PIN          144
const struct {
  GPIO_TypeDef *port;
  uint16_t      pin;
} GPIO_Pin[] = {
    {    0,          0},      //0
    {GPIOE, GPIO_PIN_2},      //1
    {GPIOE, GPIO_PIN_3},      //2
    {GPIOE, GPIO_PIN_4},      //3
    {GPIOE, GPIO_PIN_5},      //4
    {GPIOE, GPIO_PIN_6},      //5
    {    0,          0},      //6
    {GPIOC, GPIO_PIN_13},     //7
    {GPIOC, GPIO_PIN_14},     //8
    {GPIOC, GPIO_PIN_15},     //9
    {GPIOF, GPIO_PIN_0},      //10
    {GPIOF, GPIO_PIN_1},      //11
    {GPIOF, GPIO_PIN_2},      //12
    {GPIOF, GPIO_PIN_3},      //13
    {GPIOF, GPIO_PIN_4},      //14
    {GPIOF, GPIO_PIN_5},      //15
    {    0,          0},      //16
    {    0,          0},      //17
    {GPIOF, GPIO_PIN_6},      //18
    {GPIOF, GPIO_PIN_7},      //19
    {GPIOF, GPIO_PIN_8},      //20
    {GPIOF, GPIO_PIN_9},      //21
    {GPIOF, GPIO_PIN_10},     //22
    {GPIOH, GPIO_PIN_0},      //23
    {GPIOH, GPIO_PIN_1},      //24
    {    0,          0},      //25
    {GPIOC, GPIO_PIN_0},      //26
    {GPIOC, GPIO_PIN_1},      //27
    {GPIOC, GPIO_PIN_2},      //28
    {GPIOC, GPIO_PIN_3},      //29
    {    0,          0},      //30
    {    0,          0},      //31
    {    0,          0},      //32
    {    0,          0},      //33
    {GPIOA, GPIO_PIN_0},      //34
    {GPIOA, GPIO_PIN_1},      //35
    {GPIOA, GPIO_PIN_2},      //36
    {GPIOA, GPIO_PIN_3},      //37
    {    0,          0},      //38
    {    0,          0},      //39
    {GPIOA, GPIO_PIN_4},      //40
    {GPIOA, GPIO_PIN_5},      //41
    {GPIOA, GPIO_PIN_6},      //42
    {GPIOA, GPIO_PIN_7},      //43
    {GPIOC, GPIO_PIN_4},      //44
    {GPIOC, GPIO_PIN_5},      //45
    {GPIOB, GPIO_PIN_0},      //46
    {GPIOB, GPIO_PIN_1},      //47
    {GPIOB, GPIO_PIN_2},      //48
    {GPIOF, GPIO_PIN_11},     //49
    {GPIOF, GPIO_PIN_12},     //50
    {    0,          0},      //51
    {    0,          0},      //52
    {GPIOF, GPIO_PIN_13},     //53
    {GPIOF, GPIO_PIN_14},     //54
    {GPIOF, GPIO_PIN_15},     //55
    {GPIOG, GPIO_PIN_0},      //56
    {GPIOG, GPIO_PIN_1},      //57
    {GPIOE, GPIO_PIN_7},      //58
    {GPIOE, GPIO_PIN_8},      //59
    {GPIOE, GPIO_PIN_9},      //60
    {    0,          0},      //61
    {    0,          0},      //62
    {GPIOE, GPIO_PIN_10},     //63
    {GPIOE, GPIO_PIN_11},     //64
    {GPIOE, GPIO_PIN_12},     //65
    {GPIOE, GPIO_PIN_13},     //66
    {GPIOE, GPIO_PIN_14},     //67
    {GPIOE, GPIO_PIN_15},     //68
    {GPIOB, GPIO_PIN_10},     //69
    {GPIOB, GPIO_PIN_11},     //70
    {    0,          0},      //71
    {    0,          0},      //72
    {GPIOB, GPIO_PIN_12},     //73
    {GPIOB, GPIO_PIN_13},     //74
    {GPIOB, GPIO_PIN_14},     //75
    {GPIOB, GPIO_PIN_15},     //76
    {GPIOD, GPIO_PIN_8},      //77
    {GPIOD, GPIO_PIN_9},      //78
    {GPIOD, GPIO_PIN_10},     //79
    {GPIOD, GPIO_PIN_11},     //80
    {GPIOD, GPIO_PIN_12},     //81
    {GPIOD, GPIO_PIN_13},     //82
    {    0,          0},      //83
    {    0,          0},      //84
    {GPIOD, GPIO_PIN_14},     //85
    {GPIOD, GPIO_PIN_15},     //86
    {GPIOG, GPIO_PIN_2},      //87
    {GPIOG, GPIO_PIN_3},      //88
    {GPIOG, GPIO_PIN_4},      //89
    {GPIOG, GPIO_PIN_5},      //90
    {GPIOG, GPIO_PIN_6},      //91
    {GPIOG, GPIO_PIN_7},      //92
    {GPIOG, GPIO_PIN_8},      //93
    {    0,          0},      //94
    {    0,          0},      //95
    {GPIOC, GPIO_PIN_6},      //96
    {GPIOC, GPIO_PIN_7},      //97
    {GPIOC, GPIO_PIN_8},      //98
    {GPIOC, GPIO_PIN_9},      //99
    {GPIOA, GPIO_PIN_8},      //100
    {GPIOA, GPIO_PIN_9},      //101
    {GPIOA, GPIO_PIN_10},     //102
    {GPIOA, GPIO_PIN_11},     //103
    {GPIOA, GPIO_PIN_12},     //104
    {GPIOA, GPIO_PIN_13},     //105
    {    0,          0},      //106
    {    0,          0},      //107
    {    0,          0},      //108
    {GPIOA, GPIO_PIN_14},     //109
    {GPIOA, GPIO_PIN_15},     //110
    {GPIOC, GPIO_PIN_10},     //111
    {GPIOC, GPIO_PIN_11},     //112
    {GPIOC, GPIO_PIN_12},     //113
    {GPIOD, GPIO_PIN_0},      //114
    {GPIOD, GPIO_PIN_1},      //115
    {GPIOD, GPIO_PIN_2},      //116
    {GPIOD, GPIO_PIN_3},      //117
    {GPIOD, GPIO_PIN_4},      //118
    {GPIOD, GPIO_PIN_5},      //119
    {    0,          0},      //120
    {    0,          0},      //121
    {GPIOD, GPIO_PIN_6},      //122
    {GPIOD, GPIO_PIN_7},      //123
    {GPIOG, GPIO_PIN_9},      //124
    {GPIOG, GPIO_PIN_10},     //125
    {GPIOG, GPIO_PIN_11},     //126
    {GPIOG, GPIO_PIN_12},     //127
    {GPIOG, GPIO_PIN_13},     //128
    {GPIOG, GPIO_PIN_14},     //129
    {    0,          0},      //130
    {    0,          0},      //131
    {GPIOG, GPIO_PIN_15},     //132
    {GPIOB, GPIO_PIN_3},      //133
    {GPIOB, GPIO_PIN_4},      //134
    {GPIOB, GPIO_PIN_5},      //135
    {GPIOB, GPIO_PIN_6},      //136
    {GPIOB, GPIO_PIN_7},      //137
    {    0,          0},      //138
    {GPIOB, GPIO_PIN_8},      //139
    {GPIOB, GPIO_PIN_9},      //140
    {GPIOE, GPIO_PIN_0},      //141
    {GPIOE, GPIO_PIN_1},      //142
    {    0,          0},      //143
    {    0,          0},      //144
};

void pinMode(uint8_t pin, int8_t mode)
{
  const struct {
    uint32_t Mode;
    uint32_t Pull;
  } GPIO_Mode[] = {
      {GPIO_MODE_INPUT,     GPIO_NOPULL},     //INPUT
      {GPIO_MODE_OUTPUT_PP, GPIO_NOPULL},     //OUTPUT
      {GPIO_MODE_INPUT,     GPIO_PULLUP},     //INPUT_PULLUP
      {GPIO_MODE_INPUT,     GPIO_PULLDOWN},   //INPUT_PULLDOWN
      {GPIO_MODE_OUTPUT_OD, GPIO_PULLUP},     //OUTPUT_PULLUP
      {GPIO_MODE_OUTPUT_PP, GPIO_PULLDOWN},   //OUTPUT_PULLDOWN
      {GPIO_MODE_OUTPUT_OD, GPIO_NOPULL},     //OUTPUT_OPENDRAIN
  };

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  if(pin<=GPIO_MAX_PIN && GPIO_Pin[pin].port!=0) {
    if(mode != MODE_OFF && mode <= LAST_MODE) {
      GPIO_InitStruct.Pin  = GPIO_Pin[pin].pin;
      GPIO_InitStruct.Mode = GPIO_Mode[mode].Mode;
      GPIO_InitStruct.Pull = GPIO_Mode[mode].Pull;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
      HAL_GPIO_Init(GPIO_Pin[pin].port, &GPIO_InitStruct);
    }
    else {
      HAL_GPIO_DeInit(GPIO_Pin[pin].port, GPIO_Pin[pin].pin);
    }
  }
}

GPIO_PinState digitalRead(uint8_t pin)
{
  if(pin<=GPIO_MAX_PIN && GPIO_Pin[pin].port!=0) {
    return HAL_GPIO_ReadPin(GPIO_Pin[pin].port, GPIO_Pin[pin].pin);
  }
  return GPIO_PIN_RESET;
}

void digitalWrite(uint8_t pin, int8_t state)
{
  if(pin<=GPIO_MAX_PIN && GPIO_Pin[pin].port!=0) {
    if(state<0)   HAL_GPIO_TogglePin(GPIO_Pin[pin].port, GPIO_Pin[pin].pin);
    else          HAL_GPIO_WritePin (GPIO_Pin[pin].port, GPIO_Pin[pin].pin, (state==0)?GPIO_PIN_RESET:GPIO_PIN_SET);
  }
}

/* USER CODE END 1 */

/** Configure pins as
        * Analog
        * Input
        * Output
        * EVENT_OUT
        * EXTI
     PA9   ------> USB_OTG_FS_VBUS
     PA10   ------> USB_OTG_FS_ID
     PA11   ------> USB_OTG_FS_DM
     PA12   ------> USB_OTG_FS_DP
*/
void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOE_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOF_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOG_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOE, GPIO_PIN_2, GPIO_PIN_SET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOF, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOF, GPIO_PIN_12, GPIO_PIN_SET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_RESET);

  /*Configure GPIO pin : PE2 */
  GPIO_InitStruct.Pin = GPIO_PIN_2;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  /*Configure GPIO pin : PC13 */
  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pins : PF0 PF1 PF2 */
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

  /*Configure GPIO pin : PF12 */
  GPIO_InitStruct.Pin = GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

  /*Configure GPIO pin : PB12 */
  GPIO_InitStruct.Pin = GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /*Configure GPIO pin : PD15 */
  GPIO_InitStruct.Pin = GPIO_PIN_15;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  /*Configure GPIO pin : PA9 */
  GPIO_InitStruct.Pin = GPIO_PIN_9;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pins : PA10 PA11 PA12 */
  GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pin : PD1 */
  GPIO_InitStruct.Pin = GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  /*Configure GPIO pin : PE0 */
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI0_IRQn);

  HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);

}

/* USER CODE BEGIN 2 */

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)    // 엔코더 방식에서 Z펄스로 절대위치 초기화하는 함수!!
{

  if(GPIO_Pin==GPIO_PIN_15){
    Motor2_Ang.diffL = 0;
    if(WP_EncInit.Status[R] != Done){
      WP_EncInit.Status[R] = Done;    //  (250703 추가 for Init_Encoder)
    }
//    TestVari1++;
  }
  else if(GPIO_Pin==GPIO_PIN_0){
    Motor1_Ang.diffL = 0;
    if(WP_EncInit.Status[L] != Done) {
      WP_EncInit.Status[L] = Done;    //  (250703 추가 for Init_Encoder)
    }
//    TestVari1++;
  }
}

/* USER CODE END 2 */
