#include "pedometer.h" // 引入我们自己的头文件

// --- 核心计步函数实现 ---

/**
 * @brief 使用三轴加速度数据计算步数。
 */
int calculate_steps(int16_t AccX, int16_t AccY, int16_t AccZ) {
    // 使用静态变量存储状态，使得每次函数调用都能保留上一次的状态。
    static int step_count = 0;
    static int last_peak_index = -MIN_STEP_DISTANCE; // 初始化为允许第一次步进
    static int current_sample_index = 0;
    
    // 1. 计算合成加速度的平方 (Magnitude Squared) 
    // 使用 int32_t 或 int64_t 存储平方和，防止 16 位整数溢出。
    int32_t accX_sq = (int32_t)AccX * AccX;
    int32_t accY_sq = (int32_t)AccY * AccY;
    int32_t accZ_sq = (int32_t)AccZ * AccZ;
    
    // 合成加速度的平方 (单位是 LSB^2)
    int32_t magnitude_squared = accX_sq + accY_sq + accZ_sq; 
    
    // 2. 峰值检测与时间检查 
    
    // 检查当前合成加速度平方是否超过了预设的动态冲击阈值。
    if (magnitude_squared > DYNAMIC_THRESHOLD_SQ) {
        // 检查与上次有效步进的时间距离是否足够
        int distance = current_sample_index - last_peak_index;
        
        if (distance >= MIN_STEP_DISTANCE) {
            // 这是一个有效的步进峰值
            step_count++;
            
            // 更新上次峰值的位置
            last_peak_index = current_sample_index; 
        }
    }

    // 更新采样点索引
    current_sample_index++;
    
    return step_count;
}