/*
 * @Author: mypx
 * @Date: 2025-10-15 15:32:36
 * @LastEditTime: 2025-10-16 10:26:19
 * @LastEditors: mypx mypx_coder@163.com
 * @Description: 
 */
#include "bsp_temper_sampling.h"
#include "et_log.h"
#include "spi.h"

#if (USING_SOFT_SPI == 1)
soft_spi_t soft_spi = {
    .sck_port  = GPIOB,
    .sck_pin   = GPIO_PIN_5,
    .mosi_port = GPIOB,
    .mosi_pin  = GPIO_PIN_6,
    .miso_port = GPIOB,
    .miso_pin  = GPIO_PIN_4,
    .cs_port   = GPIOB,
    .cs_pin    = GPIO_PIN_7,
    .mode      = SOFT_SPI_MODE0,
    .bit_order = SOFT_SPI_MSB_FIRST,
    .lock      = RT_NULL, // 使用 RT_NULL，初始化时会创建
    .delay_us  = 1,       // 每半个 SPI 时钟周期延时 1 微秒
};

void bsp_ad7793_spi_transfer(uint8_t *tx_buf, uint8_t *rx_buf, uint16_t len)
{
    soft_spi_transfer_buffer(&soft_spi, tx_buf, rx_buf, len);
}

void bsp_ad7793_spi_write(uint8_t cmd, uint8_t *data, uint16_t len)
{
    soft_spi_write(&soft_spi, &cmd, 1, data, len);
}

void bsp_ad7793_spi_read(uint8_t cmd, uint8_t *rx_buf, uint16_t len)
{
    soft_spi_read(&soft_spi, &cmd, 1, rx_buf, len);
}

void bsp_ad7793_gpio_set(uint8_t pin, bool state)
{
    if (pin == soft_spi.cs_pin)
    {
        HAL_GPIO_WritePin(soft_spi.cs_port, soft_spi.cs_pin, state);
    }
}

bool bsp_ad7793_gpio_get(uint8_t pin)
{
    if (pin == soft_spi.miso_pin)
    {
        return HAL_GPIO_ReadPin(soft_spi.miso_port, soft_spi.miso_pin) == GPIO_PIN_SET;
    }
    return false;
}
#else
#define AD7793_CS_LOW()  HAL_GPIO_WritePin(SPI3_AD7793_CS_GPIO_Port, SPI3_AD7793_CS_Pin, GPIO_PIN_RESET)
#define AD7793_CS_HIGH() HAL_GPIO_WritePin(SPI3_AD7793_CS_GPIO_Port, SPI3_AD7793_CS_Pin, GPIO_PIN_SET)
void bsp_ad7793_spi_transfer(uint8_t *tx_buf, uint8_t *rx_buf, uint16_t len)
{
    HAL_StatusTypeDef status;
    status = HAL_SPI_TransmitReceive(&AD7793_SPI, tx_buf, rx_buf, len, 1000);
    if (status != HAL_OK)
    {
        ET_ERR("SPI transfer error:%d!", status);
    }
}

void bsp_ad7793_spi_write(uint8_t cmd, uint8_t *data, uint16_t len)
{
    uint8_t           tx_buffer[256];
    HAL_StatusTypeDef status;

    tx_buffer[0] = cmd;
    if (data && len > 0)
    {
        for (uint16_t i = 0; i < len; i++)
        {
            tx_buffer[i + 1] = data[i];
        }
    }
    status = HAL_SPI_Transmit(&AD7793_SPI, tx_buffer, len + 1, 1000);
    if (status != HAL_OK)
    {
        ET_ERR("SPI write error:%d!", status);
    }
}

void bsp_ad7793_spi_read(uint8_t cmd, uint8_t *rx_buf, uint16_t len)
{
    uint8_t           tx_buffer[1] = {cmd};
    HAL_StatusTypeDef status;
    status = HAL_SPI_Transmit(&AD7793_SPI, tx_buffer, 1, 1000);
    if (status != HAL_OK)
    {
        ET_ERR("SPI write error:%d!", status);
    }
    status = HAL_SPI_Receive(&AD7793_SPI, rx_buf, len, 1000);
    if (status != HAL_OK)
    {
        ET_ERR("SPI read error:%d!", status);
    }
}

void bsp_ad7793_gpio_set(uint8_t pin, bool state)
{
    if (pin == SPI3_AD7793_CS_Pin)
    {
        HAL_GPIO_WritePin(SPI3_AD7793_CS_GPIO_Port, SPI3_AD7793_CS_Pin, state);
    }
}

bool bsp_ad7793_gpio_get(uint8_t pin)
{
    if (pin == SPI3_AD7793_MISO_Pin)
    {
        return HAL_GPIO_ReadPin(SPI3_AD7793_MISO_GPIO_Port, SPI3_AD7793_MISO_Pin) == GPIO_PIN_SET;
    }
    return false;
}
#endif

void bsp_ad7793_delay_ms(uint16_t ms)
{
    rt_thread_mdelay(ms); // 使用 RT-Thread 的延时函数
}

void bsp_temper_sampling_init(void)
{
#if (USING_SOFT_SPI == 1)
    soft_spi_init(&soft_spi);
    soft_spi_set_mode(&soft_spi, SOFT_SPI_MODE3);          // 设置 SPI 模式
    soft_spi_set_bit_order(&soft_spi, SOFT_SPI_MSB_FIRST); // 设置位序
    soft_spi_set_delay(&soft_spi, 1);                      // 设置延时为 1 微秒
    soft_spi_select(&soft_spi);                            // 选择 SPI 设备
#endif
}
