Skip to content

Commit

Permalink
Send a user notification when an order is rejected
Browse files Browse the repository at this point in the history
Merged-by: Martin Grzenia <martin.grzenia@iml.fraunhofer.de>
  • Loading branch information
LennysLounge authored and martingr committed Jun 16, 2023
1 parent 6cab531 commit da9ed93
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
import org.opentcs.customizations.kernel.KernelExecutor;
import org.opentcs.data.model.Triple;
import org.opentcs.data.model.Vehicle;
import org.opentcs.data.notification.UserNotification;
import org.opentcs.data.order.DriveOrder;
import org.opentcs.data.order.TransportOrder;
import org.opentcs.drivers.vehicle.BasicVehicleCommAdapter;
Expand Down Expand Up @@ -206,9 +207,8 @@ public CommAdapterImpl(@Assisted Vehicle vehicle,
this.getName(),
this::sendOrder,
this::sendInstantAction,
orderAssociation -> {
movementCommandManager.enqueue(orderAssociation);
}
this::orderAccepted,
this::orderRejected
);

vehicleSerialNumber = vehicle.getProperty(PROPKEY_VEHICLE_SERIAL_NUMBER);
Expand Down Expand Up @@ -625,4 +625,17 @@ private void sendMessage(Header messageObject, String topic) {
}
}

private void orderAccepted(OrderAssociation order) {
movementCommandManager.enqueue(order);
}

private void orderRejected(OrderAssociation order) {
getProcessModel().publishUserNotification(new UserNotification(
getProcessModel().getName(),
String.format("Vehicle rejected VDA5050 order (ID: %s, update ID: %s)",
order.getOrder().getOrderId(),
order.getOrder().getOrderUpdateId()),
UserNotification.Level.IMPORTANT
));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@ public class MessageResponseMatcher {
* The callback for when an order is accepted by the vehicle.
*/
private final Consumer<OrderAssociation> orderAcceptedCallback;
/**
* The callback for when an order was rejected by the vehicle.
*/
private final Consumer<OrderAssociation> orderRejectedCallback;

/**
* Creates a new OrderResponseMatcher.
Expand All @@ -58,16 +62,19 @@ public class MessageResponseMatcher {
* @param sendOrderCallback The callback for sending the next order.
* @param sendInstantActionsCallback The callback for sending instant actions.
* @param orderAcceptedCallback The callback for when the order is accepted by the vehicle.
* @param orderRejectedCallback The callback for when the vehicle rejects an order.
*/
public MessageResponseMatcher(@Nonnull String commAdapterName,
@Nonnull Consumer<Order> sendOrderCallback,
@Nonnull Consumer<InstantActions> sendInstantActionsCallback,
@Nonnull Consumer<OrderAssociation> orderAcceptedCallback) {
@Nonnull Consumer<OrderAssociation> orderAcceptedCallback,
@Nonnull Consumer<OrderAssociation> orderRejectedCallback) {
this.commAdapterName = requireNonNull(commAdapterName, "commAdapterName");
this.sendOrderCallback = requireNonNull(sendOrderCallback, "sendOrderCallback");
this.sendInstantActionsCallback
= requireNonNull(sendInstantActionsCallback, "sendInstantActionsCallback");
this.orderAcceptedCallback = requireNonNull(orderAcceptedCallback, "orderAcceptedCallback");
this.orderRejectedCallback = requireNonNull(orderRejectedCallback, "orderRejectedCallback");
}

public void enqueueCommand(Order order, MovementCommand command) {
Expand Down Expand Up @@ -106,9 +113,14 @@ public void onStateMessage(@Nonnull State state) {
return;
}
if (vehicleRejectedOrder(state)) {
Object request = requests.peek();
if (request instanceof OrderAssociation) {
orderRejectedCallback.accept((OrderAssociation) request);
}

LOG.warn("{}: Vehicle indicates order rejection. Last request sent to it was: {}",
commAdapterName,
requests.peek());
request);
return;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
import org.opentcs.customizations.kernel.KernelExecutor;
import org.opentcs.data.model.Triple;
import org.opentcs.data.model.Vehicle;
import org.opentcs.data.notification.UserNotification;
import org.opentcs.data.order.DriveOrder;
import org.opentcs.data.order.TransportOrder;
import org.opentcs.drivers.vehicle.BasicVehicleCommAdapter;
Expand Down Expand Up @@ -206,9 +207,8 @@ public CommAdapterImpl(@Assisted Vehicle vehicle,
this.getName(),
this::sendOrder,
this::sendInstantAction,
orderAssociation -> {
movementCommandManager.enqueue(orderAssociation);
}
this::orderAccepted,
this::orderRejected
);

vehicleSerialNumber = vehicle.getProperty(PROPKEY_VEHICLE_SERIAL_NUMBER);
Expand Down Expand Up @@ -630,4 +630,17 @@ private void sendMessage(Header messageObject, String topic) {
}
}

private void orderAccepted(OrderAssociation order) {
movementCommandManager.enqueue(order);
}

private void orderRejected(OrderAssociation order) {
getProcessModel().publishUserNotification(new UserNotification(
getProcessModel().getName(),
String.format("Vehicle rejected VDA5050 order (ID: %s, update ID: %s)",
order.getOrder().getOrderId(),
order.getOrder().getOrderUpdateId()),
UserNotification.Level.IMPORTANT
));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@ public class MessageResponseMatcher {
* The callback for when an order is accepted by the vehicle.
*/
private final Consumer<OrderAssociation> orderAcceptedCallback;
/**
* The callback for when an order was rejected by the vehicle.
*/
private final Consumer<OrderAssociation> orderRejectedCallback;

/**
* Creates a new OrderResponseMatcher.
Expand All @@ -58,16 +62,19 @@ public class MessageResponseMatcher {
* @param sendOrderCallback The callback for sending the next order.
* @param sendInstantActionsCallback The callback for sending instant actions.
* @param orderAcceptedCallback The callback for when the order is accepted by the vehicle.
* @param orderRejectedCallback The callback for when the vehicle rejects an order.
*/
public MessageResponseMatcher(@Nonnull String commAdapterName,
@Nonnull Consumer<Order> sendOrderCallback,
@Nonnull Consumer<InstantActions> sendInstantActionsCallback,
@Nonnull Consumer<OrderAssociation> orderAcceptedCallback) {
@Nonnull Consumer<OrderAssociation> orderAcceptedCallback,
@Nonnull Consumer<OrderAssociation> orderRejectedCallback) {
this.commAdapterName = requireNonNull(commAdapterName, "commAdapterName");
this.sendOrderCallback = requireNonNull(sendOrderCallback, "sendOrderCallback");
this.sendInstantActionsCallback
= requireNonNull(sendInstantActionsCallback, "sendInstantActionsCallback");
this.orderAcceptedCallback = requireNonNull(orderAcceptedCallback, "orderAcceptedCallback");
this.orderRejectedCallback = requireNonNull(orderRejectedCallback, "orderRejectedCallback");
}

public void enqueueCommand(Order order, MovementCommand command) {
Expand Down Expand Up @@ -106,9 +113,14 @@ public void onStateMessage(@Nonnull State state) {
return;
}
if (vehicleRejectedOrder(state)) {
Object request = requests.peek();
if (request instanceof OrderAssociation) {
orderRejectedCallback.accept((OrderAssociation) request);
}

LOG.warn("{}: Vehicle indicates order rejection. Last request sent to it was: {}",
commAdapterName,
requests.peek());
request);
return;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ public class MessageResponseMatcherTest {
private Consumer<Order> sendOrderCallback;
private Consumer<InstantActions> sendInstantActionsCallback;
private Consumer<OrderAssociation> orderAcceptedCallback;
private Consumer<OrderAssociation> orderRejectedCallback;

private MovementCommand dummyCommand;

Expand All @@ -60,10 +61,13 @@ public void setUp() {
sendOrderCallback = mock(Consumer.class);
sendInstantActionsCallback = mock(Consumer.class);
orderAcceptedCallback = mock(Consumer.class);
orderRejectedCallback = mock(Consumer.class);
messageResponseMatcher = new MessageResponseMatcher("test",
sendOrderCallback,
sendInstantActionsCallback,
orderAcceptedCallback);
orderAcceptedCallback,
orderRejectedCallback
);
dummyCommand = new DummyMovementCommand();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ public class MessageResponseMatcherTest {
private Consumer<Order> sendOrderCallback;
private Consumer<InstantActions> sendInstantActionsCallback;
private Consumer<OrderAssociation> orderAcceptedCallback;
private Consumer<OrderAssociation> orderRejectedCallback;
private Consumer<InstantActions> actionRejectedCallback;

private MovementCommand dummyCommand;

Expand All @@ -60,10 +62,13 @@ public void setUp() {
sendOrderCallback = mock(Consumer.class);
sendInstantActionsCallback = mock(Consumer.class);
orderAcceptedCallback = mock(Consumer.class);
orderRejectedCallback = mock(Consumer.class);
messageResponseMatcher = new MessageResponseMatcher("test",
sendOrderCallback,
sendInstantActionsCallback,
orderAcceptedCallback);
orderAcceptedCallback,
orderRejectedCallback
);
dummyCommand = new DummyMovementCommand();
}

Expand Down

0 comments on commit da9ed93

Please sign in to comment.