#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"

#include "app_main.h"
#include "Com_type.h"
#include "Com_debug.h"
#include "Int_Encoder.h"
#include "Int_TMC2209.h"
#include "app_key.h"
#include "app_motor.h"
#include "app_param_store.h"
#include "app_test.h"
#include "CANopen.h"
#include "CO_app_STM32.h"
#include "can.h"

Encoder_t encoder_1 = {0};

// 静音最大速度：65mm/s
// 有效运动最大速度：350mm/s
// 最远运行距离：230mm
Stepper_t stepper_1 = {
    .dir = GPIO_PIN_RESET, // 方向(1为手轮方向，0为电机方向)
    .distance = 100.0f,    // 距离mm
    .speed = 50.0f,        // 速度mm/s
    .acc = 40.0f,          // 加速度 mm/s^2
    .dec = 40.0f,          // 减速度 mm/s^2
    .start_speed = 5.0f,   // 启动速度
};

CANopenNodeSTM32 CANopenNode;
static void CANopenNode_init(void)
{
    /* 初始化CANopen */
    CANopenNode.CANHandle = &hcan1;            /* 使用CAN接口 */
    CANopenNode.HWInitFunction = MX_CAN1_Init; /* 初始化CAN */
    CANopenNode.timerHandle = &htim11;         /* 使用的定时器句柄 */
    CANopenNode.desiredNodeID = 3;             /* Node-ID */
    CANopenNode.baudrate = 500;                /* 波特率，单位KHz */
    canopen_app_init(&CANopenNode);
}

void app_main(void)
{
    debug_printf("hello three-axis steppers");
    CANopenNode_init();
    App_Motor_Init();
    App_ParamStore_Init();
    (void)App_ParamStore_LoadAndApply();
    while (1)
    {
        App_key_run(&stepper_1);
        canopen_app_process();
        App_Motor_Process();
        App_ParamStore_Process();
    }
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    switch (GPIO_Pin)
    {
        // PE2对应X_ZERO引脚
    case X_ZERO_Pin:
        stepper_1.x_zero = 1;
        break;
        // PC9对应编码器1的Z引脚
    case ENCODER1_Z_Pin:
        encoder_1.z++;
        break;
    default:
        break;
    }
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim == CANopenNode.timerHandle)
    {
        canopen_app_interrupt();
    }

    if (htim->Instance == TIM12)
    {
        App_Motor_StepLossCheck();
    }
}
