use of org.apache.plc4x.java.ads.api.generic.AmsPacket in project plc4x by apache.
the class Ads2PayloadProtocol method handADSDeleteDeviceNotificationCommand.
private AmsPacket handADSDeleteDeviceNotificationCommand(State stateId, ByteBuf commandBuffer, AmsHeader amsHeader) {
AmsPacket amsPacket;
if (stateId.isRequest()) {
NotificationHandle notificationHandle = NotificationHandle.of(commandBuffer);
amsPacket = AdsDeleteDeviceNotificationRequest.of(amsHeader, notificationHandle);
} else {
Result result = Result.of(commandBuffer);
amsPacket = AdsDeleteDeviceNotificationResponse.of(amsHeader, result);
}
return amsPacket;
}
use of org.apache.plc4x.java.ads.api.generic.AmsPacket in project plc4x by apache.
the class Ads2PayloadProtocol method handleADSReadDeviceInfoCommand.
private AmsPacket handleADSReadDeviceInfoCommand(State stateId, ByteBuf commandBuffer, AmsHeader amsHeader) {
AmsPacket amsPacket;
if (stateId.isRequest()) {
amsPacket = AdsReadDeviceInfoRequest.of(amsHeader);
} else {
Result result = Result.of(commandBuffer);
MajorVersion majorVersion = MajorVersion.of(commandBuffer);
MinorVersion minorVersion = MinorVersion.of(commandBuffer);
Version version = Version.of(commandBuffer);
Device device = Device.of(commandBuffer);
amsPacket = AdsReadDeviceInfoResponse.of(amsHeader, result, majorVersion, minorVersion, version, device);
}
return amsPacket;
}
use of org.apache.plc4x.java.ads.api.generic.AmsPacket in project plc4x by apache.
the class Ads2PayloadProtocol method handleADSWriteCommand.
private AmsPacket handleADSWriteCommand(State stateId, ByteBuf commandBuffer, AmsHeader amsHeader) {
AmsPacket amsPacket;
if (stateId.isRequest()) {
IndexGroup indexGroup = IndexGroup.of(commandBuffer);
IndexOffset indexOffset = IndexOffset.of(commandBuffer);
Length length = Length.of(commandBuffer);
if (length.getAsLong() > Integer.MAX_VALUE) {
throw new AdsProtocolOverflowException(Integer.class, length.getAsLong());
}
if (length.getAsLong() > ADS_WRITE_COMMAND_MAX_BYTES) {
throw new AdsProtocolOverflowException("ADS_WRITE_COMMAND_MAX_BYTES", ADS_WRITE_COMMAND_MAX_BYTES, length.getAsLong());
}
byte[] dataToRead = new byte[(int) length.getAsLong()];
commandBuffer.readBytes(dataToRead);
Data data = Data.of(dataToRead);
amsPacket = AdsWriteRequest.of(amsHeader, indexGroup, indexOffset, length, data);
} else {
Result result = Result.of(commandBuffer);
amsPacket = AdsWriteResponse.of(amsHeader, result);
}
return amsPacket;
}
use of org.apache.plc4x.java.ads.api.generic.AmsPacket in project plc4x by apache.
the class Plc4x2AdsProtocol method encodeWriteRequest.
private void encodeWriteRequest(PlcRequestContainer<InternalPlcRequest, InternalPlcResponse> msg, List<Object> out) throws PlcException {
InternalPlcWriteRequest writeRequest = (InternalPlcWriteRequest) msg.getRequest();
if (writeRequest.getFields().size() != 1) {
throw new PlcProtocolException("Only one item supported");
}
PlcField field = writeRequest.getFields().get(0);
if (field instanceof SymbolicAdsField) {
DirectAdsField mappedField = fieldMapping.get(field);
LOGGER.debug("Replacing {} with {}", field, mappedField);
field = mappedField;
}
if (!(field instanceof DirectAdsField)) {
throw new PlcProtocolException("PlcField not of type DirectAdsField: " + field.getClass());
}
DirectAdsField directAdsField = (DirectAdsField) field;
Invoke invokeId = Invoke.of(correlationBuilder.incrementAndGet());
IndexGroup indexGroup = IndexGroup.of(directAdsField.getIndexGroup());
IndexOffset indexOffset = IndexOffset.of(directAdsField.getIndexOffset());
Object[] plcValues;
PlcValue plcValue = writeRequest.getPlcValues().get(0);
if (plcValue instanceof PlcList) {
plcValues = ((PlcList) plcValue).getList().toArray(new Object[0]);
} else {
plcValues = new Object[] { plcValue.getObject() };
}
byte[] bytes = encodeData(directAdsField.getAdsDataType(), plcValues);
int bytesToBeWritten = bytes.length;
int maxTheoreticalSize = directAdsField.getAdsDataType().getTargetByteSize() * directAdsField.getNumberOfElements();
if (bytesToBeWritten > maxTheoreticalSize) {
LOGGER.debug("Requested AdsDatatype {} is exceeded by number of bytes {}. Limit {}.", directAdsField.getAdsDataType(), bytesToBeWritten, maxTheoreticalSize);
throw new PlcProtocolPayloadTooBigException("ADS", maxTheoreticalSize, bytesToBeWritten, plcValues);
}
Data data = Data.of(bytes);
AmsPacket amsPacket = AdsWriteRequest.of(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, indexGroup, indexOffset, data);
LOGGER.debug("encoded write request {}", amsPacket);
out.add(amsPacket);
requests.put(invokeId.getAsLong(), msg);
}
use of org.apache.plc4x.java.ads.api.generic.AmsPacket in project plc4x by apache.
the class Plc4x2AdsProtocol method encodeProprietaryRequest.
private void encodeProprietaryRequest(PlcRequestContainer<InternalPlcRequest, InternalPlcResponse> msg, List<Object> out) throws PlcProtocolException {
PlcProprietaryRequest plcProprietaryRequest = (PlcProprietaryRequest) msg.getRequest();
if (!(plcProprietaryRequest.getProprietaryRequest() instanceof AmsPacket)) {
throw new PlcProtocolException("Unsupported proprietary type for this driver " + plcProprietaryRequest.getProprietaryRequest().getClass());
}
AmsPacket amsPacket = (AmsPacket) plcProprietaryRequest.getProprietaryRequest();
LOGGER.debug("encoded proprietary request {}", amsPacket);
out.add(amsPacket);
requests.put(amsPacket.getAmsHeader().getInvokeId().getAsLong(), msg);
}
Aggregations