/*
    ctrl_virtual_chassis Task - 使用虚拟底盘设备的示例任务
*/

/* Includes ----------------------------------------------------------------- */
#include "task/user_task.h"
/* USER INCLUDE BEGIN */
#include "device/virtual_chassis.h"
#include "module/config.h"
#include "bsp/time.h"
/* USER INCLUDE END */

/* Private typedef ---------------------------------------------------------- */
/* Private define ----------------------------------------------------------- */
/* Private macro ------------------------------------------------------------ */
/* Private variables -------------------------------------------------------- */
/* USER STRUCT BEGIN */
static Virtual_Chassis_t virtual_chassis;
static bool chassis_enabled = false;
static float test_torques[VIRTUAL_CHASSIS_MOTOR_COUNT] = {0.0f, 0.0f, 0.0f, 0.0f};
/* USER STRUCT END */

/* Private function --------------------------------------------------------- */
/* Exported functions ------------------------------------------------------- */
void Task_ctrl_virtual_chassis(void *argument) {
  (void)argument; /* 未使用argument，消除警告 */

  
  /* 计算任务运行到指定频率需要等待的tick数 */
  const uint32_t delay_tick = osKernelGetTickFreq() / 100.0f; // 100Hz频率

  osDelay(500); /* 延时一段时间再开启任务 */

  uint32_t tick = osKernelGetTickCount(); /* 控制任务运行频率的计时 */
  /* USER CODE INIT BEGIN */
  
  // 初始化虚拟底盘
  if (Virtual_Chassis_Init(&virtual_chassis, &Config_GetRobotParam()->virtual_chassis_param) != DEVICE_OK) {
      // 初始化失败处理
      return;
  }
  
  // 使能底盘电机
  Virtual_Chassis_Enable(&virtual_chassis);
  chassis_enabled = true;
  
  /* USER CODE INIT END */
  
  while (1) {
    tick += delay_tick; /* 计算下一个唤醒时刻 */
    /* USER CODE BEGIN */
    
    // 更新虚拟底盘数据（接收反馈）
    Virtual_Chassis_Update(&virtual_chassis);
    
    // 检查设备在线状态
    if (Virtual_Chassis_IsOnline(&virtual_chassis)) {
        
        // 发送力矩控制命令（这里可以根据实际需要设置力矩值）
        if (chassis_enabled) {
            Virtual_Chassis_SendTorqueCommand(&virtual_chassis, test_torques);
        }
        
        // 获取电机反馈数据
        for (int i = 0; i < VIRTUAL_CHASSIS_MOTOR_COUNT; i++) {
            Virtual_Chassis_MotorFeedback_t *motor_fb = Virtual_Chassis_GetMotorFeedback(&virtual_chassis, i);
            if (motor_fb != NULL && motor_fb->online) {
                // 这里可以使用电机反馈数据
                // 例如：发送到其他任务或用于控制算法
                // motor_fb->current_angle, motor_fb->current_velocity, motor_fb->current_torque
            }
        }
        
        // 获取IMU反馈数据
        Virtual_Chassis_IMUFeedback_t *imu_fb = Virtual_Chassis_GetIMUFeedback(&virtual_chassis);
        if (imu_fb != NULL && imu_fb->online) {
            // 这里可以使用IMU数据替换原有的陀螺仪数据
            // 例如：将数据发送给底盘控制任务
            Chassis_IMU_t chassis_imu = {
                .accl = imu_fb->accl,
                .gyro = imu_fb->gyro,
                .euler = imu_fb->euler,
            };
            
            // 发送IMU数据到底盘控制任务
            osMessageQueuePut(task_runtime.msgq.chassis_imu, &chassis_imu, 0, 0);
        }
    } else {
        // 设备离线，重新使能
        if (chassis_enabled) {
            Virtual_Chassis_Enable(&virtual_chassis);
        }
    }
    
    /* USER CODE END */
    osDelayUntil(tick); /* 运行结束，等待下一次唤醒 */
  }
}