/*
  视觉与电控通信协议
*/

#pragma once

#include <stdint.h>
#include <stdbool.h>

#ifdef __cplusplus
extern "C"
{
#endif

#define NUC_HEAD (0xFF)
#define NUC_END (0xFE)
#define NUC_ID (0x09)
#define NUC_CTRL (0x01)

#define IMU_ID (0x01)
#define CMD_ID (0x02)


  /* 电控 -> 视觉 IMU数据结构体*/
  typedef struct __attribute__((packed))
  {
    struct __attribute__((packed))
    {
      float x;
      float y;
      float z;
    } gyro; /* 陀螺仪数据 */

    struct __attribute__((packed))
    {
      float x;
      float y;
      float z;
    } accl; /* 四元数 */
    struct __attribute__((packed))
    {
      float q0;
      float q1;
      float q2;
      float q3;
    } quat; /* 四元数 */

  } Protocol_UpDataIMU_t;

    /* 电控 -> 视觉 控制数据结构体*/
  typedef struct __attribute__((packed))
  {
    int8_t cmd; /* 控制命令 */
  } Protocol_UpDataCMD_t;

  /* 视觉 -> 电控 数据结构体*/
  typedef struct __attribute__((packed))
  {
    struct __attribute__((packed))
    {
      float vx;         /* x轴移动速度 */
      float vy;         /* y轴移动速度 */
      float wz;         /* z轴转动速度 */
    } chassis_move_vec; /* 底盘移动向量 */

    float distance; /* 距离（单位：米） */

    float angle; /* 角度（单位：弧度） */

    bool notice; /* 控制命令 */
  } Protocol_DownData_t;

  typedef struct __attribute__((packed))
  {
    uint8_t head;
    uint8_t id; /* 数据包ID */
    uint8_t ctrl; /* 控制字 */
    Protocol_UpDataIMU_t data;
    uint8_t end; /* 数据包结束符 */

  } Protocol_UpPackageIMU_t;

  typedef struct __attribute__((packed))
  {
    uint8_t head;
    uint8_t id;
    uint8_t ctrl;
    Protocol_UpDataCMD_t data;
    uint8_t end;
  } Protocol_UpPackageCMD_t;

  typedef struct __attribute__((packed))
  {
    Protocol_DownData_t data;
    uint16_t crc16;
  } Protocol_DownPackage_t;

#ifdef __cplusplus
}
#endif
