Skip to content

Commit

Permalink
refactor(code-generation): Finished migrating the code to using the s…
Browse files Browse the repository at this point in the history
…tatic getSizeInBits method of DataIo types
  • Loading branch information
chrisdutz committed Jan 30, 2022
1 parent b3a1d1e commit 447ef68
Show file tree
Hide file tree
Showing 7 changed files with 103 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -428,8 +428,79 @@ public class ${type.name} {
}
</#if>

public static int getLengthInBytes(PlcValue _value<#if type.parserArguments.isPresent()>, <#list type.parserArguments.orElseThrow() as parserArgument>${helper.getLanguageTypeNameForTypeReference(parserArgument.type, false)} ${parserArgument.name}<#sep>, </#sep></#list></#if>) {
return (int) Math.ceil((float) getLengthInBits(_value<#if type.parserArguments.isPresent()>, <#list type.parserArguments.orElseThrow() as parserArgument>${parserArgument.name}<#sep>, </#sep></#list></#if>) / 8.0);
}

public static int getLengthInBits(PlcValue _value<#if type.parserArguments.isPresent()>, <#list type.parserArguments.orElseThrow() as parserArgument>${helper.getLanguageTypeNameForTypeReference(parserArgument.type, false)} ${parserArgument.name}<#sep>, </#sep></#list></#if>) {
return 0;
int sizeInBits = 0;
<#assign defaultCaseOutput=false>
<#assign dataIoTypeDefinition=type.asDataIoTypeDefinition().orElseThrow()>
<#list dataIoTypeDefinition.switchField.cases as case>
<@compress single_line=true>
<#if case.discriminatorValueTerms?has_content>
if(
<#list case.discriminatorValueTerms as discriminatorValueTerm>
<#assign discriminatorExpression=dataIoTypeDefinition.switchField.discriminatorExpressions[discriminatorValueTerm?index].asLiteral().orElseThrow().asVariableLiteral().orElseThrow()>
<#assign discriminatorType=helper.getDiscriminatorTypes()[discriminatorExpression.name]>
EvaluationHelper.equals(
${helper.toParseExpression(dataIoTypeDefinition.switchField, discriminatorType, discriminatorExpression, parserArguments)},
<#if helper.isEnumTypeReference(discriminatorType)>
${helper.getLanguageTypeNameForTypeReference(discriminatorType)}.${helper.toParseExpression(dataIoTypeDefinition.switchField, discriminatorType, discriminatorValueTerm, parserArguments)}
<#else>
${helper.toParseExpression(dataIoTypeDefinition.switchField, discriminatorType, discriminatorValueTerm, parserArguments)}
</#if>
)
<#sep> && </#sep>
</#list>
)
<#else>
<#assign defaultCaseOutput=true>
</#if>
</@compress> { // ${case.name}
<#list case.fields as field>
<#switch field.typeName>
<#case "array">
<#assign arrayField=field.asArrayField().orElseThrow()>
PlcList values = (PlcList) _value;
<#if case.name == "Struct">
// TODO: Finish this!
<#elseif arrayField.type.isComplexTypeReference()>
// TODO: Finish this!
<#else>
sizeInBits += values.getList().size() * ${arrayField.type.asSimpleTypeReference().orElseThrow().sizeInBits};
</#if>
<#break>
<#case "const">
<#assign constField=field.asConstField().orElseThrow()>
// Const Field (${constField.name})
<#-- const fields are only simple type -->
sizeInBits += ${constField.type.asSimpleTypeReference().orElseThrow().sizeInBits};
<#break>
<#case "enum">
<#assign enumField=field.asEnumField().orElseThrow()>
// Enum field (${enumField.name})
sizeInBits += ${helper.getEnumFieldSimpleTypeReference(enumField.type, enumField.fieldName).sizeInBits};
<#break>
<#case "manual">
<#assign manualField=field.asManualField().orElseThrow()>
// Manual Field (${manualField.name})
sizeInBits += ${helper.toSerializationExpression(manualField, helper.intTypeReference, manualField.lengthExpression, type.parserArguments.orElse(null))};
<#break>
<#case "reserved">
<#assign reservedField=field.asReservedField().orElseThrow()>
// Reserved Field
sizeInBits += ${reservedField.type.asSimpleTypeReference().orElseThrow().sizeInBits};
<#break>
<#case "simple">
<#assign simpleField=field.asSimpleField().orElseThrow()>
// Simple Field (${simpleField.name})
sizeInBits += ${simpleField.type.asSimpleTypeReference().orElseThrow().sizeInBits};
<#break>
</#switch>
</#list>
}<#sep> else </#sep></#list>
return sizeInBits;
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -427,8 +427,9 @@ protected CompletableFuture<PlcWriteResponse> singleWrite(PlcWriteRequest writeR
}
}
try {
WriteBufferByteBased writeBuffer = DataItem.staticSerialize(plcValue,
plcField.getAdsDataType().getDataFormatName(), stringLength, ByteOrder.LITTLE_ENDIAN);
WriteBufferByteBased writeBuffer = new WriteBufferByteBased(DataItem.getLengthInBytes(plcValue,
plcField.getAdsDataType().getDataFormatName(), stringLength));
DataItem.staticSerialize(writeBuffer, plcValue, plcField.getAdsDataType().getDataFormatName(), stringLength, ByteOrder.LITTLE_ENDIAN);
AdsData adsData = new AdsWriteRequest(
directAdsField.getIndexGroup(), directAdsField.getIndexOffset(), writeBuffer.getData());
AmsPacket amsPacket = new AmsPacket(configuration.getTargetAmsNetId(), configuration.getTargetAmsPort(),
Expand Down Expand Up @@ -485,9 +486,10 @@ protected CompletableFuture<PlcWriteResponse> multiWrite(PlcWriteRequest writeRe
}
}
try {
final WriteBufferByteBased itemWriteBuffer = DataItem.staticSerialize(plcValue,
WriteBufferByteBased itemWriteBuffer = new WriteBufferByteBased(DataItem.getLengthInBytes(plcValue,
field.getAdsDataType().getDataFormatName(), stringLength));
DataItem.staticSerialize(itemWriteBuffer, plcValue,
field.getAdsDataType().getDataFormatName(), stringLength, ByteOrder.LITTLE_ENDIAN);
assert itemWriteBuffer != null;
int numBytes = itemWriteBuffer.getPos();
System.arraycopy(itemWriteBuffer.getData(), 0, writeBuffer, pos, numBytes);
pos += numBytes;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,10 +121,11 @@ private PlcValue read(ReadBuffer buffer, GenericCANField field) throws ParseExce
}

private void write(WriteBuffer buffer, GenericCANField field, PlcValue value) throws SerializationException {
WriteBufferByteBased data = DataItem.staticSerialize(value, field.getDataType());
WriteBufferByteBased writeBuffer = new WriteBufferByteBased(DataItem.getLengthInBytes(value, field.getDataType()));
DataItem.staticSerialize(writeBuffer, value, field.getDataType());
try {
buffer.pushContext("write-" + field);
buffer.writeByteArray(data.getData());
buffer.writeByteArray(writeBuffer.getData());
} finally {
buffer.popContext("write-" + field);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@
import org.apache.plc4x.java.api.types.PlcResponseCode;
import org.apache.plc4x.java.api.value.PlcValue;
import org.apache.plc4x.java.canopen.transport.CANOpenAbortException;
import org.apache.plc4x.java.canopen.readwrite.CANOpenFrame;
import org.apache.plc4x.java.canopen.readwrite.*;
import org.apache.plc4x.java.spi.generation.ByteOrder;

import java.util.concurrent.CompletableFuture;
import org.apache.plc4x.java.spi.generation.SerializationException;
import org.apache.plc4x.java.spi.generation.WriteBufferByteBased;

public class SDODownloadConversation extends CANOpenConversationBase {

Expand All @@ -41,7 +41,9 @@ public SDODownloadConversation(CANConversation delegate, int nodeId, int answerN
this.indexAddress = indexAddress;

try {
data = DataItem.staticSerialize(value, type, null, ByteOrder.LITTLE_ENDIAN).getData();
WriteBufferByteBased writeBuffer = new WriteBufferByteBased(DataItem.getLengthInBytes(value, type, null));
DataItem.staticSerialize(writeBuffer, value, type, null, ByteOrder.LITTLE_ENDIAN);
data = writeBuffer.getData();
} catch (SerializationException e) {
throw new PlcRuntimeException("Could not serialize data", e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -219,14 +219,12 @@ private void writeInternally(DefaultPlcWriteRequest writeRequest, CANOpenPDOFiel

try {
String fieldName = writeRequest.getFieldNames().iterator().next();
WriteBufferByteBased buffer = DataItem.staticSerialize(writeValue, field.getCanOpenDataType(), writeValue.getLength(), ByteOrder.LITTLE_ENDIAN);
if (buffer != null) {
final CANOpenPDOPayload payload = new CANOpenPDOPayload(new CANOpenPDO(buffer.getData()));
context.sendToWire(new CANOpenFrame((short) field.getNodeId(), field.getService(), payload));
response.complete(new DefaultPlcWriteResponse(writeRequest, Collections.singletonMap(fieldName, PlcResponseCode.OK)));
} else {
response.complete(new DefaultPlcWriteResponse(writeRequest, Collections.singletonMap(fieldName, PlcResponseCode.INVALID_DATA)));
}

WriteBufferByteBased writeBuffer = new WriteBufferByteBased(DataItem.getLengthInBytes(writeValue, field.getCanOpenDataType(), writeValue.getLength()));
DataItem.staticSerialize(writeBuffer, writeValue, field.getCanOpenDataType(), writeValue.getLength(), ByteOrder.LITTLE_ENDIAN);
final CANOpenPDOPayload payload = new CANOpenPDOPayload(new CANOpenPDO(writeBuffer.getData()));
context.sendToWire(new CANOpenFrame((short) field.getNodeId(), field.getService(), payload));
response.complete(new DefaultPlcWriteResponse(writeRequest, Collections.singletonMap(fieldName, PlcResponseCode.OK)));
} catch (Exception e) {
response.completeExceptionally(e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ public class KnxNetIpProtocolLogic extends Plc4xProtocolBase<KnxNetIpMessage> im
private static final AtomicInteger sequenceCounter = new AtomicInteger(0);
private RequestTransactionManager tm;

private Map<DefaultPlcConsumerRegistration, Consumer<PlcSubscriptionEvent>> consumers = new ConcurrentHashMap<>();
private final Map<DefaultPlcConsumerRegistration, Consumer<PlcSubscriptionEvent>> consumers = new ConcurrentHashMap<>();

@Override
public void setDriverContext(DriverContext driverContext) {
Expand Down Expand Up @@ -284,8 +284,8 @@ public CompletableFuture<PlcWriteResponse> write(PlcWriteRequest writeRequest) {

// Use the data in the ets5 model to correctly check and serialize the PlcValue
try {
final WriteBufferByteBased writeBuffer = KnxDatapoint.staticSerialize(value,
groupAddress.getType());
final WriteBufferByteBased writeBuffer = new WriteBufferByteBased(KnxDatapoint.getLengthInBytes(value, groupAddress.getType()));
KnxDatapoint.staticSerialize(writeBuffer, value, groupAddress.getType());
final byte[] serialized = writeBuffer.getData();
dataFirstByte = serialized[0];
data = new byte[serialized.length - 1];
Expand All @@ -305,6 +305,7 @@ public CompletableFuture<PlcWriteResponse> write(PlcWriteRequest writeRequest) {
} else if (value.isList()) {
// Check each item of the list, if it's also a byte.
List<? extends PlcValue> list = value.getList();
// TODO: This could cause an exception.
data = new byte[list.size() - 1];
boolean allValuesAreBytes = !list.isEmpty();
int numByte = 0;
Expand Down Expand Up @@ -574,16 +575,16 @@ protected byte[] toKnxAddressData(KnxNetIpField field) {
try {
switch (knxNetIpDriverContext.getGroupAddressType()) {
case 3:
address.writeUnsignedShort(5, Short.valueOf(field.getMainGroup()));
address.writeUnsignedByte(3, Byte.valueOf(field.getMiddleGroup()));
address.writeUnsignedShort(8, Short.valueOf(field.getSubGroup()));
address.writeUnsignedShort(5, Short.parseShort(field.getMainGroup()));
address.writeUnsignedByte(3, Byte.parseByte(field.getMiddleGroup()));
address.writeUnsignedShort(8, Short.parseShort(field.getSubGroup()));
break;
case 2:
address.writeUnsignedShort(5, Short.valueOf(field.getMainGroup()));
address.writeUnsignedShort(11, Short.valueOf(field.getSubGroup()));
address.writeUnsignedShort(5, Short.parseShort(field.getMainGroup()));
address.writeUnsignedShort(11, Short.parseShort(field.getSubGroup()));
break;
case 1:
address.writeUnsignedShort(16, Short.valueOf(field.getSubGroup()));
address.writeUnsignedShort(16, Short.parseShort(field.getSubGroup()));
break;
}
} catch (Exception e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -424,7 +424,7 @@ private byte[] fromPlcValue(PlcField field, PlcValue plcValue) {
ModbusDataType fieldDataType = ((ModbusField) field).getDataType();
try {
if(plcValue instanceof PlcList) {
WriteBufferByteBased writeBuffer = new WriteBufferByteBased(DataItem.getLengthInBits(plcValue, fieldDataType, plcValue.getLength()));
WriteBufferByteBased writeBuffer = new WriteBufferByteBased(DataItem.getLengthInBytes(plcValue, fieldDataType, plcValue.getLength()));
DataItem.staticSerialize(writeBuffer, plcValue, fieldDataType, plcValue.getLength(), ByteOrder.BIG_ENDIAN);
byte[] data = writeBuffer.getData();
if (((ModbusField) field).getDataType() == ModbusDataType.BOOL) {
Expand All @@ -438,7 +438,7 @@ private byte[] fromPlcValue(PlcField field, PlcValue plcValue) {
}
return data;
} else {
WriteBufferByteBased writeBuffer = new WriteBufferByteBased(DataItem.getLengthInBits(plcValue, fieldDataType, plcValue.getLength()));
WriteBufferByteBased writeBuffer = new WriteBufferByteBased(DataItem.getLengthInBytes(plcValue, fieldDataType, plcValue.getLength()));
DataItem.staticSerialize(writeBuffer, plcValue, fieldDataType, plcValue.getLength(), ByteOrder.BIG_ENDIAN);
return writeBuffer.getData();
}
Expand Down

0 comments on commit 447ef68

Please sign in to comment.