/*
 * 自瞄模组
 */

#pragma once

#include "component\user_math.h"
#include "bsp\can.h"
#ifdef __cplusplus
extern "C" {
#endif

/* Includes ----------------------------------------------------------------- */

struct __attribute__((packed)) AI_ToHost
{
  uint8_t head[2];
  uint8_t mode;  // 0: 空闲, 1: 自瞄, 2: 小符, 3: 大符
  float q[4];    // wxyz顺序	/q4,q0,q1,q2/
  float yaw;
  float yaw_vel;
  float pitch;
  float pitch_vel;
  float bullet_speed;
  uint16_t bullet_count;  // 子弹累计发送次数
  uint16_t crc16;
};

struct __attribute__((packed)) AI_FromHost
{
  uint8_t head[2];
  uint8_t mode;  // 0: 不控制, 1: 控制云台但不开火，2: 控制云台且开火
  float yaw;
  float yaw_vel;
  float yaw_acc;
  float pitch;
  float pitch_vel;
  float pitch_acc;
  uint16_t crc16;
};

typedef struct {
	uint8_t mode;
	struct{
		struct{
				float yaw;
				float pit;		
		}setpoint;
		struct{
					float pit;
					float yaw;	
					}accl;
		struct{
					float pit;
					float yaw;	
					}vel;		
	}gimbal;
	
}AI_cmd_t;

typedef struct  {
  uint8_t mode;  // 0: 空闲, 1: 自瞄, 2: 小符, 3: 大符
  float q[4];    // wxyz顺序	/q4,q0,q1,q2/
  float yaw;
  float yaw_vel;
  float pitch;
  float pitch_vel;
  float bullet_speed;
  uint16_t bullet_count;  // 子弹累计发送次数
}AI_RawData_t;

typedef struct  {
	BSP_CAN_t can;
  uint16_t vision_id;
}AI_Param_t;

typedef struct __attribute__((packed)) {
	struct AI_ToHost tohost;
	struct AI_FromHost fromhost;
  AI_Param_t *param;
}AI_t;


int8_t AI_Init(AI_t *ai, AI_Param_t *param);

int8_t AI_StartReceiving(AI_t *ai);

int8_t AI_Get(AI_t *ai, AI_cmd_t* ai_cmd);

int8_t AI_ParseForHost(AI_t* ai, AI_RawData_t* raw_data);

int8_t AI_StartSend(AI_t *ai);

void AI_SendCmdOnCan(AI_t *ai, const AI_cmd_t *cmd);

 void AI_ParseCmdFromCan(AI_t *ai, AI_cmd_t *cmd);
#ifdef __cplusplus
}
#endif
