|
|
@ -7,22 +7,24 @@ import lombok.extern.slf4j.Slf4j; |
|
|
import org.eclipse.paho.mqttv5.common.MqttException; |
|
|
import org.eclipse.paho.mqttv5.common.MqttException; |
|
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
import java.util.ArrayList; |
|
|
|
|
|
import java.util.List; |
|
|
import java.util.concurrent.atomic.AtomicBoolean; |
|
|
import java.util.concurrent.atomic.AtomicBoolean; |
|
|
|
|
|
import java.util.concurrent.locks.LockSupport; |
|
|
|
|
|
|
|
|
@Slf4j |
|
|
@Slf4j |
|
|
public class PtrAgvConnectorThread extends Thread { |
|
|
public class PtrAgvConnectorThread extends Thread { |
|
|
private final AtomicBoolean running = new AtomicBoolean(false); |
|
|
private final AtomicBoolean running = new AtomicBoolean(false); |
|
|
|
|
|
|
|
|
private final PtrAgvItem executorItem; |
|
|
|
|
|
private final Cl2DeviceConnector cl2DeviceConnector; |
|
|
private final Cl2DeviceConnector cl2DeviceConnector; |
|
|
|
|
|
|
|
|
private final PtrAgvItem ptrAgvItem; |
|
|
private final PtrAgvItem ptrAgvItem; |
|
|
|
|
|
|
|
|
private final LogisticsRuntime logisticsRuntime; |
|
|
private final LogisticsRuntime logisticsRuntime; |
|
|
|
|
|
|
|
|
public PtrAgvConnectorThread(PtrAgvItem executorItem, Cl2DeviceConnector cl2DeviceConnector, PtrAgvItem ptrAgvItem, LogisticsRuntime logisticsRuntime) { |
|
|
|
|
|
super("ExecutorConnector-" + executorItem.getId()); |
|
|
|
|
|
this.executorItem = executorItem; |
|
|
public PtrAgvConnectorThread(PtrAgvItem ptrAgvItem, Cl2DeviceConnector cl2DeviceConnector, LogisticsRuntime logisticsRuntime) { |
|
|
|
|
|
super("ExecutorConnector-" + ptrAgvItem.getId()); |
|
|
this.cl2DeviceConnector = cl2DeviceConnector; |
|
|
this.cl2DeviceConnector = cl2DeviceConnector; |
|
|
this.ptrAgvItem = ptrAgvItem; |
|
|
this.ptrAgvItem = ptrAgvItem; |
|
|
this.logisticsRuntime = logisticsRuntime; |
|
|
this.logisticsRuntime = logisticsRuntime; |
|
|
@ -31,7 +33,7 @@ public class PtrAgvConnectorThread extends Thread { |
|
|
@Override |
|
|
@Override |
|
|
public void run() { |
|
|
public void run() { |
|
|
running.set(true); |
|
|
running.set(true); |
|
|
log.info("Connector thread started for executor: {}", this.executorItem.getId()); |
|
|
log.info("Connector thread started for executor: {}", this.ptrAgvItem.getId()); |
|
|
|
|
|
|
|
|
try { |
|
|
try { |
|
|
|
|
|
|
|
|
@ -43,15 +45,26 @@ public class PtrAgvConnectorThread extends Thread { |
|
|
PtrAgvDeviceTask nextTask = null; |
|
|
PtrAgvDeviceTask nextTask = null; |
|
|
AmrTaskMessage taskMessage = null; |
|
|
AmrTaskMessage taskMessage = null; |
|
|
|
|
|
|
|
|
|
|
|
// 计算中的任务
|
|
|
|
|
|
List<PtrAgvDeviceTask> computingTaskList = new ArrayList<>(); |
|
|
while (running.get()) { |
|
|
while (running.get()) { |
|
|
|
|
|
|
|
|
|
|
|
for (PtrAgvDeviceTask task : this.ptrAgvItem.runningDeviceTaskList) { |
|
|
|
|
|
if (task.taskGroupStatus < 3) { |
|
|
|
|
|
LockSupport.park(); // 阻塞当前线程
|
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// 从队列中获取任务,如果队列为空则阻塞等待
|
|
|
// 从队列中获取任务,如果队列为空则阻塞等待
|
|
|
if (nextTask == null) { |
|
|
if (nextTask == null) { |
|
|
nextTask = this.executorItem.deviceTaskQueue.take(); |
|
|
nextTask = this.ptrAgvItem.deviceTaskQueue.take(); |
|
|
|
|
|
|
|
|
} else { |
|
|
} else { |
|
|
currentTask = nextTask; |
|
|
currentTask = nextTask; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (startTask == null) { |
|
|
if (startTask == null && !nextTask.isLastTask) { |
|
|
taskMessage = new AmrTaskMessage(); |
|
|
taskMessage = new AmrTaskMessage(); |
|
|
startTask = nextTask; |
|
|
startTask = nextTask; |
|
|
currentTask = nextTask; |
|
|
currentTask = nextTask; |
|
|
@ -64,19 +77,23 @@ public class PtrAgvConnectorThread extends Thread { |
|
|
taskMessage.Link = new ArrayList<>(); |
|
|
taskMessage.Link = new ArrayList<>(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (currentTask == nextTask) { |
|
|
if (currentTask == nextTask && taskMessage != null) { |
|
|
currentTask.seqNo = taskMessage.SeqNo; |
|
|
currentTask.seqNo = taskMessage.SeqNo; |
|
|
AmrTaskMessage.LinkData link = new AmrTaskMessage.LinkData(currentTask.endPoint.logicX, currentTask.endPoint.logicY, currentTask.speed); |
|
|
AmrTaskMessage.LinkData link = new AmrTaskMessage.LinkData(currentTask.endPoint.logicX, currentTask.endPoint.logicY, currentTask.speed); |
|
|
taskMessage.Link.add(link); |
|
|
taskMessage.Link.add(link); |
|
|
taskCount++; |
|
|
taskCount++; |
|
|
distance += euclideanDistance(currentTask.startPoint.tf[0], currentTask.endPoint.tf[0]); |
|
|
distance += euclideanDistance(currentTask.startPoint.tf[0], currentTask.endPoint.tf[0]); |
|
|
|
|
|
computingTaskList.add(currentTask); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 组织设备任务并发送
|
|
|
if (currentTask.operationType > 0 || currentTask.pickMode > 0 |
|
|
else if (taskMessage != null && |
|
|
|| (((startTask.speed > 0) != (nextTask.speed > 0) || startTask.direction != nextTask.direction) && taskMessage.Link.size() > 0) |
|
|
(currentTask.operationType > 0 // 当前任务不是移动任务
|
|
|
// 单向移动距离大于2m时拆分任务指令
|
|
|
|| currentTask.pickMode > 0 // 当前作业不是默认作业(无)
|
|
|
|| (distance > 2 && taskCount > 1)) { |
|
|
|| nextTask.isLastTask // 下一个任务是结束任务
|
|
|
|
|
|
|| (((startTask.speed > 0) != (nextTask.speed > 0) || startTask.direction != nextTask.direction) && taskMessage.Link.size() > 0) // 下一个任务和开始任务方向不一致
|
|
|
|
|
|
// 单向移动距离大于2m时并且点位数量大于1
|
|
|
|
|
|
|| (distance > 2 && taskCount > 1))) { |
|
|
|
|
|
|
|
|
taskMessage.OperationType = currentTask.operationType; |
|
|
taskMessage.OperationType = currentTask.operationType; |
|
|
taskMessage.PickMode = currentTask.pickMode; |
|
|
taskMessage.PickMode = currentTask.pickMode; |
|
|
@ -84,7 +101,14 @@ public class PtrAgvConnectorThread extends Thread { |
|
|
taskMessage.EndY = currentTask.endPoint.logicY; |
|
|
taskMessage.EndY = currentTask.endPoint.logicY; |
|
|
|
|
|
|
|
|
try { |
|
|
try { |
|
|
|
|
|
// 发送任务
|
|
|
cl2DeviceConnector.sendTask(ptrAgvItem.getId(), taskMessage); |
|
|
cl2DeviceConnector.sendTask(ptrAgvItem.getId(), taskMessage); |
|
|
|
|
|
this.ptrAgvItem.runningDeviceTaskList.addAll(computingTaskList); |
|
|
|
|
|
for (PtrAgvDeviceTask task : computingTaskList) { |
|
|
|
|
|
task.taskStatus = 1; |
|
|
|
|
|
task.taskGroupStatus = 1; |
|
|
|
|
|
} |
|
|
|
|
|
computingTaskList.clear(); |
|
|
} catch (MqttException | JsonProcessingException e) { |
|
|
} catch (MqttException | JsonProcessingException e) { |
|
|
log.error("Cl2DeviceConnector robotMove: executorItem={}, task={}, error={}", |
|
|
log.error("Cl2DeviceConnector robotMove: executorItem={}, task={}, error={}", |
|
|
ptrAgvItem.getId(), currentTask.planTaskId, e); |
|
|
ptrAgvItem.getId(), currentTask.planTaskId, e); |
|
|
@ -95,14 +119,14 @@ public class PtrAgvConnectorThread extends Thread { |
|
|
startTask = null; |
|
|
startTask = null; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (nextTask == currentTask) { |
|
|
if (nextTask == currentTask || nextTask.isLastTask) { |
|
|
nextTask = null; |
|
|
nextTask = null; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} catch (InterruptedException e) { |
|
|
} catch (InterruptedException e) { |
|
|
System.out.println("Connector thread interrupted for executor: " + this.executorItem.getId()); |
|
|
System.out.println("Connector thread interrupted for executor: " + this.ptrAgvItem.getId()); |
|
|
} finally { |
|
|
} finally { |
|
|
System.out.println("Connector thread stopped for executor: " + this.executorItem.getId()); |
|
|
System.out.println("Connector thread stopped for executor: " + this.ptrAgvItem.getId()); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|