/**
  ******************************************************************************
  * @file    ltc2508_example.c
  * @brief   LTC2508 双缓冲驱动使用示例
  ******************************************************************************
  */

#include "ltc2508_driver.h"
#include "main.h"

// 外部SPI句柄声明（需要在main.c中定义）
extern SPI_HandleTypeDef hspi1;
extern SPI_HandleTypeDef hspi2;
extern SPI_HandleTypeDef hspi3;

/**
  * @brief LTC2508 双缓冲使用示例
  * @param None
  * @retval None
  */
void LTC2508_Example_Usage(void)
{
    LTC2508_StatusTypeDef status;
    LTC2508_BufferTypeDef *ready_buffer = NULL;
    
    // 1. 初始化LTC2508驱动
    status = LTC2508_Init(&hspi1, &hspi2, &hspi3);
    if (status != LTC2508_OK) {
        // 处理初始化错误
        return;
    }
    
    // 2. 主循环中的数据采集和处理
    while (1) {
        // 触发DMA读取（非阻塞）
        status = LTC2508_TriggerDmaRead();
        if (status == LTC2508_OK) {
            // DMA传输已启动，可以继续执行其他任务
        }
        
        // 检查是否有准备好的数据
        status = LTC2508_GetReadyBuffer(&ready_buffer);
        if (status == LTC2508_OK && ready_buffer != NULL) {
            // 处理数据
            LTC2508_ProcessData(ready_buffer);
            
            // 获取当前读取缓冲区索引并释放
            uint8_t current_read_idx = LTC2508_GetCurrentReadBuffer();
            LTC2508_ReleaseBuffer(current_read_idx);
        }
        
        // 其他任务...
        HAL_Delay(1);
    }
}

/**
  * @brief 处理LTC2508数据的示例函数
  * @param buffer: 包含ADC数据的缓冲区
  * @retval None
  */
void LTC2508_ProcessData(LTC2508_BufferTypeDef *buffer)
{
    if (buffer == NULL) return;
    
    // 验证每个通道的数据
    for (uint8_t channel = 0; channel < NUM_LTC2508; channel++) {
        if (LTC2508_ValidateData(buffer, channel) == LTC2508_OK) {
            // 获取32位ADC数据
            uint32_t adc_value = ((uint32_t)buffer->data[channel][0] << 16) | 
                                buffer->data[channel][1];
            
            // 处理数据（例如：转换为电压值、滤波、存储等）
            float voltage = LTC2508_ConvertToVoltage(adc_value);
            
            // 可以在这里添加数据处理逻辑
            // 例如：数字滤波、数据存储、通信发送等
        }
    }
    
    // 记录时间戳
    uint32_t timestamp = buffer->timestamp;
    // 可以用于计算采样率或数据同步
}

/**
  * @brief 将ADC原始数据转换为电压值
  * @param adc_value: 32位ADC原始数据
  * @retval float: 对应的电压值
  */
float LTC2508_ConvertToVoltage(uint32_t adc_value)
{
    // LTC2508是32位ADC，假设参考电压为5V
    const float VREF = 5.0f;
    const uint32_t ADC_MAX = 0xFFFFFFFF;
    
    return (float)adc_value * VREF / ADC_MAX;
}

/**
  * @brief SPI DMA传输完成中断回调函数
  * @param hspi: SPI句柄
  * @retval None
  */
void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
{
    // 调用LTC2508的DMA完成回调
    LTC2508_DmaComplete_Callback(hspi);
}

/**
  * @brief SPI DMA接收完成中断回调函数
  * @param hspi: SPI句柄
  * @retval None
  */
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
    // 调用LTC2508的DMA完成回调
    LTC2508_DmaComplete_Callback(hspi);
}

/**
  * @brief SPI错误中断回调函数
  * @param hspi: SPI句柄
  * @retval None
  */
void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi)
{
    // 调用LTC2508的错误回调
    LTC2508_ErrorCallback(hspi);
}

/**
  * @brief 获取并打印LTC2508统计信息
  * @param None
  * @retval None
  */
void LTC2508_PrintStats(void)
{
    LTC2508_StatsTypeDef stats;
    LTC2508_GetStats(&stats);
    
    // 可以通过UART或其他方式输出统计信息
    // printf("Total samples: %lu\n", stats.total_samples);
    // printf("Error count: %lu\n", stats.error_count);
    // printf("DMA errors: %lu\n", stats.dma_error_count);
    // printf("Buffer overflows: %lu\n", stats.buffer_overflow_count);
}