gcs_vklink_v30.c 59 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832
  1. #include "gcs_vklink_v30.h"
  2. #include "auto_pilot.h"
  3. #include "control_attitude.h"
  4. #include "control_rate.h"
  5. #include "control_throttle.h"
  6. #include "data_save.h"
  7. #include "flight_mode.h"
  8. #include "geomatry.h"
  9. #include "helpler_funtions.h"
  10. #include "math.h"
  11. #include "my_math.h"
  12. #include "params.h"
  13. #include "payload.h"
  14. #include "pilot_navigation.h"
  15. #include "soft_can_yy.h"
  16. #include "soft_flash.h"
  17. #include "soft_gs.h"
  18. #include "soft_imu.h"
  19. #include "soft_motor_output.h"
  20. #include "soft_port_uart4.h"
  21. #include "soft_rc_input.h"
  22. #include "soft_sdcard.h"
  23. #include "soft_time.h"
  24. #include "soft_voltage.h"
  25. #include "string.h"
  26. #include "um482.h"
  27. #include "ver_config.h"
  28. #include "vklink.h"
  29. #include "mode_gcs_tax_launch_run.h"
  30. #include "mode_attitude.h"
  31. #include <stdio.h>
  32. /* COMP ID 分配 */
  33. enum
  34. {
  35. COMPID_IMUBL = 201,
  36. COMPID_IMU = 1,
  37. COMPID_FMU = 0,
  38. };
  39. /* CTL 指令子 ID 分配 */
  40. enum
  41. {
  42. CTL_MSG_UNLOCK = 1, // 解锁
  43. CTL_MSG_TAKTOFF = 2, // 起飞
  44. CTL_MSG_FIRSTPOINT = 3, // 去一点
  45. CTL_MSG_BREAKPOINT = 4, // 断点续飞
  46. CTL_MSG_CRUISE = 5, // 开始巡航
  47. CTL_MSG_PAUSE = 6, // 暂停航线
  48. CTL_MSG_CONTINUE = 7, // 继续航线
  49. CTL_MSG_RTH = 8, // 返航
  50. CTL_MSG_LAND = 9, // 一键降落
  51. CTL_MSG_ALT_CHANGE = 10, // 一键变高
  52. CTL_MSG_WPT_CHANGE = 11, // 一键变点
  53. CTL_MSG_MANUL_PHOTO = 30, // 手动拍照
  54. CTL_MSG_AUTO_YAW_LOCK = 46, // 自动模式机头锁定
  55. CTL_MSG_AUTO_YAW_UNLOCK = 47, // 自动模式机头取消锁定
  56. CTL_MSG_WP_CYCLE_TIME = 50, // 循环圈数
  57. CTL_MSG_PUMPCLOSE = 51, // 关闭喷洒
  58. CTL_MSG_ENABLE_CONTINUOUSLY_PHOTO = 53, // 开启连续拍照
  59. CTL_MSG_DISABLE_CONTINUOULSY_PHOTO = 54, // 关闭连续拍照
  60. CTL_MSG_ENGINE_CTRL = 56, // 发动机控制
  61. CTL_MSG_VEHICLE_LAUNCH = 60, // 车载起飞
  62. CTL_MSG_VEHICLE_FOLLOW = 61, // 车载跟随
  63. CTL_MSG_VEHICLE_LAND = 62, // 车载降落
  64. CTL_MSG_VEHICLE_FOLLOW_EXIT = 63, // 结束车载跟随
  65. CTL_MSG_CANESC_CONF = 70, // 电调配置指令
  66. CTL_MSG_AFC_CONTROL = 80, // AFC 控制
  67. CTL_MSG_SELF_ROTATION = 82, // 原地自旋
  68. CTL_MSG_ENABLE_TUNING = 90, // 使能调式模式
  69. CTL_MSG_ALLSTOP = 100, // 紧急停转
  70. CTL_MSG_PAYLOAD_CTL = 101, // 载荷遥控
  71. CTL_MSG_VINS_CTL = 110, // 视觉模块指令
  72. CTL_MSG_SET_SIMULATOR = 140, // 仿真固件使能
  73. };
  74. /* CAL 指令子 ID 分配 */
  75. enum
  76. {
  77. CAL_MSG_ATT = 1, // 姿态校准
  78. CAL_MSG_MAG = 2, // 磁校准
  79. CAL_MSG_REMOTE_S = 3, // 遥控器校准-开始
  80. CAL_MSG_REMOTE_E = 4, // 遥控器校准-结束
  81. CAL_MSG_MOTOR = 5, // 电机检测
  82. CAL_MSG_ASSEMBLY_DIRECTION = 6, // 装配方向
  83. CAL_MSG_BATTERY_VOLTAGE = 50 // 电压校准
  84. };
  85. #pragma pack(1)
  86. struct global_pos_msg_data
  87. {
  88. uint32_t time_stamp_us; /* 本地 us 时间戳 */
  89. int32_t slng; /* 解算经度 */
  90. int32_t slat; /* 解算纬度 */
  91. int32_t gps_alt_cm; /* 海拔高度 */
  92. int32_t salt_cm; /* 解算高度 */
  93. int16_t roll; /* 横滚 0.1deg */
  94. int16_t pitch; /* 俯仰 */
  95. int16_t yaw; /* 航向 */
  96. int16_t evel; /* 水平速度 cm/s */
  97. int16_t nvel; /* 解算垂直速度 cm/s */
  98. int16_t uvel; /* 天向垂直速度 cm/s */
  99. uint16_t airspeed; /* 空速 cm/s */
  100. };
  101. struct bat_bms_msg_data
  102. {
  103. char manufactory[8]; /* 厂商代号 */
  104. char product[8]; /* 产品型号 */
  105. uint16_t voltage; /* 电压 0.1 V */
  106. int16_t current; /* 电流 0.1 A, 正冲负放 */
  107. int16_t temperature; /* 温度 */
  108. uint8_t electricity_percentage; /* 电量百分比 */
  109. uint8_t fault_status; /* 故障状态 */
  110. uint16_t number_of_circles; /* 循环次数 */
  111. uint16_t capacity_total; /* 电池设计容量 mAh */
  112. uint16_t capacity_remaining_percentage; /* 电池剩余容量 mAh */
  113. uint16_t reserve0; /* 预留 */
  114. uint16_t cell_volt[16]; /* 电芯电压 */
  115. uint8_t user_data[32]; /* 其它信息, 根据不同电池数据特定 */
  116. };
  117. struct can_servo_msg_data
  118. {
  119. uint16_t manufactory;
  120. uint8_t link_status[8];
  121. uint8_t servo_pwmin[8];
  122. uint16_t error_status[8];
  123. uint16_t servo_rpm[8];
  124. uint16_t servo_voltin[8];
  125. uint16_t servo_currentout[8];
  126. int16_t servo_temperature[8];
  127. };
  128. struct gps_imu_pos_fix_msg_data
  129. {
  130. int16_t gps_pos_fix[6];
  131. int16_t imu_pos_fix[3];
  132. };
  133. struct afc_ctl_msg_data
  134. {
  135. uint8_t link_status; /* 连接状态 0-无 1-正常 2-断开 */
  136. uint8_t ap_type; /* 动力构型 1-旋翼 2-固定翼 */
  137. int16_t forward_speed; /* 前向速度指令 */
  138. int16_t right_speed; /* 右向速度指令 */
  139. int16_t up_speed; /* 上向速度指令 */
  140. int16_t tar_yaw; /* 目标航向 0.1deg */
  141. int16_t tar_roll; /* 目标横滚角 0.1deg */
  142. uint32_t reserve;
  143. int16_t tar_pitch; /* 目标俯仰角 0.1deg */
  144. uint8_t ctl_id1; /* 收到的指令字1 */
  145. uint8_t ctl_id2; /* 收到的指令字2 */
  146. int32_t tar_lon; /* 目标位置经度 */
  147. int32_t tar_lat; /* 目标位置纬度 */
  148. int32_t tar_alt; /* 目标位置高度 */
  149. };
  150. struct vins_msg_data
  151. {
  152. int32_t pos_lng;
  153. int32_t pos_lat;
  154. int32_t pos_alt;
  155. int16_t espeed_cms;
  156. int16_t nspeed_cms;
  157. int16_t uspeed_cms;
  158. int32_t pos_e;
  159. int32_t pos_n;
  160. int32_t pos_u;
  161. uint8_t flag_p;
  162. int32_t target_pos_e;
  163. int32_t target_pos_n;
  164. int32_t target_pos_u;
  165. uint16_t target_vel_e;
  166. uint16_t target_vel_n;
  167. uint16_t target_vel_u;
  168. uint16_t target_heading;
  169. uint8_t flag_t;
  170. };
  171. #pragma pack(0)
  172. /**
  173. * @brief 初始化一个发送消息
  174. *
  175. * @param Msg
  176. * @param msgid
  177. */
  178. static void
  179. gcs_vklink_txmsg_init(VKlink_Msg_Type *txMsg, uint8_t msgid)
  180. {
  181. txMsg->head = VKLINK_MSG_HEAD;
  182. txMsg->seq++;
  183. txMsg->sysid = verinf._sysid;
  184. txMsg->compid = COMPID_FMU;
  185. txMsg->msgid = msgid;
  186. txMsg->payload_len = 0;
  187. txMsg->crc16_check = 0;
  188. }
  189. void gcs_vklink_v300_send_global_pos_data(struct GCS_Link *pgcs)
  190. {
  191. if (pgcs->_current_sysid != verinf._sysid)
  192. {
  193. return;
  194. }
  195. VKlink_Msg_Type *txMsg = &pgcs->vklink_tx_msg;
  196. gcs_vklink_txmsg_init(txMsg, GCS_VKLINK_V300_GLOBAL_POS_ID);
  197. struct global_pos_msg_data *data = (struct global_pos_msg_data *)txMsg->payload;
  198. txMsg->payload_len = sizeof(*data);
  199. data->time_stamp_us = micros();
  200. data->slng = pid_m_posx.loc_c;
  201. data->slat = pid_m_posy.loc_c;
  202. data->gps_alt_cm = ins.gps_alt;
  203. data->salt_cm = pid_m_alt.loc_c;
  204. data->roll = pid_m_roll.angle_c * 10;
  205. data->pitch = pid_m_pitch.angle_c * 10;
  206. data->yaw = pid_m_yaw.angle_c * 10;
  207. data->evel = pid_m_posx.vel_c * 0.1f;
  208. data->nvel = pid_m_posy.vel_c * 0.1f;
  209. data->uvel = pid_m_alt.vel_c * 0.1f;
  210. data->airspeed = 0;
  211. gs_tx_vklink_msg(pgcs, txMsg);
  212. }
  213. /**
  214. * @brief 发送遥测消息
  215. *
  216. */
  217. void gcs_vklink_v300_send_telemetry_data(struct GCS_Link *pgcs)
  218. {
  219. uint8_t tmp_uint8;
  220. int32_t tmp_int32;
  221. int16_t tmp_int16;
  222. uint32_t tmp_uint32;
  223. const struct yy_can_rx_msg_data *yy_can = yy_can_rx_data_get();
  224. VKlink_Msg_Type *txMsg = &pgcs->vklink_tx_msg;
  225. gcs_vklink_txmsg_init(txMsg, GCS_VKLINK_V300_TELEMETRY_ID);
  226. // 飞控 SN 号
  227. vklink_msg_payload_put_data(txMsg, &ver_par.serial_id, 4);
  228. // 航向角,0.1deg
  229. tmp_int16 = pid_m_yaw.angle_c * 10;
  230. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  231. // 横滚角,0.1deg
  232. tmp_int16 = pid_m_roll.angle_c * 10;
  233. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  234. // 俯仰角,0.1deg
  235. tmp_int16 = pid_m_pitch.angle_c * 10;
  236. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  237. // 解算高度,0.1m
  238. tmp_int32 = pid_m_alt.loc_c / 10;
  239. vklink_msg_payload_put_data(txMsg, &tmp_int32, 4);
  240. // 爬升速度,0.1m/s
  241. tmp_int16 = pid_m_alt.vel_c / 10;
  242. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  243. // 水平速度,0.1m/s
  244. tmp_int16 = ins.horz_vel / 10;
  245. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  246. // 空速,0.1m/s
  247. tmp_int16 = 0;
  248. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  249. // 解算经度
  250. tmp_int32 = _cxy.pos_integ[0] * 10.0f;// pid_m_posx.loc_c;
  251. vklink_msg_payload_put_data(txMsg, &tmp_int32, 4);
  252. // 解算纬度
  253. tmp_int32 = _cxy.pos_integ[1] * 10.0f;//pid_m_posy.loc_c;
  254. vklink_msg_payload_put_data(txMsg, &tmp_int32, 4);
  255. // GPS原始经度
  256. tmp_int32 = raw_gps._longitude;
  257. vklink_msg_payload_put_data(txMsg, &tmp_int32, 4);
  258. // GPS原始纬度
  259. tmp_int32 = raw_gps._latitude;
  260. vklink_msg_payload_put_data(txMsg, &tmp_int32, 4);
  261. // GPS高度,0.1m
  262. // tmp_int32 = ins.gps_alt / 10;
  263. if (!isnan(yy_can->txgl_alt_sp))
  264. {
  265. tmp_int32 = yy_can->txgl_alt_sp * 10;
  266. }
  267. else
  268. {
  269. tmp_int32 = 0;
  270. }
  271. vklink_msg_payload_put_data(txMsg, &tmp_int32, 4);
  272. // GPS航向,0.1deg
  273. // tmp_int16 = ins.gps_yaw * 10;
  274. tmp_int16 = yy_can->txgl_drone_cmd * 10;
  275. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  276. // GPS速度,0.1m/s
  277. // tmp_int16 = ins.gps_vel / 10;
  278. if (!isnan(yy_can->txgl_yaw_sp))
  279. {
  280. tmp_int16 = yy_can->txgl_yaw_sp * 10;
  281. }
  282. else
  283. {
  284. tmp_int16 = 0;
  285. }
  286. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  287. tmp_uint8 = ins.gps_num;
  288. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  289. tmp_uint8 = ins.gps_pdop;
  290. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  291. vklink_msg_payload_put_data(txMsg, &ins.rtk_state, 1);
  292. vklink_msg_payload_put_data(txMsg, &ins.oscillating_coefficient, 1);
  293. // gps 时间
  294. tmp_int16 = ins.gps_year;
  295. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  296. vklink_msg_payload_put_data(txMsg, &ins.gps_month, 1);
  297. vklink_msg_payload_put_data(txMsg, &ins.gps_day, 1);
  298. vklink_msg_payload_put_data(txMsg, &ins.gps_hour, 1);
  299. vklink_msg_payload_put_data(txMsg, &ins.gps_minute, 1);
  300. vklink_msg_payload_put_data(txMsg, &ins.gps_second, 1);
  301. vklink_msg_payload_put_data(txMsg, &ins.gps_millisecond, 1);
  302. // 备用 GPS 星数
  303. raw_gps._redundant_gps_num = dist_comp[0] * 10;
  304. vklink_msg_payload_put_data(txMsg, &raw_gps._redundant_gps_num, 1);
  305. // 双天线的从天线星数
  306. raw_gps._dgps_ant2_gps_num = dist_comp[1] * 10;
  307. vklink_msg_payload_put_data(txMsg, &raw_gps._dgps_ant2_gps_num, 1);
  308. // 离家距离,m
  309. tmp_int16 = status_broadcast;
  310. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  311. // 报警信息
  312. vklink_msg_payload_put_data(txMsg, &warn_reason, 1);
  313. // 返航信息
  314. tmp_uint8 = 0;
  315. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  316. // 已飞时间,s
  317. tmp_int16 = (short)Get_HaveFlyTime();
  318. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  319. // 偏航距,0.1m
  320. tmp_int16 = 0;
  321. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  322. // 目标距离,0.1m
  323. tmp_int16 = wp_curtotar_verdistance / 10;
  324. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  325. // 目标高度 0.1m
  326. tmp_int16 = pid_m_alt.loc_t / 10;
  327. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  328. // 总飞行里程
  329. tmp_uint32 = 0;
  330. vklink_msg_payload_put_data(txMsg, &tmp_uint32, 4);
  331. // 本架次飞行里程
  332. tmp_uint32 = 0;
  333. vklink_msg_payload_put_data(txMsg, &tmp_uint32, 4);
  334. // 剩余循环圈数
  335. if (wp_cycle_times >= wp_have_cycle_times)
  336. {
  337. tmp_int16 = wp_cycle_times - wp_have_cycle_times;
  338. }
  339. else
  340. {
  341. tmp_int16 = 0;
  342. }
  343. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  344. // 高度雷达障碍物距离
  345. tmp_int16 = 0;
  346. // tmp_int16 = payload_naroradar_get_raw();
  347. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  348. // 前雷达障碍距离
  349. tmp_int16 = 0;
  350. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  351. // 后雷达障碍距离
  352. tmp_int16 = 0;
  353. tmp_int16 = (int16_t)(raw_gps._auxiliary_gps_lon - 80000);
  354. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  355. // 飞行模式
  356. vklink_msg_payload_put_data(txMsg, &flight_mode, 1);
  357. // 航点总数
  358. tmp_int16 = waypoint_totalnum;
  359. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  360. // 目标航点序号
  361. tmp_int16 = tar_wp_no;
  362. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  363. // 拍照数
  364. tmp_int16 = 0;
  365. if (yy_can->temp_count & 0x01)
  366. {
  367. tmp_int16 = 0;
  368. }
  369. else
  370. {
  371. tmp_int16 = 1;
  372. }
  373. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  374. // 飞控供电电压
  375. tmp_int16 = Voltage_GetVolt(Volt_MC_CH) * 10;
  376. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  377. vklink_msg_payload_put_data(txMsg, &thr_lock_status, 1);
  378. vklink_msg_payload_put_data(txMsg, &ins.temprature, 1);
  379. // 总飞行时间s
  380. tmp_uint32 = fly_log.total_flight_time;
  381. vklink_msg_payload_put_data(txMsg, &tmp_uint32, 4);
  382. // 解算标志, 低 4 位是组合解算标志, 高 4 位是相对位置锁定标志
  383. tmp_uint8 = (raw_gps._insgps_ok & 0x0F) + (raw_gps._vehicle_vector_flag << 4);
  384. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  385. // 电机平衡
  386. tmp_uint8 = 0;
  387. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  388. // 安装方向
  389. vklink_msg_payload_put_data(txMsg, &raw_gps._imu_assembly_direction, 1);
  390. // 是否在禁飞区中
  391. tmp_uint8 = 0;
  392. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  393. // 磁校准标志位
  394. vklink_msg_payload_put_data(txMsg, &raw_gps._state_flag, 1);
  395. // 飞机状态标志
  396. vklink_msg_payload_put_data(txMsg, &pilot_mode, 1);
  397. // 电压 ad0
  398. tmp_int16 = Voltage_GetVolt(Volt_AD0) * 10;
  399. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  400. // 电压 ad1
  401. tmp_int16 = Voltage_GetVolt(Volt_AD1) * 10;
  402. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  403. // 遥控输入 8 通道
  404. if (comp_rc_status == COMP_NOEXIST && rock_isenable != COMP_NOEXIST)
  405. {
  406. for (uint8_t i = 0; i < 4; ++i)
  407. {
  408. tmp_uint8 = rock_in[i] / 10;
  409. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  410. }
  411. tmp_uint8 = rock_key;
  412. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  413. tmp_uint8 = 0;
  414. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  415. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  416. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  417. }
  418. else
  419. {
  420. for (uint8_t i = 0; i < 8; i++)
  421. {
  422. tmp_uint8 = tmp_rc_in[i] / 10;
  423. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  424. }
  425. }
  426. // 电机输出 8 通道
  427. for (uint8_t motor = MOTOR1; motor <= MOTOR8; motor++)
  428. {
  429. tmp_uint8 = get_motor_pwm(motor) / 10;
  430. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  431. }
  432. // 基础油门
  433. tmp_int16 = pid_thr;
  434. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  435. // gps 气压计 加速度计 磁传感器 标志位
  436. vklink_msg_payload_put_data(txMsg, &raw_gps._gps_status, 1);
  437. vklink_msg_payload_put_data(txMsg, &raw_gps._gps_status2, 1);
  438. vklink_msg_payload_put_data(txMsg, &raw_gps._acc_gyro_status, 1);
  439. vklink_msg_payload_put_data(txMsg, &raw_gps._mag_status, 1);
  440. // 板卡输出相对右前上距离
  441. tmp_int32 = 0;
  442. vklink_msg_payload_put_data(txMsg, &tmp_int32, 4);
  443. vklink_msg_payload_put_data(txMsg, &tmp_int32, 4);
  444. vklink_msg_payload_put_data(txMsg, &tmp_int32, 4);
  445. vklink_msg_payload_put_data(txMsg, &tmp_int32, 4);
  446. vklink_msg_payload_put_data(txMsg, &tmp_int32, 4);
  447. vklink_msg_payload_put_data(txMsg, &tmp_int32, 4);
  448. tmp_int16 = 0;
  449. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  450. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  451. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  452. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  453. vklink_msg_payload_put_data(txMsg, &tmp_int16, 1);
  454. vklink_msg_payload_put_data(txMsg, &tmp_int16, 1);
  455. vklink_msg_payload_put_data(txMsg, &tmp_int16, 1);
  456. /* 避障开关状态 */
  457. tmp_uint8 = 0;
  458. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  459. // 是否允许解锁
  460. tmp_uint8 = judge_pilot_rcunlock_allow();
  461. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  462. tmp_uint8 = judge_pilot_gsunlock_allow();
  463. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  464. // 将消息发送
  465. gs_tx_vklink_msg(pgcs, txMsg);
  466. }
  467. /**
  468. * @brief 发送载荷状态消息
  469. *
  470. */
  471. void gcs_vklink_v300_send_payload_data(struct GCS_Link *pgcs)
  472. {
  473. VKlink_Msg_Type *txMsg = &pgcs->vklink_tx_msg;
  474. struct payload_diaocang *payload = port4_get_payload();
  475. if (payload->_link_status == COMP_NORMAL)
  476. {
  477. gcs_vklink_txmsg_init(txMsg, GCS_VKLINK_V300_PAYLOAD_DATA_ID);
  478. uint16_t laser_dist = payload->_status.laser_dist_m * 10;
  479. vklink_msg_payload_put_data(txMsg, &laser_dist, 2);
  480. int16_t tmp_int16 = payload->_status.roll * 10;
  481. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  482. tmp_int16 = payload->_status.pitch * 10;
  483. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  484. tmp_int16 = payload->_status.yaw * 10;
  485. vklink_msg_payload_put_data(txMsg, &tmp_int16, 2);
  486. uint8_t tmp_uint8 = payload->_status.zoom;
  487. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  488. tmp_uint8 = payload->_status.trace_flag;
  489. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  490. int32_t tmp_int = payload->_status.tar_lon;
  491. vklink_msg_payload_put_data(txMsg, &tmp_int, 4);
  492. tmp_int = payload->_status.tar_lat;
  493. vklink_msg_payload_put_data(txMsg, &tmp_int, 4);
  494. tmp_int = payload->_status.tar_alt;
  495. vklink_msg_payload_put_data(txMsg, &tmp_int, 4);
  496. gs_tx_vklink_msg(pgcs, txMsg);
  497. }
  498. }
  499. /**
  500. * @brief 发送电池 bms 数据信息
  501. */
  502. void gcs_vklink_v300_send_bat_bms_msg(struct GCS_Link *pgcs)
  503. {
  504. VKlink_Msg_Type *txMsg = &pgcs->vklink_tx_msg;
  505. const VoltageBms *bms = Voltage_GetBmsInfo();
  506. if (bms->link_status == COMP_NORMAL)
  507. {
  508. gcs_vklink_txmsg_init(txMsg, GCS_VKLINK_V300_BAT_BMS_ID);
  509. struct bat_bms_msg_data *data = (struct bat_bms_msg_data *)txMsg->payload;
  510. memset(data, 0, sizeof(*data));
  511. txMsg->payload_len = (sizeof(*data));
  512. memcpy(data->manufactory, bms->manufactory, sizeof(data->manufactory));
  513. memcpy(data->product, bms->product, sizeof(data->product));
  514. data->voltage = bms->voltage;
  515. data->current = bms->current;
  516. data->temperature = bms->temperature;
  517. data->electricity_percentage = bms->electricity_percentage;
  518. data->number_of_circles = bms->number_of_circles;
  519. data->capacity_remaining_percentage = bms->capacity_remaining;
  520. data->reserve0 = 0;
  521. data->fault_status = bms->fault_status;
  522. memcpy(data->cell_volt, bms->cell_volt, sizeof(data->cell_volt));
  523. memcpy(data->user_data, bms->user_data, sizeof(data->user_data));
  524. gs_tx_vklink_msg(pgcs, txMsg);
  525. }
  526. }
  527. void gcs_vklink_v300_send_confinf_data(struct GCS_Link *pgcs, uint16_t arg)
  528. {
  529. VKlink_Msg_Type *txMsg = &pgcs->vklink_tx_msg;
  530. gcs_vklink_txmsg_init(txMsg, GCS_VKLINK_V300_CONFINF_ID);
  531. /* 参数项序号 */
  532. uint16_t transport_confinf_num = arg;
  533. vklink_msg_payload_put_data(txMsg, &transport_confinf_num, 2);
  534. /* 参数项值 */
  535. int16_t value = params_get_value(transport_confinf_num);
  536. vklink_msg_payload_put_data(txMsg, &value, 2);
  537. gs_tx_vklink_msg(pgcs, txMsg);
  538. }
  539. void gcs_vklink_v300_send_confinf_total_data(struct GCS_Link *pgcs)
  540. {
  541. VKlink_Msg_Type *txMsg = &pgcs->vklink_tx_msg;
  542. gcs_vklink_txmsg_init(txMsg, GCS_VKLINK_V300_CONFINF_TOTAL_ID);
  543. for (uint16_t i = ParamNum_APType; i < ParamNum_MaxNum; ++i)
  544. {
  545. uint16_t value = params_get_value(i);
  546. vklink_msg_payload_put_data(txMsg, &value, 2);
  547. }
  548. gs_tx_vklink_msg(pgcs, txMsg);
  549. }
  550. void gcs_vklink_v300_send_ack_data(struct GCS_Link *pgcs, const struct gcs_ack_arg *arg)
  551. {
  552. VKlink_Msg_Type *txMsg = &pgcs->vklink_tx_msg;
  553. ;
  554. gcs_vklink_txmsg_init(txMsg, GCS_VKLINK_V300_ACK_ID);
  555. vklink_msg_payload_put_data(txMsg, &arg->ack_id, 1);
  556. for (uint8_t i = 0; i < 5; ++i)
  557. {
  558. vklink_msg_payload_put_data(txMsg, &arg->ack_content[i], sizeof(arg->ack_content[i]));
  559. }
  560. gs_tx_vklink_msg(pgcs, txMsg);
  561. }
  562. /**
  563. * @brief 发送机型参数消息
  564. *
  565. */
  566. void gcs_vklink_v300_send_aptype_data(struct GCS_Link *pgcs)
  567. {
  568. VKlink_Msg_Type *txMsg = &pgcs->vklink_tx_msg;
  569. gcs_vklink_txmsg_init(txMsg, GCS_VKLINK_V300_APTYPE_ID);
  570. uint16_t tmp_uint16;
  571. uint8_t tmp_uint8;
  572. /* 旋翼机型 */
  573. tmp_uint8 = params_get_value(ParamNum_APType);
  574. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  575. /* 盘旋半径 */
  576. tmp_uint16 = params_get_value(ParamNum_APCircleRadiusM);
  577. vklink_msg_payload_put_data(txMsg, &tmp_uint16, 2);
  578. /* 电台失联判定时间 */
  579. tmp_uint16 = params_get_value(ParamNum_RadioLinkLostTimeS);
  580. vklink_msg_payload_put_data(txMsg, &tmp_uint16, 2);
  581. /* 一级低电压阈值和动作 */
  582. tmp_uint16 = params_get_value(ParamNum_LowVoltValue1);
  583. vklink_msg_payload_put_data(txMsg, &tmp_uint16, 2);
  584. tmp_uint8 = params_get_value(ParamNum_LowVoltAction1);
  585. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  586. /* 二级低电压阈值和动作 */
  587. tmp_uint16 = params_get_value(ParamNum_LowVoltValue2);
  588. vklink_msg_payload_put_data(txMsg, &tmp_uint16, 2);
  589. tmp_uint8 = params_get_value(ParamNum_LowVoltAction2);
  590. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  591. /* 自动起飞高度 */
  592. tmp_uint16 = params_get_value(ParamNum_APTakeoffAltM);
  593. vklink_msg_payload_put_data(txMsg, &tmp_uint16, 2);
  594. /* 返航最低高度 */
  595. tmp_uint16 = params_get_value(ParamNum_APRthAltM);
  596. vklink_msg_payload_put_data(txMsg, &tmp_uint16, 2);
  597. /* 磁偏角 */
  598. tmp_uint8 = params_get_value(ParamNum_MagDeclinationDeg);
  599. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  600. /* imu 滤波参数 */
  601. tmp_uint8 = params_get_value(ParamNum_ImuFilterLever);
  602. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  603. /* 旋翼电机怠速等级 */
  604. tmp_uint16 = params_get_value(ParamNum_APIdleSpeed);
  605. tmp_uint8 = (tmp_uint16 - 1050) / 50 + 1;
  606. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  607. /* 遥控器失控悬停时间 */
  608. tmp_uint16 = params_get_value(ParamNum_RcFailLoiterTimeS);
  609. vklink_msg_payload_put_data(txMsg, &tmp_uint16, 2);
  610. gs_tx_vklink_msg(pgcs, txMsg);
  611. }
  612. /**
  613. * @brief 发送安装位置补偿
  614. *
  615. */
  616. void gcs_vklink_v300_send_centerfix_data(struct GCS_Link *pgcs)
  617. {
  618. VKlink_Msg_Type *txMsg = &pgcs->vklink_tx_msg;
  619. gcs_vklink_txmsg_init(txMsg, GCS_VKLINK_V300_CENTER_FIX_ID);
  620. struct gps_imu_pos_fix_msg_data *data = (struct gps_imu_pos_fix_msg_data *)txMsg->payload;
  621. txMsg->payload_len = sizeof(*data);
  622. for (uint8_t i = 0; i < 6; ++i)
  623. {
  624. data->gps_pos_fix[i] = ins.imu_conf.gps_pos_param[i];
  625. }
  626. for (uint8_t i = 0; i < 3; ++i)
  627. {
  628. data->imu_pos_fix[i] = ins.imu_conf.imu_pos_param[i];
  629. }
  630. gs_tx_vklink_msg(pgcs, txMsg);
  631. }
  632. /**
  633. * @brief 发送 pid 参数消息
  634. *
  635. */
  636. void gcs_vklink_v300_send_pid_data(struct GCS_Link *pgcs)
  637. {
  638. VKlink_Msg_Type *txMsg = &pgcs->vklink_tx_msg;
  639. gcs_vklink_txmsg_init(txMsg, GCS_VKLINK_V300_PID_ID);
  640. uint16_t tmp_uint16;
  641. uint8_t tmp_uint8;
  642. // 横滚角度,角速度 比例系数
  643. tmp_uint16 = params_get_value(ParamNum_RollAngleKp);
  644. vklink_msg_payload_put_data(txMsg, &tmp_uint16, 2);
  645. tmp_uint16 = params_get_value(ParamNum_RollGyroKp);
  646. vklink_msg_payload_put_data(txMsg, &tmp_uint16, 2);
  647. // 俯仰角度,角速度 比例系数
  648. tmp_uint16 = params_get_value(ParamNum_PitchAngleKp);
  649. vklink_msg_payload_put_data(txMsg, &tmp_uint16, 2);
  650. tmp_uint16 = params_get_value(ParamNum_PitchGyroKp);
  651. vklink_msg_payload_put_data(txMsg, &tmp_uint16, 2);
  652. // 航向角度, 角速度 比例系数
  653. tmp_uint16 = params_get_value(ParamNum_YawAngleKp);
  654. vklink_msg_payload_put_data(txMsg, &tmp_uint16, 2);
  655. tmp_uint16 = params_get_value(ParamNum_YawGyroKp);
  656. vklink_msg_payload_put_data(txMsg, &tmp_uint16, 2);
  657. // 垂直速度比例系数
  658. tmp_uint16 = params_get_value(ParamNum_AltholdSpeedKp);
  659. vklink_msg_payload_put_data(txMsg, &tmp_uint16, 2);
  660. // 横滚 俯仰 航向 角速率微分系数
  661. tmp_uint8 = params_get_value(ParamNum_RollGyroKd);
  662. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  663. tmp_uint8 = params_get_value(ParamNum_PitchGyroKd);
  664. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  665. tmp_uint8 = params_get_value(ParamNum_YawGyroKd);
  666. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  667. // 高度误差比例系数
  668. tmp_uint16 = params_get_value(ParamNum_AltholdDistKp);
  669. vklink_msg_payload_put_data(txMsg, &tmp_uint16, 2);
  670. // 垂直加速度误差比例系数
  671. tmp_uint16 = params_get_value(ParamNum_AltholdAccKp);
  672. vklink_msg_payload_put_data(txMsg, &tmp_uint16, 2);
  673. // 垂直加速度误差积分系数
  674. tmp_uint8 = params_get_value(ParamNum_AltholdAccKi);
  675. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  676. // 水平误差比例系数
  677. tmp_uint16 = params_get_value(ParamNum_LoiterDistKp);
  678. vklink_msg_payload_put_data(txMsg, &tmp_uint16, 2);
  679. // 水平速度误差比例系数
  680. tmp_uint16 = params_get_value(ParamNum_LoiterSpeedKp);
  681. vklink_msg_payload_put_data(txMsg, &tmp_uint16, 2);
  682. // 水平加速度比例系数
  683. tmp_uint16 = params_get_value(ParamNum_LoiterAccKp);
  684. vklink_msg_payload_put_data(txMsg, &tmp_uint16, 2);
  685. // 水平速度误差积分系数
  686. tmp_uint16 = params_get_value(ParamNum_LoiterAccKi);
  687. vklink_msg_payload_put_data(txMsg, &tmp_uint16, 1);
  688. // 水平刹车陀螺参数 10~50
  689. tmp_uint8 = params_get_value(ParamNum_GyroBrakeRatio);
  690. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  691. // 水平加速度变化率 4~50
  692. tmp_uint8 = params_get_value(ParamNum_MaxHorJet);
  693. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  694. gs_tx_vklink_msg(pgcs, txMsg);
  695. }
  696. /**
  697. * @brief 发送 par 参数消息
  698. *
  699. */
  700. void gcs_vklink_v300_send_par_data(struct GCS_Link *pgcs)
  701. {
  702. VKlink_Msg_Type *txMsg = &pgcs->vklink_tx_msg;
  703. gcs_vklink_txmsg_init(txMsg, GCS_VKLINK_V300_PAR_ID);
  704. uint8_t tmp_uint8;
  705. uint16_t tmp_uint16;
  706. tmp_uint8 = params_get_value(ParamNum_APMaxTilteAngleDeg);
  707. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  708. tmp_uint8 = params_get_value(ParamNum_APMaxHorizonalSpeedGpsModeDms);
  709. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  710. tmp_uint8 = params_get_value(ParamNum_APMaxClimbSpeedGpsModeDms);
  711. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  712. tmp_uint8 = params_get_value(ParamNum_APMaxDeclineSpeedGpsModeDms);
  713. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  714. tmp_uint16 = params_get_value(ParamNum_APHoverThrottle);
  715. vklink_msg_payload_put_data(txMsg, &tmp_uint16, 2);
  716. tmp_uint16 = params_get_value(ParamNum_AltRestrictionA);
  717. vklink_msg_payload_put_data(txMsg, &tmp_uint16, 2);
  718. tmp_uint16 = params_get_value(ParamNum_AltRestrictionB);
  719. vklink_msg_payload_put_data(txMsg, &tmp_uint16, 2);
  720. tmp_uint8 = params_get_value(ParamNum_APMaxYawRate);
  721. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  722. tmp_uint8 = params_get_value(ParamNum_VoltCalibOffset0);
  723. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  724. tmp_uint8 = params_get_value(ParamNum_VoltCalibOffset1);
  725. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  726. tmp_uint8 = params_get_value(ParamNum_VoltCalibOffset2);
  727. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  728. tmp_uint8 = params_get_value(ParamNum_FollowDistM);
  729. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  730. tmp_uint8 = params_get_value(ParamNum_APMaxClimbSpeedAutoModeDms);
  731. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  732. tmp_uint8 = params_get_value(ParamNum_APMaxDeclineSpeedAutoModeDms);
  733. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  734. tmp_uint8 = params_get_value(ParamNum_APMinLandingRateAutoModeDms);
  735. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  736. tmp_uint8 = params_get_value(ParamNum_APRthSpeedDms);
  737. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  738. tmp_uint16 = params_get_value(ParamNum_ObstacleHoldDistCm);
  739. vklink_msg_payload_put_data(txMsg, &tmp_uint16, 2);
  740. tmp_uint8 = params_get_value(ParamNum_LinklostAction);
  741. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  742. tmp_uint8 = params_get_value(ParamNum_ServoFailsafe);
  743. vklink_msg_payload_put_data(txMsg, &tmp_uint8, 1);
  744. tmp_uint16 = params_get_value(ParamNum_VoltCalibKp1);
  745. vklink_msg_payload_put_data(txMsg, &tmp_uint16, 2);
  746. tmp_uint16 = params_get_value(ParamNum_MaxHorizonalDistanceM);
  747. vklink_msg_payload_put_data(txMsg, &tmp_uint16, 2);
  748. gs_tx_vklink_msg(pgcs, txMsg);
  749. }
  750. /**
  751. * @brief 发送相机参数消息
  752. *
  753. */
  754. void gcs_vklink_v300_send_caminf_data(struct GCS_Link *pgcs)
  755. {
  756. VKlink_Msg_Type *txMsg = &pgcs->vklink_tx_msg;
  757. gcs_vklink_txmsg_init(txMsg, GCS_VKLINK_V300_CAMINF_ID);
  758. vklink_msg_payload_put_data(txMsg, &caminf._signal_type, 1);
  759. vklink_msg_payload_put_data(txMsg, &caminf._signal_interval, 2);
  760. vklink_msg_payload_put_data(txMsg, &caminf._signal_pwm_takephoto_on, 2);
  761. vklink_msg_payload_put_data(txMsg, &caminf._signal_pwm_takephoto_off, 2);
  762. gs_tx_vklink_msg(pgcs, txMsg);
  763. }
  764. /**
  765. * @brief 发送版本信息
  766. *
  767. */
  768. void gcs_vklink_v300_send_ver_data(struct GCS_Link *pgcs)
  769. {
  770. int32_t tmpInt = 0;
  771. VKlink_Msg_Type *txMsg = &pgcs->vklink_tx_msg;
  772. ;
  773. gcs_vklink_txmsg_init(txMsg, GCS_VKLINK_V300_VER_ID);
  774. vklink_msg_payload_put_data(txMsg, verinf._ap_name, 10);
  775. vklink_msg_payload_put_data(txMsg, &verinf._serial_id, 4);
  776. // imu 固件号
  777. tmpInt = ins.imu_conf.version;
  778. vklink_msg_payload_put_data(txMsg, &tmpInt, 4);
  779. // 主控固件号
  780. tmpInt = FW_VER;
  781. vklink_msg_payload_put_data(txMsg, &tmpInt, 4);
  782. vklink_msg_payload_put_data(txMsg, &verinf._hw_ver, 2);
  783. vklink_msg_payload_put_data(txMsg, &verinf._sysid, 1);
  784. gs_tx_vklink_msg(pgcs, txMsg);
  785. }
  786. /**
  787. * @brief 发送航点消息
  788. *
  789. */
  790. void gcs_vklink_v300_send_wp_data(struct GCS_Link *pgcs, uint16_t arg)
  791. {
  792. VKlink_Msg_Type *txMsg = &pgcs->vklink_tx_msg;
  793. gcs_vklink_txmsg_init(txMsg, GCS_VKLINK_V300_WP_ID);
  794. uint16_t transport_wp_num = arg;
  795. /* 从 flash 中读取一个航点 */
  796. struct waypoint_data wp_temp;
  797. flash_read_bytes(WAYPOINT_ADDR + transport_wp_num * sizeof(wp_temp),
  798. (uint8_t *)&wp_temp, sizeof(wp_temp));
  799. vklink_msg_payload_put_data(txMsg, &wp_temp.wp_num, 2);
  800. vklink_msg_payload_put_data(txMsg, &wp_temp.wp_lng, 4);
  801. vklink_msg_payload_put_data(txMsg, &wp_temp.wp_lat, 4);
  802. vklink_msg_payload_put_data(txMsg, &wp_temp.wp_alt, 4);
  803. vklink_msg_payload_put_data(txMsg, &wp_temp.wp_vel, 2);
  804. vklink_msg_payload_put_data(txMsg, &wp_temp.wp_mode, 1);
  805. vklink_msg_payload_put_data(txMsg, &wp_temp.wp_mode_param, 2);
  806. vklink_msg_payload_put_data(txMsg, &wp_temp.wp_task, 1);
  807. vklink_msg_payload_put_data(txMsg, &wp_temp.wp_task_param, 2);
  808. vklink_msg_payload_put_data(txMsg, &wp_temp.wp_param3, 2);
  809. vklink_msg_payload_put_data(txMsg, &wp_temp.wp_alt_type, 1);
  810. vklink_msg_payload_put_data(txMsg, &wp_temp.wp_totalnum, 2);
  811. vklink_msg_payload_put_data(txMsg, &wp_temp.wp_param4, 2);
  812. gs_tx_vklink_msg(pgcs, txMsg);
  813. }
  814. /**
  815. * @brief 飞行数据
  816. *
  817. */
  818. void gcs_vklink_v300_send_flydata_data(struct GCS_Link *pgcs,
  819. uint16_t index_offset,
  820. uint32_t pack_num)
  821. {
  822. static uint8_t data_buff[128] = {0};
  823. // 计算一下总包数有多少,一包128个字节
  824. // 总字节数+127 / 128 正好向上取整
  825. char file_name[24] = "", logfile_path[24] = "";
  826. sprintf(file_name, "%d", fly_log.sorties - index_offset);
  827. strcat(logfile_path, "LOG/");
  828. strcat(logfile_path, file_name);
  829. if (f_open(&fnew_data, logfile_path, FA_READ) == FR_OK)
  830. {
  831. VKlink_Msg_Type *txMsg = &pgcs->vklink_tx_msg;
  832. gcs_vklink_txmsg_init(txMsg, GCS_VKLINK_V300_DATA_ID);
  833. // 当前发送数据包序号
  834. vklink_msg_payload_put_data(txMsg, &pack_num, 4);
  835. // 字节长度
  836. uint8_t byte_length = 128;
  837. vklink_msg_payload_put_data(txMsg, &byte_length, 1);
  838. // 包总数
  839. uint32_t data_total_num = (f_size(&fnew_data) + 127) / 128;
  840. vklink_msg_payload_put_data(txMsg, &data_total_num, 4);
  841. // 读取数据
  842. f_lseek(&fnew_data, (pack_num - 1) * 128);
  843. f_read(&fnew_data, data_buff, 128, &frnum);
  844. for (uint8_t i = frnum; i < 128; i++)
  845. {
  846. data_buff[i] = 0xFF;
  847. }
  848. vklink_msg_payload_put_data(txMsg, data_buff, 128);
  849. gs_tx_vklink_msg(pgcs, txMsg);
  850. }
  851. }
  852. /*
  853. * 发送飞行log数据,前两字节为总
  854. */
  855. void gcs_vklink_v300_send_flylog_data(struct GCS_Link *pgcs, uint16_t log_num)
  856. {
  857. f_open(&fnew_log, "LOG/LOG_FLY.DAT", FA_READ);
  858. if (f_size(&fnew_log) >= sizeof(fly_log))
  859. {
  860. VKlink_Msg_Type *txMsg = &pgcs->vklink_tx_msg;
  861. gcs_vklink_txmsg_init(txMsg, GCS_VKLINK_V300_LOG_ID);
  862. // 移动到尾部最后一包,并获取总的log条数
  863. f_lseek(&fnew_log, f_size(&fnew_log) - sizeof(fly_log));
  864. uint16_t total_log_num;
  865. f_read(&fnew_log, &total_log_num, sizeof(total_log_num), &frnum);
  866. vklink_msg_payload_put_data(txMsg, &total_log_num, 2);
  867. // 再移动到需要读取的log条数位置,读取一条log信息填充发送buf
  868. FLY_LOG tmp_log;
  869. f_lseek(&fnew_log, (log_num - 1) * sizeof(tmp_log));
  870. f_read(&fnew_log, &tmp_log, sizeof(tmp_log), &frnum);
  871. vklink_msg_payload_put_data(txMsg, &tmp_log, sizeof(tmp_log));
  872. gs_tx_vklink_msg(pgcs, txMsg);
  873. }
  874. f_close(&fnew_log);
  875. }
  876. /**
  877. * @brief 发送SD卡文件索引
  878. */
  879. void gcs_vklink_v300_send_fileindex_data(struct GCS_Link *pgcs, uint16_t index_num)
  880. {
  881. VKlink_Msg_Type *txMsg = &pgcs->vklink_tx_msg;
  882. gcs_vklink_txmsg_init(txMsg, GCS_VKLINK_V300_FILE_INDEX_ID);
  883. f_opendir(&logdir, "LOG");
  884. for (char i = 0; i < index_num; ++i)
  885. f_readdir(&logdir, &fno);
  886. f_closedir(&logdir);
  887. if (fno.fname[0] != '\0')
  888. {
  889. vklink_msg_payload_put_data(txMsg, &fno, sizeof(fno));
  890. }
  891. else
  892. {
  893. for (uint32_t i = 0; i < sizeof(fno); ++i)
  894. {
  895. uint8_t data = 0;
  896. vklink_msg_payload_put_data(txMsg, &data, 1);
  897. }
  898. }
  899. gs_tx_vklink_msg(pgcs, txMsg);
  900. }
  901. /**
  902. * @brief 转发载荷串口数据
  903. *
  904. */
  905. void gcs_vklink_v300_send_uart4_rx_data(struct GCS_Link *pgcs, const void *data, uint32_t len)
  906. {
  907. VKlink_Msg_Type *txMsg = &pgcs->vklink_tx_msg;
  908. gcs_vklink_txmsg_init(txMsg, GCS_VKLINK_V300_PORT_UART4_DATA);
  909. vklink_msg_payload_put_data(txMsg, data, len);
  910. port4_data.len = 0;
  911. gs_tx_vklink_msg(pgcs, txMsg);
  912. }
  913. /**
  914. * @brief 接收消息解包
  915. *
  916. * @param rxMsg
  917. */
  918. void gcs_vklink_v300_rx_decode(struct GCS_Link *pgcs)
  919. {
  920. const VKlink_Msg_Type *rxMsg = &pgcs->vklink_rx_msg;
  921. /* 过滤 sysid */
  922. if (rxMsg->sysid != verinf._sysid && rxMsg->sysid != 0xFF)
  923. return;
  924. /* 如果是来自地面站的 IMU 升级消息,则转发给 IMU */
  925. if (rxMsg->compid == COMPID_IMUBL)
  926. {
  927. if (thr_lock_status == LOCKED)
  928. {
  929. pilot_mode = PILOT_IMU_UPDATE;
  930. send_vklink_msg_to_imu(rxMsg);
  931. }
  932. }
  933. /* 如果是正常的消息, 则进行解析 */
  934. else
  935. {
  936. switch (rxMsg->msgid)
  937. {
  938. case GCS_VKLINK_V300_HEART_ID:
  939. {
  940. /* 地面站连接状态置为正常,清零失联记时 */
  941. pgcs->link_status = COMP_NORMAL;
  942. pgcs->link_lost_time_us = 0;
  943. /* 心跳包带版本号 */
  944. uint16_t vklink_protocal_version;
  945. memcpy(&vklink_protocal_version, rxMsg->payload, 2);
  946. gs_set_vklink_protocal_version(pgcs, vklink_protocal_version);
  947. /* 心跳包带多机当前选中的飞机 */
  948. pgcs->_current_sysid = rxMsg->payload[2];
  949. }
  950. break;
  951. case GCS_VKLINK_V300_REQ_ID:
  952. {
  953. uint8_t send_what = rxMsg->payload[0];
  954. switch (send_what)
  955. {
  956. case GCS_VKLINK_V300_APTYPE_ID:
  957. gcs_vklink_v300_send_aptype_data(pgcs);
  958. break;
  959. case GCS_VKLINK_V300_CAMINF_ID:
  960. gcs_vklink_v300_send_caminf_data(pgcs);
  961. break;
  962. case GCS_VKLINK_V300_CENTER_FIX_ID:
  963. gcs_vklink_v300_send_centerfix_data(pgcs);
  964. break;
  965. case GCS_VKLINK_V300_CONFINF_ID:
  966. {
  967. uint16_t arg;
  968. memcpy(&arg, rxMsg->payload + 1, 2);
  969. gcs_vklink_v300_send_confinf_data(pgcs, arg);
  970. }
  971. break;
  972. case GCS_VKLINK_V300_CONFINF_TOTAL_ID:
  973. gcs_vklink_v300_send_confinf_total_data(pgcs);
  974. break;
  975. case GCS_VKLINK_V300_PID_ID:
  976. gcs_vklink_v300_send_pid_data(pgcs);
  977. break;
  978. case GCS_VKLINK_V300_PAR_ID:
  979. gcs_vklink_v300_send_par_data(pgcs);
  980. break;
  981. case GCS_VKLINK_V300_VER_ID:
  982. gcs_vklink_v300_send_ver_data(pgcs);
  983. break;
  984. case GCS_VKLINK_V300_WP_ID:
  985. {
  986. uint16_t transport_wp_num;
  987. memcpy(&transport_wp_num, rxMsg->payload + 1, 2);
  988. gcs_vklink_v300_send_wp_data(pgcs, transport_wp_num);
  989. }
  990. break;
  991. case GCS_VKLINK_V300_DATA_ID:
  992. if (thr_lock_status == LOCKED)
  993. {
  994. uint16_t index_offset = 0;
  995. uint32_t data_pack_num = 0;
  996. memcpy(&index_offset, rxMsg->payload + 1, 2);
  997. memcpy(&data_pack_num, rxMsg->payload + 3, 4);
  998. gcs_vklink_v300_send_flydata_data(pgcs, index_offset, data_pack_num);
  999. }
  1000. break;
  1001. case GCS_VKLINK_V300_LOG_ID:
  1002. if (thr_lock_status == LOCKED)
  1003. {
  1004. uint16_t log_num = 0;
  1005. memcpy(&log_num, rxMsg->payload + 1, 2);
  1006. if (log_num == 0)
  1007. {
  1008. sd_card_clear_fly_log();
  1009. }
  1010. else
  1011. {
  1012. gcs_vklink_v300_send_flylog_data(pgcs, log_num);
  1013. }
  1014. }
  1015. break;
  1016. case GCS_VKLINK_V300_FILE_INDEX_ID:
  1017. if (thr_lock_status == LOCKED)
  1018. {
  1019. uint16_t index_num;
  1020. memcpy(&index_num, rxMsg->payload + 1, 2);
  1021. gcs_vklink_v300_send_fileindex_data(pgcs, index_num);
  1022. }
  1023. break;
  1024. default:
  1025. break;
  1026. }
  1027. }
  1028. break;
  1029. case GCS_VKLINK_V300_HOME_ID:
  1030. {
  1031. int x, y, z;
  1032. int16_t yaw;
  1033. memcpy(&x, rxMsg->payload, 4);
  1034. memcpy(&y, rxMsg->payload + 4, 4);
  1035. memcpy(&z, rxMsg->payload + 8, 4);
  1036. memcpy(&yaw, rxMsg->payload + 12, 2);
  1037. if (rxMsg->payload[14] == 0)
  1038. {
  1039. home_pos_isrecord = HOME_POS_MANUL_SET;
  1040. home_position.lng = x;
  1041. home_position.lat = y;
  1042. home_position.gps_alt = z;
  1043. home_position.yaw = wrap_180(yaw);
  1044. }
  1045. struct gcs_ack_arg arg = {0};
  1046. arg.ack_id = GCS_VKLINK_V300_HOME_ID;
  1047. arg.ack_content[0] = rxMsg->payload[14];
  1048. gcs_vklink_v300_send_ack_data(pgcs, &arg);
  1049. }
  1050. break;
  1051. case GCS_VKLINK_V300_CTL_ID:
  1052. {
  1053. uint8_t ctl_id = rxMsg->payload[0];
  1054. switch (ctl_id)
  1055. {
  1056. case CTL_MSG_ENABLE_TUNING:
  1057. if (thr_lock_status == LOCKED)
  1058. {
  1059. throttle_enable_unlock_tune();
  1060. }
  1061. break;
  1062. /* 车载起飞指令 */
  1063. case CTL_MSG_VEHICLE_LAUNCH:
  1064. if (thr_lock_status == LOCKED)
  1065. {
  1066. control_mode = CONTROL_GCS;
  1067. flight_mode_flag = GCS_VEHICLE_LAUNCH;
  1068. }
  1069. break;
  1070. default:
  1071. break;
  1072. }
  1073. struct gcs_ack_arg arg = {0};
  1074. arg.ack_id = GCS_VKLINK_V300_CTL_ID;
  1075. arg.ack_content[0] = ctl_id;
  1076. gcs_vklink_v300_send_ack_data(pgcs, &arg);
  1077. }
  1078. break;
  1079. case GCS_VKLINK_V300_CAL_ID:
  1080. {
  1081. uint8_t cal_id = rxMsg->payload[0];
  1082. switch (cal_id)
  1083. {
  1084. case CAL_MSG_ATT:
  1085. // 上锁状态下才能执行
  1086. if (thr_lock_status == LOCKED)
  1087. {
  1088. imu_euler_angle_clear();
  1089. }
  1090. break;
  1091. case CAL_MSG_MAG:
  1092. // 上锁状态下才能执行
  1093. if (thr_lock_status == LOCKED)
  1094. {
  1095. // 角度清零以及磁校准有时候执行不了,已测试与地面站无关
  1096. ci_jiao_zhun = true;
  1097. }
  1098. break;
  1099. case CAL_MSG_REMOTE_S:
  1100. // 上锁状态下才能执行
  1101. if (thr_lock_status == LOCKED)
  1102. {
  1103. rc_input_calib_start();
  1104. }
  1105. break;
  1106. case CAL_MSG_REMOTE_E:
  1107. // 开始校准并且上锁状态下
  1108. if (thr_lock_status == LOCKED)
  1109. {
  1110. rc_input_calib_end();
  1111. }
  1112. break;
  1113. // 电机检测
  1114. case CAL_MSG_MOTOR:
  1115. if (thr_lock_status == LOCKED)
  1116. {
  1117. uint16_t motor_num;
  1118. memcpy(&motor_num, rxMsg->payload + 1, 2);
  1119. if (motor_num == 1)
  1120. {
  1121. motor_num = 3;
  1122. }
  1123. else if (motor_num == 3)
  1124. {
  1125. motor_num = 1;
  1126. }
  1127. MotorCheck_SetCheckNum(motor_num);
  1128. }
  1129. break;
  1130. // 安装方向
  1131. case CAL_MSG_ASSEMBLY_DIRECTION:
  1132. if (thr_lock_status == LOCKED)
  1133. {
  1134. uint8_t calib_value[3] = {
  1135. rxMsg->payload[1], 0, 0};
  1136. send_calibration_msg_to_imu(ASSEMBLE_CALIB, calib_value, 1);
  1137. }
  1138. break;
  1139. // 电压校准参数
  1140. case CAL_MSG_BATTERY_VOLTAGE:
  1141. if (thr_lock_status == LOCKED)
  1142. {
  1143. uint8_t calib_flag = rxMsg->payload[1];
  1144. uint8_t ad_num = rxMsg->payload[2];
  1145. switch (calib_flag)
  1146. {
  1147. /* 恢复默认电压校准系数 */
  1148. case 0:
  1149. switch (ad_num)
  1150. {
  1151. case 0:
  1152. params_set_value(ParamNum_VoltCalibKp0, 1000);
  1153. params_set_value(ParamNum_VoltCalibOffset0, 0);
  1154. break;
  1155. case 1:
  1156. params_set_value(ParamNum_VoltCalibKp1, 1000);
  1157. params_set_value(ParamNum_VoltCalibOffset1, 0);
  1158. break;
  1159. case 2:
  1160. params_set_value(ParamNum_VoltCalibKp2, 1000);
  1161. params_set_value(ParamNum_VoltCalibOffset2, 0);
  1162. break;
  1163. }
  1164. break;
  1165. /* 设置电压校准系数 */
  1166. case 1:
  1167. {
  1168. int16_t volt_kp;
  1169. memcpy(&volt_kp, rxMsg->payload + 3, 2);
  1170. int8_t volt_offset = rxMsg->payload[5];
  1171. ParamsEnumType paramnumKp = ParamNum_VoltCalibKp0;
  1172. ParamsEnumType paramnumOffset =
  1173. ParamNum_VoltCalibOffset0;
  1174. switch (ad_num)
  1175. {
  1176. case 0:
  1177. paramnumKp = ParamNum_VoltCalibKp0;
  1178. paramnumOffset = ParamNum_VoltCalibOffset0;
  1179. break;
  1180. case 1:
  1181. paramnumKp = ParamNum_VoltCalibKp1;
  1182. paramnumOffset = ParamNum_VoltCalibOffset1;
  1183. break;
  1184. case 2:
  1185. paramnumKp = ParamNum_VoltCalibKp2;
  1186. paramnumOffset = ParamNum_VoltCalibOffset2;
  1187. break;
  1188. }
  1189. params_set_value(paramnumKp, volt_kp);
  1190. params_set_value(paramnumOffset, volt_offset);
  1191. }
  1192. break;
  1193. }
  1194. write_par_information = true;
  1195. }
  1196. break;
  1197. }
  1198. struct gcs_ack_arg arg = {0};
  1199. arg.ack_id = GCS_VKLINK_V300_CAL_ID;
  1200. arg.ack_content[0] = cal_id;
  1201. gcs_vklink_v300_send_ack_data(pgcs, &arg);
  1202. }
  1203. break;
  1204. case GCS_VKLINK_V300_CONFINF_ID:
  1205. {
  1206. uint16_t num;
  1207. memcpy(&num, rxMsg->payload, 2);
  1208. int16_t value;
  1209. memcpy(&value, rxMsg->payload + 2, 2);
  1210. params_set_value(num, value);
  1211. struct gcs_ack_arg arg = {0};
  1212. arg.ack_id = GCS_VKLINK_V300_CONFINF_ID;
  1213. arg.ack_content[0] = num;
  1214. arg.ack_content[1] = value;
  1215. gcs_vklink_v300_send_ack_data(pgcs, &arg);
  1216. }
  1217. break;
  1218. case GCS_VKLINK_V300_ROCK_ID:
  1219. {
  1220. for (uint8_t i = 0; i < 4; ++i)
  1221. {
  1222. memcpy(&rock_in[i], rxMsg->payload + 2 * i, 2);
  1223. }
  1224. rock_key = rxMsg->payload[8];
  1225. rock_isenable = COMP_NORMAL;
  1226. }
  1227. break;
  1228. case GCS_VKLINK_V300_APTYPE_ID:
  1229. {
  1230. uint8_t index = 0;
  1231. int16_t value = 0;
  1232. /* 机型 */
  1233. params_set_value(ParamNum_APType, rxMsg->payload[index++]);
  1234. /* 盘旋半径 m */
  1235. memcpy(&value, rxMsg->payload + index, 2);
  1236. index += 2;
  1237. params_set_value(ParamNum_APCircleRadiusM, value);
  1238. /* 失联时间 */
  1239. memcpy(&value, rxMsg->payload + index, 2);
  1240. index += 2;
  1241. params_set_value(ParamNum_RadioLinkLostTimeS, value);
  1242. /* 1 级电压保护阈值 */
  1243. memcpy(&value, rxMsg->payload + index, 2);
  1244. index += 2;
  1245. params_set_value(ParamNum_LowVoltValue1, value);
  1246. /* 1 级电压保护动作 */
  1247. value = rxMsg->payload[index++];
  1248. params_set_value(ParamNum_LowVoltAction1, value);
  1249. /* 2 级电压保护阈值 */
  1250. memcpy(&value, rxMsg->payload + index, 2);
  1251. index += 2;
  1252. params_set_value(ParamNum_LowVoltValue2, value);
  1253. /* 2 级电压保护动作 */
  1254. value = rxMsg->payload[index++];
  1255. params_set_value(ParamNum_LowVoltAction2, value);
  1256. /* 起飞高度 */
  1257. memcpy(&value, rxMsg->payload + index, 2);
  1258. index += 2;
  1259. params_set_value(ParamNum_APTakeoffAltM, value);
  1260. /* 返航高度 */
  1261. memcpy(&value, rxMsg->payload + index, 2);
  1262. index += 2;
  1263. params_set_value(ParamNum_APRthAltM, value);
  1264. /* 磁偏角 */
  1265. value = rxMsg->payload[index++];
  1266. params_set_value(ParamNum_MagDeclinationDeg, value);
  1267. /* IMU 滤波参数 */
  1268. value = rxMsg->payload[index++];
  1269. params_set_value(ParamNum_ImuFilterLever, value);
  1270. /* 怠速等级 */
  1271. value = rxMsg->payload[index++];
  1272. if (value >= 1 && value <= 5)
  1273. {
  1274. uint16_t mc_idle_speed = (value - 1) * 50 + 1050;
  1275. params_set_value(ParamNum_APIdleSpeed, mc_idle_speed);
  1276. }
  1277. /* 遥控器失控后悬停等待时间 */
  1278. memcpy(&value, rxMsg->payload + index, 2);
  1279. index += 2;
  1280. params_set_value(ParamNum_RcFailLoiterTimeS, value);
  1281. struct gcs_ack_arg arg = {0};
  1282. arg.ack_id = GCS_VKLINK_V300_APTYPE_ID;
  1283. gcs_vklink_v300_send_ack_data(pgcs, &arg);
  1284. }
  1285. break;
  1286. case GCS_VKLINK_V300_CENTER_FIX_ID:
  1287. {
  1288. struct gps_imu_pos_fix_msg_data *data =
  1289. (struct gps_imu_pos_fix_msg_data *)rxMsg->payload;
  1290. int8_t gps_pos_fix[6];
  1291. int8_t imu_pos_fix[3];
  1292. if (rxMsg->payload_len >= 12)
  1293. {
  1294. for (size_t i = 0; i < 6; ++i)
  1295. {
  1296. gps_pos_fix[i] = data->gps_pos_fix[i];
  1297. }
  1298. if (thr_lock_status == LOCKED)
  1299. {
  1300. send_calibration_msg_to_imu(
  1301. GPS_POS_CALIB, (uint8_t *)gps_pos_fix, 6);
  1302. }
  1303. }
  1304. if (rxMsg->payload_len >= 18)
  1305. {
  1306. for (size_t i = 0; i < 3; ++i)
  1307. {
  1308. imu_pos_fix[i] = data->imu_pos_fix[i];
  1309. }
  1310. if (thr_lock_status == LOCKED)
  1311. {
  1312. send_calibration_msg_to_imu(
  1313. IMU_POS_CALIB, (uint8_t *)imu_pos_fix, 3);
  1314. }
  1315. }
  1316. struct gcs_ack_arg arg = {0};
  1317. arg.ack_id = GCS_VKLINK_V300_CENTER_FIX_ID;
  1318. gcs_vklink_v300_send_ack_data(pgcs, &arg);
  1319. }
  1320. break;
  1321. case GCS_VKLINK_V300_PID_ID:
  1322. {
  1323. uint8_t index = 0;
  1324. int16_t value = 0;
  1325. memcpy(&value, rxMsg->payload + index, 2);
  1326. index += 2;
  1327. params_set_value(ParamNum_RollAngleKp, value);
  1328. memcpy(&value, rxMsg->payload + index, 2);
  1329. index += 2;
  1330. params_set_value(ParamNum_RollGyroKp, value);
  1331. memcpy(&value, rxMsg->payload + index, 2);
  1332. index += 2;
  1333. params_set_value(ParamNum_PitchAngleKp, value);
  1334. memcpy(&value, rxMsg->payload + index, 2);
  1335. index += 2;
  1336. params_set_value(ParamNum_PitchGyroKp, value);
  1337. memcpy(&value, rxMsg->payload + index, 2);
  1338. index += 2;
  1339. params_set_value(ParamNum_YawAngleKp, value);
  1340. memcpy(&value, rxMsg->payload + index, 2);
  1341. index += 2;
  1342. params_set_value(ParamNum_YawGyroKp, value);
  1343. memcpy(&value, rxMsg->payload + index, 2);
  1344. index += 2;
  1345. params_set_value(ParamNum_AltholdSpeedKp, value);
  1346. value = rxMsg->payload[index++];
  1347. params_set_value(ParamNum_RollGyroKd, value);
  1348. value = rxMsg->payload[index++];
  1349. params_set_value(ParamNum_PitchGyroKd, value);
  1350. value = rxMsg->payload[index++];
  1351. params_set_value(ParamNum_YawGyroKd, value);
  1352. memcpy(&value, rxMsg->payload + index, 2);
  1353. index += 2;
  1354. params_set_value(ParamNum_AltholdDistKp, value);
  1355. memcpy(&value, rxMsg->payload + index, 2);
  1356. index += 2;
  1357. params_set_value(ParamNum_AltholdAccKp, value);
  1358. value = rxMsg->payload[index++];
  1359. params_set_value(ParamNum_AltholdAccKi, value);
  1360. memcpy(&value, rxMsg->payload + index, 2);
  1361. index += 2;
  1362. params_set_value(ParamNum_LoiterDistKp, value);
  1363. memcpy(&value, rxMsg->payload + index, 2);
  1364. index += 2;
  1365. params_set_value(ParamNum_LoiterSpeedKp, value);
  1366. memcpy(&value, rxMsg->payload + index, 2);
  1367. index += 2;
  1368. params_set_value(ParamNum_LoiterAccKp, value);
  1369. value = rxMsg->payload[index++];
  1370. params_set_value(ParamNum_LoiterAccKi, value);
  1371. value = rxMsg->payload[index++];
  1372. params_set_value(ParamNum_GyroBrakeRatio, value);
  1373. value = rxMsg->payload[index++];
  1374. params_set_value(ParamNum_MaxHorJet, value);
  1375. struct gcs_ack_arg arg = {0};
  1376. arg.ack_id = GCS_VKLINK_V300_PID_ID;
  1377. gcs_vklink_v300_send_ack_data(pgcs, &arg);
  1378. }
  1379. break;
  1380. case GCS_VKLINK_V300_PAR_ID:
  1381. {
  1382. uint8_t index = 0;
  1383. int16_t value = 0;
  1384. value = rxMsg->payload[index++];
  1385. params_set_value(ParamNum_APMaxTilteAngleDeg, value);
  1386. value = rxMsg->payload[index++];
  1387. params_set_value(ParamNum_APMaxHorizonalSpeedGpsModeDms, value);
  1388. value = rxMsg->payload[index++];
  1389. params_set_value(ParamNum_APMaxClimbSpeedGpsModeDms, value);
  1390. value = rxMsg->payload[index++];
  1391. params_set_value(ParamNum_APMaxDeclineSpeedGpsModeDms, value);
  1392. // buf2short((short *)&parinf._par_hover_throttle,
  1393. // &rx_buffer[index]);
  1394. index += 2;
  1395. memcpy(&value, rxMsg->payload + index, 2);
  1396. index += 2;
  1397. params_set_value(ParamNum_AltRestrictionA, value);
  1398. memcpy(&value, rxMsg->payload + index, 2);
  1399. index += 2;
  1400. params_set_value(ParamNum_AltRestrictionB, value);
  1401. value = rxMsg->payload[index++];
  1402. params_set_value(ParamNum_APMaxYawRate, value);
  1403. value = rxMsg->payload[index++];
  1404. params_set_value(ParamNum_VoltCalibOffset0, value);
  1405. value = rxMsg->payload[index++];
  1406. params_set_value(ParamNum_VoltCalibOffset1, value);
  1407. value = rxMsg->payload[index++];
  1408. params_set_value(ParamNum_VoltCalibOffset2, value);
  1409. value = rxMsg->payload[index++];
  1410. params_set_value(ParamNum_FollowDistM, value);
  1411. value = rxMsg->payload[index++];
  1412. params_set_value(ParamNum_APMaxClimbSpeedAutoModeDms, value);
  1413. value = rxMsg->payload[index++];
  1414. params_set_value(ParamNum_APMaxDeclineSpeedAutoModeDms, value);
  1415. value = rxMsg->payload[index++];
  1416. params_set_value(ParamNum_APMinLandingRateAutoModeDms, value);
  1417. value = rxMsg->payload[index++];
  1418. params_set_value(ParamNum_APRthSpeedDms, value);
  1419. memcpy(&value, &rxMsg->payload[index], 2);
  1420. index += 2;
  1421. params_set_value(ParamNum_ObstacleHoldDistCm, value);
  1422. value = rxMsg->payload[index++];
  1423. params_set_value(ParamNum_LinklostAction, value);
  1424. value = rxMsg->payload[index++];
  1425. params_set_value(ParamNum_ServoFailsafe, value);
  1426. /* 预留 */
  1427. index += 2;
  1428. memcpy(&value, rxMsg->payload + index, 2);
  1429. index += 2;
  1430. params_set_value(ParamNum_MaxHorizonalDistanceM, value);
  1431. struct gcs_ack_arg arg = {0};
  1432. arg.ack_id = GCS_VKLINK_V300_PAR_ID;
  1433. gcs_vklink_v300_send_ack_data(pgcs, &arg);
  1434. }
  1435. break;
  1436. case GCS_VKLINK_V300_VER_ID:
  1437. {
  1438. if (thr_lock_status == LOCKED)
  1439. {
  1440. /* 飞控名字 */
  1441. memcpy(verinf._ap_name, &rxMsg->payload[0],
  1442. sizeof(verinf._ap_name));
  1443. /* 飞控序列号 */
  1444. memcpy(&verinf._serial_id, rxMsg->payload + 10, 4);
  1445. /* */
  1446. verinf._hw_ver = rxMsg->payload[22] + (rxMsg->payload[23] << 8);
  1447. /* 飞机编号 */
  1448. verinf._sysid = rxMsg->payload[24];
  1449. write_ver_information = true;
  1450. }
  1451. struct gcs_ack_arg arg = {0};
  1452. arg.ack_id = GCS_VKLINK_V300_VER_ID;
  1453. gcs_vklink_v300_send_ack_data(pgcs, &arg);
  1454. }
  1455. break;
  1456. /* 固件升级开始 */
  1457. case GCS_VKLINK_V300_FIRMWARE_UPDATE_ID:
  1458. if (thr_lock_status == LOCKED)
  1459. write_iap_flag = true;
  1460. break;
  1461. default:
  1462. break;
  1463. }
  1464. }
  1465. }
  1466. /**
  1467. * @brief 地面站发送消息轮询
  1468. *
  1469. */
  1470. void gcs_vklink_v300_tx_poll(struct GCS_Link *pgcs)
  1471. {
  1472. if (pilot_mode == PILOT_IMU_UPDATE)
  1473. {
  1474. /* 升级 imu 时地面站作为透传转发, 不发送其它常发消息 */
  1475. imu_tx_msg_to_gcs(pgcs);
  1476. return;
  1477. }
  1478. else
  1479. {
  1480. /* 1hz 遥测数据定频发送 */
  1481. if (micros() - pgcs->_last_tx1hz_time_us > (1e6 / 1 / 8))
  1482. {
  1483. pgcs->_last_tx1hz_time_us = micros();
  1484. switch (pgcs->_last_tx1hz_id)
  1485. {
  1486. case 0:
  1487. pgcs->_last_tx1hz_id++;
  1488. break;
  1489. case 1:
  1490. gcs_vklink_v300_send_payload_data(pgcs);
  1491. pgcs->_last_tx1hz_id++;
  1492. break;
  1493. case 5:
  1494. // gcs_vklink_v300_send_telemetry_data(pgcs);
  1495. pgcs->_last_tx1hz_id++;
  1496. break;
  1497. default:
  1498. pgcs->_last_tx1hz_id = 0;
  1499. break;
  1500. }
  1501. }
  1502. /* 2hz 遥测数据定频发送 */
  1503. if (micros() - pgcs->_last_tx2hz_time_us > (1e6 / 2 / 1))
  1504. {
  1505. pgcs->_last_tx2hz_time_us = micros();
  1506. /* 2hz 遥测数据定频发送 */
  1507. switch (pgcs->_last_tx2hz_id)
  1508. {
  1509. case 0:
  1510. pgcs->_last_tx2hz_id = 0;
  1511. break;
  1512. default:
  1513. pgcs->_last_tx2hz_id = 0;
  1514. break;
  1515. }
  1516. }
  1517. /* 5hz 遥测数据定频发送 */
  1518. if (micros() - pgcs->_last_tx5hz_time_us > (1e6 / 5 / 3))
  1519. {
  1520. pgcs->_last_tx5hz_time_us = micros();
  1521. switch (pgcs->_last_tx5hz_id)
  1522. {
  1523. case 0:
  1524. pgcs->_last_tx5hz_id++;
  1525. break;
  1526. case 1:
  1527. gcs_vklink_v300_send_global_pos_data(pgcs);
  1528. pgcs->_last_tx5hz_id++;
  1529. break;
  1530. case 2:
  1531. gcs_vklink_v300_send_telemetry_data(pgcs);
  1532. pgcs->_last_tx5hz_id = 0;
  1533. break;
  1534. default:
  1535. pgcs->_last_tx5hz_id = 0;
  1536. break;
  1537. }
  1538. }
  1539. }
  1540. }
  1541. void gcs_vklink_v300_set_tx_msg(struct GCS_Link *pgcs, uint8_t msg_id, void *arg)
  1542. {
  1543. switch (msg_id)
  1544. {
  1545. case GCS_VKLINK_V300_PORT_UART4_DATA:
  1546. {
  1547. struct gcs_transparent_transmission_arg *tt_arg =
  1548. (struct gcs_transparent_transmission_arg *)arg;
  1549. gcs_vklink_v300_send_uart4_rx_data(pgcs, tt_arg->data, tt_arg->data_len);
  1550. }
  1551. break;
  1552. case GCS_VKLINK_V300_ACK_ID:
  1553. {
  1554. struct gcs_ack_arg *ack_arg = (struct gcs_ack_arg *)arg;
  1555. gcs_vklink_v300_send_ack_data(pgcs, ack_arg);
  1556. }
  1557. break;
  1558. default:
  1559. break;
  1560. }
  1561. }