| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832 | /* ********************************************************************************************************* *                                                xmk guide *                                          huali xmk guide process * *                                 (c) Copyright 2016-2020, hualijidian.com *                                           All Rights Reserved * * File    : guide.c * By      : eric * Version : V0.0.1 ********************************************************************************************************* */#include "stdio.h"#include "ctype.h"#include "env.h"#include "guide.h"#include "cargo.h"#include "screen.h"#include "music.h"#include "driver.h"#include "apptask.h"#include "lift.h"#include "obs.h"#include "hardware.h"#include "demotask.h"#include "dm_scaner.h"#include "task_scheduler.h"#include "systick.h"#include "chassis_bus.h"#include "bms.h"#define DBG_SECTION_NAME  "guide"#define DBG_LEVEL         DBG_INFO#include <rtdbg.h>enum{  PUBLISHTASKSTA_CARRERYING,      //ִ����  PUBLISHTASKSTA_FINISH,          //���  PUBLISHTASKSTA_PAUSE            //��ͣ};/* ********************************************************************************************************* *                                            GLOBAL VARIABLES ********************************************************************************************************* *//*�����ٶ�*/uint32_t loopTime1s_Auto_Charge;uint32_t Timer_Auto_Charge = 0;/** * @brief ������ * @param * @retval * @note */rt_inline void _batteryProcess(void);rt_inline void _Timer_Charge(void);rt_inline void _Test_Print(void);/** * @brief ����״̬���þ�ʾ�� * @param * @retval *///rt_inline uint8_t _collectStatus(void);rt_inline uint8_t _navToStation(uint32_t station);rt_inline uint8_t _prepare(void);rt_inline void _run(void);rt_inline void collectTaskInfo(void);rt_inline bool _GDReady(void);rt_inline bool _GDActionProcess(uint8_t action);rt_inline void _GDAddTask(void);rt_inline void _GDPublishTaskStatus(void);rt_inline point_t station2Point(int station_xy,int station_z);void GDCruise(void *param){    uint32_t loopTime1s;    while(1)    {        loopTime1s++;//        _Adcc();	Bug0018        if(S.DRStatus == DR_STATUS_INIT){			if(S.Status != STATUS_ESTOP)            S.Status = STATUS_INIT;	//        }        //CanSendProcess(CAN1);        if((loopTime1s % 10) == 0)        {            /* ÿ��ִ��һ�� */            _batteryProcess();	//电池进程            //_Auto_Charge();            //_Timer_Charge();            //CscSendStatusToTsj();            _GDAddTask();	//GD            _GDPublishTaskStatus();	//打印任务状态        }        Dir_Lift_Process();		//顶升进程        Cargo_Process();	//货物的进程        Dir_Lift_LR_Timer();	//延时到位        Dir_Lift_FB_Timer();	        //_Test_Print();        //Demo_Task();        Screen_SetCode(S.Status);	        /* ����״̬  */        collectTaskInfo();	//收集任务信息        switch(S.Status){        case STATUS_INIT:            DRSetAction(ACT_STOP);            if(_prepare()){                LOG_D("Status INIT-> READY");				if(S.Status != STATUS_ESTOP)                S.Status = STATUS_READY;            }            break;        case STATUS_READY:            if(Task_HasTransport()){                LOG_D("Status STOP-> RUN");				if(S.Status != STATUS_ESTOP && S.Status != STATUS_REMOTE_MANUAL)                S.Status = STATUS_RUN;                break;            }    //        DRSetAction(ACT_STOP);            Screen_Icon_Run(Icon_Stop);            Screen_Icon_Speed(Icon_Clear);            break;        case STATUS_RUN:	//状态是运行            SetSpeed(Cfg.Speed);            _run();            Screen_Icon_Run(Icon_Run);            Screen_Icon_Speed(Icon_Hign_Speed);            Screen_Icon_Warn(Icon_Clear);            break;        case STATUS_STOP_OBS:            Screen_Icon_Speed(Icon_Mid_Speed);            Screen_Icon_Warn(Icon_Warn);            _run();            break;        case STATUS_RUN_OBS_LOW_SPEED:	//obs            SetSpeed(Cfg.SpdNear);            _run();            Screen_Icon_Speed(Icon_Mid_Speed);            Screen_Icon_Warn(Icon_Warn);            break;        case STATUS_RUN_LOW_POWER:            _run();            break;        case STATUS_ESTOP:            DRSetAction(ACT_BRAKE);            Screen_Icon_Run(Icon_Stop);            break;        case STATUS_REMOTE_MANUAL:            S.DemoTaskStatus = STATUS_INIT;            break;        default:            DRSetAction(ACT_STOP);        }        rt_thread_mdelay(100);    }}int GDInit(void){    rt_thread_t tid;	if(S.Status != STATUS_ESTOP)    S.Status = STATUS_INIT;    Set_Init();//    RoadInfo_Init();    Cargo_Init();    ObsInit();    Lift_Init();    tid = rt_thread_create("nav", GDCruise, RT_NULL, 4096, 10, 5);    if (tid != RT_NULL)    {        rt_thread_startup(tid);    }    LOG_D("Guide inited!");    return 0;}INIT_APP_EXPORT(GDInit);rt_inline uint8_t _prepare(void) {    if(S.DRStatus == DR_STATUS_RUN){        return 1;    }    return 0;}rt_inline uint8_t _transportProcess(TASK_Transport_t *task) {    static TASK_Transport_t *preTask = NULL;    if(task != preTask){        LOG_D("transport to %d", task->Dst);        preTask = task;    }    switch(Trans.Status){    case TRANS_STATUS_INIT:{            int target_PointXY = (task->Dst);            //if(Cargo_ToHomePos())            /*���Ŀ��㲻��������������Ŀ��������������ҵ�ǰ�������������ڵ�ǰС������*/            if((target_PointXY != Set.TsjStation) || ((target_PointXY == Set.TsjStation) && S.cValue == S.TsjFloorStatus))                Trans.Status = TRANS_STATUS_TO_DST;        }        break;    case TRANS_STATUS_TO_DST:        if(_navToStation(task->Dst)){            Trans.Status = TRANS_STATUS_ACTION;        }        break;    case TRANS_STATUS_ACTION:        if(_GDActionProcess(task->Act)){	//执行动作            LOG_I("guide task action type:%d\r\n",task->Act);	//打印动作            Trans.Status = TRANS_STATUS_INIT;            Task_FinishCurTransport();            S.Status = STATUS_READY;            if(!Task_HasTransport()){                task_set_status(PUBLISHTASKSTA_FINISH, station2Point(S.Point,S.cValue));                LOG_I("guide task finish\r\n");            }            return 1;        }        break;    default:        Trans.Status = TRANS_STATUS_INIT;    }    return 0;}rt_inline void _run(void) {    TASK_Transport_t *curTransport = NULL;    /* ����������� */    curTransport = Task_GetCurTransport();	//获取当前运输值    if(curTransport != NULL){        _transportProcess(curTransport);	//根据运输值做动作        return;    }    return;}rt_inline void collectTaskInfo(void) {    TASK_Transport_t *curTransport = Task_GetCurTransport();    if(curTransport != NULL){        S.TaskId = curTransport->Id;        S.TaskStatus = Trans.Status;    }else{        S.TaskStatus = TRANS_STATUS_NULL;    }}rt_inline bool navToStationNav(uint32_t station) {	S.TgtStationXvalue = (S.TgtStation / 1000) % 1000;	S.TgtStationYvalue = S.TgtStation % 1000;//	S.TgtCvalue = (S.TgtStation / 1000 /1000) % 1000;//	LOG_I("S.TgtStationXvalue: %d\r\n",S.TgtStationXvalue);//	LOG_I("S.TgtStationYvalue: %d\r\n",S.TgtStationYvalue);//  S.AtStation = station;//********************************1Cto1C*********************************************************************************//    if(S.TgtCvalue == S.cValue){        if (S.Point == S.TgtStation ){        	switch(S.Action){        	case ACT_FORWARD:        		DRSetAction(ACT_FORWARD_STOP_CROSS);        		return 0;        	case ACT_BACKWARD:        		DRSetAction(ACT_BACKWARD_STOP_CROSS);        		return 0;        	case ACT_LEFT:        		DRSetAction(ACT_LEFT_STOP_CROSS);        		return 0;        	case ACT_RIGHT:        		DRSetAction(ACT_RIGHT_STOP_CROSS);        		return 0;            case ACT_RESET:        	case ACT_STOP:        		return 1;        	}        }//        if (S.yValue == S.RoadNum)        {            if (S.TgtStationYvalue > S.yValue)	//目标值大于y值			{            	if (S.DirStatus == DIR_STATUS_LR){            		if (Dir_Lift_LR()){                		DRSetAction(ACT_LEFT);                		S.DirPauseStatus = DIR_RUN_STATUS;            		}            	}else{            		if (drDirFbNav()){            			Dir_Lift_LR();            		}            	}            }            if (S.TgtStationYvalue < S.yValue)	//目标值大于y值			{            	if (S.DirStatus == DIR_STATUS_LR){            		if (Dir_Lift_LR()){                		DRSetAction(ACT_RIGHT);                		S.DirPauseStatus = DIR_RUN_STATUS;            		}            	}else{            		if (drDirFbNav()){            			Dir_Lift_LR();            		}            	}            }            if (S.TgtStationYvalue == S.yValue && S.TgtStationXvalue < S.xValue){            	if (S.DirStatus == DIR_STATUS_FB){            		if (Dir_Lift_FB()){            			DRSetAction(ACT_BACKWARD);                        S.DirPauseStatus = DIR_RUN_STATUS;            		}            	}else{            		if (drDirLrNav()){            			Dir_Lift_FB();            		}            	}            }            if (S.TgtStationXvalue == S.yValue && S.TgtStationXvalue > S.xValue){            	if (S.DirStatus == DIR_STATUS_FB){            		if (Dir_Lift_FB()){            			DRSetAction(ACT_FORWARD);                        S.DirPauseStatus = DIR_RUN_STATUS;            		}            	}else{            		if (drDirLrNav()){            			Dir_Lift_FB();            		}            	}            }        }        if (S.Point != S.TgtStation)        {        	if(S.yValue != S.TgtStationYvalue){        		if (S.DirStatus == DIR_STATUS_FB){        			DRSetAction(ACT_BACKWARD);        		}        		S.DirPauseStatus = DIR_RUN_STATUS;        	}        	if(S.yValue == S.TgtStationYvalue){        		if(S.xValue < S.TgtStationXvalue){        			if (S.DirStatus == DIR_STATUS_FB){        				DRSetAction(ACT_FORWARD);        			}            		S.DirPauseStatus = DIR_RUN_STATUS;        		}else{        			if (S.DirStatus == DIR_STATUS_FB){        				DRSetAction(ACT_BACKWARD);        			}            		S.DirPauseStatus = DIR_RUN_STATUS;        		}        	}        }//    }    return 0;}/** * @brief ������վ�� * @param * @retval 1������վ�㣬0��δ����վ�� */rt_inline uint8_t _navToStation(uint32_t station) {    if(S.TgtStation != station){        LOG_D("Nav to station %d", station);        S.TgtStation = station;        Screen_SetTarget(station);    }    if(S.Point == NULL_POINT){        DRSetAction(ACT_FORWARD);        S.NavStatus = NAV_STATUS_NAV;        return 0;    }    /* ����Ҫ��վʱ ����վ�㼴�� *///    if(inSt == 0){        if(navToStationNav(station)){            S.NavStatus = NAV_STATUS_STATION_IN;            return 1;        }        S.NavStatus = NAV_STATUS_NAV;        return 0;}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,        uint8_t d6, uint8_t d7){    struct rt_can_msg msg;    msg.id = id;    msg.len = 8;    msg.data[0] = d0;    msg.data[1] = d1;    msg.data[2] = d2;    msg.data[3] = d3;    msg.data[4] = d4;    msg.data[5] = d5;    msg.data[6] = d6;    msg.data[7] = d7;    chassis_bus_write(&msg, sizeof(msg));}void _Reset() {    DRSetAction(ACT_RESET);    LOG_D("DR_ACT_RESET");    S.Status = STATUS_READY;//    CanSendByte(0x171, 8, 0, 0x21, 0, 0x11,0,0x01, 0, 0x01);//    CanSendByte(0x172, 8, 0, 0x21, 0, 0x11,0,0x01, 0, 0x01);    CanSendByte(0x17a, 8, 0, 0x21, 0, 0x11,0,0x01, 0, 0x01);//    CanSendByte(0x17b, 8, 0, 0x21, 0, 0x11,0,0x01, 0, 0x01);//    CanSendByte(0x175, 8, 0, 0x21, 0, 0x11,0,0x01, 0, 0x01);}void GDStart(uint8_t FR) {    S.FR = FR;//	if(S.Status != STATUS_ESTOP && S.Status != STATUS_REMOTE_MANUAL)    S.Status = STATUS_RUN;    _Reset();}void GDStop(void) {	if(S.Status != STATUS_ESTOP && S.Status != STATUS_REMOTE_MANUAL)    S.Status = STATUS_READY;    DRSetAction(ACT_STOP);}void GDPause(void) {    LOG_D("GD_Pause");    if((S.Status != STATUS_STOP_OBS) && (S.Status != STATUS_RUN_OBS_LOW_SPEED)){        S.PreStatus = S.Status;    }	if(S.Status != STATUS_ESTOP && S.Status != STATUS_REMOTE_MANUAL)    S.Status = STATUS_STOP_OBS;}void GDLowSpeed(void) {    LOG_I("GD_LowSpeed");    switch(S.Status){    case STATUS_RUN:    case STATUS_RUN_LOW_POWER:        S.PreStatus = S.Status;		if(S.Status != STATUS_ESTOP && S.Status != STATUS_REMOTE_MANUAL)        S.Status = STATUS_RUN_OBS_LOW_SPEED;    }}/* ȥվ�� */void GDToStation(uint16_t station){    S.TgtStation = station;}void GDResume(void) {    if(S.Status == STATUS_STOP_OBS || S.Status == STATUS_RUN_OBS_LOW_SPEED){        if(S.Status != STATUS_ESTOP && S.Status != STATUS_REMOTE_MANUAL)		S.Status = S.PreStatus;    }}void GDEStop(void) {    S.Status = STATUS_ESTOP;    DRSetAction(ACT_BRAKE);}//void GDBreak(void) {//    S.Status = STATUS_BREAK;//    DRSetAction(ACT_BRAKE);//}uint8_t GDSetAction(uint8_t action) {    DRSetAction(action);    return true;}uint8_t GDSetStation(uint16_t station) {    S.TgtStation = station;    return true;}uint8_t GDSetSpeed(uint16_t speed) {    SetSpeed(speed);    return true;}void GD_ManualStop(void) {    S.Status = STATUS_REMOTE_MANUAL;    DRSetAction(ACT_MANUAL_STOP);}void GD_ManualForward(void) {	S.Status = STATUS_REMOTE_MANUAL;	if (S.DirStatus == DIR_STATUS_FB){		DRSetAction(ACT_MANUAL_FORWARD);	}}void GD_ManualBackward(void) {    S.Status = STATUS_REMOTE_MANUAL;	if (S.DirStatus == DIR_STATUS_FB){		DRSetAction(ACT_MANUAL_BACKWARD);	}}void GD_ManualLeftward(void) {    S.Status = STATUS_REMOTE_MANUAL;    DRSetAction(ACT_MANUAL_DRIFT_LEFT);}void GD_ManualRightward(void) {    S.Status = STATUS_REMOTE_MANUAL;    DRSetAction(ACT_MANUAL_DRIFT_RIGHT);}void GD_ManualDriftLeft(void) {    S.Status = STATUS_REMOTE_MANUAL;	if (S.DirStatus == DIR_STATUS_LR){		DRSetAction(ACT_MANUAL_DRIFT_LEFT);	}}void GD_ManualDriftRight(void) {    S.Status = STATUS_REMOTE_MANUAL;	if (S.DirStatus == DIR_STATUS_LR){		DRSetAction(ACT_MANUAL_DRIFT_RIGHT);	}}void GD_ManualRoteLeft(void) {    S.Status = STATUS_REMOTE_MANUAL;    DRSetAction(ACT_MANUAL_ROTATE_LEFT);}void GD_ManualRoteRight(void) {    S.Status = STATUS_REMOTE_MANUAL;    DRSetAction(ACT_MANUAL_ROTATE_RIGHT);}#define ASCII_TO_NUM3(a, b, c) TO_DIGIT((a))* 100+ TO_DIGIT((b)) * 10 + TO_DIGIT((c));uint8_t GDAddAsciiTrans(uint8_t* data, uint8_t len) {    TASK_Transport_t task;    // �ж������    if(len != 6){        LOG_E("TASK_ERROR_LEN %d", len);        return TASK_ERROR_LEN;    }    // �ж������Ƿ�ȫ������    if(!isdigit(            data[0]) || !isdigit(data[1]) || !isdigit(data[2])){        LOG_E("TASK_ERROR_SRC_NOT_NUM");        return TASK_ERROR_SRC_NOT_NUM;    }    task.Src = ASCII_TO_NUM3(data[0], data[1], data[2])    ;    if(!isdigit(            data[3]) || !isdigit(data[4]) || !isdigit(data[5])){        LOG_E("TASK_ERROR_DST_NOT_NUM");        return TASK_ERROR_DST_NOT_NUM;    }    task.Dst = ASCII_TO_NUM3(data[3], data[4], data[5])    ;		task.Id[0]='\0';    return Task_AddTransport(task);}uint8_t GDClearTask(void) {    //JsonPrintfToBuff("{\"t\":\"ClearTask\", \"r\":\"ok\"}");    return Task_ClearTransport();}void GDClearPauseTask(void) {    if(S.Status != STATUS_RUN        && S.Status != STATUS_RUN_OBS_LOW_SPEED        && S.Status != STATUS_RUN_LOW_POWER)    {        Task_ForceClear();		if(S.Status != STATUS_ESTOP && S.Status != STATUS_REMOTE_MANUAL)        S.Status = STATUS_READY;        Trans.Status = TRANS_STATUS_INIT;        task_set_status(PUBLISHTASKSTA_FINISH, station2Point(S.Point,S.cValue));        LOG_I("guide task finish\r\n");    }}rt_inline void _batteryProcess(void) {		if(get_bat_enable())	{		S.BatteryStatus = get_bat_rsoc();		if(S.BatteryStatus > 95)	Screen_Icon_Battery(Icon_Battery_100);		else			if(83 < S.BatteryStatus && S.BatteryStatus < 90)	Screen_Icon_Battery(Icon_Battery_80);		else		if(63 < S.BatteryStatus && S.BatteryStatus < 80)	Screen_Icon_Battery(Icon_Battery_60);		else		if(43 < S.BatteryStatus && S.BatteryStatus < 60)	Screen_Icon_Battery(Icon_Battery_40);		else		if(23 < S.BatteryStatus && S.BatteryStatus < 40)			{			Screen_Icon_Battery(Icon_Battery_20);			if(S.Status != STATUS_ESTOP && S.Status != STATUS_REMOTE_MANUAL)			S.Status = STATUS_RUN_LOW_POWER;		}		else		if(S.BatteryStatus < 20)			{			Screen_Icon_Battery(Icon_Battery_20);			if(S.Status != STATUS_ESTOP && S.Status != STATUS_REMOTE_MANUAL)			S.Status = STATUS_STOP_LOW_POWER;		}						}	else	{		if(S.BatteryVolt >= Cfg.VoltFull)		{			S.BatteryStatus = BATTERY_STATUS_FULL;			Screen_Icon_Battery(Icon_Battery_100);		}		else 		if(S.BatteryVolt >= Cfg.VoltHigh && S.BatteryVolt < Cfg.VoltFull-30)	//bug8		{			S.BatteryStatus = BATTERY_STATUS_HIGH;			Screen_Icon_Battery(Icon_Battery_80);		}		else 		if(S.BatteryVolt >= Cfg.VoltMid && S.BatteryVolt < Cfg.VoltHigh-30)	//bug8		{			S.BatteryStatus = BATTERY_STATUS_MID;			Screen_Icon_Battery(Icon_Battery_60);		}		else 		if(S.BatteryVolt >= Cfg.VoltLow && S.BatteryVolt < Cfg.VoltMid-30)	//bug8		{			S.BatteryStatus = BATTERY_STATUS_LOW;			Screen_Icon_Battery(Icon_Battery_40);		}		else 		if(S.BatteryVolt >= Cfg.VoltWarn && S.BatteryVolt < Cfg.VoltLow-30)	//bug8		{			S.BatteryStatus = BATTERY_STATUS_WARN;			Screen_Icon_Battery(Icon_Battery_20);			if(S.Status != STATUS_ESTOP && S.Status != STATUS_REMOTE_MANUAL)			S.Status = STATUS_RUN_LOW_POWER;		}		else		if(S.BatteryVolt < Cfg.VoltWarn-30)	//bug8		{			S.BatteryStatus = BATTERY_STATUS_STOP;			Screen_Icon_Battery(Icon_Battery_00);			if(S.Status != STATUS_ESTOP && S.Status != STATUS_REMOTE_MANUAL){								S.Status = STATUS_STOP_LOW_POWER;			}		}	}	//bms不行	if((S.Status == STATUS_RUN_LOW_POWER || S.Status == STATUS_STOP_LOW_POWER) && (S.BatteryStatus != BATTERY_STATUS_WARN)){	    if(S.Status != STATUS_ESTOP && S.Status != STATUS_REMOTE_MANUAL)		S.Status = STATUS_READY;	}    Screen_SetBatteryStatus(S.BatteryStatus);}rt_inline void _Timer_Charge(void) {//	LOG_I("Time: %d:%d:%d",S.HH,S.MM,S.SS);	switch(S.HH){	case 11:	case 17:		if (S.MM >30){			S.TimerChargeStatus = TIMER_STATUS_TO_CHARGE;		}		return;	case 13:	case 7:		if (S.MM >30){			S.TimerChargeStatus = TIMER_STATUS_TO_TASK;		}		return;	}}rt_inline void _Test_Print(void){	LOG_I("++++++++++++++++CscStatus+++++++++++++++++ \r\n");	LOG_I("S.CscStatus:%d \r\n",S.Status);	LOG_I("S.CscCvalue:%d \r\n",S.cValue);	LOG_I("S.TgtCvalue:%d \r\n",S.TgtCvalue);	LOG_I("++++++++++++++++TsjStatus+++++++++++++++++ \r\n");	LOG_I("TsjId:%d \r\n",S.TsjId);	LOG_I("TsjStatus:%d \r\n",S.TsjStatus);	LOG_I("TsjFloorStatus:%d \r\n",S.TsjFloorStatus);}/** * @funtion point2Station * @brief ������ʽת�� * @Author Deman * @DateTime 2021.06.21-T15:21:33+0800 * * @param   point  �ڵ�ṹ�� * @return  ����     zxy */rt_inline uint32_t point2Station(point_t point){    return (point.x*1000+point.y);}/** * @funtion station2Point * @brief ������ʽת�� xy z -> point_t * @Author Deman * @DateTime 2021.06.21-T15:17:53+0800 * * @param   station_xy  ����x,y * @param   station_z  ����z * @return  �ڵ�ṹ�� */rt_inline point_t station2Point(int station_xy,int station_z){    point_t point;    point.x = (station_xy / 1000) % 1000;    point.y = station_xy % 1000;    point.z = station_z;    point.action = 0;    return point;}/** * @funtion _GDReady * @brief �ۺϴ���״̬���ж��Ƿ������û�ȡ�ڵ�켣������ * @Author Deman * @DateTime 2021.06.21-T16:03:10+0800 * * @return  true ������ false δ���� */rt_inline bool _GDReady(void){    //TODO �ۺϸ�״̬�ж�    //����������Ϊ�գ�����վ����Ч������״̬����    if(!Task_HasTransport() && S.Point != NULL_POINT        && (S.Status == STATUS_READY || S.Status == STATUS_RUN ||S.Status == STATUS_RUN_OBS_LOW_SPEED ||S.Status == STATUS_RUN_LOW_POWER)){        return true;        }    return false;}/** * @funtion _GDActionProcess * @brief �ڵ㶯��ִ�� * @Author Deman * @DateTime 2021.06.21-T15:15:53+0800 * * @param   action  �������� * @return  true �ɹ� falseʧ�� */rt_inline bool _GDActionProcess(uint8_t action){    bool result = false;    switch(action){    case TASK_ACT_NULL:        result = true;        break;    case TASK_ACT_PICKUP:        result = Cargo_Pickup();        break;    case TASK_ACT_RELEASE:        result = Cargo_Release();        break;    case TASK_ACT_STEER_RAMP://			LOG_I("do act chang lr");            result = Dir_Lift_LR();        break;    case TASK_ACT_TUNNEL:        result = Dir_Lift_FB();        break;    case TASK_ACT_OPEN_CHARGE:        BTY_AUTO_ON;        result = true;        break;    case TASK_ACT_CLOSE_CHARGE:        BTY_AUTO_OFF;        result = true;        break;    default:        result = true;    }    return result;}/** * @funtion _GDPublishTaskStatus * @brief ��������״̬���ϲ� * @Author Deman * @DateTime 2021.06.21-T15:14:31+0800 * */rt_inline void _GDPublishTaskStatus(void){    uint8_t status;    point_t cur_point;    cur_point = station2Point(S.Point,S.cValue);    switch(S.Status){        case STATUS_INIT:            status = PUBLISHTASKSTA_PAUSE;            break;        case STATUS_READY:            status = PUBLISHTASKSTA_FINISH;            break;        case STATUS_RUN:        case STATUS_RUN_OBS_LOW_SPEED:        case STATUS_RUN_LOW_POWER:            if(Task_HasTransport()){                status = PUBLISHTASKSTA_CARRERYING;                task_set_status(status, cur_point);            }            break;        case STATUS_STOP_OBS:        case STATUS_ESTOP:        case STATUS_REMOTE_MANUAL:        default:            status = PUBLISHTASKSTA_PAUSE;            task_set_status(status, cur_point);    }}/** * @funtion _GDAddTask * @brief ���ϲ��ȡ�Ĺ켣����ӵ��������� * @Author Deman * @DateTime 2021.06.21-T16:04:29+0800 * */rt_inline void _GDAddTask(void)		/* 导航增加任务 */{    point_t trajectory[TASK_MAX_POINT];    point_t cur_point;    uint8_t point_num;    uint8_t i;    cur_point = station2Point(S.Point,S.cValue);    if(_GDReady()){        point_num = task_get(cur_point, trajectory);        if(point_num > 0 && point_num <= TASK_MAX_POINT){            for(i = 0;i < point_num;i++){                TASK_Transport_t task;                sprintf(task.Id,"%3d%3d%3d%d",trajectory[i].z, trajectory[i].x, trajectory[i].y,trajectory[i].action);                task.Dst = point2Station(trajectory[i]);                task.DstFloor = trajectory[i].z;                task.Act = trajectory[i].action;                Task_AddTransport(task);            }        }   }}
 |