#ifndef _AEM_SENSOR_IF_H_
#define _AEM_SENSOR_IF_H_
#include <stddef.h>
#include <stdbool.h>
#include <stdint.h>

#define KM_TO_MI 0.6213712 /* 公里转英里 */
#define MI_TO_KM 1.609344  /* 英里转公里 */

#define CONVERT_KM_MI_COEFFICIENT 0.00062137 // 注意此系数是米转英里

#define DAY_ACTVITY_MAX_COUNT 100
#define HOUR_ACTIVITY_MAX_COUNT 10

#define DAY_HR_MAX_COUNT 200

#pragma pack(push, 1)

typedef enum
{
    HISTORY_REPORT_REASON_OLNY_UPDATE_BUF,
    HISTORY_REPORT_REASON_TIME_CHANGE,
    HISTORY_REPORT_REASON_POWER_OFF
} event_report_t;

typedef struct
{
    uint8_t enable;
    uint8_t start_hour;
    uint8_t start_min;
    uint8_t end_hour;
    uint8_t end_min;
    uint8_t interval_time_min;
} aem_setting_auto_meas_t;

typedef aem_setting_auto_meas_t aem_setting_hr_auto_meas_t;
typedef aem_setting_auto_meas_t aem_setting_bp_auto_meas_t;
typedef aem_setting_auto_meas_t aem_setting_spo2_auto_meas_t;
typedef aem_setting_auto_meas_t aem_setting_btemp_auto_meas_t;

typedef struct
{
    uint32_t step;
    uint32_t calories;
    uint32_t distance;
} aem_step_info_t;

typedef struct
{
    uint8_t hr;
    uint8_t signalquality;
} aem_rt_hr_info_t;

typedef struct
{
    uint8_t spo2_value;
    uint8_t signalquality;
} aem_rt_spo2_info_t;

typedef struct
{
    uint8_t stress;
} aem_rt_stress_info_t;

typedef struct
{
    uint8_t enable;
    uint8_t hr_remind_h;
    uint8_t hr_remind_l;
} aem_hr_remind_t;

typedef enum
{
    MAG_ACCURACY_UNRELIABLE,
    MAG_ACCURACY_LOW,
    MAG_ACCURACY_MEDIUM,
    MAG_ACCURACY_HIGH,
} aem_mag_accuracy_e;

typedef struct
{
    float x;
    float y;
    float z;
} aem_acc_raw_data_t;

typedef enum
{
    PPG_HR,
    PPG_SPO2,
} ppg_type_e;

typedef enum
{
    AEM_PPG_OPEN,
    AEM_PPG_CLOSE,
} ppg_op_e;

typedef enum
{
    SENSOR_START,
    SENSOR_PASUE,
    SENSOR_STOP,
} sensor_op_e;

typedef struct
{
    ppg_type_e type;
    ppg_op_e op;
} ppgsensor_op_t;

typedef struct
{
    uint8_t version;
    uint8_t enable;
    uint8_t siesta_enable;
    uint8_t start_hour;
    uint8_t start_min;
    uint8_t end_hour;
    uint8_t end_min;
} aem_setting_sedentary_t;

typedef enum
{
    NORMAL_STATUS,
    CHARGING_STATUS,
    LOWER_STATUS,
    SHUTDOWN_STATUS,
    CHARGING_COMPLETE_STATUS,
} charger_status_e;

// ar alert type(長時間動作類型)(0 : 未知(unknown), 1 : 走路(walk), 2 : 跑步(run), 3 : 騎車(ride), 4 : 划船機(rowing), 5 : 橢圓機(elliptical)) "
typedef enum
{
    AUTO_RECOGNITION_UNKNOWN = 0,
    AUTO_RECOGNITION_WALKING,
    AUTO_RECOGNITION_RUNNING,
    AUTO_RECOGNITION_BIKING,
    AUTO_RECOGNITION_ROWING,
    AUTO_RECOGNITION_ELLIPTICALMACHINE,
    AUTO_RECOGNITION_NUM,
} workout_auto_recognition_e;

typedef struct
{
    uint8_t level;
    charger_status_e charger_status;
} aem_battery_info_t;

#define AEM_SLEEP_STAGE_DATA_MAX_CNT (200)

typedef struct
{
    // 入睡时间
    uint16_t fall_year;
    uint8_t fall_month;
    uint8_t fall_day;
    uint8_t fall_hour;
    uint8_t fall_minute;

    // 起床时间
    uint16_t getup_year;
    uint8_t getup_month;
    uint8_t getup_day;
    uint8_t getup_hour;
    uint8_t getup_minute;

    uint16_t total_time_mins; // 睡眠总时长

    uint16_t wake_mins; // 总清醒时长, 单位:分
    uint16_t doze_mins; // 总浅眠时长
    uint16_t rem_mins;  // 总REM时长
    uint16_t deep_mins; // 总深眠时长

    uint8_t wake_count; // 清醒次数
    uint8_t doze_count; // 浅眠次数
    uint8_t rem_count;  // 眼动次数
    uint8_t deep_count; // 深眠次数

    uint8_t sleep_score; // 睡眠得分
} aem_sleep_summary_info_t;

typedef enum
{
    AEM_SLEEP_STATE_AWAKE = 1,
    AEM_SLEEP_STATE_REM,
    AEM_SLEEP_STATE_DOZE,
    AEM_SLEEP_STATE_DEEP,
} aem_sleep_state_e;

typedef struct
{
    uint8_t stage;    // 阶段  1:醒着 2:浅睡 3:深睡 4:快速眼动
    uint8_t duration; // 持续时长
} aem_sleep_stage_t;

typedef struct
{
    uint16_t item_count;
    aem_sleep_stage_t data[AEM_SLEEP_STAGE_DATA_MAX_CNT];
} aem_sleep_stage_data_t;

typedef struct
{
    aem_sleep_summary_info_t summary;
    aem_sleep_stage_data_t stage;
} aem_rt_sleep_info_t;

#define HEALTH_STRESS_MAX 100
#define PRESS_MAX_LEVEL 4

typedef enum
{
    AEM_TWIST_SCREEN_OFF,
    AEM_TWIST_SCREEN_ON,
    AEM_TWIST_NO_ACTION,
    AEM_TWIST_MAX,
} twist_evt_t;

typedef enum
{
    AEM_SLEEP_DEEP,
    AEM_SLEEP_RESTLESS,
    AEM_SLEEP_AWARE,
    AEM_SLEEP_INVIALD,
    AEM_SLEEP_MAX,
} sleep_state_e;

typedef enum
{
    HANDS_WAKEUP_OFF,
    HANDS_WAKEUP_ON,
} hands_wakeup_type_t;
typedef struct
{
    hands_wakeup_type_t status;
} aem_hands_wakeup_t;

typedef struct
{
    uint8_t active_kcal;
    uint8_t resting_kcal;
} activity_kcal_t;

typedef struct
{
    uint8_t activity_type;
    uint8_t time_minute;
} activity_intensity_t;

typedef struct
{
    uint32_t timestamp;
    uint32_t steps;
    uint32_t calories;
    uint32_t stand;
    uint32_t times;
    uint32_t distance; // 距离m
} aem_rt_activity_info_t;

typedef struct
{
    uint16_t steps;
    uint16_t calories;
    uint16_t distance;
} activity_data_item_t;

typedef enum
{
    ACTIVITY_NO_REMIND = 0,
    ACTIVITY_REMIND_CALORIES,
    ACTIVITY_REMIND_STEP,
    ACTIVITY_REMIND_TIMES,
} activity_remind_type_e;

typedef struct
{
    uint16_t steps;
    uint16_t calories;
    uint16_t times;
} aem_activity_goal_t;

typedef struct
{
    uint16_t year;
    uint8_t mon;
    uint8_t day;
    aem_activity_goal_t goal;
    bool is_step_completed;
    bool is_calories_completed;
    bool is_times_completed;
} activity_remind_state_t;

typedef struct
{
    activity_remind_type_e remind_type;
    uint8_t active_flag;
    uint32_t value;
} activity_remind_t;

typedef struct
{
    uint16_t steps;
    uint16_t distances;
    uint16_t total_kcal;
    uint16_t dur_secs;
} act_every_xmin_t;

typedef struct
{
    uint8_t current_resting_hr;
    uint8_t yesterday_resting_hr;
} hr_resting_result_t;

typedef struct
{
    uint8_t cur_heart_rate;
    uint8_t max_heart_rate;
    uint8_t min_heart_rate;
    uint8_t avg_heart_rate;
} workout_rt_hr_t;

typedef struct
{
    uint16_t cur_speed;
    uint16_t avg_speed;
    uint16_t max_speed;
} rt_speed_info_t;

typedef struct
{
    uint16_t cur_km_pace; // 当前公里配速  s/km
    uint16_t max_km_pace; // 最快配速s/km,值最小公里配速最快
    uint16_t avg_km_pace; // 平均配速s/km
} rt_pace_info_t;

typedef enum
{
    POSTURE_MEDLEY = 0,      // 混合泳
    POSTURE_FREESTYLE,       // 自由泳
    POSTURE_BREASTSTROKE,    // 蛙泳
    POSTURE_BACKSTROKE,      // 其他(仰泳)
    POSTURE_BUTTERFLYSTROKE, // 其他(蝶泳)
    POSTURE_OTHERS,          // 其他
    POSTURE_ALL,
} swim_posture_e;

// 运动游泳数据
typedef struct
{
    uint8_t laps;       // 趟数
    uint8_t posture;    // 泳姿
    uint16_t distance;  // 距离
    uint16_t strokes;   // 划水次数
    uint16_t swim_time; // 游泳时长

    uint16_t swolf;    // 50米的游泳时长+50米的划水次数
    uint32_t calories; // 卡路里
    uint16_t pace;     // 配速 s/100m
    uint16_t ave_pace; // 平均配速 s/100m
    uint8_t frequency; // 频率
} workout_swim_info_t;

typedef struct
{
    /* uint32_t strokes_frq;     // 划水频率
    uint8_t main_posture;     // 主泳姿
    uint8_t laps;             // 趟数
    uint16_t last_swolf;      // 最近一趟swolf
    uint16_t avg_swolf;       // 平均
    uint16_t avg_pace;        // 平均
    uint16_t strokes;         // 划水次数
    uint16_t total_rest_time; // 总休息时间 */
    float total_distance;     // meters
    float total_calories;     // Kcal
    float strokes;
    float laps;
    float swim_time;
    float stroke_freq;
    float is_pause;
} rt_swim_info_t;

typedef struct
{
    int16_t cur_altitude;
    int16_t avg_altitude;
    int16_t max_altitude;
    int16_t min_altitude;
    uint16_t cumulative_rise; // 累计上升 m
    uint16_t cumulative_fall; // 累计下降 m
} altitude_info_t;

typedef struct
{
    int16_t cur_altitude;
    int16_t avg_altitude;
    int16_t max_altitude;
    int16_t min_altitude;
} wk_altitude_info_t;

typedef struct
{
    float altitude;
} rt_altitude_t;

typedef struct
{
    float orientation;
} aem_rt_magnetism_info_t;

typedef struct
{
    float altitude;
    uint32_t air_pressure;
} aem_rt_barometer_info_t;

typedef enum
{
    SPORT_IDLE = 0,
    SPORT_START,
    SPORT_PAUSE,
    SPORT_CONTINUE,
    SPORT_STOP,
    SPORT_MAX_UNKNOW,
} sports_status_e;

typedef struct
{
    uint8_t ver;
    uint8_t is_on;
    uint8_t warn_value;
} sports_hr_warning_t;

typedef struct
{
    uint32_t steps;
    uint32_t calories;
    uint32_t distance; // 距离 单位m
    uint32_t times;    // 当天运动时长,s
} activity_rt_info_t;

typedef struct
{
    uint32_t steps;
    uint32_t durations;
    uint32_t total_kcal;
    uint32_t distances;
} activity_data_t;

typedef enum
{
    GESTURE_NONE = 0,
    GESTURE_WRIST_RAISE, // 抬腕
    GESTURE_PALMING,     // 翻腕
    GESTURE_COVER_HAND,  // TP捂手灭屏
} gesture_status_type_e;

typedef struct
{
    uint32_t pressure_value;
    int16_t altitude_value;
} aem_baro_data_t;

typedef struct
{
    double lat;
    double lon;
    bool valid;
} aem_gps_info_t;

#pragma pack(pop)

typedef struct
{
    uint32_t sleeping_hr_cnt;
    uint32_t sleeping_hr_sum;
    uint8_t last_sleeping_hr;
} aem_hr_sleeping_t;

#define MIN_HR_NUM 5
typedef struct
{
    uint32_t resting_hr_cnt;
    uint32_t resting_hr_sum;
    uint8_t avg_hr_f;
    uint8_t min_heart_rate[MIN_HR_NUM];
    hr_resting_result_t hr_strategy_resting_hr_result;
    aem_hr_sleeping_t hr_strategy_sleeping_hr_result;
} hr_algo_resting_t;

typedef enum
{
    WORKOUT_GPS_STATE_CLOSED = 0,
    WORKOUT_GPS_STATE_SEARCHING,
    WORKOUT_GPS_STATE_LOCATE,
    WORKOUT_GPS_STATE_FAIL,
    WORKOUT_GPS_STATE_ERROR,
    WORKOUT_GPS_STATE_AGPS,
    WORKOUT_GPS_STATE_MOVE_TO_OPEN,
    WORKOUT_GPS_STATE_MAX
} workout_gps_state_e;

typedef enum
{
    WORKOUT_GPS_SIGNAL_NONE = 0,
    WORKOUT_GPS_SIGNAL_LEVEL_1,
    WORKOUT_GPS_SIGNAL_LEVEL_2,
    WORKOUT_GPS_SIGNAL_LEVEL_3,
    WORKOUT_GPS_SIGNAL_LEVEL_4,
    WORKOUT_GPS_SIGNAL_LEVEL_5,
    WORKOUT_GPS_SIGNAL_LEVEL_MAX,
} workout_gps_signal_e;

typedef struct
{
    aem_gps_info_t info;
    workout_gps_signal_e signal;
    workout_gps_state_e state;
} aem_gps_rt_info_t;

typedef struct
{
    workout_gps_state_e state;
    uint8_t signal;
} workout_gps_state_info_t;

#define is_sports_status_valid(a) ((SPORT_IDLE <= (a)) && ((a) < SPORT_MAX_UNKNOW))
#define is_workout_type_valid(a) ((WORKOUT_ID_BEGIN <= (a)) && ((a) < WORKOUT_ID_MAX))
#endif