command.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549
  1. /*******************************************************************************************
  2. * @file command.c
  3. *
  4. * @brief 小车指令
  5. *
  6. * (c) Copyright 2021, Shandong Huali electromechanical Co., Ltd..
  7. * This is protected by international copyright laws. Knowledge of the
  8. * source code may not be used to write a similar product. This file may
  9. * only be used in accordance with a license and should not be redistributed
  10. * in any way. We appreciate your understanding and fairness.
  11. *
  12. *
  13. * @author Simon
  14. * @date Created: 2021.06.17-T14:17:29+0800
  15. *
  16. *******************************************************************************************/
  17. #include "rtthread.h"
  18. #include "lwip/netdb.h"
  19. #include "stdint.h"
  20. #include "wcs.h"
  21. #include "task_scheduler.h"
  22. #include "board.h"
  23. #include "env.h"
  24. #include "cargo.h"
  25. #include "guide.h"
  26. #include "lift.h"
  27. #include "music.h"
  28. #include "dm_scaner.h"
  29. #define DBG_TAG "wcs.cmd"
  30. #define DBG_LVL DBG_LOG
  31. #include <rtdbg.h>
  32. #define CMD_USING_TASK
  33. enum
  34. {
  35. WCS_CMD_PICK = 0x01, /* 托盘取货 */
  36. WCS_CMD_RELEASE = 0x02, /* 托盘放货 */
  37. WCS_CMD_OPEN_CHARGE = 0x03, /* 开始充电 */
  38. WCS_CMD_CLOSE_CHARGE = 0x04, /* 关闭充电 */
  39. WCS_CMD_STEER_RAMP = 0x05, /* 换向到坡道 */
  40. WCS_CMD_STEER_TUNNEL = 0x06,/* 换向到巷道 */
  41. WCS_CMD_PALLET_CAL = 0x08, /* 托盘校准 */
  42. WCS_CMD_PALLET_CAL_LIFT = 0x09, /* 托盘校准+托盘顶升 */
  43. // WCS_CMD_FORWARD_DST = 0x11, /* 按1方向距离行驶 */
  44. // WCS_CMD_BACKWARD_DST = 0x12, /* 按2方向距离行驶 */
  45. // WCS_CMD_LEFT_DST = 0x13, /* 按3方向距离行驶 */
  46. // WCS_CMD_RIGHT_DST = 0x14, /* 按4方向距离行驶 */
  47. // WCS_CMD_SYNC_TIME = 0x15, /* 时间同步 */
  48. WCS_CMD_FORWARD_AUTO = 0x31,/* 1方向长感应停 */
  49. WCS_CMD_BACKWARD_AUTO = 0x32,/* 2方向长感应停 */
  50. WCS_CMD_LEFT_AUTO = 0x33, /* 3方向长感应停 */
  51. WCS_CMD_RIGHT_AUTO = 0x34, /* 4方向长感应停 */
  52. WCS_CMD_FORWARD_SPD = 0x41, /* 按1方向速度行驶 */
  53. WCS_CMD_BACKWARD_SPD = 0x42,/* 按2方向速度行驶 */
  54. WCS_CMD_LEFT_SPD = 0x43, /* 按3方向速度行驶 */
  55. WCS_CMD_RIGHT_SPD = 0x44, /* 按4方向速度行驶 */
  56. WCS_CMD_RELOCATE = 0x50, /* 更改小车坐标 */
  57. WCS_CMD_CAL_LOCAT = 0x51, /* 校准位置 */
  58. WCS_CMD_STOP = 0x81, /* 小车急停 */
  59. WCS_CMD_RECOVERY = 0x82, /* 小车暂停恢复 */
  60. // WCS_CMD_SPD = 0x83, /* 更改小车行驶速度 */
  61. // WCS_CMD_SPD_AT_AREA = 0x84, /* 更改小车特殊位置行驶速度 */
  62. WCS_CMD_OPEN_BEEP = 0x85, /* 打开小车蜂鸣器 */
  63. WCS_CMD_CLOSE_BEEP = 0x86, /* 关闭小车蜂鸣器 */
  64. WCS_CMD_PAUSE = 0x87, /* 小车行驶暂停 */
  65. // WCS_CMD_PAUSE_AT_SPD = 0x88,/* 小车按速度停止 */
  66. WCS_CMD_INIT = 0x8e, /* 初始化指令 */
  67. WCS_CMD_CANCEL = 0x8f, /* 任务撤销 */
  68. WCS_CMD_CHK_PALLET = 0x91, /* 查询小车托盘有无 */
  69. WCS_CMD_LIFT_FLOOR = 0x92, /* 下发提升机当前层 */
  70. // WCS_CMD_SHUTDOWN = 0x96, /* 小车系统关机 */
  71. WCS_CMD_REBOOT = 0x97, /* 小车系统重启 */
  72. // WCS_CMD_UPDATE_MAP = 0x98, /* 发送地图 */
  73. };
  74. typedef struct
  75. {
  76. uint8_t cmd;
  77. uint8_t cmd_no;
  78. int status;
  79. int result;
  80. uint32_t timeout_tick;
  81. }cmd_delay_work_t;
  82. static cmd_delay_work_t cmd_delay_work = {0};
  83. static void (*cmd_clear_func)(void) = NULL; /* 清状态回调函数,wcs.c调用 */
  84. __weak void Music_Enable(int enable)
  85. {
  86. }
  87. /**
  88. * @funtion cmd_set_clear_indication
  89. * @brief 设置清状态回调函数
  90. * @Author Simon
  91. * @DateTime 2021.06.25-T17:20:35+0800
  92. *
  93. * @param clear_func description
  94. */
  95. void cmd_set_clear_indication(void (*clear_func)(void))
  96. {
  97. cmd_clear_func = clear_func;
  98. }
  99. /**
  100. * @funtion cmd_set_point
  101. * @brief 更改小车坐标
  102. * @Author Simon
  103. * @DateTime 2021.06.19-T15:29:34+0800
  104. *
  105. * @param point 坐标点
  106. * @return 成功
  107. */
  108. static int cmd_set_point(uint32_t point)
  109. {
  110. wcs_point_t *ppoint;
  111. point = point >> 8;
  112. ppoint = (wcs_point_t *)&point;
  113. S.xValue = ppoint->x;
  114. S.yValue = ppoint->y;
  115. S.cValue = ppoint->z;
  116. if(ppoint->z)
  117. scan.Set_cValue = ppoint->z;
  118. else
  119. LOG_D("wcs Set err cValue");
  120. return ERR_C_SYSTEM_SUCCESS;
  121. }
  122. static int cmd_cancel_task(void)
  123. {
  124. if(task_cancel(0) < 0)
  125. return ERR_C_RES_REVOCATION;
  126. return ERR_C_SYSTEM_SUCCESS;
  127. }
  128. static int cmd_initial(void)
  129. {
  130. if(S.Status != STATUS_ESTOP)
  131. S.Status = STATUS_INIT;
  132. if(cmd_clear_func)
  133. {
  134. cmd_clear_func();
  135. }
  136. if(task_cancel(1) < 0)
  137. return ERR_C_RES_REVOCATION;
  138. GDClearPauseTask();
  139. Lift_ManualDown();
  140. cmd_delay_work.cmd = WCS_CMD_INIT;
  141. cmd_delay_work.status = 0;
  142. cmd_delay_work.result = ERR_C_SYSTEM_RECV_SUCCESS;
  143. cmd_delay_work.timeout_tick = rt_tick_get() + 5000;
  144. return ERR_C_SYSTEM_RECV_SUCCESS;
  145. }
  146. static void cmd_initial_delay_work(void)
  147. {
  148. if(Lift_ManualDown())
  149. {
  150. cmd_delay_work.result = ERR_C_SYSTEM_SUCCESS;
  151. }
  152. else
  153. {
  154. if(rt_tick_get() > cmd_delay_work.timeout_tick)
  155. {
  156. cmd_delay_work.result = ERR_C_RES_TRAVEL_TIME_OUT;
  157. LOG_W("release timeout");
  158. }
  159. }
  160. }
  161. static int cmd_pickup(void)
  162. {
  163. Lift_ManualUp();
  164. cmd_delay_work.cmd = WCS_CMD_PICK;
  165. cmd_delay_work.status = 0;
  166. cmd_delay_work.result = ERR_C_SYSTEM_RECV_SUCCESS;
  167. cmd_delay_work.timeout_tick = rt_tick_get() + 5000;
  168. return ERR_C_SYSTEM_RECV_SUCCESS;
  169. }
  170. static void cmd_pickup_delay_work(void)
  171. {
  172. if(Lift_ManualUp())
  173. {
  174. cmd_delay_work.result = ERR_C_SYSTEM_SUCCESS;
  175. }
  176. else
  177. {
  178. if(rt_tick_get() > cmd_delay_work.timeout_tick)
  179. {
  180. cmd_delay_work.result = ERR_C_RES_TRAVEL_TIME_OUT;
  181. LOG_W("pickup timeout");
  182. }
  183. }
  184. }
  185. static int cmd_release(void)
  186. {
  187. Lift_ManualDown();
  188. cmd_delay_work.cmd = WCS_CMD_RELEASE;
  189. cmd_delay_work.status = 0;
  190. cmd_delay_work.result = ERR_C_SYSTEM_RECV_SUCCESS;
  191. cmd_delay_work.timeout_tick = rt_tick_get() + 5000;
  192. return ERR_C_SYSTEM_RECV_SUCCESS;
  193. }
  194. static void cmd_release_delay_work(void)
  195. {
  196. if(Lift_ManualDown())
  197. {
  198. cmd_delay_work.result = ERR_C_SYSTEM_SUCCESS;
  199. }
  200. else
  201. {
  202. if(rt_tick_get() > cmd_delay_work.timeout_tick)
  203. {
  204. cmd_delay_work.result = ERR_C_RES_TRAVEL_TIME_OUT;
  205. LOG_W("release timeout");
  206. }
  207. }
  208. }
  209. static int cmd_charge_open(void)
  210. {
  211. BTY_AUTO_ON;
  212. return ERR_C_SYSTEM_SUCCESS;
  213. }
  214. static int cmd_charge_close(void)
  215. {
  216. BTY_AUTO_OFF;
  217. return ERR_C_SYSTEM_SUCCESS;
  218. }
  219. static int cmd_ramp(void)
  220. {
  221. Dir_Lift_LR(); //BUG2,左右换向
  222. cmd_delay_work.cmd = WCS_CMD_STEER_RAMP;
  223. cmd_delay_work.status = 0;
  224. cmd_delay_work.result = ERR_C_SYSTEM_RECV_SUCCESS;
  225. cmd_delay_work.timeout_tick = rt_tick_get() + 5000;
  226. return ERR_C_SYSTEM_RECV_SUCCESS;
  227. }
  228. static void cmd_ramp_delay_work(void)
  229. {
  230. if(Dir_Lift_LR())//BUG2左右换向
  231. {
  232. cmd_delay_work.result = ERR_C_SYSTEM_SUCCESS;
  233. }
  234. else
  235. {
  236. if(rt_tick_get() > cmd_delay_work.timeout_tick)
  237. {
  238. cmd_delay_work.result = ERR_C_RES_TRAVEL_TIME_OUT;
  239. LOG_W("steer ramp timeout");
  240. }
  241. }
  242. }
  243. static int cmd_tunnel(void)
  244. {
  245. Dir_Lift_FB();//BUG2
  246. cmd_delay_work.cmd = WCS_CMD_STEER_TUNNEL;
  247. cmd_delay_work.status = 0;
  248. cmd_delay_work.result = ERR_C_SYSTEM_RECV_SUCCESS;
  249. cmd_delay_work.timeout_tick = rt_tick_get() + 5000;
  250. return ERR_C_SYSTEM_RECV_SUCCESS;
  251. }
  252. static void cmd_tunnel_delay_work(void)
  253. {
  254. if(Dir_Lift_FB())//BUG2
  255. {
  256. cmd_delay_work.result = ERR_C_SYSTEM_SUCCESS;
  257. }
  258. else
  259. {
  260. if(rt_tick_get() > cmd_delay_work.timeout_tick)
  261. {
  262. cmd_delay_work.result = ERR_C_RES_TRAVEL_TIME_OUT;
  263. LOG_W("steer tunnel timeout");
  264. }
  265. }
  266. }
  267. static void cmd_reboot(void)
  268. {
  269. cmd_delay_work.cmd = WCS_CMD_REBOOT;
  270. cmd_delay_work.status = 0;
  271. cmd_delay_work.result = ERR_C_SYSTEM_RECV_SUCCESS;
  272. cmd_delay_work.timeout_tick = rt_tick_get() + 1000;
  273. }
  274. static void cmd_reboot_delay_work(void)
  275. {
  276. if(rt_tick_get() > cmd_delay_work.timeout_tick)
  277. {
  278. LOG_I("reboot now...");
  279. rt_hw_cpu_reset();
  280. }
  281. }
  282. int cmd_parser(uint8_t cmd_no, uint8_t cmd, uint32_t *param)
  283. {
  284. int rc = ERR_C_TRAVEL_ERR_HAVE_NOCMD;
  285. if(cmd_delay_work.cmd == cmd)
  286. {
  287. return ERR_C_TRAVEL_ERR_CMDREP;
  288. }
  289. cmd_delay_work.cmd_no = cmd_no;
  290. switch(cmd)
  291. {
  292. case WCS_CMD_RELOCATE:
  293. rc = cmd_set_point(*param);
  294. break;
  295. case WCS_CMD_STOP:
  296. GDEStop();
  297. rc = ERR_C_SYSTEM_SUCCESS;
  298. break;
  299. case WCS_CMD_PAUSE:
  300. GDPause();
  301. rc = ERR_C_SYSTEM_SUCCESS;
  302. break;
  303. case WCS_CMD_RECOVERY:
  304. GDResume();
  305. rc = ERR_C_SYSTEM_SUCCESS;
  306. break;
  307. case WCS_CMD_LIFT_FLOOR:
  308. S.TsjFloorStatus = ntohl(*param);
  309. rc = ERR_C_SYSTEM_SUCCESS;
  310. break;
  311. case WCS_CMD_CHK_PALLET:
  312. if(S.CargoStatus == CARGO_STATUS_CENTER || S.CargoStatus == CARGO_STATUS_SIDE)
  313. {
  314. *param = htonl(1);
  315. }
  316. else
  317. {
  318. *param = 0;
  319. }
  320. rc = ERR_C_SYSTEM_SUCCESS;
  321. break;
  322. case WCS_CMD_OPEN_BEEP:
  323. Music_Enable(1);
  324. rc = ERR_C_SYSTEM_SUCCESS;
  325. break;
  326. case WCS_CMD_CLOSE_BEEP:
  327. Music_Enable(0);
  328. rc = ERR_C_SYSTEM_SUCCESS;
  329. break;
  330. /* 任务执行中返回ERR_C_RES_TASK_DOING */
  331. case WCS_CMD_PICK:
  332. case WCS_CMD_RELEASE:
  333. case WCS_CMD_OPEN_CHARGE:
  334. case WCS_CMD_CLOSE_CHARGE:
  335. case WCS_CMD_STEER_RAMP:
  336. case WCS_CMD_STEER_TUNNEL:
  337. case WCS_CMD_FORWARD_SPD:
  338. case WCS_CMD_FORWARD_AUTO:
  339. case WCS_CMD_BACKWARD_SPD:
  340. case WCS_CMD_BACKWARD_AUTO:
  341. case WCS_CMD_LEFT_SPD:
  342. case WCS_CMD_LEFT_AUTO:
  343. case WCS_CMD_RIGHT_SPD:
  344. case WCS_CMD_RIGHT_AUTO:
  345. case WCS_CMD_REBOOT:
  346. case WCS_CMD_PALLET_CAL:
  347. case WCS_CMD_CAL_LOCAT:
  348. case WCS_CMD_CANCEL:
  349. case WCS_CMD_INIT:
  350. if(task_get_status() == TASK_STATUS_EXE || task_get_status() == TASK_STATUS_PAUSE)
  351. {
  352. rc = ERR_C_RES_TASK_DOING;
  353. }
  354. break;
  355. default:
  356. break;
  357. }
  358. if(cmd == WCS_CMD_INIT)
  359. {
  360. if(task_get_status() != TASK_STATUS_EXE)
  361. {
  362. rc = cmd_initial();
  363. }
  364. else
  365. {
  366. rc = ERR_C_RES_TASK_DOING;
  367. }
  368. }
  369. if(task_get_status() != TASK_STATUS_EXE && task_get_status() != TASK_STATUS_PAUSE)
  370. {
  371. switch(cmd)
  372. {
  373. case WCS_CMD_PICK:
  374. rc = cmd_pickup();
  375. break;
  376. case WCS_CMD_RELEASE:
  377. rc = cmd_release();
  378. break;
  379. case WCS_CMD_OPEN_CHARGE:
  380. rc = cmd_charge_open();
  381. break;
  382. case WCS_CMD_CLOSE_CHARGE:
  383. rc = cmd_charge_close();
  384. break;
  385. case WCS_CMD_STEER_RAMP:
  386. rc = cmd_ramp();
  387. break;
  388. case WCS_CMD_STEER_TUNNEL:
  389. rc = cmd_tunnel();
  390. break;
  391. case WCS_CMD_FORWARD_SPD:
  392. case WCS_CMD_FORWARD_AUTO:
  393. GD_ManualForward();
  394. rc = ERR_C_SYSTEM_SUCCESS;
  395. break;
  396. case WCS_CMD_BACKWARD_SPD:
  397. case WCS_CMD_BACKWARD_AUTO:
  398. GD_ManualBackward();
  399. rc = ERR_C_SYSTEM_SUCCESS;
  400. break;
  401. case WCS_CMD_LEFT_SPD:
  402. case WCS_CMD_LEFT_AUTO:
  403. GD_ManualDriftLeft();
  404. rc = ERR_C_SYSTEM_SUCCESS;
  405. break;
  406. case WCS_CMD_RIGHT_SPD:
  407. case WCS_CMD_RIGHT_AUTO:
  408. GD_ManualDriftRight();
  409. rc = ERR_C_SYSTEM_SUCCESS;
  410. break;
  411. case WCS_CMD_REBOOT:
  412. cmd_reboot();
  413. rc = ERR_C_SYSTEM_SUCCESS;
  414. break;
  415. case WCS_CMD_PALLET_CAL:
  416. rc = ERR_C_SYSTEM_SUCCESS;
  417. break;
  418. case WCS_CMD_CAL_LOCAT:
  419. rc = ERR_C_SYSTEM_SUCCESS;
  420. break;
  421. case WCS_CMD_CANCEL:
  422. rc = cmd_cancel_task();
  423. break;
  424. default:
  425. break;
  426. }
  427. }
  428. return rc;
  429. }
  430. /**
  431. * @funtion cmd_work_result
  432. * @brief description
  433. * @Author Simon
  434. * @DateTime 2021.06.25-T9:33:43+0800
  435. *
  436. * @param cmd_no 指令序号输出
  437. * @return >=0 指令完成结果, -1 无指令
  438. */
  439. int cmd_work_result(uint8_t *cmd_no)
  440. {
  441. int rc = -1;
  442. if(cmd_delay_work.cmd)
  443. {
  444. if(cmd_no)
  445. {
  446. *cmd_no = cmd_delay_work.cmd_no;
  447. }
  448. rc = cmd_delay_work.result;
  449. if(rc == ERR_C_SYSTEM_SUCCESS && cmd_no)
  450. {
  451. memset(&cmd_delay_work, 0, sizeof(cmd_delay_work_t));
  452. }
  453. /**/
  454. // if(rc == ERR_C_SYSTEM_RECV_SUCCESS)
  455. // {
  456. // rc = ERR_C_SYSTEM_SUCCESS;
  457. // }
  458. }
  459. return rc;
  460. }
  461. /**
  462. * @funtion cmd_delay_task
  463. * @brief 创建任务运行或放主循环运行
  464. * @Author Simon
  465. * @DateTime 2021.06.19-T18:16:51+0800
  466. *
  467. */
  468. void cmd_delay_task(void)
  469. {
  470. switch(cmd_delay_work.cmd)
  471. {
  472. case WCS_CMD_PICK:
  473. cmd_pickup_delay_work();
  474. break;
  475. case WCS_CMD_RELEASE:
  476. cmd_release_delay_work();
  477. break;
  478. case WCS_CMD_STEER_RAMP:
  479. cmd_ramp_delay_work();
  480. break;
  481. case WCS_CMD_STEER_TUNNEL:
  482. cmd_tunnel_delay_work();
  483. break;
  484. case WCS_CMD_REBOOT:
  485. cmd_reboot_delay_work();
  486. break;
  487. case WCS_CMD_INIT:
  488. cmd_initial_delay_work();
  489. break;
  490. default:
  491. break;
  492. }
  493. }
  494. #ifdef CMD_USING_TASK
  495. static void cmd_task(void *param)
  496. {
  497. while(1)
  498. {
  499. cmd_delay_task();
  500. rt_thread_delay(100);
  501. }
  502. }
  503. static int cmd_init(void)
  504. {
  505. static rt_thread_t tid;
  506. tid = rt_thread_create("wcs_cmd", cmd_task, NULL, 512, 15, 10);
  507. if(tid)
  508. {
  509. rt_thread_startup(tid);
  510. }
  511. return RT_EOK;
  512. }
  513. INIT_APP_EXPORT(cmd_init);
  514. #endif