/**
 * @file pwm_capture.h
 * @brief PWM 输入捕获：5 路占空比测量
 *
 * 输入引脚：
 *   P01 (IN_W), P02 (IN_C), P03 (IN_R), P14 (IN_G), P15 (IN_B)
 *
 * 实现原理：
 *   使用 Timer 的输入捕获功能测量 PWM 高电平时间和周期，
 *   计算占空比并映射到 0-255。
 *
 * HC32F003 Timer 资源：
 *   - ATIM（高级定时器）：支持多路输入捕获
 *   - LPTIM / GT：基本定时器，单通道
 *   实际实现时可将 5 路捕获分配到不同定时器通道，
 *   或使用 GPIO 外部中断 + 软件计时的方式。
 *
 * 此文件采用"GPIO 外部中断 + SysTick 软件计时"方案，
 * 兼容性更强，适合 5 路捕获资源不足的情况。
 */

#ifndef PWM_CAPTURE_H
#define PWM_CAPTURE_H

#include <stdint.h>

/* =========================================================
 * 全局捕获值（0-255，由捕获模块更新，主循环读取）
 * ========================================================= */
extern uint8_t g_cap_w;  /* 暖白 IN_W */
extern uint8_t g_cap_c;  /* 冷白 IN_C */
extern uint8_t g_cap_r;  /* 红   IN_R */
extern uint8_t g_cap_g;  /* 绿   IN_G */
extern uint8_t g_cap_b;  /* 蓝   IN_B */

/* =========================================================
 * 函数声明
 * ========================================================= */

/**
 * @brief 初始化 PWM 捕获模块
 *
 * DDL 调用：
 *   Gpio_SetFunc(P01, GpioFuncTim1Cap) — P01 配置为定时器捕获输入
 *   （或 Gpio_Init(P01, INPUT_PULLDOWN) + EXTI_Init(P01) 软件计时方案）
 *   SysTick_Config(SystemCoreClock / 1000000)  — 1us 节拍用于高精度计时
 */
void PwmCapture_Init(void);

/**
 * @brief 更新所有通道的占空比读数（主循环中周期调用）
 *
 * 软件计时方案：读取各 GPIO 的高低电平持续时间，
 * 计算 duty = high_time / period，映射到 [0, 255]
 *
 * 注：外部中断触发时在 ISR 中记录时间戳，
 *     此函数读取 ISR 记录的数据并计算占空比。
 */
void PwmCapture_Update(void);

/**
 * @brief GPIO 外部中断服务（在相应 ISR 中调用）
 * @param ch  通道编号：0=W, 1=C, 2=R, 3=G, 4=B
 * @param level 当前引脚电平（1=上升沿，0=下降沿）
 * @param timestamp_us 当前时间戳（微秒）
 */
void PwmCapture_EdgeIsr(uint8_t ch, uint8_t level, uint32_t timestamp_us);

#endif /* PWM_CAPTURE_H */
