|
|
@ -2,7 +2,7 @@ package com.galaxis.rcs.ptr; |
|
|
|
|
|
|
|
|
import com.fasterxml.jackson.annotation.JsonIgnore; |
|
|
import com.fasterxml.jackson.annotation.JsonIgnore; |
|
|
import com.galaxis.rcs.common.entity.RcsTaskPlan; |
|
|
import com.galaxis.rcs.common.entity.RcsTaskPlan; |
|
|
import com.galaxis.rcs.common.enums.AgvEventType; |
|
|
import com.yvan.event.AgvEventType; |
|
|
import com.galaxis.rcs.common.enums.LCCDirection; |
|
|
import com.galaxis.rcs.common.enums.LCCDirection; |
|
|
import com.galaxis.rcs.common.enums.PlanTaskStatus; |
|
|
import com.galaxis.rcs.common.enums.PlanTaskStatus; |
|
|
import com.galaxis.rcs.common.enums.PlanTaskType; |
|
|
import com.galaxis.rcs.common.enums.PlanTaskType; |
|
|
@ -15,6 +15,7 @@ import com.galaxis.rcs.ptr.sendEntity.RcsSRMessage; |
|
|
import com.galaxis.rcs.ptr.sendEntity.RcsSetLocationMessage; |
|
|
import com.galaxis.rcs.ptr.sendEntity.RcsSetLocationMessage; |
|
|
import com.google.common.base.Joiner; |
|
|
import com.google.common.base.Joiner; |
|
|
import com.google.common.collect.Queues; |
|
|
import com.google.common.collect.Queues; |
|
|
|
|
|
import com.yvan.event.EventManager; |
|
|
import com.yvan.logisticsModel.ExecutorItem; |
|
|
import com.yvan.logisticsModel.ExecutorItem; |
|
|
import com.yvan.logisticsModel.LogisticsRuntime; |
|
|
import com.yvan.logisticsModel.LogisticsRuntime; |
|
|
import com.yvan.logisticsModel.StaticItem; |
|
|
import com.yvan.logisticsModel.StaticItem; |
|
|
@ -73,8 +74,6 @@ public abstract class PtrAgvItem extends ExecutorItem { |
|
|
private volatile PosDirection lastPausedPosition; |
|
|
private volatile PosDirection lastPausedPosition; |
|
|
private volatile boolean isOnline = false; |
|
|
private volatile boolean isOnline = false; |
|
|
|
|
|
|
|
|
private final Set<AgvEventListener> eventListeners = new CopyOnWriteArraySet<>(); |
|
|
|
|
|
|
|
|
|
|
|
// 执行中的任务
|
|
|
// 执行中的任务
|
|
|
@JsonIgnore |
|
|
@JsonIgnore |
|
|
public List<PtrAgvDeviceTask> runningDeviceTaskList = new ArrayList<>(); |
|
|
public List<PtrAgvDeviceTask> runningDeviceTaskList = new ArrayList<>(); |
|
|
@ -91,6 +90,7 @@ public abstract class PtrAgvItem extends ExecutorItem { |
|
|
@JsonIgnore |
|
|
@JsonIgnore |
|
|
final BlockingQueue<PtrAgvDeviceTask> deviceTaskQueue = Queues.newArrayBlockingQueue(BLOCKING_QUEUE_CAPACITY); |
|
|
final BlockingQueue<PtrAgvDeviceTask> deviceTaskQueue = Queues.newArrayBlockingQueue(BLOCKING_QUEUE_CAPACITY); |
|
|
|
|
|
|
|
|
|
|
|
@JsonIgnore |
|
|
final Cl2DeviceConnector cl2DeviceConnector = new Cl2DeviceConnector(this.runtime); |
|
|
final Cl2DeviceConnector cl2DeviceConnector = new Cl2DeviceConnector(this.runtime); |
|
|
|
|
|
|
|
|
@JsonIgnore |
|
|
@JsonIgnore |
|
|
@ -159,10 +159,14 @@ public abstract class PtrAgvItem extends ExecutorItem { |
|
|
|
|
|
|
|
|
this.planTaskSequence = taskSequence; |
|
|
this.planTaskSequence = taskSequence; |
|
|
buildPlanToDeviceTask(); |
|
|
buildPlanToDeviceTask(); |
|
|
fireEvent(AgvEventType.PLAN_ACCEPT, this); |
|
|
fireEvent(AgvEventType.PLAN_TASK_SEQUENCE_ACCEPT, this, taskSequence); |
|
|
connectorThread.resumeProcessing(); |
|
|
connectorThread.resumeProcessing(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void fireEvent(AgvEventType agvEventType, Object... args) { |
|
|
|
|
|
this.runtime.eventManager.fireEvent(agvEventType, args); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
public synchronized void pauseTask() { |
|
|
public synchronized void pauseTask() { |
|
|
if (planTaskSequence == null) { |
|
|
if (planTaskSequence == null) { |
|
|
throw new IllegalStateException("No active task to pause"); |
|
|
throw new IllegalStateException("No active task to pause"); |
|
|
@ -184,7 +188,7 @@ public abstract class PtrAgvItem extends ExecutorItem { |
|
|
log.error("Failed to send stop command to AGV {}", this.getId(), e); |
|
|
log.error("Failed to send stop command to AGV {}", this.getId(), e); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
fireEvent(AgvEventType.PLAN_PAUSE, this); |
|
|
fireEvent(AgvEventType.PLAN_TASK_SEQUENCE_PAUSE, this); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public synchronized void resumeTask() { |
|
|
public synchronized void resumeTask() { |
|
|
@ -202,7 +206,7 @@ public abstract class PtrAgvItem extends ExecutorItem { |
|
|
|
|
|
|
|
|
isPaused = false; |
|
|
isPaused = false; |
|
|
connectorThread.resumeProcessing(); |
|
|
connectorThread.resumeProcessing(); |
|
|
fireEvent(AgvEventType.PLAN_RESUME, this); |
|
|
fireEvent(AgvEventType.PLAN_TASK_SEQUENCE_RESUME, this); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@SneakyThrows |
|
|
@SneakyThrows |
|
|
@ -217,7 +221,7 @@ public abstract class PtrAgvItem extends ExecutorItem { |
|
|
deviceTaskQueue.clear(); |
|
|
deviceTaskQueue.clear(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
fireEvent(AgvEventType.PLAN_CANCEL, this); |
|
|
fireEvent(AgvEventType.PLAN_TASK_SEQUENCE_CANCEL, this); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@SneakyThrows |
|
|
@SneakyThrows |
|
|
@ -284,7 +288,7 @@ public abstract class PtrAgvItem extends ExecutorItem { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (planTaskSequence != null && planTaskSequence.isAllCompleted()) { |
|
|
if (planTaskSequence != null && planTaskSequence.isAllCompleted()) { |
|
|
fireEvent(AgvEventType.PLAN_COMPLETE, this); |
|
|
fireEvent(AgvEventType.PLAN_TASK_SEQUENCE_COMPLETE, this); |
|
|
this.runningDeviceTaskList.clear(); |
|
|
this.runningDeviceTaskList.clear(); |
|
|
planTaskSequence = null; |
|
|
planTaskSequence = null; |
|
|
} |
|
|
} |
|
|
@ -306,13 +310,12 @@ public abstract class PtrAgvItem extends ExecutorItem { |
|
|
// 触发位置变化事件
|
|
|
// 触发位置变化事件
|
|
|
if (oldX != logicX || oldY != logicY) { |
|
|
if (oldX != logicX || oldY != logicY) { |
|
|
fireEvent(AgvEventType.POS_CHANGED, this, |
|
|
fireEvent(AgvEventType.POS_CHANGED, this, |
|
|
new PosDirection(oldX, oldY, oldDirection), |
|
|
new PosDirection(logicX, logicY, direction), |
|
|
new PosDirection(logicX, logicY, direction)); |
|
|
new PosDirection(oldX, oldY, oldDirection)); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (oldDirection != direction) { |
|
|
if (oldDirection != direction) { |
|
|
fireEvent(AgvEventType.DIRECTION_CHANGED, this, |
|
|
fireEvent(AgvEventType.DIRECTION_CHANGED, this, direction, oldDirection); |
|
|
oldDirection, direction); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
boolean needCompute = false; |
|
|
boolean needCompute = false; |
|
|
@ -341,14 +344,15 @@ public abstract class PtrAgvItem extends ExecutorItem { |
|
|
|
|
|
|
|
|
// 更新计划任务
|
|
|
// 更新计划任务
|
|
|
RcsTaskPlan planTask = planTaskSequence.getByPlanTaskId(task.movePlanTaskId); |
|
|
RcsTaskPlan planTask = planTaskSequence.getByPlanTaskId(task.movePlanTaskId); |
|
|
if (planTask != null) { |
|
|
if (planTask != null && !PlanTaskStatus.FINISHED.toString().equals(planTask.getPlanTaskStatus())) { |
|
|
|
|
|
fireEvent(AgvEventType.DEVICE_TASK_COMPLETE, this, planTaskSequence, planTask); |
|
|
planTask.setPlanTaskStatus(PlanTaskStatus.FINISHED.toString()); |
|
|
planTask.setPlanTaskStatus(PlanTaskStatus.FINISHED.toString()); |
|
|
planTaskSequence.savePlanTask(planTask); |
|
|
planTaskSequence.savePlanTask(planTask); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (planTaskSequence.isAllCompleted()) { |
|
|
if (planTaskSequence.isAllCompleted()) { |
|
|
fireEvent(AgvEventType.PLAN_COMPLETE, this); |
|
|
fireEvent(AgvEventType.PLAN_TASK_SEQUENCE_COMPLETE, this); |
|
|
this.runningDeviceTaskList.clear(); |
|
|
this.runningDeviceTaskList.clear(); |
|
|
planTaskSequence = null; |
|
|
planTaskSequence = null; |
|
|
} |
|
|
} |
|
|
@ -446,21 +450,6 @@ public abstract class PtrAgvItem extends ExecutorItem { |
|
|
fireEvent(AgvEventType.OFFLINE, this); |
|
|
fireEvent(AgvEventType.OFFLINE, this); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 事件监听管理
|
|
|
|
|
|
public void addEventListener(AgvEventListener listener) { |
|
|
|
|
|
eventListeners.add(listener); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void removeEventListener(AgvEventListener listener) { |
|
|
|
|
|
eventListeners.remove(listener); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void fireEvent(AgvEventType type, Object... args) { |
|
|
|
|
|
for (AgvEventListener listener : eventListeners) { |
|
|
|
|
|
listener.onEvent(type, args); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private String getTaskStatus() { |
|
|
private String getTaskStatus() { |
|
|
if (planTaskSequence == null) return "IDLE"; |
|
|
if (planTaskSequence == null) return "IDLE"; |
|
|
if (isPaused) return "PAUSED"; |
|
|
if (isPaused) return "PAUSED"; |
|
|
@ -801,11 +790,6 @@ public abstract class PtrAgvItem extends ExecutorItem { |
|
|
|
|
|
|
|
|
// planQueue.addAll(sequence.taskList);
|
|
|
// planQueue.addAll(sequence.taskList);
|
|
|
deviceTaskQueue.addAll(deviceTaskList); |
|
|
deviceTaskQueue.addAll(deviceTaskList); |
|
|
|
|
|
|
|
|
String json = JsonWrapper.toJson(deviceTaskList); |
|
|
|
|
|
log.info("deviceTaskList: {}", json); |
|
|
|
|
|
|
|
|
|
|
|
// TODO: 开启轮询线程,等待下一个待执行任务
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public boolean isSamePosition(PosDirection startPos) { |
|
|
public boolean isSamePosition(PosDirection startPos) { |
|
|
|