drv_vkweigher_vls300.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567
  1. #include "drv_vkweigher_vls300.h"
  2. #include "dronecan.h"
  3. #include "sys/time.h"
  4. #include <fcntl.h>
  5. #include <stdint.h>
  6. #include <stdio.h>
  7. #include <sys/stat.h>
  8. #include <sys/types.h>
  9. #include <unistd.h>
  10. #include "vkweigher.Version_res.h"
  11. #include "vkweigher.WeigherStatus.h"
  12. #include "vkweigher.WeigherCalib_req.h"
  13. #include "vkweigher.WeigherCalib_res.h"
  14. #include "vkweigher.FuseBreak_req.h"
  15. #include "vkweigher.FuseBreak_res.h"
  16. #include "vkweigher.Version_req.h"
  17. #include "soft_timer.h"
  18. #include "string.h"
  19. #include "soft_seed_device.h"
  20. struct vk_weigher_vls300 _vk_vls300;
  21. // static rt_size_t read_data(rt_device_t dev, weigher_data_t *data) {
  22. // struct weigher_device *weigher =
  23. // rt_container_of(dev, struct weigher_device, parent);
  24. // struct vk_weigher_vls300 *vls300 =
  25. // rt_container_of(weigher, struct vk_weigher_vls300, weigher_dev);
  26. // rt_size_t size = 0;
  27. // rt_enter_critical();
  28. // if (vls300->status_data.timestamp > 0 && vls300->data_got == RT_TRUE) {
  29. // vls300->data_got = RT_FALSE;
  30. // data->timestamp_ms = vls300->status_data.timestamp;
  31. // data->weight = vls300->status_data.weight;
  32. // data->weight_dot = vls300->status_data.weight_dot;
  33. // data->ucode[0] = vls300->status_data.status;
  34. // data->ucode[1] = vls300->status_data.status >> 8;
  35. // for (int i = 0; i < 3; ++i) {
  36. // data->acce[i] = vls300->status_data.acce[i];
  37. // data->gyro[i] = vls300->status_data.gyro[i];
  38. // }
  39. // for (int i = 0; i < 4; ++i) {
  40. // data->Q[i] = vls300->status_data.Q[i];
  41. // }
  42. // size = sizeof(weigher_data_t);
  43. // }
  44. // rt_exit_critical();
  45. // return size;
  46. // }
  47. // static rt_ssize_t read_version(rt_device_t dev, weigher_version_t *version) {
  48. // RT_ASSERT(dev != RT_NULL);
  49. // RT_ASSERT(version != RT_NULL);
  50. // struct weigher_device *weigher =
  51. // rt_container_of(dev, struct weigher_device, parent);
  52. // struct vk_weigher_vls300 *vls300 =
  53. // rt_container_of(weigher, struct vk_weigher_vls300, weigher_dev);
  54. // rt_ssize_t size = 0;
  55. // rt_enter_critical();
  56. // if (vls300->version.timestamp > 0) {
  57. // version->timestamp_ms = vls300->version.timestamp;
  58. // rt_snprintf(version->sn_num, sizeof(version->sn_num), "%u",
  59. // vls300->version.SN_num);
  60. // rt_strncpy(version->fw_ver, (char *)vls300->version.fw_ver,
  61. // sizeof(version->fw_ver));
  62. // rt_strncpy(version->hw_ver, "VLS300", sizeof(version->hw_ver));
  63. // rt_strncpy(version->manufactory, "VKFLY", sizeof(version->manufactory));
  64. // size = sizeof(weigher_version_t);
  65. // }
  66. // rt_exit_critical();
  67. // return size;
  68. // }
  69. // uint8_t vklift_weight_calibrate(uint32_t weight)
  70. // {
  71. // static uint8_t transfer_id = 0;
  72. // struct vkweigher_WeigherCalibRequest msg = {0};
  73. // msg.weight = weight;
  74. // uint8_t buffer[VKWEIGHER_WEIGHERCALIB_REQUEST_MAX_SIZE] = {0};
  75. // memcpy(buffer,&msg.weight,sizeof(msg.weight));
  76. // uint8_t len = vkweigher_WeigherCalibRequest_encode(&msg, buffer);
  77. // CanardTxTransfer tranxfer = {
  78. // .inout_transfer_id = &transfer_id,
  79. // .transfer_type = CanardTransferTypeRequest,
  80. // .data_type_id = VKWEIGHER_WEIGHERCALIB_REQUEST_ID,
  81. // .data_type_signature = VKWEIGHER_WEIGHERCALIB_REQUEST_SIGNATURE,
  82. // .priority = CANARD_TRANSFER_PRIORITY_LOW,
  83. // .payload = buffer,
  84. // .payload_len = len,
  85. // };
  86. // dronecan_request_or_respond(DRONECAN_WEIGHER_NODE_ID, &tranxfer);
  87. // return 1;
  88. // }
  89. // static rt_err_t fuse_prot(rt_device_t dev, void *args) {
  90. // RT_ASSERT(dev != RT_NULL);
  91. // struct weigher_device *weigher =
  92. // rt_container_of(dev, struct weigher_device, parent);
  93. // struct vk_weigher_vls300 *vls300 =
  94. // rt_container_of(weigher, struct vk_weigher_vls300, weigher_dev);
  95. // static uint8_t transfer_id = 0;
  96. // struct vkweigher_FuseBreakRequest msg = {0};
  97. // msg.break_cmd = *(uint8_t *)args;
  98. // uint8_t buffer[VKWEIGHER_FUSEBREAK_REQUEST_MAX_SIZE] = {0};
  99. // uint8_t len = vkweigher_FuseBreakRequest_encode(&msg, buffer);
  100. // if (vls300->canard != RT_NULL) {
  101. // CanardTxTransfer tranxfer = {
  102. // .inout_transfer_id = &transfer_id,
  103. // .transfer_type = CanardTransferTypeRequest,
  104. // .data_type_id = VKWEIGHER_FUSEBREAK_REQUEST_ID,
  105. // .data_type_signature = VKWEIGHER_FUSEBREAK_REQUEST_SIGNATURE,
  106. // .priority = CANARD_TRANSFER_PRIORITY_MEDIUM,
  107. // .payload = buffer,
  108. // .payload_len = len,
  109. // .iface_mask = vls300->iface_mask,
  110. // };
  111. // struct dronecan *dcan = (struct dronecan *)vls300->canard->user_reference;
  112. // dronecan_request_or_respond(DRONECAN_WEIGHER_NODE_ID, &tranxfer);
  113. // }
  114. // return RT_EOK;
  115. // }
  116. // static rt_err_t factory_reset(rt_device_t dev, void *args) { return RT_EOK; }
  117. // static rt_err_t set_sn(rt_device_t dev, uint32_t SN) {
  118. // RT_ASSERT(dev != RT_NULL);
  119. // RT_ASSERT(data != RT_NULL);
  120. // static uint8_t transfer_id = 0;
  121. // struct weigher_device *weigher =
  122. // rt_container_of(dev, struct weigher_device, parent);
  123. // struct vk_weigher_vls300 *vls300 =
  124. // rt_container_of(weigher, struct vk_weigher_vls300, weigher_dev);
  125. // struct vkweigher_VersionRequest msg = {0};
  126. // msg.cmd = 1;
  127. // msg.SN_num = SN;
  128. // uint8_t buffer[VKWEIGHER_VERSION_REQUEST_MAX_SIZE] = {0};
  129. // uint8_t len = vkweigher_VersionRequest_encode(&msg, buffer);
  130. // CanardTxTransfer tranxfer = {
  131. // .inout_transfer_id = &transfer_id,
  132. // .transfer_type = CanardTransferTypeRequest,
  133. // .data_type_id = VKWEIGHER_VERSION_REQUEST_ID,
  134. // .data_type_signature = VKWEIGHER_VERSION_REQUEST_SIGNATURE,
  135. // .priority = CANARD_TRANSFER_PRIORITY_LOW,
  136. // .payload = buffer,
  137. // .payload_len = len,
  138. // .iface_mask = vls300->iface_mask,
  139. // };
  140. // struct dronecan *dcan = (struct dronecan *)vls300->canard->user_reference;
  141. // dronecan_request_or_respond(DRONECAN_WEIGHER_NODE_ID, &tranxfer);
  142. // return RT_EOK;
  143. // }
  144. static void req_version(struct vk_weigher_vls300 *vls300) {
  145. static uint8_t transfer_id = 0;
  146. if (vls300->canard != NULL) {
  147. struct vkweigher_VersionRequest msg = {0};
  148. msg.cmd = 0;
  149. uint8_t buffer[VKWEIGHER_VERSION_REQUEST_MAX_SIZE] = {0};
  150. uint8_t len = vkweigher_VersionRequest_encode(&msg, buffer);
  151. CanardTxTransfer tranxfer = {
  152. .inout_transfer_id = &transfer_id,
  153. .transfer_type = CanardTransferTypeRequest,
  154. .data_type_id = VKWEIGHER_VERSION_REQUEST_ID,
  155. .data_type_signature = VKWEIGHER_VERSION_REQUEST_SIGNATURE,
  156. .priority = CANARD_TRANSFER_PRIORITY_LOW,
  157. .payload = buffer,
  158. .payload_len = len,
  159. };
  160. dronecan_request_or_respond(DRONECAN_WEIGHER_NODE_ID, &tranxfer);
  161. }
  162. }
  163. // static void handle_fw_update(CanardRxTransfer *transfer) {
  164. // RT_ASSERT(transfer != RT_NULL);
  165. // if (transfer->transfer_type == CanardTransferTypeRequest) {
  166. // switch (transfer->data_type_id) {
  167. // case UAVCAN_PROTOCOL_FILE_GETINFO_REQUEST_ID: {
  168. // /* 处理固件信息请求 */
  169. // struct uavcan_protocol_file_GetInfoRequest req = {0};
  170. // if (!uavcan_protocol_file_GetInfoRequest_decode(transfer, &req)) {
  171. // if (rt_strncmp((char *)req.path.path.data, "VLS300.bin",
  172. // req.path.path.len) == 0) {
  173. // rt_event_send(_vk_vls300->_event,
  174. // VLS300_EVENT_GOT_FW_UPDATE_INFO_ACK);
  175. // }
  176. // }
  177. // } break;
  178. // case UAVCAN_PROTOCOL_FILE_READ_REQUEST_ID: {
  179. // /* 处理固件数据读取请求 */
  180. // rt_event_send(_vk_vls300->_event, VLS300_EVENT_GOT_FW_UPDATE_DATA_ACK);
  181. // } break;
  182. // default:
  183. // break;
  184. // }
  185. // } else if (transfer->transfer_type == CanardTransferTypeResponse) {
  186. // switch (transfer->data_type_id) {
  187. // case UAVCAN_PROTOCOL_FILE_BEGINFIRMWAREUPDATE_RESPONSE_ID: {
  188. // rt_event_send(_vk_vls300->_event, VLS300_EVENT_GOT_FW_UPDATE_START_ACK);
  189. // } break;
  190. // default:
  191. // break;
  192. // }
  193. // }
  194. // };
  195. int vkWeigher_Vls300_OnRecieved(CanardInstance *canardIns,
  196. CanardRxTransfer *transfer) {
  197. int ret = 0;
  198. if (transfer->transfer_type == CanardTransferTypeBroadcast) {
  199. /* weigher 广播帧 */
  200. switch (transfer->data_type_id) {
  201. case VKWEIGHER_WEIGHERSTATUS_ID: {
  202. struct vkweigher_WeigherStatus status = {0};
  203. if (!vkweigher_WeigherStatus_decode(transfer, &status)) {
  204. Dev.Lift_Weight_Link.connect_status = COMP_NORMAL;
  205. Dev.Lift_Weight_Link.recv_time = HAL_GetTick();
  206. Dev.Lift_Weight.facid = FAC_VK;
  207. _vk_vls300.data_got = true;
  208. _vk_vls300.status_data.timestamp = Get_Systimer_Us();
  209. _vk_vls300.status_data.weight = status.weight;
  210. _vk_vls300.status_data.weight_dot = status.rate;
  211. _vk_vls300.status_data.status = status.status;
  212. _vk_vls300.status_data.acce[0] = status.ax;
  213. _vk_vls300.status_data.acce[1] = status.ay;
  214. _vk_vls300.status_data.acce[2] = status.az;
  215. _vk_vls300.status_data.gyro[0] = status.gx;
  216. _vk_vls300.status_data.gyro[1] = status.gy;
  217. _vk_vls300.status_data.gyro[2] = status.gz;
  218. for (int i = 0; i < 4; i++) {
  219. _vk_vls300.status_data.Q[i] = status.Q[i];
  220. }
  221. /* 若未收到版本信息, 则主动请求一次版本信息 */
  222. if (_vk_vls300.version.timestamp == 0) {
  223. req_version(&_vk_vls300);
  224. }
  225. }
  226. ret = 1;
  227. } break;
  228. default:
  229. break;
  230. }
  231. } else if (transfer->transfer_type == CanardTransferTypeResponse) {
  232. /* weigher 应答帧 */
  233. switch (transfer->data_type_id) {
  234. case VKWEIGHER_VERSION_RESPONSE_ID: {
  235. struct vkweigher_VersionResponse msg = {0};
  236. if (!vkweigher_VersionResponse_decode(transfer, &msg)) {
  237. /* 收到 version 消息回令 */
  238. _vk_vls300.version.timestamp = Get_Systimer_Us();
  239. memcpy(_vk_vls300.version.fw_ver, msg.fw_ver, sizeof(msg.fw_ver));
  240. _vk_vls300.version.SN_num = msg.SN_num;
  241. }
  242. ret = 1;
  243. } break;
  244. case VKWEIGHER_FUSEBREAK_RESPONSE_ID: {
  245. struct vkweigher_FuseBreakResponse msg = {0};
  246. if (!vkweigher_FuseBreakResponse_decode(transfer, &msg)) {
  247. /* 收到 fuse break 消息回令 */
  248. }
  249. ret = 1;
  250. } break;
  251. case VKWEIGHER_WEIGHERCALIB_RESPONSE_ID: {
  252. struct vkweigher_WeigherCalibResponse msg = {0};
  253. if (!vkweigher_WeigherCalibResponse_decode(transfer, &msg)) {
  254. /* 收到 calibrate 消息回令 */
  255. }
  256. ret = 1;
  257. } break;
  258. // case UAVCAN_PROTOCOL_FILE_BEGINFIRMWAREUPDATE_RESPONSE_ID:
  259. // case UAVCAN_PROTOCOL_FILE_GETINFO_REQUEST_ID:
  260. // case UAVCAN_PROTOCOL_FILE_READ_REQUEST_ID:
  261. // handle_fw_update(transfer);
  262. // break;
  263. default:
  264. break;
  265. }
  266. }
  267. return ret;
  268. }
  269. bool vkWeigher_Vls300_shouldAcceptTransfer(const CanardInstance *ins,
  270. uint64_t *out_data_type_signature,
  271. uint16_t data_type_id,
  272. CanardTransferType transfer_type,
  273. uint8_t source_node_id) {
  274. bool ret = false;
  275. if (data_type_id == VKWEIGHER_WEIGHERSTATUS_ID &&
  276. transfer_type == CanardTransferTypeBroadcast) {
  277. *out_data_type_signature = VKWEIGHER_WEIGHERSTATUS_SIGNATURE;
  278. ret = true;
  279. } else if (data_type_id == VKWEIGHER_VERSION_RESPONSE_ID &&
  280. transfer_type == CanardTransferTypeResponse) {
  281. *out_data_type_signature = VKWEIGHER_VERSION_RESPONSE_SIGNATURE;
  282. ret = true;
  283. } else if (data_type_id == VKWEIGHER_FUSEBREAK_RESPONSE_ID &&
  284. transfer_type == CanardTransferTypeResponse) {
  285. *out_data_type_signature = VKWEIGHER_FUSEBREAK_RESPONSE_SIGNATURE;
  286. ret = true;
  287. } else if (data_type_id == VKWEIGHER_WEIGHERCALIB_RESPONSE_ID &&
  288. transfer_type == CanardTransferTypeResponse) {
  289. *out_data_type_signature = VKWEIGHER_WEIGHERCALIB_RESPONSE_SIGNATURE;
  290. ret = true;
  291. }
  292. // } else if (data_type_id ==
  293. // UAVCAN_PROTOCOL_FILE_BEGINFIRMWAREUPDATE_RESPONSE_ID &&
  294. // (transfer_type == CanardTransferTypeResponse)) {
  295. // *out_data_type_signature =
  296. // UAVCAN_PROTOCOL_FILE_BEGINFIRMWAREUPDATE_RESPONSE_SIGNATURE;
  297. // ret = true;
  298. // } else if (data_type_id == UAVCAN_PROTOCOL_FILE_GETINFO_REQUEST_ID &&
  299. // transfer_type == CanardTransferTypeRequest) {
  300. // *out_data_type_signature = UAVCAN_PROTOCOL_FILE_GETINFO_REQUEST_SIGNATURE;
  301. // ret = true;
  302. // } else if (data_type_id == UAVCAN_PROTOCOL_FILE_READ_REQUEST_ID &&
  303. // transfer_type == CanardTransferTypeRequest) {
  304. // *out_data_type_signature = UAVCAN_PROTOCOL_FILE_READ_REQUEST_SIGNATURE;
  305. // ret = true;
  306. // }
  307. return ret;
  308. }
  309. // static void fw_update_start(struct vk_weigher_vls300 *vls300,
  310. // CanardInstance *canardIns) {
  311. // /* 发送升级开始 */
  312. // struct uavcan_protocol_file_BeginFirmwareUpdateRequest req = {0};
  313. // uint8_t buffer[UAVCAN_PROTOCOL_FILE_BEGINFIRMWAREUPDATE_REQUEST_MAX_SIZE] = {
  314. // 0};
  315. // static uint8_t transfer_id = 0;
  316. // req.source_node_id = DRONECAN_FMU_NODE_ID;
  317. // req.image_file_remote_path.path.len = rt_strlen("VLS300.bin");
  318. // rt_memcpy((char *)req.image_file_remote_path.path.data, "VLS300.bin",
  319. // req.image_file_remote_path.path.len);
  320. // uint32_t len =
  321. // uavcan_protocol_file_BeginFirmwareUpdateRequest_encode(&req, buffer);
  322. // CanardTxTransfer tx_transfer = {
  323. // .data_type_signature =
  324. // UAVCAN_PROTOCOL_FILE_BEGINFIRMWAREUPDATE_REQUEST_SIGNATURE,
  325. // .data_type_id = UAVCAN_PROTOCOL_FILE_BEGINFIRMWAREUPDATE_REQUEST_ID,
  326. // .inout_transfer_id = &transfer_id,
  327. // .priority = CANARD_TRANSFER_PRIORITY_MEDIUM,
  328. // .transfer_type = CanardTransferTypeRequest,
  329. // .payload = buffer,
  330. // .payload_len = len,
  331. // };
  332. // struct dronecan *dcan = (struct dronecan *)canardIns->user_reference;
  333. // dronecan_request_or_respond(DRONECAN_FMU_NODE_ID, &tx_transfer);
  334. // }
  335. // static void fw_update_send_info(struct vk_weigher_vls300 *vls300,
  336. // uint32_t fw_size, CanardInstance *canardIns) {
  337. // /* 发送升级信息 */
  338. // struct uavcan_protocol_file_GetInfoResponse res = {0};
  339. // static uint8_t transfer_id = 0;
  340. // uint8_t buffer[UAVCAN_PROTOCOL_FILE_GETINFO_RESPONSE_MAX_SIZE] = {0};
  341. // res.size = fw_size;
  342. // res.error.value = UAVCAN_PROTOCOL_FILE_ERROR_OK;
  343. // uint32_t len = uavcan_protocol_file_GetInfoResponse_encode(&res, buffer);
  344. // CanardTxTransfer tx_transfer = {
  345. // .data_type_signature = UAVCAN_PROTOCOL_FILE_GETINFO_RESPONSE_SIGNATURE,
  346. // .data_type_id = UAVCAN_PROTOCOL_FILE_GETINFO_RESPONSE_ID,
  347. // .inout_transfer_id = &transfer_id,
  348. // .priority = CANARD_TRANSFER_PRIORITY_MEDIUM,
  349. // .transfer_type = CanardTransferTypeResponse,
  350. // .payload = buffer,
  351. // .payload_len = len,
  352. // };
  353. // struct dronecan *dcan = (struct dronecan *)canardIns->user_reference;
  354. // dronecan_request_or_respond(DRONECAN_FMU_NODE_ID, &tx_transfer);
  355. // }
  356. // static void fw_update_data(struct vk_weigher_vls300 *vls300, uint16_t pack_num,
  357. // const uint8_t data[128 + 2]) {
  358. // // send_data_to_vkgps(vls300, _MSGID_MCTOGPS_UPDATE_DATA, data, 128 + 4);
  359. // }
  360. // static int do_fw_update(struct vk_weigher_vls300 *vls300,
  361. // const char *fw_file_name, CanardInstance *canardIns,
  362. // CanardRxTransfer *transfer) {
  363. // RT_ASSERT(vls300 != RT_NULL);
  364. // RT_ASSERT(fw_file_name != RT_NULL);
  365. // const uint32_t PACK_BYTES_LEN = 128;
  366. // uint8_t buff[PACK_BYTES_LEN + 2];
  367. // /* 获取fd文件的大小 */
  368. // struct stat stat;
  369. // uint32_t fw_byte_size = 0;
  370. // int fd = open(fw_file_name, O_RDONLY);
  371. // if (fd < 0) {
  372. // LOG_E("open file %s failed!", fw_file_name);
  373. // return -1;
  374. // }
  375. // if (fstat(fd, &stat) == 0) {
  376. // fw_byte_size = stat.st_size;
  377. // } else {
  378. // /* 固件文件描述符异常 */
  379. // close(fd);
  380. // return -1;
  381. // }
  382. // uint8_t retry_cnt = 0;
  383. // uint32_t event;
  384. // uint16_t send_pack_num = 0;
  385. // off_t fd_offset = 0;
  386. // /* 发送升级开始 */
  387. // do {
  388. // LOG_D("send fw update sta.");
  389. // fw_update_start(vls300, vls300->canard);
  390. // rt_err_t ret =
  391. // rt_event_recv(vls300->_event, VLS300_EVENT_GOT_FW_UPDATE_START_ACK,
  392. // RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, 1000, &event);
  393. // /* 等待升级开始回令 */
  394. // if (RT_EOK == ret && (event & VLS300_EVENT_GOT_FW_UPDATE_START_ACK)) {
  395. // /* 收到升级开始回令 */
  396. // LOG_D("got update sta ack.");
  397. // rt_thread_mdelay(200);
  398. // send_pack_num = 1;
  399. // break;
  400. // } else {
  401. // retry_cnt++;
  402. // /* 升级开始失败 */
  403. // rt_thread_mdelay(200);
  404. // if (retry_cnt >= 5) {
  405. // LOG_E("update sta retry failed!");
  406. // close(fd);
  407. // return -1;
  408. // }
  409. // }
  410. // } while (1);
  411. // /* 发送升级数据信息 */
  412. // do {
  413. // fw_update_send_info(vls300, fw_byte_size, vls300->canard);
  414. // rt_err_t ret =
  415. // rt_event_recv(vls300->_event, VLS300_EVENT_GOT_FW_UPDATE_INFO_ACK,
  416. // RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, 500, &event);
  417. // if (ret == RT_EOK && (event & VLS300_EVENT_GOT_FW_UPDATE_INFO_ACK)) {
  418. // /* 收到回令, 升级结束 */
  419. // LOG_D("got update end ack.");
  420. // break;
  421. // } else {
  422. // /* 超时次未有回令, 升级结束失败 */
  423. // retry_cnt++;
  424. // if (retry_cnt >= 5) {
  425. // LOG_E("gps_id %d: update end ack retry failed!");
  426. // close(fd);
  427. // return -4;
  428. // }
  429. // };
  430. // } while (1);
  431. // /* 发送升级数据 */
  432. // do {
  433. // lseek(fd, fd_offset, SEEK_SET);
  434. // rt_memcpy(buff, &send_pack_num, 2);
  435. // uint16_t read_len = read(fd, buff + 2, PACK_BYTES_LEN);
  436. // LOG_D("send fw update data, pack number %d.", send_pack_num);
  437. // fw_update_data(vls300, send_pack_num, buff);
  438. // vls300->_fw_update_send_pack_num = send_pack_num;
  439. // rt_err_t ret =
  440. // rt_event_recv(vls300->_event, VLS300_EVENT_GOT_FW_UPDATE_DATA_ACK,
  441. // RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, 500, &event);
  442. // if (RT_EOK == ret && (event & VLS300_EVENT_GOT_FW_UPDATE_DATA_ACK)) {
  443. // /* 接收到升级数据回令 */
  444. // fd_offset += read_len;
  445. // send_pack_num += 1;
  446. // if (fd_offset >= fw_byte_size) {
  447. // break;
  448. // }
  449. // } else {
  450. // retry_cnt++;
  451. // if (retry_cnt >= 5) {
  452. // LOG_E("update data retry failed!");
  453. // close(fd);
  454. // return -3;
  455. // }
  456. // }
  457. // } while (1);
  458. // close(fd);
  459. // return 0;
  460. // }
  461. // static void vk_vls300_fw_update_entry(void *arg) {
  462. // struct vk_weigher_vls300 *vls300 = (struct vk_weigher_vls300 *)arg;
  463. // do_fw_update(vls300, vls300->_fw_file_name, vls300->canard, RT_NULL);
  464. // }
  465. // int vls300_fw_update(const char *fw_file_name) {
  466. // /* 检查固件文件是否存在 */
  467. // if (access(fw_file_name, F_OK) != 0) {
  468. // return -1;
  469. // }
  470. // _vk_vls300->_fw_file_name = fw_file_name;
  471. // rt_thread_t tid =
  472. // rt_thread_create("VK_VLS300_FW_UPDATE", vk_vls300_fw_update_entry,
  473. // _vk_vls300, 2048, 15, 5);
  474. // rt_thread_startup(tid);
  475. // return 0;
  476. // }