#ifndef __COM_TYPE_H__
#define __COM_TYPE_H__

#include "stdint.h"
#include "gpio.h"

typedef struct
{
    int32_t pulses;    // 脉冲数
    uint8_t dir;       // 方向
    uint16_t overflow; // 溢出次数
    uint16_t z;        // Z相触发次数
} Encoder_t;

typedef enum
{
    // 电机运动状态 0：加速 1：匀速 2：减速 3：停止
    ACCELERATE = 0,
    CONSTANT,
    DECELERATE,
    STOP,

} Stepper_state_t;

typedef struct
{
    GPIO_PinState dir; // 前进方向
    float distance;    // 距离
    uint16_t speed;    // 前进速度,单位mm/s
    uint8_t run_flag;  // 运行标志

    // 梯形算法参数(加减速对称)
    float start_speed;      // 启动速度
    uint32_t current_step;  // 当前步数
    uint16_t acc;           // 加速度,单位mm/s^2
    uint16_t dec;           // 减速度,单位mm/s^2
    uint32_t acc_step;      // 加速步数
    uint32_t constant_step; // 匀速步数
    uint32_t total_step;    // 总步数
    uint16_t interval;      // 步间隔
    Stepper_state_t state;  // 电机运动状态

    uint32_t step_count; // 实时记录已走的步数 (用来和 acc_step 比较)
    float current_speed; // 当前实时速度 (浮点型，用于计算中间值)
    float speed_inc;     // 每一步的速度增量 (用于中断里累加)

    uint8_t step_loss_flag;
    uint8_t x_zero; // X轴零点标志
} Stepper_t;

typedef enum
{
    KEY_NONE,
    KEY_1,
    KEY_2,
    KEY_3,
    KEY_4,
    KEY_5
} Key_t;

typedef enum
{
    KEY_EVT_NONE = 0,
    KEY_EVT_CLICK,
    KEY_EVT_LONG_START,
    KEY_EVT_LONG_HOLD,
    KEY_EVT_RELEASE
} KeyEvt_t;

typedef struct
{
    Key_t key;
    KeyEvt_t evt;
} KeyAction_t;

typedef struct
{
    uint16_t acc_mm_s2;
    uint16_t dec_mm_s2;
    float step_loss_threshold_mm;
} App_RunParams_t;

#endif /* __COM_TYPE_H__ */
