#ifndef BOARD_CONFIG_H
#define BOARD_CONFIG_H

#include "gd32e23x.h"
#include "stdbool.h"

#ifndef CFG_DISABLE
#define CFG_DISABLE 0
#endif

#ifndef CFG_ENABLE
#define CFG_ENABLE  1
#endif

#define GD32E23XF4          0x10
#define GD32E23XF6          0x20
#define GD32E23XF8          0x40

#define PROTOCOL_BOARD_TYPE       0x01  /**< 板卡类型标识 */

#include "version.h"

/* >>>>>>>>>>>>>>>>>>>>[IIC TYPE DEFINE]<<<<<<<<<<<<<<<<<<<< */

#define SOFTWARE_IIC         CFG_DISABLE  // CFG_DISABLE: Hardware IIC; CFG_ENABLE: Software IIC

/* >>>>>>>>>>>>>>>>>>>>[DEBUG MODE]<<<<<<<<<<<<<<<<<<<< */

#define DEBUG_MODE           CFG_DISABLE  // CFG_DISABLE: Release Mode; CFG_ENABLE: Debug Mode

/* >>>>>>>>>>>>>>>>>>>>[COMMAND DEBUG]<<<<<<<<<<<<<<<<<<<< */

#define COM_DEBUG            CFG_DISABLE  // CFG_DISABLE: Command debug off; CFG_ENABLE: Command debug on

/* >>>>>>>>>>>>>>>>>>>>[DEBUG ASSERTIONS DEFINE]<<<<<<<<<<<<<<<<<<<< */

#define DEBUG_VERBOSE        CFG_DISABLE  // CFG_DISABLE: Verbose debug off; CFG_ENABLE: Verbose debug on

/* >>>>>>>>>>>>>>>>>>>>[SEGGER RTT DETECTION]<<<<<<<<<<<<<<<<<<<< */

#define SEGGER_RTT_DETECTION CFG_ENABLE   // CFG_DISABLE: SEGGER RTT off; CFG_ENABLE: SEGGER RTT on

#if SEGGER_RTT_DETECTION == CFG_ENABLE
  #include "SEGGER_RTT.h"
  #define RTT_printf(ch, ...)     SEGGER_RTT_printf(ch, __VA_ARGS__)
  #define RTT_WriteString(ch, s)  SEGGER_RTT_WriteString(ch, s)
  #define RTT_PutChar(ch, c)      SEGGER_RTT_PutChar(ch, c)
#else
  #define RTT_printf(ch, ...)
  #define RTT_WriteString(ch, s)
  #define RTT_PutChar(ch, c)
#endif

#define RS485_MODE            CFG_ENABLE  // CFG_DISABLE: RS485 off; CFG_ENABLE: RS485 on

/******************************************************************************/

/* Dynamic USART Configuration Structure */
typedef struct {
    uint32_t rcu_usart;
    uint32_t usart_periph;
    IRQn_Type irq_type;
    void (*irq_handler)(void);  // 函数指针：指向中断处理函数
} usart_config_t;

extern usart_config_t g_usart_config;
extern uint8_t g_mcu_flash_size;

/* USART中断处理函数声明 */
void usart0_irq_handler(void);
void usart1_irq_handler(void);

/******************************************************************************/

// #define RCU_GPIO_I2C         RCU_GPIOF
// #define RCU_I2C              RCU_I2C0
// #define I2C_SCL_PORT         GPIOF
// #define I2C_SCL_PIN          GPIO_PIN_1
// #define I2C_SDA_PORT         GPIOF
// #define I2C_SDA_PIN          GPIO_PIN_0
// #define I2C_GPIO_AF          GPIO_AF_1

/******************************************************************************/

#define LED_RCU              RCU_GPIOB
#define LED_PORT             GPIOB
#define LED_PIN              GPIO_PIN_1

/******************************************************************************/

typedef enum {
    ACTUATOR_CH1 = 0,
    ACTUATOR_CH2
} actuator_channel_t;

typedef enum {
    DIRECTION_PUSH = 0,  // 推动方向
    DIRECTION_PULL   // 拉动方向
} actuator_direction_t;

/******************************************************************************/

#define ACTUATOR_CH1_PWM_RCU        RCU_GPIOA
#define ACTUATOR_CH1_PWM_PORT       GPIOA
#define ACTUATOR_CH1_PWM_PIN        GPIO_PIN_10
#define ACTUATOR_CH1_GPIO_RCU       RCU_GPIOF
#define ACTUATOR_CH1_GPIO_PORT      GPIOF
#define ACTUATOR_CH1_GPIO_PIN       GPIO_PIN_0

#define ACTUATOR_CH2_PWM_RCU        RCU_GPIOA
#define ACTUATOR_CH2_PWM_PORT       GPIOA
#define ACTUATOR_CH2_PWM_PIN        GPIO_PIN_9
#define ACTUATOR_CH2_GPIO_RCU       RCU_GPIOF
#define ACTUATOR_CH2_GPIO_PORT      GPIOF
#define ACTUATOR_CH2_GPIO_PIN       GPIO_PIN_1

#define ACTUATOR_PWM_TIMER_RCU      RCU_TIMER0
#define ACTUATOR_PWM_TIMER          TIMER0

#define ACTUATOR_CH1_PWM_TIMER_CH   TIMER_CH_2
#define ACTUATOR_CH2_PWM_TIMER_CH   TIMER_CH_1

/******************************************************************************/

#define UART_RCU             (g_usart_config.rcu_usart)
#define UART_PHY             (g_usart_config.usart_periph)
#define UART_IRQ             (g_usart_config.irq_type)
#define UART_GPIO_RCU        RCU_GPIOA
#define UART_GPIO_PORT       GPIOA
#define UART_TX_PIN          GPIO_PIN_2
#define UART_RX_PIN          GPIO_PIN_3
#define UART_BAUDRATE        115200U

#if RS485_MODE == CFG_ENABLE
#define RS485_DE_RCU         RCU_GPIOA
#define RS485_DE_PORT        GPIOA
#define RS485_DE_PIN         GPIO_PIN_1
#endif

/******************************************************************************/

#define DEBUG_UART              USART0

void mcu_detect_and_config(void);
uint8_t get_flash_size(void);

#endif //BOARD_CONFIG_H
