Search in sources :

Example 1 with Df1Field

use of org.apache.plc4x.java.df1.field.Df1Field in project plc4x by apache.

the class Plc4XDf1Protocol method encode.

@Override
protected void encode(ChannelHandlerContext ctx, PlcRequestContainer msg, List<Object> out) throws Exception {
    logger.trace("Received Request {} to send out", msg);
    if (msg.getRequest() instanceof PlcReadRequest) {
        for (PlcField field : ((PlcReadRequest) msg.getRequest()).getFields()) {
            if (!(field instanceof Df1Field)) {
                throw new IllegalArgumentException("Invalid field type found inside Df1 Request");
            }
            int address = ((Df1Field) field).getAddress();
            short size = ((Df1Field) field).getDataType().getLength();
            int transactionId = this.transactionId.getAndIncrement();
            while (((transactionId & 0xFF) == 0x10) || (((transactionId >>> 8) & 0xFF) == 0x10)) {
                // prevent that one of the transactionID bytes is 0x10, which has to be escaped by double 0x10 and makes life a lot harder
                transactionId = this.transactionId.getAndIncrement();
            }
            logger.debug("Creating request for offset {}, with length {} and transaction id {}", address, size, transactionId);
            requests.put(transactionId, msg);
            switch(((Df1Field) field).getAddress_type()) {
                case OFFSET:
                    out.add(new DF1UnprotectedReadRequest((short) 0x00, (short) transactionId, address, size));
                    break;
                case LOGICAL:
                    // TODO: add 'protected typed logical read' to mspec
                    throw new NotImplementedException("not yet implemented in mspec");
            }
        }
    } else {
        throw new IllegalStateException("This should not happen!");
    }
}
Also used : NotImplementedException(org.apache.commons.lang3.NotImplementedException) PlcField(org.apache.plc4x.java.api.model.PlcField) PlcReadRequest(org.apache.plc4x.java.api.messages.PlcReadRequest) Df1Field(org.apache.plc4x.java.df1.field.Df1Field)

Example 2 with Df1Field

use of org.apache.plc4x.java.df1.field.Df1Field in project plc4x by apache.

the class Plc4XDf1Protocol method decode.

@Override
protected void decode(ChannelHandlerContext ctx, DF1Symbol msg, List<Object> out) throws Exception {
    logger.debug("Received DF1 Command incoming {}", msg);
    if (msg instanceof DF1SymbolMessageFrameNAK) {
        logger.warn("Received a response NAK, notify all requests");
        for (Map.Entry<Integer, PlcRequestContainer> entry : requests.entrySet()) {
            entry.getValue().getResponseFuture().complete(new DefaultPlcReadResponse((PlcReadRequest) entry.getValue().getRequest(), Collections.singletonMap("erster", new ResponseItem<>(PlcResponseCode.INTERNAL_ERROR, new PlcDINT(-1)))));
        }
        return;
    } else if (msg instanceof DF1SymbolMessageFrameACK) {
        logger.warn("Received a response ACK :D");
        return;
    }
    assert msg instanceof DF1SymbolMessageFrame;
    DF1Command command = ((DF1SymbolMessageFrame) msg).getCommand();
    int transactionId = command.getTransactionCounter();
    if (!requests.containsKey(transactionId)) {
        logger.warn("Received a response to unknown transaction id {}", transactionId);
        ctx.fireExceptionCaught(new RuntimeException("Received a response to unknown transaction id"));
        ctx.close();
        return;
    }
    // As every response has a matching request, get this request based on the tpdu.
    PlcRequestContainer requestContainer = requests.remove(transactionId);
    PlcRequest request = requestContainer.getRequest();
    // Handle the response.
    PlcResponse response = null;
    if (request instanceof PlcReadRequest) {
        /*
            Things to do
            - check response code (if there is something like that?
            - cast the bytes to right datatype
            - create Response
             */
        // We can do this as we have only one fieldName in DF1
        final String fieldName = ((PlcReadRequest) request).getFieldNames().iterator().next();
        // TODO can there be another code than ok?
        final PlcResponseCode responseCode = PlcResponseCode.OK;
        // TODO maybe check for different status bytes
        final Df1Field field = (Df1Field) ((PlcReadRequest) request).getField(fieldName);
        // Cast byte and create response item
        PlcValue responseItem = null;
        byte[] data = ((DF1UnprotectedReadResponse) command).getData();
        switch(field.getDataType()) {
            case BIT:
                break;
            case INTEGER:
                // TODO: type conversion is untested
                responseItem = new PlcDINT((int) data[0] + ((int) data[1] << 8));
                break;
            case FLOAT:
                break;
            case BIT_STRING:
                break;
            case ARRAY:
                break;
            // TODO add all other cases here...
            default:
                throw new NotImplementedException("The DataType " + field.getDataType() + " is currently not implemented!");
        }
        response = new DefaultPlcReadResponse(((PlcReadRequest) request), Collections.singletonMap(fieldName, new ResponseItem<>(responseCode, responseItem)));
    } else if (request instanceof PlcWriteRequest) {
        logger.warn("Writing is currently not implemented but received a write response?!");
        ctx.close();
        throw new NotImplementedException("This is currently not implemented!");
    }
    // Confirm the response being handled.
    if (response != null) {
        requestContainer.getResponseFuture().complete(response);
    }
}
Also used : PlcRequestContainer(org.apache.plc4x.java.spi.messages.PlcRequestContainer) PlcDINT(org.apache.plc4x.java.spi.values.PlcDINT) PlcRequest(org.apache.plc4x.java.api.messages.PlcRequest) NotImplementedException(org.apache.commons.lang3.NotImplementedException) PlcResponseCode(org.apache.plc4x.java.api.types.PlcResponseCode) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) PlcValue(org.apache.plc4x.java.api.value.PlcValue) PlcResponse(org.apache.plc4x.java.api.messages.PlcResponse) PlcWriteRequest(org.apache.plc4x.java.api.messages.PlcWriteRequest) DefaultPlcReadResponse(org.apache.plc4x.java.spi.messages.DefaultPlcReadResponse) PlcReadRequest(org.apache.plc4x.java.api.messages.PlcReadRequest) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Map(java.util.Map) Df1Field(org.apache.plc4x.java.df1.field.Df1Field)

Aggregations

NotImplementedException (org.apache.commons.lang3.NotImplementedException)2 PlcReadRequest (org.apache.plc4x.java.api.messages.PlcReadRequest)2 Df1Field (org.apache.plc4x.java.df1.field.Df1Field)2 Map (java.util.Map)1 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)1 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)1 PlcRequest (org.apache.plc4x.java.api.messages.PlcRequest)1 PlcResponse (org.apache.plc4x.java.api.messages.PlcResponse)1 PlcWriteRequest (org.apache.plc4x.java.api.messages.PlcWriteRequest)1 PlcField (org.apache.plc4x.java.api.model.PlcField)1 PlcResponseCode (org.apache.plc4x.java.api.types.PlcResponseCode)1 PlcValue (org.apache.plc4x.java.api.value.PlcValue)1 DefaultPlcReadResponse (org.apache.plc4x.java.spi.messages.DefaultPlcReadResponse)1 PlcRequestContainer (org.apache.plc4x.java.spi.messages.PlcRequestContainer)1 PlcDINT (org.apache.plc4x.java.spi.values.PlcDINT)1