ChargeJob.cs 3.7 KB
using DeviceLib.Model.AGV;

namespace DeviceLib.BLL
{
    public class ChargeJob : ImpJob
    {
        public ChargeJob(JobParam jobParam) : base(jobParam)
        {
            JobName = "充电任务";
        }

        public override Job Run(Robot robot)
        {
            Job job = this;
            switch (JobRunStep.CurStep)
            {
                case RunStep.None:
                    ToNextStep(RunStep.Charge_01_Start, $"开始充电任务");
                    break;
                case RunStep.Charge_01_Start:
                    //    ToNextStep(RunStep.DeliverShelf_02_CrossDoor, $"准备去目标车间");
                    //    GenJobCallBack(this.GetType(), RunStep.Charge_03_CrossDoorSuccess, JobParam);
                    //    job = new CrossDoorJob(JobParam);
                    //    break;
                    ////case RunStep.Charge_02_CrossDoor:
                    ////    break;
                    //case RunStep.Charge_03_CrossDoorSuccess:
                    ToNextStep(RunStep.Charge_04_ToDst, $"准备去充电桩");
                    MoveToNode(robot, JobParam.CurDstNode);
                    break;
                case RunStep.Charge_04_ToDst:
                    ToNextStep(RunStep.Charge_05_Charging, $"到达充电桩");
                    StartCharge(robot);
                    break;
                case RunStep.Charge_05_Charging:
                    if (ChargeOk(robot))
                    {
                        ToNextStep(RunStep.Charge_07_ChargingSuccess, $"充电中...");
                        SetRobotState(robot, RobotState.充电中);
                    }
                    else if (JobRunStep.IsTimeOut(60))
                    {
                        ToNextStep(RunStep.Charge_06_ChargingError, $"充电失败");
                    }
                    break;
                case RunStep.Charge_06_ChargingError:
                    ToNextStep(RunStep.Charge_05_Charging, $"重新尝试充电");
                    StartCharge(robot);
                    break;
                case RunStep.Charge_07_ChargingSuccess:
                    //该机器人已经开始充电,找到其他电量低于当前车电量的小车
                    if (ChargeStandJobType.FindOtherLowerRobor(robot))
                    {
                        ToNextStep(RunStep.Charge_08_LeaveCharge, $"发现其他低电量的机器人");
                        MoveToNode(robot, Common.Setting_Str.standby);
                    }
                    else if (ChargeStandJobType.CanSearchJob(robot))//电量大于最低电量,搜索运输任务
                    {
                        bool newJob = JobManager.CheckNewJob(robot);
                        if (newJob)
                        {
                            ToNextStep(RunStep.Charge_08_LeaveCharge, $"检测到运输任务");
                            MoveToNode(robot, Common.Setting_Str.standby);
                        }
                    }
                    else if (ChargeStandJobType.CanCancelCharge(robot))//充电完成
                    {
                        ToNextStep(RunStep.Charge_08_LeaveCharge, $"电量充足");
                        MoveToNode(robot, Common.Setting_Str.standby);
                    }
                    break;
                case RunStep.Charge_08_LeaveCharge:
                    if (MissionIsOk())
                        ToNextStep(RunStep.Charge_09_End, $"充电结束,小车离开充电桩");
                    break;
                case RunStep.Charge_09_End:
                    SetRobotState(robot, RobotState.空闲);
                    job = null;
                    break;
            }
            return job;
        }


    }
}