guide.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832
  1. /*
  2. *********************************************************************************************************
  3. * xmk guide
  4. * huali xmk guide process
  5. *
  6. * (c) Copyright 2016-2020, hualijidian.com
  7. * All Rights Reserved
  8. *
  9. * File : guide.c
  10. * By : eric
  11. * Version : V0.0.1
  12. *********************************************************************************************************
  13. */
  14. #include "stdio.h"
  15. #include "ctype.h"
  16. #include "env.h"
  17. #include "guide.h"
  18. #include "cargo.h"
  19. #include "screen.h"
  20. #include "music.h"
  21. #include "driver.h"
  22. #include "apptask.h"
  23. #include "lift.h"
  24. #include "obs.h"
  25. #include "hardware.h"
  26. #include "demotask.h"
  27. #include "dm_scaner.h"
  28. #include "task_scheduler.h"
  29. #include "systick.h"
  30. #include "chassis_bus.h"
  31. #include "bms.h"
  32. #define DBG_SECTION_NAME "guide"
  33. #define DBG_LEVEL DBG_INFO
  34. #include <rtdbg.h>
  35. enum{
  36. PUBLISHTASKSTA_CARRERYING, //ִ����
  37. PUBLISHTASKSTA_FINISH, //���
  38. PUBLISHTASKSTA_PAUSE //��ͣ
  39. };
  40. /*
  41. *********************************************************************************************************
  42. * GLOBAL VARIABLES
  43. *********************************************************************************************************
  44. */
  45. /*�����ٶ�*/
  46. uint32_t loopTime1s_Auto_Charge;
  47. uint32_t Timer_Auto_Charge = 0;
  48. /**
  49. * @brief ������
  50. * @param
  51. * @retval
  52. * @note
  53. */
  54. rt_inline void _batteryProcess(void);
  55. rt_inline void _Timer_Charge(void);
  56. rt_inline void _Test_Print(void);
  57. /**
  58. * @brief ����״̬���þ�ʾ��
  59. * @param
  60. * @retval
  61. */
  62. //rt_inline uint8_t _collectStatus(void);
  63. rt_inline uint8_t _navToStation(uint32_t station);
  64. rt_inline uint8_t _prepare(void);
  65. rt_inline void _run(void);
  66. rt_inline void collectTaskInfo(void);
  67. rt_inline bool _GDReady(void);
  68. rt_inline bool _GDActionProcess(uint8_t action);
  69. rt_inline void _GDAddTask(void);
  70. rt_inline void _GDPublishTaskStatus(void);
  71. rt_inline point_t station2Point(int station_xy,int station_z);
  72. void GDCruise(void *param)
  73. {
  74. uint32_t loopTime1s;
  75. while(1)
  76. {
  77. loopTime1s++;
  78. // _Adcc(); Bug0018
  79. if(S.DRStatus == DR_STATUS_INIT){
  80. if(S.Status != STATUS_ESTOP)
  81. S.Status = STATUS_INIT; //
  82. }
  83. //CanSendProcess(CAN1);
  84. if((loopTime1s % 10) == 0)
  85. {
  86. /* ÿ��ִ��һ�� */
  87. _batteryProcess(); //电池进程
  88. //_Auto_Charge();
  89. //_Timer_Charge();
  90. //CscSendStatusToTsj();
  91. _GDAddTask(); //GD
  92. _GDPublishTaskStatus(); //打印任务状态
  93. }
  94. Dir_Lift_Process(); //顶升进程
  95. Cargo_Process(); //货物的进程
  96. Dir_Lift_LR_Timer(); //延时到位
  97. Dir_Lift_FB_Timer();
  98. //_Test_Print();
  99. //Demo_Task();
  100. Screen_SetCode(S.Status);
  101. /* ����״̬ */
  102. collectTaskInfo(); //收集任务信息
  103. switch(S.Status){
  104. case STATUS_INIT:
  105. DRSetAction(ACT_STOP);
  106. if(_prepare()){
  107. LOG_D("Status INIT-> READY");
  108. if(S.Status != STATUS_ESTOP)
  109. S.Status = STATUS_READY;
  110. }
  111. break;
  112. case STATUS_READY:
  113. if(Task_HasTransport()){
  114. LOG_D("Status STOP-> RUN");
  115. if(S.Status != STATUS_ESTOP && S.Status != STATUS_REMOTE_MANUAL)
  116. S.Status = STATUS_RUN;
  117. break;
  118. }
  119. // DRSetAction(ACT_STOP);
  120. Screen_Icon_Run(Icon_Stop);
  121. Screen_Icon_Speed(Icon_Clear);
  122. break;
  123. case STATUS_RUN: //状态是运行
  124. SetSpeed(Cfg.Speed);
  125. _run();
  126. Screen_Icon_Run(Icon_Run);
  127. Screen_Icon_Speed(Icon_Hign_Speed);
  128. Screen_Icon_Warn(Icon_Clear);
  129. break;
  130. case STATUS_STOP_OBS:
  131. Screen_Icon_Speed(Icon_Mid_Speed);
  132. Screen_Icon_Warn(Icon_Warn);
  133. _run();
  134. break;
  135. case STATUS_RUN_OBS_LOW_SPEED: //obs
  136. SetSpeed(Cfg.SpdNear);
  137. _run();
  138. Screen_Icon_Speed(Icon_Mid_Speed);
  139. Screen_Icon_Warn(Icon_Warn);
  140. break;
  141. case STATUS_RUN_LOW_POWER:
  142. _run();
  143. break;
  144. case STATUS_ESTOP:
  145. DRSetAction(ACT_BRAKE);
  146. Screen_Icon_Run(Icon_Stop);
  147. break;
  148. case STATUS_REMOTE_MANUAL:
  149. S.DemoTaskStatus = STATUS_INIT;
  150. break;
  151. default:
  152. DRSetAction(ACT_STOP);
  153. }
  154. rt_thread_mdelay(100);
  155. }
  156. }
  157. int GDInit(void)
  158. {
  159. rt_thread_t tid;
  160. if(S.Status != STATUS_ESTOP)
  161. S.Status = STATUS_INIT;
  162. Set_Init();
  163. // RoadInfo_Init();
  164. Cargo_Init();
  165. ObsInit();
  166. Lift_Init();
  167. tid = rt_thread_create("nav", GDCruise, RT_NULL, 4096, 10, 5);
  168. if (tid != RT_NULL)
  169. {
  170. rt_thread_startup(tid);
  171. }
  172. LOG_D("Guide inited!");
  173. return 0;
  174. }
  175. INIT_APP_EXPORT(GDInit);
  176. rt_inline uint8_t _prepare(void) {
  177. if(S.DRStatus == DR_STATUS_RUN){
  178. return 1;
  179. }
  180. return 0;
  181. }
  182. rt_inline uint8_t _transportProcess(TASK_Transport_t *task) {
  183. static TASK_Transport_t *preTask = NULL;
  184. if(task != preTask){
  185. LOG_D("transport to %d", task->Dst);
  186. preTask = task;
  187. }
  188. switch(Trans.Status){
  189. case TRANS_STATUS_INIT:{
  190. int target_PointXY = (task->Dst);
  191. //if(Cargo_ToHomePos())
  192. /*���Ŀ��㲻��������������Ŀ��������������ҵ�ǰ�������������ڵ�ǰС������*/
  193. if((target_PointXY != Set.TsjStation) || ((target_PointXY == Set.TsjStation) && S.cValue == S.TsjFloorStatus))
  194. Trans.Status = TRANS_STATUS_TO_DST;
  195. }
  196. break;
  197. case TRANS_STATUS_TO_DST:
  198. if(_navToStation(task->Dst)){
  199. Trans.Status = TRANS_STATUS_ACTION;
  200. }
  201. break;
  202. case TRANS_STATUS_ACTION:
  203. if(_GDActionProcess(task->Act)){ //执行动作
  204. LOG_I("guide task action type:%d\r\n",task->Act); //打印动作
  205. Trans.Status = TRANS_STATUS_INIT;
  206. Task_FinishCurTransport();
  207. S.Status = STATUS_READY;
  208. if(!Task_HasTransport()){
  209. task_set_status(PUBLISHTASKSTA_FINISH, station2Point(S.Point,S.cValue));
  210. LOG_I("guide task finish\r\n");
  211. }
  212. return 1;
  213. }
  214. break;
  215. default:
  216. Trans.Status = TRANS_STATUS_INIT;
  217. }
  218. return 0;
  219. }
  220. rt_inline void _run(void) {
  221. TASK_Transport_t *curTransport = NULL;
  222. /* ����������� */
  223. curTransport = Task_GetCurTransport(); //获取当前运输值
  224. if(curTransport != NULL){
  225. _transportProcess(curTransport); //根据运输值做动作
  226. return;
  227. }
  228. return;
  229. }
  230. rt_inline void collectTaskInfo(void) {
  231. TASK_Transport_t *curTransport = Task_GetCurTransport();
  232. if(curTransport != NULL){
  233. S.TaskId = curTransport->Id;
  234. S.TaskStatus = Trans.Status;
  235. }else{
  236. S.TaskStatus = TRANS_STATUS_NULL;
  237. }
  238. }
  239. rt_inline bool navToStationNav(uint32_t station) {
  240. S.TgtStationXvalue = (S.TgtStation / 1000) % 1000;
  241. S.TgtStationYvalue = S.TgtStation % 1000;
  242. // S.TgtCvalue = (S.TgtStation / 1000 /1000) % 1000;
  243. // LOG_I("S.TgtStationXvalue: %d\r\n",S.TgtStationXvalue);
  244. // LOG_I("S.TgtStationYvalue: %d\r\n",S.TgtStationYvalue);
  245. // S.AtStation = station;
  246. //********************************1Cto1C*********************************************************************************
  247. // if(S.TgtCvalue == S.cValue){
  248. if (S.Point == S.TgtStation ){
  249. switch(S.Action){
  250. case ACT_FORWARD:
  251. DRSetAction(ACT_FORWARD_STOP_CROSS);
  252. return 0;
  253. case ACT_BACKWARD:
  254. DRSetAction(ACT_BACKWARD_STOP_CROSS);
  255. return 0;
  256. case ACT_LEFT:
  257. DRSetAction(ACT_LEFT_STOP_CROSS);
  258. return 0;
  259. case ACT_RIGHT:
  260. DRSetAction(ACT_RIGHT_STOP_CROSS);
  261. return 0;
  262. case ACT_RESET:
  263. case ACT_STOP:
  264. return 1;
  265. }
  266. }
  267. // if (S.yValue == S.RoadNum)
  268. {
  269. if (S.TgtStationYvalue > S.yValue) //目标值大于y值
  270. {
  271. if (S.DirStatus == DIR_STATUS_LR){
  272. if (Dir_Lift_LR()){
  273. DRSetAction(ACT_LEFT);
  274. S.DirPauseStatus = DIR_RUN_STATUS;
  275. }
  276. }else{
  277. if (drDirFbNav()){
  278. Dir_Lift_LR();
  279. }
  280. }
  281. }
  282. if (S.TgtStationYvalue < S.yValue) //目标值大于y值
  283. {
  284. if (S.DirStatus == DIR_STATUS_LR){
  285. if (Dir_Lift_LR()){
  286. DRSetAction(ACT_RIGHT);
  287. S.DirPauseStatus = DIR_RUN_STATUS;
  288. }
  289. }else{
  290. if (drDirFbNav()){
  291. Dir_Lift_LR();
  292. }
  293. }
  294. }
  295. if (S.TgtStationYvalue == S.yValue && S.TgtStationXvalue < S.xValue){
  296. if (S.DirStatus == DIR_STATUS_FB){
  297. if (Dir_Lift_FB()){
  298. DRSetAction(ACT_BACKWARD);
  299. S.DirPauseStatus = DIR_RUN_STATUS;
  300. }
  301. }else{
  302. if (drDirLrNav()){
  303. Dir_Lift_FB();
  304. }
  305. }
  306. }
  307. if (S.TgtStationXvalue == S.yValue && S.TgtStationXvalue > S.xValue){
  308. if (S.DirStatus == DIR_STATUS_FB){
  309. if (Dir_Lift_FB()){
  310. DRSetAction(ACT_FORWARD);
  311. S.DirPauseStatus = DIR_RUN_STATUS;
  312. }
  313. }else{
  314. if (drDirLrNav()){
  315. Dir_Lift_FB();
  316. }
  317. }
  318. }
  319. }
  320. if (S.Point != S.TgtStation)
  321. {
  322. if(S.yValue != S.TgtStationYvalue){
  323. if (S.DirStatus == DIR_STATUS_FB){
  324. DRSetAction(ACT_BACKWARD);
  325. }
  326. S.DirPauseStatus = DIR_RUN_STATUS;
  327. }
  328. if(S.yValue == S.TgtStationYvalue){
  329. if(S.xValue < S.TgtStationXvalue){
  330. if (S.DirStatus == DIR_STATUS_FB){
  331. DRSetAction(ACT_FORWARD);
  332. }
  333. S.DirPauseStatus = DIR_RUN_STATUS;
  334. }else{
  335. if (S.DirStatus == DIR_STATUS_FB){
  336. DRSetAction(ACT_BACKWARD);
  337. }
  338. S.DirPauseStatus = DIR_RUN_STATUS;
  339. }
  340. }
  341. }
  342. // }
  343. return 0;
  344. }
  345. /**
  346. * @brief ������վ��
  347. * @param
  348. * @retval 1������վ�㣬0��δ����վ��
  349. */
  350. rt_inline uint8_t _navToStation(uint32_t station) {
  351. if(S.TgtStation != station){
  352. LOG_D("Nav to station %d", station);
  353. S.TgtStation = station;
  354. Screen_SetTarget(station);
  355. }
  356. if(S.Point == NULL_POINT){
  357. DRSetAction(ACT_FORWARD);
  358. S.NavStatus = NAV_STATUS_NAV;
  359. return 0;
  360. }
  361. /* ����Ҫ��վʱ ����վ�㼴�� */
  362. // if(inSt == 0){
  363. if(navToStationNav(station)){
  364. S.NavStatus = NAV_STATUS_STATION_IN;
  365. return 1;
  366. }
  367. S.NavStatus = NAV_STATUS_NAV;
  368. return 0;
  369. }
  370. static void CanSendByte(uint32_t id, uint8_t len, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, uint8_t d5,
  371. uint8_t d6, uint8_t d7)
  372. {
  373. struct rt_can_msg msg;
  374. msg.id = id;
  375. msg.len = 8;
  376. msg.data[0] = d0;
  377. msg.data[1] = d1;
  378. msg.data[2] = d2;
  379. msg.data[3] = d3;
  380. msg.data[4] = d4;
  381. msg.data[5] = d5;
  382. msg.data[6] = d6;
  383. msg.data[7] = d7;
  384. chassis_bus_write(&msg, sizeof(msg));
  385. }
  386. void _Reset() {
  387. DRSetAction(ACT_RESET);
  388. LOG_D("DR_ACT_RESET");
  389. S.Status = STATUS_READY;
  390. // CanSendByte(0x171, 8, 0, 0x21, 0, 0x11,0,0x01, 0, 0x01);
  391. // CanSendByte(0x172, 8, 0, 0x21, 0, 0x11,0,0x01, 0, 0x01);
  392. CanSendByte(0x17a, 8, 0, 0x21, 0, 0x11,0,0x01, 0, 0x01);
  393. // CanSendByte(0x17b, 8, 0, 0x21, 0, 0x11,0,0x01, 0, 0x01);
  394. // CanSendByte(0x175, 8, 0, 0x21, 0, 0x11,0,0x01, 0, 0x01);
  395. }
  396. void GDStart(uint8_t FR) {
  397. S.FR = FR;
  398. // if(S.Status != STATUS_ESTOP && S.Status != STATUS_REMOTE_MANUAL)
  399. S.Status = STATUS_RUN;
  400. _Reset();
  401. }
  402. void GDStop(void) {
  403. if(S.Status != STATUS_ESTOP && S.Status != STATUS_REMOTE_MANUAL)
  404. S.Status = STATUS_READY;
  405. DRSetAction(ACT_STOP);
  406. }
  407. void GDPause(void) {
  408. LOG_D("GD_Pause");
  409. if((S.Status != STATUS_STOP_OBS) && (S.Status != STATUS_RUN_OBS_LOW_SPEED)){
  410. S.PreStatus = S.Status;
  411. }
  412. if(S.Status != STATUS_ESTOP && S.Status != STATUS_REMOTE_MANUAL)
  413. S.Status = STATUS_STOP_OBS;
  414. }
  415. void GDLowSpeed(void) {
  416. LOG_I("GD_LowSpeed");
  417. switch(S.Status){
  418. case STATUS_RUN:
  419. case STATUS_RUN_LOW_POWER:
  420. S.PreStatus = S.Status;
  421. if(S.Status != STATUS_ESTOP && S.Status != STATUS_REMOTE_MANUAL)
  422. S.Status = STATUS_RUN_OBS_LOW_SPEED;
  423. }
  424. }
  425. /* ȥվ�� */
  426. void GDToStation(uint16_t station){
  427. S.TgtStation = station;
  428. }
  429. void GDResume(void) {
  430. if(S.Status == STATUS_STOP_OBS || S.Status == STATUS_RUN_OBS_LOW_SPEED){
  431. if(S.Status != STATUS_ESTOP && S.Status != STATUS_REMOTE_MANUAL)
  432. S.Status = S.PreStatus;
  433. }
  434. }
  435. void GDEStop(void) {
  436. S.Status = STATUS_ESTOP;
  437. DRSetAction(ACT_BRAKE);
  438. }
  439. //void GDBreak(void) {
  440. // S.Status = STATUS_BREAK;
  441. // DRSetAction(ACT_BRAKE);
  442. //}
  443. uint8_t GDSetAction(uint8_t action) {
  444. DRSetAction(action);
  445. return true;
  446. }
  447. uint8_t GDSetStation(uint16_t station) {
  448. S.TgtStation = station;
  449. return true;
  450. }
  451. uint8_t GDSetSpeed(uint16_t speed) {
  452. SetSpeed(speed);
  453. return true;
  454. }
  455. void GD_ManualStop(void) {
  456. S.Status = STATUS_REMOTE_MANUAL;
  457. DRSetAction(ACT_MANUAL_STOP);
  458. }
  459. void GD_ManualForward(void) {
  460. S.Status = STATUS_REMOTE_MANUAL;
  461. if (S.DirStatus == DIR_STATUS_FB){
  462. DRSetAction(ACT_MANUAL_FORWARD);
  463. }
  464. }
  465. void GD_ManualBackward(void) {
  466. S.Status = STATUS_REMOTE_MANUAL;
  467. if (S.DirStatus == DIR_STATUS_FB){
  468. DRSetAction(ACT_MANUAL_BACKWARD);
  469. }
  470. }
  471. void GD_ManualLeftward(void) {
  472. S.Status = STATUS_REMOTE_MANUAL;
  473. DRSetAction(ACT_MANUAL_DRIFT_LEFT);
  474. }
  475. void GD_ManualRightward(void) {
  476. S.Status = STATUS_REMOTE_MANUAL;
  477. DRSetAction(ACT_MANUAL_DRIFT_RIGHT);
  478. }
  479. void GD_ManualDriftLeft(void) {
  480. S.Status = STATUS_REMOTE_MANUAL;
  481. if (S.DirStatus == DIR_STATUS_LR){
  482. DRSetAction(ACT_MANUAL_DRIFT_LEFT);
  483. }
  484. }
  485. void GD_ManualDriftRight(void) {
  486. S.Status = STATUS_REMOTE_MANUAL;
  487. if (S.DirStatus == DIR_STATUS_LR){
  488. DRSetAction(ACT_MANUAL_DRIFT_RIGHT);
  489. }
  490. }
  491. void GD_ManualRoteLeft(void) {
  492. S.Status = STATUS_REMOTE_MANUAL;
  493. DRSetAction(ACT_MANUAL_ROTATE_LEFT);
  494. }
  495. void GD_ManualRoteRight(void) {
  496. S.Status = STATUS_REMOTE_MANUAL;
  497. DRSetAction(ACT_MANUAL_ROTATE_RIGHT);
  498. }
  499. #define ASCII_TO_NUM3(a, b, c) TO_DIGIT((a))* 100+ TO_DIGIT((b)) * 10 + TO_DIGIT((c));
  500. uint8_t GDAddAsciiTrans(uint8_t* data, uint8_t len) {
  501. TASK_Transport_t task;
  502. // �ж������
  503. if(len != 6){
  504. LOG_E("TASK_ERROR_LEN %d", len);
  505. return TASK_ERROR_LEN;
  506. }
  507. // �ж������Ƿ�ȫ������
  508. if(!isdigit(
  509. data[0]) || !isdigit(data[1]) || !isdigit(data[2])){
  510. LOG_E("TASK_ERROR_SRC_NOT_NUM");
  511. return TASK_ERROR_SRC_NOT_NUM;
  512. }
  513. task.Src = ASCII_TO_NUM3(data[0], data[1], data[2])
  514. ;
  515. if(!isdigit(
  516. data[3]) || !isdigit(data[4]) || !isdigit(data[5])){
  517. LOG_E("TASK_ERROR_DST_NOT_NUM");
  518. return TASK_ERROR_DST_NOT_NUM;
  519. }
  520. task.Dst = ASCII_TO_NUM3(data[3], data[4], data[5])
  521. ;
  522. task.Id[0]='\0';
  523. return Task_AddTransport(task);
  524. }
  525. uint8_t GDClearTask(void) {
  526. //JsonPrintfToBuff("{\"t\":\"ClearTask\", \"r\":\"ok\"}");
  527. return Task_ClearTransport();
  528. }
  529. void GDClearPauseTask(void) {
  530. if(S.Status != STATUS_RUN
  531. && S.Status != STATUS_RUN_OBS_LOW_SPEED
  532. && S.Status != STATUS_RUN_LOW_POWER)
  533. {
  534. Task_ForceClear();
  535. if(S.Status != STATUS_ESTOP && S.Status != STATUS_REMOTE_MANUAL)
  536. S.Status = STATUS_READY;
  537. Trans.Status = TRANS_STATUS_INIT;
  538. task_set_status(PUBLISHTASKSTA_FINISH, station2Point(S.Point,S.cValue));
  539. LOG_I("guide task finish\r\n");
  540. }
  541. }
  542. rt_inline void _batteryProcess(void) {
  543. if(get_bat_enable())
  544. {
  545. S.BatteryStatus = get_bat_rsoc();
  546. if(S.BatteryStatus > 95) Screen_Icon_Battery(Icon_Battery_100);
  547. else
  548. if(83 < S.BatteryStatus && S.BatteryStatus < 90) Screen_Icon_Battery(Icon_Battery_80);
  549. else
  550. if(63 < S.BatteryStatus && S.BatteryStatus < 80) Screen_Icon_Battery(Icon_Battery_60);
  551. else
  552. if(43 < S.BatteryStatus && S.BatteryStatus < 60) Screen_Icon_Battery(Icon_Battery_40);
  553. else
  554. if(23 < S.BatteryStatus && S.BatteryStatus < 40)
  555. {
  556. Screen_Icon_Battery(Icon_Battery_20);
  557. if(S.Status != STATUS_ESTOP && S.Status != STATUS_REMOTE_MANUAL)
  558. S.Status = STATUS_RUN_LOW_POWER;
  559. }
  560. else
  561. if(S.BatteryStatus < 20)
  562. {
  563. Screen_Icon_Battery(Icon_Battery_20);
  564. if(S.Status != STATUS_ESTOP && S.Status != STATUS_REMOTE_MANUAL)
  565. S.Status = STATUS_STOP_LOW_POWER;
  566. }
  567. }
  568. else
  569. {
  570. if(S.BatteryVolt >= Cfg.VoltFull)
  571. {
  572. S.BatteryStatus = BATTERY_STATUS_FULL;
  573. Screen_Icon_Battery(Icon_Battery_100);
  574. }
  575. else
  576. if(S.BatteryVolt >= Cfg.VoltHigh && S.BatteryVolt < Cfg.VoltFull-30) //bug8
  577. {
  578. S.BatteryStatus = BATTERY_STATUS_HIGH;
  579. Screen_Icon_Battery(Icon_Battery_80);
  580. }
  581. else
  582. if(S.BatteryVolt >= Cfg.VoltMid && S.BatteryVolt < Cfg.VoltHigh-30) //bug8
  583. {
  584. S.BatteryStatus = BATTERY_STATUS_MID;
  585. Screen_Icon_Battery(Icon_Battery_60);
  586. }
  587. else
  588. if(S.BatteryVolt >= Cfg.VoltLow && S.BatteryVolt < Cfg.VoltMid-30) //bug8
  589. {
  590. S.BatteryStatus = BATTERY_STATUS_LOW;
  591. Screen_Icon_Battery(Icon_Battery_40);
  592. }
  593. else
  594. if(S.BatteryVolt >= Cfg.VoltWarn && S.BatteryVolt < Cfg.VoltLow-30) //bug8
  595. {
  596. S.BatteryStatus = BATTERY_STATUS_WARN;
  597. Screen_Icon_Battery(Icon_Battery_20);
  598. if(S.Status != STATUS_ESTOP && S.Status != STATUS_REMOTE_MANUAL)
  599. S.Status = STATUS_RUN_LOW_POWER;
  600. }
  601. else
  602. if(S.BatteryVolt < Cfg.VoltWarn-30) //bug8
  603. {
  604. S.BatteryStatus = BATTERY_STATUS_STOP;
  605. Screen_Icon_Battery(Icon_Battery_00);
  606. if(S.Status != STATUS_ESTOP && S.Status != STATUS_REMOTE_MANUAL){
  607. S.Status = STATUS_STOP_LOW_POWER;
  608. }
  609. }
  610. } //bms不行
  611. if((S.Status == STATUS_RUN_LOW_POWER || S.Status == STATUS_STOP_LOW_POWER) && (S.BatteryStatus != BATTERY_STATUS_WARN)){
  612. if(S.Status != STATUS_ESTOP && S.Status != STATUS_REMOTE_MANUAL)
  613. S.Status = STATUS_READY;
  614. }
  615. Screen_SetBatteryStatus(S.BatteryStatus);
  616. }
  617. rt_inline void _Timer_Charge(void) {
  618. // LOG_I("Time: %d:%d:%d",S.HH,S.MM,S.SS);
  619. switch(S.HH){
  620. case 11:
  621. case 17:
  622. if (S.MM >30){
  623. S.TimerChargeStatus = TIMER_STATUS_TO_CHARGE;
  624. }
  625. return;
  626. case 13:
  627. case 7:
  628. if (S.MM >30){
  629. S.TimerChargeStatus = TIMER_STATUS_TO_TASK;
  630. }
  631. return;
  632. }
  633. }
  634. rt_inline void _Test_Print(void){
  635. LOG_I("++++++++++++++++CscStatus+++++++++++++++++ \r\n");
  636. LOG_I("S.CscStatus:%d \r\n",S.Status);
  637. LOG_I("S.CscCvalue:%d \r\n",S.cValue);
  638. LOG_I("S.TgtCvalue:%d \r\n",S.TgtCvalue);
  639. LOG_I("++++++++++++++++TsjStatus+++++++++++++++++ \r\n");
  640. LOG_I("TsjId:%d \r\n",S.TsjId);
  641. LOG_I("TsjStatus:%d \r\n",S.TsjStatus);
  642. LOG_I("TsjFloorStatus:%d \r\n",S.TsjFloorStatus);
  643. }
  644. /**
  645. * @funtion point2Station
  646. * @brief ������ʽת��
  647. * @Author Deman
  648. * @DateTime 2021.06.21-T15:21:33+0800
  649. *
  650. * @param point �ڵ�ṹ��
  651. * @return ���� zxy
  652. */
  653. rt_inline uint32_t point2Station(point_t point)
  654. {
  655. return (point.x*1000+point.y);
  656. }
  657. /**
  658. * @funtion station2Point
  659. * @brief ������ʽת�� xy z -> point_t
  660. * @Author Deman
  661. * @DateTime 2021.06.21-T15:17:53+0800
  662. *
  663. * @param station_xy ����x,y
  664. * @param station_z ����z
  665. * @return �ڵ�ṹ��
  666. */
  667. rt_inline point_t station2Point(int station_xy,int station_z)
  668. {
  669. point_t point;
  670. point.x = (station_xy / 1000) % 1000;
  671. point.y = station_xy % 1000;
  672. point.z = station_z;
  673. point.action = 0;
  674. return point;
  675. }
  676. /**
  677. * @funtion _GDReady
  678. * @brief �ۺϴ���״̬���ж��Ƿ���׼���û�ȡ�ڵ�켣������
  679. * @Author Deman
  680. * @DateTime 2021.06.21-T16:03:10+0800
  681. *
  682. * @return true ��׼���� false δ׼����
  683. */
  684. rt_inline bool _GDReady(void)
  685. {
  686. //TODO �ۺϸ�״̬�ж�
  687. //����������Ϊ�գ�����վ����Ч������״̬����
  688. if(!Task_HasTransport() && S.Point != NULL_POINT
  689. && (S.Status == STATUS_READY || S.Status == STATUS_RUN ||S.Status == STATUS_RUN_OBS_LOW_SPEED ||S.Status == STATUS_RUN_LOW_POWER)){
  690. return true;
  691. }
  692. return false;
  693. }
  694. /**
  695. * @funtion _GDActionProcess
  696. * @brief �ڵ㶯��ִ��
  697. * @Author Deman
  698. * @DateTime 2021.06.21-T15:15:53+0800
  699. *
  700. * @param action ��������
  701. * @return true �ɹ� falseʧ��
  702. */
  703. rt_inline bool _GDActionProcess(uint8_t action)
  704. {
  705. bool result = false;
  706. switch(action){
  707. case TASK_ACT_NULL:
  708. result = true;
  709. break;
  710. case TASK_ACT_PICKUP:
  711. result = Cargo_Pickup();
  712. break;
  713. case TASK_ACT_RELEASE:
  714. result = Cargo_Release();
  715. break;
  716. case TASK_ACT_STEER_RAMP:
  717. // LOG_I("do act chang lr");
  718. result = Dir_Lift_LR();
  719. break;
  720. case TASK_ACT_TUNNEL:
  721. result = Dir_Lift_FB();
  722. break;
  723. case TASK_ACT_OPEN_CHARGE:
  724. BTY_AUTO_ON;
  725. result = true;
  726. break;
  727. case TASK_ACT_CLOSE_CHARGE:
  728. BTY_AUTO_OFF;
  729. result = true;
  730. break;
  731. default:
  732. result = true;
  733. }
  734. return result;
  735. }
  736. /**
  737. * @funtion _GDPublishTaskStatus
  738. * @brief ��������״̬���ϲ�
  739. * @Author Deman
  740. * @DateTime 2021.06.21-T15:14:31+0800
  741. *
  742. */
  743. rt_inline void _GDPublishTaskStatus(void)
  744. {
  745. uint8_t status;
  746. point_t cur_point;
  747. cur_point = station2Point(S.Point,S.cValue);
  748. switch(S.Status){
  749. case STATUS_INIT:
  750. status = PUBLISHTASKSTA_PAUSE;
  751. break;
  752. case STATUS_READY:
  753. status = PUBLISHTASKSTA_FINISH;
  754. break;
  755. case STATUS_RUN:
  756. case STATUS_RUN_OBS_LOW_SPEED:
  757. case STATUS_RUN_LOW_POWER:
  758. if(Task_HasTransport()){
  759. status = PUBLISHTASKSTA_CARRERYING;
  760. task_set_status(status, cur_point);
  761. }
  762. break;
  763. case STATUS_STOP_OBS:
  764. case STATUS_ESTOP:
  765. case STATUS_REMOTE_MANUAL:
  766. default:
  767. status = PUBLISHTASKSTA_PAUSE;
  768. task_set_status(status, cur_point);
  769. }
  770. }
  771. /**
  772. * @funtion _GDAddTask
  773. * @brief ���ϲ��ȡ�Ĺ켣����ӵ���������
  774. * @Author Deman
  775. * @DateTime 2021.06.21-T16:04:29+0800
  776. *
  777. */
  778. rt_inline void _GDAddTask(void) /* 导航增加任务 */
  779. {
  780. point_t trajectory[TASK_MAX_POINT];
  781. point_t cur_point;
  782. uint8_t point_num;
  783. uint8_t i;
  784. cur_point = station2Point(S.Point,S.cValue);
  785. if(_GDReady()){
  786. point_num = task_get(cur_point, trajectory);
  787. if(point_num > 0 && point_num <= TASK_MAX_POINT){
  788. for(i = 0;i < point_num;i++){
  789. TASK_Transport_t task;
  790. sprintf(task.Id,"%3d%3d%3d%d",trajectory[i].z, trajectory[i].x, trajectory[i].y,trajectory[i].action);
  791. task.Dst = point2Station(trajectory[i]);
  792. task.DstFloor = trajectory[i].z;
  793. task.Act = trajectory[i].action;
  794. Task_AddTransport(task);
  795. }
  796. }
  797. }
  798. }