/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : bsp_board.h
  * @brief          : 板级支持包板级抽象头文件
  ******************************************************************************
  */
/* USER CODE END Header */

#ifndef BSP_BOARD_H
#define BSP_BOARD_H

#include <stdint.h>
#include "hal.h"
#include "hal_gpio.h"
#include "hal_uart.h"
#include "hal_spi.h"
#include "hal_i2c.h"
#include "hal_can.h"
#include "hal_adc.h"
#include "hal_eth.h"
#include "bsp_eth.h"

/**
 * @brief BSP 配置版本
 */
#define BSP_CONFIG_VERSION_MAJOR 1
#define BSP_CONFIG_VERSION_MINOR 0
#define BSP_CONFIG_VERSION_PATCH 0
#define BSP_CONFIG_VERSION (BSP_CONFIG_VERSION_MAJOR << 16 | BSP_CONFIG_VERSION_MINOR << 8 | BSP_CONFIG_VERSION_PATCH)

/**
 * @brief 板级 LED 配置结构体
 */
typedef struct {
    uint8_t enable;                 /*!< LED 使能标志 */
    hal_gpio_port_t port;           /*!< LED GPIO 端口 */
    hal_gpio_pin_t pin;             /*!< LED GPIO 引脚 */
    hal_gpio_mode_t mode;           /*!< LED GPIO 模式 */
    hal_gpio_speed_t speed;         /*!< LED GPIO 速度 */
    hal_gpio_pull_t pull;           /*!< LED GPIO 上拉配置 */
} bsp_led_config_t;

/**
 * @brief 板级 LEDs 配置结构体
 */
typedef struct {
    uint8_t enable;                 /*!< LEDs 使能标志 */
    uint8_t count;                  /*!< LED 数量 */
    const bsp_led_config_t* leds;   /*!< 指向 LEDs 配置数组的指针 */
} bsp_leds_config_t;

/**
 * @brief 板级按键配置结构体
 */
typedef struct {
    hal_gpio_port_t port;           /*!< 按键 GPIO 端口 */
    hal_gpio_pin_t pin;             /*!< 按键 GPIO 引脚 */
    hal_gpio_mode_t mode;           /*!< 按键 GPIO 模式 */
    hal_gpio_speed_t speed;         /*!< 按键 GPIO 速度 */
    hal_gpio_pull_t pull;           /*!< 按键 GPIO 上拉配置 */
    uint8_t active_high;            /*!< 按键高电平有效标志 */
} bsp_button_config_t;

/**
 * @brief 板级按键组配置结构体
 */
typedef struct {
    uint8_t enable;                 /*!< 按键使能标志 */
    uint8_t count;                  /*!< 按键数量 */
    const bsp_button_config_t* buttons; /*!< 指向按键配置数组的指针 */
} bsp_buttons_config_t;

/**
 * @brief UART 实例标识符定义
 */
typedef enum {
    BSP_UART_INSTANCE_1 = 0,
    BSP_UART_INSTANCE_2,
    BSP_UART_INSTANCE_3,
    BSP_UART_INSTANCE_4,
    BSP_UART_INSTANCE_5,
    BSP_UART_INSTANCE_6,
    BSP_UART_INSTANCE_MAX
} bsp_uart_instance_t;

/**
 * @brief 板级 UART 配置结构体
 */
typedef struct {
    uint8_t enable;                 /*!< UART 使能标志 */
    bsp_uart_instance_t instance;   /*!< UART 实例 */
    uint32_t baudrate;              /*!< UART 波特率 */
    hal_uart_parity_t parity;       /*!< UART 校验位 */
    hal_uart_stopbits_t stopbits;   /*!< UART 停止位 */
    hal_uart_databits_t databits;   /*!< UART 数据位 */
    hal_gpio_port_t tx_port;        /*!< UART TX 端口 */
    hal_gpio_pin_t tx_pin;          /*!< UART TX 引脚 */
    hal_gpio_port_t rx_port;        /*!< UART RX 端口 */
    hal_gpio_pin_t rx_pin;          /*!< UART RX 引脚 */
} bsp_uart_config_t;

/**
 * @brief 板级 SPI 配置结构体
 */
typedef struct {
    uint8_t enable;                 /*!< SPI 使能标志 */
    hal_spi_instance_t instance;    /*!< SPI 实例 */
    hal_spi_mode_t mode;            /*!< SPI 模式 */
    uint32_t baudrate;              /*!< SPI 波特率 */
    hal_spi_polarity_t polarity;    /*!< SPI 时钟极性 */
    hal_spi_phase_t phase;          /*!< SPI 时钟相位 */
    hal_spi_databits_t databits;    /*!< SPI 数据位 */
    hal_gpio_port_t sck_port;       /*!< SPI SCK 端口 */
    hal_gpio_pin_t sck_pin;         /*!< SPI SCK 引脚 */
    hal_gpio_port_t miso_port;      /*!< SPI MISO 端口 */
    hal_gpio_pin_t miso_pin;        /*!< SPI MISO 引脚 */
    hal_gpio_port_t mosi_port;      /*!< SPI MOSI 端口 */
    hal_gpio_pin_t mosi_pin;        /*!< SPI MOSI 引脚 */
} bsp_spi_config_t;

/**
 * @brief 板级 I2C 配置结构体
 */
typedef struct {
    uint8_t enable;                 /*!< I2C 使能标志 */
    hal_i2c_instance_t instance;    /*!< I2C 实例 */
    hal_i2c_speed_t speed;          /*!< I2C 速度 */
    hal_i2c_address_mode_t address_mode; /*!< I2C 地址模式 */
    hal_i2c_dutycycle_t dutycycle;  /*!< I2C 占空比 */
    uint16_t own_address1;          /*!< I2C 自身地址 1 */
    hal_gpio_port_t scl_port;       /*!< I2C SCL 端口 */
    hal_gpio_pin_t scl_pin;         /*!< I2C SCL 引脚 */
    hal_gpio_port_t sda_port;       /*!< I2C SDA 端口 */
    hal_gpio_pin_t sda_pin;         /*!< I2C SDA 引脚 */
} bsp_i2c_config_t;

/**
 * @brief 板级 CAN 配置结构体
 */
typedef struct {
    uint8_t enable;                 /*!< CAN 使能标志 */
    hal_can_instance_t instance;    /*!< CAN 实例 */
    hal_can_mode_t mode;            /*!< CAN 模式 */
    uint32_t prescaler;             /*!< CAN 预分频器 */
    uint8_t sync_jump_width;        /*!< CAN 同步跳转宽度 */
    uint8_t time_segment1;          /*!< CAN 时间段 1 */
    uint8_t time_segment2;          /*!< CAN 时间段 2 */
    hal_gpio_port_t rx_port;        /*!< CAN RX 端口 */
    hal_gpio_pin_t rx_pin;          /*!< CAN RX 引脚 */
    hal_gpio_port_t tx_port;        /*!< CAN TX 端口 */
    hal_gpio_pin_t tx_pin;          /*!< CAN TX 引脚 */
} bsp_can_config_t;

/**
 * @brief 板级 ADC 通道配置结构体
 */
typedef struct {
    uint8_t enable;                 /*!< ADC 通道使能标志 */
    hal_adc_channel_t channel;      /*!< ADC 通道 */
    hal_adc_sampletime_t sampletime; /*!< ADC 采样时间 */
    uint8_t rank;                   /*!< ADC 通道优先级 */
} bsp_adc_channel_config_t;

/**
 * @brief 板级 ADC 配置结构体
 */
typedef struct {
    uint8_t enable;                 /*!< ADC 使能标志 */
    hal_adc_instance_t instance;    /*!< ADC 实例 */
    hal_adc_resolution_t resolution; /*!< ADC 分辨率 */
    uint8_t scan_conversion_mode;   /*!< ADC 扫描转换模式 */
    uint8_t continuous_conversion_mode; /*!< ADC 连续转换模式 */
    uint8_t channel_count;          /*!< ADC 通道数量 */
    const bsp_adc_channel_config_t* channels; /*!< 指向 ADC 通道配置数组的指针 */
} bsp_adc_config_t;

/**
 * @brief 板级 W25QXX 配置结构体
 */
typedef struct {
    uint8_t enable;                 /*!< W25QXX 使能标志 */
    hal_gpio_port_t cs_port;        /*!< W25QXX CS 端口 */
    hal_gpio_pin_t cs_pin;          /*!< W25QXX CS 引脚 */
    uint8_t spi_instance;           /*!< W25QXX 使用的 SPI 实例 */
} bsp_w25qxx_config_t;

/**
 * @brief 板级外设初始化函数类型
 */
typedef hal_ret_t (*bsp_periph_init_func_t)(const void* config);

/**
 * @brief 板级 ID 结构体
 */
typedef struct {
    uint16_t vendor_id;             /*!< 板级厂商 ID */
    uint16_t product_id;            /*!< 板级产品 ID */
    uint32_t serial_number;         /*!< 板级序列号 */
} bsp_board_id_t;

/**
 * @brief 板级特性标志
 */
typedef enum {
    BSP_BOARD_FEATURE_LED         = (1 << 0),  /*!< 板级支持 LED */
    BSP_BOARD_FEATURE_BUTTON      = (1 << 1),  /*!< 板级支持按键 */
    BSP_BOARD_FEATURE_UART        = (1 << 2),  /*!< 板级支持 UART */
    BSP_BOARD_FEATURE_SPI         = (1 << 3),  /*!< 板级支持 SPI */
    BSP_BOARD_FEATURE_I2C         = (1 << 4),  /*!< 板级支持 I2C */
    BSP_BOARD_FEATURE_CAN         = (1 << 5),  /*!< 板级支持 CAN */
    BSP_BOARD_FEATURE_ADC         = (1 << 6),  /*!< 板级支持 ADC */
    BSP_BOARD_FEATURE_DAC         = (1 << 7),  /*!< 板级支持 DAC */
    BSP_BOARD_FEATURE_TIMER       = (1 << 8),  /*!< 板级支持 TIMER */
    BSP_BOARD_FEATURE_RTC         = (1 << 9),  /*!< 板级支持 RTC */
    BSP_BOARD_FEATURE_W25QXX      = (1 << 10), /*!< 板级支持 W25QXX */
    BSP_BOARD_FEATURE_DMA         = (1 << 11), /*!< 板级支持 DMA */
    BSP_BOARD_FEATURE_ETH         = (1 << 12), /*!< 板级支持 ETH */
    BSP_BOARD_FEATURE_USB         = (1 << 13), /*!< 板级支持 USB */
    BSP_BOARD_FEATURE_SDIO        = (1 << 14), /*!< 板级支持 SDIO */
    BSP_BOARD_FEATURE_FSMC        = (1 << 15), /*!< 板级支持 FSMC */
} bsp_board_feature_t;

/**
 * @brief 板级硬件信息结构体
 */
typedef struct {
    uint32_t clock_speed;           /*!< 板级时钟速度 */
    uint32_t flash_size;            /*!< Flash 大小（字节） */
    uint32_t ram_size;              /*!< RAM 大小（字节） */
    uint32_t eeprom_size;           /*!< EEPROM 大小（字节） */
    uint32_t sram_size;             /*!< SRAM 大小（字节） */
    uint8_t  cpu_core;              /*!< CPU 核心类型 */
    uint8_t  cpu_bits;              /*!< CPU 位数（32 或 64） */
} bsp_board_hw_info_t;

/**
 * @brief 板级外设配置结构体
 */
typedef struct {
    /* UART 配置 */
    uint8_t uart_count;             /*!< UART 数量 */
    const bsp_uart_config_t* uarts; /*!< 指向 UART 配置数组的指针 */
    
    /* SPI 配置 */
    uint8_t spi_count;              /*!< SPI 数量 */
    const bsp_spi_config_t* spis;   /*!< 指向 SPI 配置数组的指针 */
    
    /* I2C 配置 */
    uint8_t i2c_count;              /*!< I2C 数量 */
    const bsp_i2c_config_t* i2cs;   /*!< 指向 I2C 配置数组的指针 */
    
    /* CAN 配置 */
    uint8_t can_count;              /*!< CAN 数量 */
    const bsp_can_config_t* cans;   /*!< 指向 CAN 配置数组的指针 */
    
    /* ADC 配置 */
    uint8_t adc_count;              /*!< ADC 数量 */
    const bsp_adc_config_t* adcs;   /*!< 指向 ADC 配置数组的指针 */
} bsp_board_periph_config_t;

/**
 * @brief 板级以太网配置结构体
 */
// bsp_eth_config_t 在 bsp_eth.h 中定义

/**
 * @brief 板级初始化函数指针结构体
 */
typedef struct {
    bsp_periph_init_func_t led_init;        /*!< LED 初始化函数 */
    bsp_periph_init_func_t button_init;     /*!< 按键初始化函数 */
    bsp_periph_init_func_t uart_init;       /*!< UART 初始化函数 */
    bsp_periph_init_func_t spi_init;        /*!< SPI 初始化函数 */
    bsp_periph_init_func_t i2c_init;        /*!< I2C 初始化函数 */
    bsp_periph_init_func_t can_init;        /*!< CAN 初始化函数 */
    bsp_periph_init_func_t adc_init;        /*!< ADC 初始化函数 */
    bsp_periph_init_func_t w25qxx_init;     /*!< W25QXX 初始化函数 */
    bsp_periph_init_func_t eth_init;        /*!< 以太网初始化函数 */
} bsp_board_init_funcs_t;

/**
 * @brief 板级配置结构体
 */
typedef struct {
    uint32_t version;               /*!< 配置版本 */
    const char* name;               /*!< 板级名称 */
    const char* description;        /*!< 板级描述 */
    bsp_board_id_t id;              /*!< 板级 ID 信息 */
    
    /* 板级特性 */
    uint32_t features;              /*!< 板级特性标志 */
    
    /* 硬件信息 */
    bsp_board_hw_info_t hw_info;    /*!< 硬件信息 */
    
    /* 外设配置 */
    bsp_leds_config_t leds;         /*!< LEDs 配置 */
    bsp_buttons_config_t buttons;   /*!< 按键配置 */
    bsp_w25qxx_config_t w25qxx;     /*!< W25QXX 配置 */
    bsp_eth_config_t eth;           /*!< 以太网配置 */
    
    /* 外设数组 */
    bsp_board_periph_config_t periphs; /*!< 外设配置 */
    
    /* 初始化函数 */
    bsp_board_init_funcs_t init_funcs; /*!< 初始化函数指针 */
    
    /* 板级特定配置 */
    void* custom_config;            /*!< 自定义板级配置指针 */
    size_t custom_config_size;      /*!< 自定义板级配置大小 */
    
    /* 板级版本信息 */
    uint8_t major_rev;              /*!< 主版本 */
    uint8_t minor_rev;              /*!< 次版本 */
    uint8_t patch_rev;              /*!< 补丁版本 */
    const char* revision_desc;      /*!< 版本描述 */
} bsp_board_config_t;

/**
 * @brief STM32F407VET6 板级配置外部声明
 */
extern const bsp_board_config_t stm32f407vet6_board_config;

/**
 * @brief 板级硬件初始化
 * @retval HAL 状态码
 */
hal_ret_t bsp_board_init(void);

/**
 * @brief 获取板级名称
 * @retval 板级名称字符串
 */
const char* bsp_board_get_name(void);

/**
 * @brief 获取板级配置
 * @retval 指向板级配置结构体的指针
 */
const bsp_board_config_t* bsp_board_get_config(void);

#endif /* BSP_BOARD_H */
