@Override public Collection<String> getFieldNames() { return request.getFieldNames(); }
@Override public PlcField getField(String name) { return request.getField(name); }
@Override public CompletableFuture<PlcWriteResponse> write(PlcWriteRequest writeRequest) { if(!(writeRequest instanceof InternalPlcWriteRequest)) { throw new IllegalArgumentException("Read request doesn't implement InternalPlcWriteRequest"); } InternalPlcWriteRequest request = (InternalPlcWriteRequest) writeRequest; Map<String, PlcResponseCode> fields = new HashMap<>(); for (String fieldName : request.getFieldNames()) { TestField field = (TestField) request.getField(fieldName); BaseDefaultFieldItem fieldItem = request.getFieldItem(fieldName); device.set(field, fieldItem); fields.put(fieldName, PlcResponseCode.OK); } PlcWriteResponse response = new DefaultPlcWriteResponse(request, fields); return CompletableFuture.completedFuture(response); }
@SuppressWarnings("unchecked") private PlcResponse decodeWriteResponse(S7ResponseMessage responseMessage, PlcRequestContainer requestContainer) throws PlcProtocolException { InternalPlcWriteRequest plcWriteRequest = (InternalPlcWriteRequest) requestContainer.getRequest(); VarPayload payload = responseMessage.getPayload(VarPayload.class) .orElseThrow(() -> new PlcProtocolException("No VarPayload supplied")); // TODO: Checkout if the payload items are sort of a flatMap of all request items. // If the numbers of items don't match, we're in big trouble as the only // way to know how to interpret the responses is by aligning them with the // items from the request as this information is not returned by the PLC. if (plcWriteRequest.getNumberOfFields() != payload.getItems().size()) { throw new PlcProtocolException( "The number of requested items doesn't match the number of returned items"); } Map<String, PlcResponseCode> values = new HashMap<>(); List<VarPayloadItem> payloadItems = payload.getItems(); int index = 0; for (String fieldName : plcWriteRequest.getFieldNames()) { VarPayloadItem payloadItem = payloadItems.get(index); // A write response contains only the return code for every item. PlcResponseCode responseCode = decodeResponseCode(payloadItem.getReturnCode()); values.put(fieldName, responseCode); index++; } return new DefaultPlcWriteResponse(plcWriteRequest, values); }
} else if (internalPlcFieldRequest instanceof InternalPlcWriteRequest && splitConfig.splitWrite) { InternalPlcWriteRequest internalPlcWriteRequest = (InternalPlcWriteRequest) internalPlcFieldRequest; internalPlcWriteRequest.getNamedFieldTriples().forEach(fieldItemTriple -> { ChannelPromise subPromise = new DefaultChannelPromise(promise.channel());
@Override public CompletableFuture<PlcWriteResponse> write(PlcWriteRequest writeRequest) { InternalPlcWriteRequest request = checkInternal(writeRequest, InternalPlcWriteRequest.class); Map<String, PlcResponseCode> fields = new HashMap<>(); for (String fieldName : request.getFieldNames()) { TestField field = (TestField) request.getField(fieldName); BaseDefaultFieldItem fieldItem = request.getFieldItem(fieldName); device.set(field, fieldItem); fields.put(fieldName, PlcResponseCode.OK); } PlcWriteResponse response = new DefaultPlcWriteResponse(request, fields); return CompletableFuture.completedFuture(response); }