#pragma once #include "common.h" #include enum payload_type { PAYLOAD_TYPE_ELSE = 0, // 其它类载荷 PAYLOAD_TYPE_GIMBAL_POD = 1, // 光电吊舱类载荷 PAYLOAD_TYPE_SENSOR_LADAR = 2, // 传感器雷达类载荷 PAYLOAD_TYPE_DGPS_BASE = 3, // 差分基站类载荷 }; #define PAYLOAD_SZHT_FILTER_BUFF_LEN 10 enum payload_sensor_type { PAYLOAD_SENSOR_VISEBLE = 1, // 可见光 PAYLOAD_SENSOR_INFRARED = 2, // 红外 PAYLOAD_SENSOR_MIX_VISEBLE = 3, // 画中画, 可见光主 PAYLOAD_SENSOR_MIX_INFRARED = 4, // 画中画, 红外主 }; // 光电吊舱操作枚举类 enum { PAYLOAD_DIAOCANT_OPS_NULL = 0, // 控 PAYLOAD_DIAOCANG_OPS_BACK_MID = 1, // 回中 PAYLOAD_DIAOCANG_OPS_SET_PITCH = 2, // 设置俯仰角 PAYLOAD_DIAOCANG_OPS_SET_YAW = 3, // 设置方位角 PAYLOAD_DIAOCANG_OPS_LOOK_DOWN = 4, // 垂直下视 PAYLOAD_DIAOCANG_OPS_TAR_TRACE = 5, // 目标跟踪 PAYLOAD_DIAOCANG_OPS_ZOOM = 6, // 变焦 PAYLOAD_DIAOCANG_OPS_SENSOR_SWITCH = 7, // 光学传感器切换 PAYLOAD_DIAOCANG_OPS_TAKE_PHOTO = 8, // 拍照 PAYLOAD_DIAOCANG_OPS_TAKE_VEDIO = 9, // 录制 PAYLOAD_DIAOCANG_OPS_LASER_MEASURE = 10, // 激光测距 PAYLOAD_DIAOCANG_OPS_MOVE = 11, // 向上下左右运动 PAYLOAD_DIAOCANG_OPS_TOUCH_MOVE = 12, // 指点移动 PAYLOAD_DIAOCANG_OPS_FOLLOW = 13, // 跟随模式 PAYLOAD_DIAOCANG_OPS_LOCK = 14, // 锁定模式 PAYLOAD_DIAOCANG_OPS_FOCUS = 15, // 聚焦目标 PAYLOAD_DIAOCANG_OPS_OSD_SET = 16, // OSD 设置 PAYLOAD_DIAOCANG_OPS_TTRANS = 200, // 指令透传 }; // 吊舱操作运动方向 enum { PAYLOAD_MOVE_STOP = 0, PAYLOAD_MOVE_UP = 1, PAYLOAD_MOVE_DOWN = 2, PAYLOAD_MOVE_LEFT = 3, PAYLOAD_MOVE_RIGHT = 4, }; // 吊舱变焦操作 enum { PAYLOAD_ZOOM_STOP = 0, PAYLOAD_ZOOM_OUT = 1, PAYLOAD_ZOOM_IN = 2 }; // 吊舱跟踪操作 enum { PAYLOAD_TRACE_STOP = 0, PAYLOAD_TRACE_START = 1, }; struct payload_status { float laser_dist_m; float roll; /*deg*/ float pitch; float yaw; uint8_t zoom; uint8_t trace_flag; int tar_lon; /* 跟踪使用的目标位置 */ int tar_lat; int tar_alt; int tar_lon_loc; /* 根据激光测距计算的目标位置 */ int tar_lat_loc; int tar_alt_loc; float y_axis[3]; /* 光轴空间向量 */ }; struct payload_diaocang; struct payload_ops { void (*_tx_poll)(uint32_t time_us, uint32_t *last_tx_time_us, uint32_t (*send_data)(const uint8_t *pdata, uint32_t len)); /* 回中 */ void (*_return_to_mid)(uint32_t (*send_data)(const uint8_t *pdata, uint32_t len)); /* 设置俯仰 */ void (*_set_pitch)(float pitch_ang, uint32_t (*send_data)(const uint8_t *pdata, uint32_t len)); /* 设置航向 */ void (*_set_yaw)(float yaw_ang, uint32_t (*send_data)(const uint8_t *pdata, uint32_t len)); /* 拍照 */ void (*_take_photo)(uint32_t (*send_data)(const uint8_t *pdata, uint32_t len)); /* 录像 */ void (*_take_vedio)(int on_off, uint32_t (*send_data)(const uint8_t *pdata, uint32_t len)); /* 激光测距 */ void (*_laser_dist)(uint32_t (*send_data)(const uint8_t *pdata, uint32_t len)); /* 下视 */ void (*_look_downward)(uint32_t (*send_data)(const uint8_t *pdata, uint32_t len)); /* 跟随模式 */ void (*_follow_mode)(uint32_t (*send_data)(const uint8_t *pdata, uint32_t len)); /* 锁定模式 */ void (*_lock_mode)(uint32_t (*send_data)(const uint8_t *pdata, uint32_t len)); /* 运动 */ void (*_move)(int direction, float rate, uint32_t (*send_data)(const uint8_t *pdata, uint32_t len)); /* 指点移动 */ void (*_touch_move)(float px, float py, uint32_t (*send_data)(const uint8_t *pdata, uint32_t len)); /* 缩放 */ void (*_zoom)(int direction, float rate, uint32_t (*send_data)(const uint8_t *pdata, uint32_t len)); /* 光学传感器切换 */ void (*_sensor_switch)(uint32_t (*send_data)(const uint8_t *pdata, uint32_t len), uint16_t sensor_type); /* 目标追踪 */ void (*_trace)(int trace_act, float p1x, float p1y, float p2x, float p2y, uint32_t (*send_data)(const uint8_t *pdata, uint32_t len)); /* 目标位置聚焦 */ void (*_focus)(int focus_lon, int focus_lat, int focus_alt, uint32_t (*_send_data)(const uint8_t *pdata, uint32_t len)); uint32_t (*_send_data)(const uint8_t *pdata, uint32_t len); int (*_rx_cbk)(uint8_t ch, struct payload_diaocang *status); }; struct payload_diaocang { enum payload_type _type; struct payload_status _status; struct payload_ops _ops; uint32_t _last_tx_time; comp_status _link_status; uint32_t _link_lost_count; uint32_t _link_check_time; float _diste_filter_buffer[PAYLOAD_SZHT_FILTER_BUFF_LEN]; float _distn_filter_buffer[PAYLOAD_SZHT_FILTER_BUFF_LEN]; int _filter_in_index; }; void payload_ctl_received(uint8_t ctl_ops_id, const void *param, uint32_t param_len, struct payload_diaocang *payload); void payload_tx_poll(uint32_t tiem_us, struct payload_diaocang *payload); int payload_rx_cbk(uint8_t ch, struct payload_diaocang *payload); void payload_check_linkstatu_poll(uint32_t time_now_us, struct payload_diaocang *payload); void payload_targte_locate(struct payload_diaocang *payload, uint8_t gimbal_euler_type);