#include "ys32md211.h"
#include "system_ys32md211.h"

#ifndef __YS32MD211_NUCLEO_H__
#define __YS32MD211_NUCLEO_H__

#define BSP_UART_REMAP_PRINT_ENABLE
//#define BSP_KEY_EXTI_ENABLE

// LED
#define LED1_PIN                          GPIO_Pin_7
#define LED1_GPIO_PORT                    GPIOA
#define LED1_GPIO_CLK_ENABLE()            RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_GPIOA, ENABLE);
#define LED1_GPIO_CLK_DISABLE()           RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_GPIOA, DISABLE);  

#define BSP_LED1_ON()                     {GPIO_SetBits(LED1_GPIO_PORT, LED1_PIN);}
#define BSP_LED1_OFF()                    {GPIO_ResetBits(LED1_GPIO_PORT, LED1_PIN);}
#define BSP_LED1_TOGGLE()                 {\
    if(GPIO_ReadOutputDataBit(LED1_GPIO_PORT, LED1_PIN) == SET)\
      GPIO_ResetBits(LED1_GPIO_PORT, LED1_PIN);\
    else\
      GPIO_SetBits(LED1_GPIO_PORT, LED1_PIN);\
}

// KEY
#define KEY1_PIN                          GPIO_Pin_9
#define KEY1_GPIO_PORT                    GPIOB
#define KEY1_GPIO_CLK_ENABLE()            RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_GPIOB, ENABLE);
#define KEY1_GPIO_CLK_DISABLE()           RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_GPIOB, DISABLE);  

#define BSP_KEY1_STATUS                   GPIO_ReadInputDataBit(KEY1_GPIO_PORT, KEY1_PIN)

#define KEY1_EXTI_PinSource               EXTI_PinSource9
#define KEY1_EXTI_Port                    EXTI_PortSourceGPIOB
#define KEY1_EXTI_Line                    EXTI_Line9
#define KEY1_EXTI_IRQn                    EXTI4_15_IRQn
#define KEY1_EXTI_IRQHandler              EXTI4_15_IRQHandler

// UART
#define USER_UARTx                        UART1
#define USER_UART_BAUD_RATE               115200
#define UARTx_CLK_ENABLE()                RCC_APB2PeriphClockCmd(RCC_APB2Periph_UART1, ENABLE); 
#define UARTx_CLK_DISABLE()               RCC_APB2PeriphClockCmd(RCC_APB2Periph_UART1, DISABLE);

#define UARTx_TX_PIN                      GPIO_Pin_9
#define UARTx_TX_PinSource                GPIO_PinSource9
#define UARTx_TX_GPIO_AF                  GPIO_AF_1
#define UARTx_TX_GPIO_PORT                GPIOA
#define UARTx_TX_GPIO_CLK_ENABLE()        RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_GPIOA, ENABLE);
#define UARTx_TX_GPIO_CLK_DISABLE()       RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_GPIOA, DISABLE);  

typedef enum 
{  
  KEY_MODE_GPIO = 0,
  
  #ifdef BSP_KEY_EXTI_ENABLE
  KEY_MODE_EXTI_RISING,
  KEY_MODE_EXTI_FALLING,
  KEY_MODE_EXTI_RISING_FALLING
  #endif
} KEY_TypeDef; 

void BSP_LED_Init(void);
void BSP_KEY_Init(KEY_TypeDef KeyMode);
void BSP_UART_Init(void);
void BSP_UART_SendByte(uint8_t Data);

#endif  //__YS32MD211_NUCLEO_H__
