| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549 | /******************************************************************************************* * @file command.c * * @brief 小车指令 * *               (c) Copyright 2021, Shandong Huali electromechanical Co., Ltd.. *             This is protected by international copyright laws. Knowledge of the *             source code may not be used to write a similar product. This file may *             only be used in accordance with a license and should not be redistributed *             in any way. We appreciate your understanding and fairness. * * * @author      Simon * @date        Created: 2021.06.17-T14:17:29+0800 ********************************************************************************************/#include "rtthread.h"#include "lwip/netdb.h"#include "stdint.h"#include "wcs.h"#include "task_scheduler.h"#include "board.h"#include "env.h"#include "cargo.h"#include "guide.h"#include "lift.h"#include "music.h"#include "dm_scaner.h"#define DBG_TAG                "wcs.cmd"#define DBG_LVL           DBG_LOG#include <rtdbg.h>#define CMD_USING_TASKenum{    WCS_CMD_PICK = 0x01,	    /* 托盘取货 */    WCS_CMD_RELEASE = 0x02,	    /* 托盘放货 */    WCS_CMD_OPEN_CHARGE = 0x03,	    /* 开始充电 */    WCS_CMD_CLOSE_CHARGE = 0x04,	/* 关闭充电 */    WCS_CMD_STEER_RAMP = 0x05,	/* 换向到坡道 */    WCS_CMD_STEER_TUNNEL = 0x06,/* 换向到巷道 */    WCS_CMD_PALLET_CAL = 0x08,	/* 托盘校准 */    WCS_CMD_PALLET_CAL_LIFT = 0x09,	/* 托盘校准+托盘顶升 *///    WCS_CMD_FORWARD_DST = 0x11,	/* 按1方向距离行驶 *///    WCS_CMD_BACKWARD_DST = 0x12,	/* 按2方向距离行驶 *///    WCS_CMD_LEFT_DST = 0x13,	/* 按3方向距离行驶 *///    WCS_CMD_RIGHT_DST = 0x14,	/* 按4方向距离行驶 *///    WCS_CMD_SYNC_TIME = 0x15,	/* 时间同步 */    WCS_CMD_FORWARD_AUTO = 0x31,/* 1方向长感应停 */    WCS_CMD_BACKWARD_AUTO = 0x32,/* 2方向长感应停 */    WCS_CMD_LEFT_AUTO = 0x33,	/* 3方向长感应停 */    WCS_CMD_RIGHT_AUTO = 0x34,	/* 4方向长感应停 */    WCS_CMD_FORWARD_SPD = 0x41,	/* 按1方向速度行驶 */    WCS_CMD_BACKWARD_SPD = 0x42,/* 按2方向速度行驶 */    WCS_CMD_LEFT_SPD = 0x43,	/* 按3方向速度行驶 */    WCS_CMD_RIGHT_SPD = 0x44,	/* 按4方向速度行驶 */    WCS_CMD_RELOCATE = 0x50,	/* 更改小车坐标 */    WCS_CMD_CAL_LOCAT = 0x51,	/* 校准位置 */    WCS_CMD_STOP = 0x81,	    /* 小车急停 */    WCS_CMD_RECOVERY = 0x82,	/* 小车暂停恢复 *///    WCS_CMD_SPD = 0x83,	        /* 更改小车行驶速度 *///    WCS_CMD_SPD_AT_AREA = 0x84,	/* 更改小车特殊位置行驶速度 */    WCS_CMD_OPEN_BEEP = 0x85,	/* 打开小车蜂鸣器 */    WCS_CMD_CLOSE_BEEP = 0x86,	/* 关闭小车蜂鸣器 */    WCS_CMD_PAUSE = 0x87,	    /* 小车行驶暂停 *///    WCS_CMD_PAUSE_AT_SPD = 0x88,/* 小车按速度停止 */    WCS_CMD_INIT = 0x8e,	    /* 初始化指令 */    WCS_CMD_CANCEL = 0x8f,	    /* 任务撤销 */    WCS_CMD_CHK_PALLET = 0x91,	/* 查询小车托盘有无 */    WCS_CMD_LIFT_FLOOR = 0x92,	/* 下发提升机当前层 *///    WCS_CMD_SHUTDOWN = 0x96,	/* 小车系统关机 */    WCS_CMD_REBOOT = 0x97,	    /* 小车系统重启 *///    WCS_CMD_UPDATE_MAP = 0x98,	/* 发送地图 */};typedef struct{    uint8_t cmd;    uint8_t cmd_no;    int status;    int result;    uint32_t timeout_tick;}cmd_delay_work_t;static cmd_delay_work_t cmd_delay_work = {0};static void (*cmd_clear_func)(void) = NULL;	/* 清状态回调函数,wcs.c调用 */__weak void Music_Enable(int enable){}/** * @funtion cmd_set_clear_indication * @brief 设置清状态回调函数 * @Author Simon * @DateTime 2021.06.25-T17:20:35+0800 * * @param   clear_func  description */void cmd_set_clear_indication(void (*clear_func)(void)){    cmd_clear_func = clear_func;}/** * @funtion cmd_set_point * @brief 更改小车坐标 * @Author Simon * @DateTime 2021.06.19-T15:29:34+0800 * * @param   point  坐标点 * @return  成功 */static int cmd_set_point(uint32_t point){    wcs_point_t *ppoint;    point = point >> 8;    ppoint = (wcs_point_t *)&point;    S.xValue = ppoint->x;    S.yValue = ppoint->y;    S.cValue = ppoint->z;	if(ppoint->z)	scan.Set_cValue = ppoint->z;	else	LOG_D("wcs Set err cValue");    return ERR_C_SYSTEM_SUCCESS;}static int cmd_cancel_task(void){    if(task_cancel(0) < 0)        return ERR_C_RES_REVOCATION;    return ERR_C_SYSTEM_SUCCESS;}static int cmd_initial(void){    if(S.Status != STATUS_ESTOP)        S.Status = STATUS_INIT;    if(cmd_clear_func)    {        cmd_clear_func();    }    if(task_cancel(1) < 0)        return ERR_C_RES_REVOCATION;    GDClearPauseTask();    Lift_ManualDown();    cmd_delay_work.cmd = WCS_CMD_INIT;    cmd_delay_work.status = 0;    cmd_delay_work.result = ERR_C_SYSTEM_RECV_SUCCESS;    cmd_delay_work.timeout_tick = rt_tick_get() + 5000;    return ERR_C_SYSTEM_RECV_SUCCESS;}static void cmd_initial_delay_work(void){    if(Lift_ManualDown())    {        cmd_delay_work.result = ERR_C_SYSTEM_SUCCESS;    }    else    {        if(rt_tick_get() > cmd_delay_work.timeout_tick)        {            cmd_delay_work.result = ERR_C_RES_TRAVEL_TIME_OUT;            LOG_W("release timeout");        }    }}static int cmd_pickup(void){    Lift_ManualUp();    cmd_delay_work.cmd = WCS_CMD_PICK;    cmd_delay_work.status = 0;    cmd_delay_work.result = ERR_C_SYSTEM_RECV_SUCCESS;    cmd_delay_work.timeout_tick = rt_tick_get() + 5000;    return ERR_C_SYSTEM_RECV_SUCCESS;}static void cmd_pickup_delay_work(void){    if(Lift_ManualUp())    {        cmd_delay_work.result = ERR_C_SYSTEM_SUCCESS;    }    else    {        if(rt_tick_get() > cmd_delay_work.timeout_tick)        {            cmd_delay_work.result = ERR_C_RES_TRAVEL_TIME_OUT;            LOG_W("pickup timeout");        }    }}static int cmd_release(void){    Lift_ManualDown();    cmd_delay_work.cmd = WCS_CMD_RELEASE;    cmd_delay_work.status = 0;    cmd_delay_work.result = ERR_C_SYSTEM_RECV_SUCCESS;    cmd_delay_work.timeout_tick = rt_tick_get() + 5000;    return ERR_C_SYSTEM_RECV_SUCCESS;}static void cmd_release_delay_work(void){    if(Lift_ManualDown())    {        cmd_delay_work.result = ERR_C_SYSTEM_SUCCESS;    }    else    {        if(rt_tick_get() > cmd_delay_work.timeout_tick)        {            cmd_delay_work.result = ERR_C_RES_TRAVEL_TIME_OUT;            LOG_W("release timeout");        }    }}static int cmd_charge_open(void){    BTY_AUTO_ON;    return ERR_C_SYSTEM_SUCCESS;}static int cmd_charge_close(void){    BTY_AUTO_OFF;    return ERR_C_SYSTEM_SUCCESS;}static int cmd_ramp(void){    Dir_Lift_LR();	//BUG2,左右换向    cmd_delay_work.cmd = WCS_CMD_STEER_RAMP;    cmd_delay_work.status = 0;    cmd_delay_work.result = ERR_C_SYSTEM_RECV_SUCCESS;    cmd_delay_work.timeout_tick = rt_tick_get() + 5000;    return ERR_C_SYSTEM_RECV_SUCCESS;}static void cmd_ramp_delay_work(void){    if(Dir_Lift_LR())//BUG2左右换向    {        cmd_delay_work.result = ERR_C_SYSTEM_SUCCESS;    }    else    {        if(rt_tick_get() > cmd_delay_work.timeout_tick)        {            cmd_delay_work.result = ERR_C_RES_TRAVEL_TIME_OUT;            LOG_W("steer ramp timeout");        }    }}static int cmd_tunnel(void){    Dir_Lift_FB();//BUG2    cmd_delay_work.cmd = WCS_CMD_STEER_TUNNEL;    cmd_delay_work.status = 0;    cmd_delay_work.result = ERR_C_SYSTEM_RECV_SUCCESS;    cmd_delay_work.timeout_tick = rt_tick_get() + 5000;    return ERR_C_SYSTEM_RECV_SUCCESS;}static void cmd_tunnel_delay_work(void){    if(Dir_Lift_FB())//BUG2    {        cmd_delay_work.result = ERR_C_SYSTEM_SUCCESS;    }    else    {        if(rt_tick_get() > cmd_delay_work.timeout_tick)        {            cmd_delay_work.result = ERR_C_RES_TRAVEL_TIME_OUT;            LOG_W("steer tunnel timeout");        }    }}static void cmd_reboot(void){    cmd_delay_work.cmd = WCS_CMD_REBOOT;    cmd_delay_work.status = 0;    cmd_delay_work.result = ERR_C_SYSTEM_RECV_SUCCESS;    cmd_delay_work.timeout_tick = rt_tick_get() + 1000;}static void cmd_reboot_delay_work(void){    if(rt_tick_get() > cmd_delay_work.timeout_tick)    {        LOG_I("reboot now...");        rt_hw_cpu_reset();    }}int cmd_parser(uint8_t cmd_no, uint8_t cmd, uint32_t *param){    int rc = ERR_C_TRAVEL_ERR_HAVE_NOCMD;    if(cmd_delay_work.cmd == cmd)    {        return ERR_C_TRAVEL_ERR_CMDREP;    }    cmd_delay_work.cmd_no = cmd_no;    switch(cmd)    {        case WCS_CMD_RELOCATE:            rc = cmd_set_point(*param);            break;        case WCS_CMD_STOP:            GDEStop();            rc = ERR_C_SYSTEM_SUCCESS;            break;        case WCS_CMD_PAUSE:            GDPause();            rc = ERR_C_SYSTEM_SUCCESS;            break;        case WCS_CMD_RECOVERY:            GDResume();            rc = ERR_C_SYSTEM_SUCCESS;            break;        case WCS_CMD_LIFT_FLOOR:            S.TsjFloorStatus = ntohl(*param);            rc = ERR_C_SYSTEM_SUCCESS;            break;        case WCS_CMD_CHK_PALLET:            if(S.CargoStatus == CARGO_STATUS_CENTER || S.CargoStatus == CARGO_STATUS_SIDE)            {                *param = htonl(1);            }            else            {                *param = 0;            }            rc = ERR_C_SYSTEM_SUCCESS;            break;        case WCS_CMD_OPEN_BEEP:            Music_Enable(1);            rc = ERR_C_SYSTEM_SUCCESS;            break;        case WCS_CMD_CLOSE_BEEP:            Music_Enable(0);            rc = ERR_C_SYSTEM_SUCCESS;            break;        /* 任务执行中返回ERR_C_RES_TASK_DOING */        case WCS_CMD_PICK:        case WCS_CMD_RELEASE:        case WCS_CMD_OPEN_CHARGE:        case WCS_CMD_CLOSE_CHARGE:        case WCS_CMD_STEER_RAMP:        case WCS_CMD_STEER_TUNNEL:        case WCS_CMD_FORWARD_SPD:        case WCS_CMD_FORWARD_AUTO:        case WCS_CMD_BACKWARD_SPD:        case WCS_CMD_BACKWARD_AUTO:        case WCS_CMD_LEFT_SPD:        case WCS_CMD_LEFT_AUTO:        case WCS_CMD_RIGHT_SPD:        case WCS_CMD_RIGHT_AUTO:        case WCS_CMD_REBOOT:        case WCS_CMD_PALLET_CAL:        case WCS_CMD_CAL_LOCAT:        case WCS_CMD_CANCEL:        case WCS_CMD_INIT:            if(task_get_status() == TASK_STATUS_EXE || task_get_status() == TASK_STATUS_PAUSE)            {                rc = ERR_C_RES_TASK_DOING;            }            break;        default:            break;    }    if(cmd == WCS_CMD_INIT)    {        if(task_get_status() != TASK_STATUS_EXE)        {            rc = cmd_initial();        }        else        {            rc = ERR_C_RES_TASK_DOING;        }    }    if(task_get_status() != TASK_STATUS_EXE && task_get_status() != TASK_STATUS_PAUSE)    {        switch(cmd)        {            case WCS_CMD_PICK:                rc = cmd_pickup();                break;            case WCS_CMD_RELEASE:                rc = cmd_release();                break;            case WCS_CMD_OPEN_CHARGE:                rc = cmd_charge_open();                break;            case WCS_CMD_CLOSE_CHARGE:                rc = cmd_charge_close();                break;            case WCS_CMD_STEER_RAMP:                rc = cmd_ramp();                break;            case WCS_CMD_STEER_TUNNEL:                rc = cmd_tunnel();                break;            case WCS_CMD_FORWARD_SPD:            case WCS_CMD_FORWARD_AUTO:                GD_ManualForward();                rc = ERR_C_SYSTEM_SUCCESS;                break;            case WCS_CMD_BACKWARD_SPD:            case WCS_CMD_BACKWARD_AUTO:                GD_ManualBackward();                rc = ERR_C_SYSTEM_SUCCESS;                break;            case WCS_CMD_LEFT_SPD:            case WCS_CMD_LEFT_AUTO:                GD_ManualDriftLeft();                rc = ERR_C_SYSTEM_SUCCESS;                break;            case WCS_CMD_RIGHT_SPD:            case WCS_CMD_RIGHT_AUTO:                GD_ManualDriftRight();                rc = ERR_C_SYSTEM_SUCCESS;                break;            case WCS_CMD_REBOOT:                cmd_reboot();                rc = ERR_C_SYSTEM_SUCCESS;                break;            case WCS_CMD_PALLET_CAL:                rc = ERR_C_SYSTEM_SUCCESS;                break;            case WCS_CMD_CAL_LOCAT:                rc = ERR_C_SYSTEM_SUCCESS;                break;            case WCS_CMD_CANCEL:                rc = cmd_cancel_task();                break;            default:                break;        }    }    return rc;}/** * @funtion cmd_work_result * @brief description * @Author Simon * @DateTime 2021.06.25-T9:33:43+0800 * * @param   cmd_no  指令序号输出 * @return  >=0 指令完成结果, -1 无指令 */int cmd_work_result(uint8_t *cmd_no){    int rc = -1;    if(cmd_delay_work.cmd)    {        if(cmd_no)        {            *cmd_no = cmd_delay_work.cmd_no;        }        rc = cmd_delay_work.result;        if(rc == ERR_C_SYSTEM_SUCCESS && cmd_no)        {            memset(&cmd_delay_work, 0, sizeof(cmd_delay_work_t));        }        /**///        if(rc == ERR_C_SYSTEM_RECV_SUCCESS)//        {//            rc = ERR_C_SYSTEM_SUCCESS;//        }    }    return rc;}/** * @funtion cmd_delay_task * @brief 创建任务运行或放主循环运行 * @Author Simon * @DateTime 2021.06.19-T18:16:51+0800 * */void cmd_delay_task(void){    switch(cmd_delay_work.cmd)    {        case WCS_CMD_PICK:            cmd_pickup_delay_work();            break;        case WCS_CMD_RELEASE:            cmd_release_delay_work();            break;        case WCS_CMD_STEER_RAMP:            cmd_ramp_delay_work();            break;        case WCS_CMD_STEER_TUNNEL:            cmd_tunnel_delay_work();            break;        case WCS_CMD_REBOOT:            cmd_reboot_delay_work();            break;        case WCS_CMD_INIT:            cmd_initial_delay_work();            break;        default:            break;    }}#ifdef CMD_USING_TASKstatic void cmd_task(void *param){    while(1)    {        cmd_delay_task();        rt_thread_delay(100);    }}static int cmd_init(void){    static rt_thread_t tid;    tid = rt_thread_create("wcs_cmd", cmd_task, NULL, 512, 15, 10);    if(tid)    {        rt_thread_startup(tid);    }    return RT_EOK;}INIT_APP_EXPORT(cmd_init);#endif
 |