// 周涛 2023-02-08
// 基于传感器参数估算位移

#ifndef __IMU_H__
#define __IMU_H__

#include "../../sysdefine/sysdef.h"

#define IMU_ACC_LIST_LEN 256                          // 加速度队列深度
#define IMU_ACC_LIST_ONE_SECOND_LEN 128               // 一秒加速度队列长度
#define IMU_ACC_PEAK_LIST_LEN 128                     // 加速度峰值队列深度
#define IMU_ACC_LIST_SIZE (4 + 12 * IMU_ACC_LIST_LEN) // 加速度队列大小

// 模块初始化参数
typedef struct
{
    flt32 fNoiseX; // X轴噪声，默认值：-0.008151
    flt32 fNoiseY; // Y轴噪声，默认值：0.055946
    flt32 fNoiseZ; // Z轴噪声，默认值：-0.019

    uint32 dwPeakPeakDistance; // 峰间距，默认值35
    uint32 dwPeakValueThres;   // 峰门限，默认值102，放大100倍保存
} IMU_INIT_PARAM_T;

// 三轴角速度原始数据结构
typedef struct
{
    flt32 fAccX; // x轴加速度
    flt32 fAccY; // y轴加速度
    flt32 fAccZ; // z轴加速度
} IMU_ACC_DATA_T;

// 外部函数
void imu_init();
void imu_free_memory();
int32 *imu_get_acc_address_exchange(); // 数据交换模块使用
void imu_save_acc_list_exchange();     // 数据交换模块使用
uint32 imu_cal_distance_lct();         // 定位模块使用

// 内部函数
void imu_save_acc_xyz(uint32 dwAccListLen);
uint32 imu_cal_distance();
uint8 imu_select_acc_xyz(flt32 *pfValidAccDataList, uint8 *pfValidAccDataListLen);
uint8 imu_check_max_acc(flt32 *pfAccDataList, uint8 byListLen, uint8 *pbyMoveFlag);

#endif
