Search in sources :

Example 1 with Invoke

use of org.apache.plc4x.java.ads.api.generic.types.Invoke 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);
}
Also used : PlcProtocolException(org.apache.plc4x.java.api.exceptions.PlcProtocolException) SymbolicAdsField(org.apache.plc4x.java.ads.model.SymbolicAdsField) PlcField(org.apache.plc4x.java.api.model.PlcField) LittleEndianEncoder.encodeData(org.apache.plc4x.java.ads.protocol.util.LittleEndianEncoder.encodeData) Invoke(org.apache.plc4x.java.ads.api.generic.types.Invoke) PlcList(org.apache.plc4x.java.api.value.PlcList) PlcValue(org.apache.plc4x.java.api.value.PlcValue) DirectAdsField(org.apache.plc4x.java.ads.model.DirectAdsField) PlcProtocolPayloadTooBigException(org.apache.plc4x.java.api.exceptions.PlcProtocolPayloadTooBigException) AmsPacket(org.apache.plc4x.java.ads.api.generic.AmsPacket)

Example 2 with Invoke

use of org.apache.plc4x.java.ads.api.generic.types.Invoke in project plc4x by apache.

the class ADSProtocolBenchmark method buildAdsReadRequest.

private static AdsReadRequest buildAdsReadRequest() {
    AmsNetId targetAmsNetId = AmsNetId.of("1.2.3.4.5.6");
    AmsPort targetAmsPort = AmsPort.of(7);
    AmsNetId sourceAmsNetId = AmsNetId.of("8.9.10.11.12.13");
    AmsPort sourceAmsPort = AmsPort.of(14);
    Invoke invokeId = Invoke.of(15);
    return AdsReadRequest.of(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, IndexGroup.of(1), IndexOffset.of(1), Length.of(1));
}
Also used : AmsPort(org.apache.plc4x.java.ads.api.generic.types.AmsPort) AmsNetId(org.apache.plc4x.java.ads.api.generic.types.AmsNetId) Invoke(org.apache.plc4x.java.ads.api.generic.types.Invoke)

Example 3 with Invoke

use of org.apache.plc4x.java.ads.api.generic.types.Invoke in project plc4x by apache.

the class ADSProtocolBenchmark method buildADSReadResponse.

private static byte[] buildADSReadResponse() {
    AmsNetId targetAmsNetId = AmsNetId.of("1.2.3.4.5.6");
    AmsPort targetAmsPort = AmsPort.of(7);
    AmsNetId sourceAmsNetId = AmsNetId.of("8.9.10.11.12.13");
    AmsPort sourceAmsPort = AmsPort.of(14);
    Invoke invokeId = Invoke.of(15);
    Result result = Result.of(AdsReturnCode.ADS_CODE_0);
    Data data = Data.of("Hello World!".getBytes());
    return AdsReadResponse.of(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, result, data).getBytes();
}
Also used : AmsPort(org.apache.plc4x.java.ads.api.generic.types.AmsPort) AmsNetId(org.apache.plc4x.java.ads.api.generic.types.AmsNetId) Invoke(org.apache.plc4x.java.ads.api.generic.types.Invoke)

Example 4 with Invoke

use of org.apache.plc4x.java.ads.api.generic.types.Invoke in project plc4x by apache.

the class Plc4x2AdsProtocol method encodeReadRequest.

private void encodeReadRequest(PlcRequestContainer<InternalPlcRequest, InternalPlcResponse> msg, List<Object> out) throws PlcException {
    PlcReadRequest readRequest = (PlcReadRequest) msg.getRequest();
    if (readRequest.getFields().size() != 1) {
        throw new PlcProtocolException("Only one item supported");
    }
    PlcField field = readRequest.getFields().get(0);
    if (field instanceof SymbolicAdsField) {
        DirectAdsField mappedField = fieldMapping.get(field);
        if (mappedField == null) {
            throw new PlcProtocolException("No field mapping for " + 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());
    AdsDataType adsDataType = directAdsField.getAdsDataType();
    int numberOfElements = directAdsField.getNumberOfElements();
    int readLength = adsDataType.getTargetByteSize() * numberOfElements;
    Length length = Length.of(readLength);
    AmsPacket amsPacket = AdsReadRequest.of(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, indexGroup, indexOffset, length);
    LOGGER.debug("encoded read request {}", amsPacket);
    out.add(amsPacket);
    requests.put(invokeId.getAsLong(), msg);
}
Also used : PlcProtocolException(org.apache.plc4x.java.api.exceptions.PlcProtocolException) SymbolicAdsField(org.apache.plc4x.java.ads.model.SymbolicAdsField) AdsDataType(org.apache.plc4x.java.ads.model.AdsDataType) PlcField(org.apache.plc4x.java.api.model.PlcField) DirectAdsField(org.apache.plc4x.java.ads.model.DirectAdsField) AmsPacket(org.apache.plc4x.java.ads.api.generic.AmsPacket) PlcReadRequest(org.apache.plc4x.java.api.messages.PlcReadRequest) Invoke(org.apache.plc4x.java.ads.api.generic.types.Invoke)

Example 5 with Invoke

use of org.apache.plc4x.java.ads.api.generic.types.Invoke in project plc4x by apache.

the class AbstractProtocolTest method amsPacketStream.

public static Stream<AmsPacket> amsPacketStream() {
    AmsNetId targetAmsNetId = AmsNetId.of("1.2.3.4.5.6");
    AmsPort targetAmsPort = AmsPort.of(7);
    AmsNetId sourceAmsNetId = AmsNetId.of("8.9.10.11.12.13");
    AmsPort sourceAmsPort = AmsPort.of(14);
    Invoke invokeId = Invoke.of(15);
    Data data = Data.of("Hello World!".getBytes());
    return Stream.of(AdsAddDeviceNotificationRequest.of(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, IndexGroup.of(1), IndexOffset.of(1), Length.of(1), TransmissionMode.of(1), MaxDelay.of(1), CycleTime.of(1)), AdsAddDeviceNotificationResponse.of(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, Result.of(0), NotificationHandle.of(0)), AdsDeleteDeviceNotificationRequest.of(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, NotificationHandle.of(0)), AdsDeleteDeviceNotificationResponse.of(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, Result.of(0)), AdsDeviceNotificationRequest.of(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, Stamps.of(1), Collections.singletonList(// Nano times need to be offset by (1.1.1970 - 1.1.1601) years in nanos
    AdsStampHeader.of(TimeStamp.of(new Date()), Collections.singletonList(AdsNotificationSample.of(NotificationHandle.of(0), data))))), AdsReadDeviceInfoRequest.of(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId), AdsReadDeviceInfoResponse.of(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, Result.of(0), MajorVersion.of((byte) 1), MinorVersion.of((byte) 2), Version.of(3), Device.of("Random DeviceId")), AdsReadRequest.of(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, IndexGroup.of(0), IndexOffset.NONE, Length.of(1)), AdsReadResponse.of(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, Result.of(0), data), AdsReadStateRequest.of(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId), AdsReadStateResponse.of(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, Result.of(0), AdsState.of(0), DeviceState.of(0)), AdsReadWriteRequest.of(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, IndexGroup.of(0), IndexOffset.NONE, ReadLength.of(data.getCalculatedLength()), data), AdsReadWriteResponse.of(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, Result.of(0), data), AdsWriteControlRequest.of(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, AdsState.of(0xaffe), DeviceState.of(0xaffe), data), AdsWriteControlResponse.of(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, Result.of(0)), AdsWriteRequest.of(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, IndexGroup.of(0), IndexOffset.NONE, data), AdsWriteResponse.of(targetAmsNetId, targetAmsPort, sourceAmsNetId, sourceAmsPort, invokeId, Result.of(0)));
}
Also used : AmsPort(org.apache.plc4x.java.ads.api.generic.types.AmsPort) AmsNetId(org.apache.plc4x.java.ads.api.generic.types.AmsNetId) Date(java.util.Date) Invoke(org.apache.plc4x.java.ads.api.generic.types.Invoke)

Aggregations

Invoke (org.apache.plc4x.java.ads.api.generic.types.Invoke)8 AmsNetId (org.apache.plc4x.java.ads.api.generic.types.AmsNetId)6 AmsPort (org.apache.plc4x.java.ads.api.generic.types.AmsPort)6 AmsPacket (org.apache.plc4x.java.ads.api.generic.AmsPacket)3 AdsDataType (org.apache.plc4x.java.ads.model.AdsDataType)2 DirectAdsField (org.apache.plc4x.java.ads.model.DirectAdsField)2 SymbolicAdsField (org.apache.plc4x.java.ads.model.SymbolicAdsField)2 PlcProtocolException (org.apache.plc4x.java.api.exceptions.PlcProtocolException)2 PlcField (org.apache.plc4x.java.api.model.PlcField)2 Field (java.lang.reflect.Field)1 Modifier (java.lang.reflect.Modifier)1 BigDecimal (java.math.BigDecimal)1 BigInteger (java.math.BigInteger)1 LocalDate (java.time.LocalDate)1 LocalDateTime (java.time.LocalDateTime)1 LocalTime (java.time.LocalTime)1 java.util (java.util)1 Date (java.util.Date)1 CompletableFuture (java.util.concurrent.CompletableFuture)1 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)1