Skip to content

Commit

Permalink
refactor(plc4j): Continued streamlining the way Api types are parsed/…
Browse files Browse the repository at this point in the history
…serialized
  • Loading branch information
chrisdutz committed Feb 13, 2023
1 parent ec30925 commit 1997380
Show file tree
Hide file tree
Showing 10 changed files with 68 additions and 114 deletions.
2 changes: 1 addition & 1 deletion plc4go/assets/testing/protocols/eip/DriverTestsuite.xml
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@
</EipConnectionRequest>
</EipPacket>
</outgoing-plc-message>
<!-- The PLC will send the connection response with a sender context and session handle-->
<!-- The PLC will send the connection response with a sender context and session handle -->
<incoming-plc-message name="Receive connection response">
<EipPacket>
<command dataType="uint" bitLength="16">101</command>
Expand Down
16 changes: 9 additions & 7 deletions plc4go/assets/testing/protocols/modbus/tcp/DriverTestsuite.xml
Original file line number Diff line number Diff line change
Expand Up @@ -432,13 +432,13 @@
<numberOfElements dataType="uint" bitLength="16">1</numberOfElements>
<dataType dataType="string" bitLength="32" encoding="UTF-8">REAL</dataType>
</ModbusTagHoldingRegister>
<value dataType="string" bitLength="72" encoding="UTF-8">3.1415927</value>
<PlcREAL dataType="float" bitLength="32">3.1415927410125732</PlcREAL>
</hurz>
</tags>
</PlcWriteRequest>
<tags>
<responseCodes>
<hurz dataType="string" bitLength="16" encoding="UTF-8">OK</hurz>
</tags>
</responseCodes>
</PlcWriteResponse>
</api-response>
</steps>
Expand Down Expand Up @@ -519,14 +519,16 @@
<numberOfElements dataType="uint" bitLength="16">2</numberOfElements>
<dataType dataType="string" bitLength="32" encoding="UTF-8">REAL</dataType>
</ModbusTagHoldingRegister>
<value dataType="string" bitLength="72" encoding="UTF-8">3.1415927</value>
<value dataType="string" bitLength="72" encoding="UTF-8">3.1415927</value>
<PlcList>
<PlcREAL dataType="float" bitLength="32">3.1415927410125732</PlcREAL>
<PlcREAL dataType="float" bitLength="32">3.1415927410125732</PlcREAL>
</PlcList>
</hurz>
</tags>
</PlcWriteRequest>
<tags>
<responseCodes>
<hurz dataType="string" bitLength="16" encoding="UTF-8">OK</hurz>
</tags>
</responseCodes>
</PlcWriteResponse>
</api-response>
</steps>
Expand Down
2 changes: 1 addition & 1 deletion plc4go/internal/eip/Tag.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ func (m plcTag) GetElementNb() uint16 {
}

func (m plcTag) Serialize() ([]byte, error) {
wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.LittleEndian))
if err := m.SerializeWithWriteBuffer(wb); err != nil {
return nil, err
}
Expand Down
2 changes: 1 addition & 1 deletion plc4go/pkg/api/model/plc_response_code.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,5 +86,5 @@ func (m PlcResponseCode) Serialize() ([]byte, error) {
}

func (m PlcResponseCode) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
return writeBuffer.WriteUint8("AlarmType", 8, uint8(m), utils.WithAdditionalStringRepresentation(m.GetName()))
return writeBuffer.WriteUint8("ResponseCode", 8, uint8(m), utils.WithAdditionalStringRepresentation(m.GetName()))
}
52 changes: 8 additions & 44 deletions plc4go/spi/model/DefaultPlcWriteRequest.go
Original file line number Diff line number Diff line change
Expand Up @@ -201,14 +201,11 @@ func (d *DefaultPlcWriteRequest) SerializeWithWriteBuffer(ctx context.Context, w
if err := writeBuffer.PushContext("PlcWriteRequest"); err != nil {
return err
}
if err := d.DefaultPlcTagRequest.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
return err
}
if err := writeBuffer.PushContext("values", utils.WithRenderAsList(true)); err != nil {

if err := writeBuffer.PushContext("tags"); err != nil {
return err
}
for name, elem := range d.values {

for name, elem := range d.tags {
var elem interface{} = elem
if serializable, ok := elem.(utils.Serializable); ok {
if err := writeBuffer.PushContext(name); err != nil {
Expand All @@ -217,6 +214,10 @@ func (d *DefaultPlcWriteRequest) SerializeWithWriteBuffer(ctx context.Context, w
if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
return err
}
var value interface{} = d.values[name]
if err := value.(utils.Serializable).SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
return err
}
if err := writeBuffer.PopContext(name); err != nil {
return err
}
Expand All @@ -227,47 +228,10 @@ func (d *DefaultPlcWriteRequest) SerializeWithWriteBuffer(ctx context.Context, w
}
}
}
if err := writeBuffer.PopContext("values", utils.WithRenderAsList(true)); err != nil {
if err := writeBuffer.PopContext("tags"); err != nil {
return err
}

if d.writer != nil {
if serializableField, ok := d.writer.(utils.Serializable); ok {
if err := writeBuffer.PushContext("writer"); err != nil {
return err
}
if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
return err
}
if err := writeBuffer.PopContext("writer"); err != nil {
return err
}
} else {
stringValue := fmt.Sprintf("%v", d.writer)
if err := writeBuffer.WriteString("writer", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
return err
}
}
}

if d.writeRequestInterceptor != nil {
if serializableField, ok := d.writeRequestInterceptor.(utils.Serializable); ok {
if err := writeBuffer.PushContext("writeRequestInterceptor"); err != nil {
return err
}
if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
return err
}
if err := writeBuffer.PopContext("writeRequestInterceptor"); err != nil {
return err
}
} else {
stringValue := fmt.Sprintf("%v", d.writeRequestInterceptor)
if err := writeBuffer.WriteString("writeRequestInterceptor", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
return err
}
}
}
if err := writeBuffer.PopContext("PlcWriteRequest"); err != nil {
return err
}
Expand Down
37 changes: 12 additions & 25 deletions plc4go/spi/model/DefaultPlcWriteResponse.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,23 +41,23 @@ func NewDefaultPlcWriteResponse(request model.PlcWriteRequest, responseCodes map
}
}

func (m *DefaultPlcWriteResponse) GetTagNames() []string {
func (d *DefaultPlcWriteResponse) GetTagNames() []string {
var tagNames []string
// We take the tag names from the request to keep order as map is not ordered
for _, name := range m.request.GetTagNames() {
if _, ok := m.responseCodes[name]; ok {
for _, name := range d.request.GetTagNames() {
if _, ok := d.responseCodes[name]; ok {
tagNames = append(tagNames, name)
}
}
return tagNames
}

func (m *DefaultPlcWriteResponse) GetRequest() model.PlcWriteRequest {
return m.request
func (d *DefaultPlcWriteResponse) GetRequest() model.PlcWriteRequest {
return d.request
}

func (m *DefaultPlcWriteResponse) GetResponseCode(name string) model.PlcResponseCode {
return m.responseCodes[name]
func (d *DefaultPlcWriteResponse) GetResponseCode(name string) model.PlcResponseCode {
return d.responseCodes[name]
}

func (d *DefaultPlcWriteResponse) Serialize() ([]byte, error) {
Expand Down Expand Up @@ -88,30 +88,17 @@ func (d *DefaultPlcWriteResponse) SerializeWithWriteBuffer(ctx context.Context,
}
}
}
if err := writeBuffer.PushContext("responseCodes", utils.WithRenderAsList(true)); err != nil {
if err := writeBuffer.PushContext("responseCodes"); err != nil {
return err
}
for name, elem := range d.responseCodes {

var elem interface{} = elem
if serializable, ok := elem.(utils.Serializable); ok {
if err := writeBuffer.PushContext(name); err != nil {
return err
}
if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
return err
}
if err := writeBuffer.PopContext(name); err != nil {
return err
}
} else {
elemAsString := fmt.Sprintf("%v", elem)
if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
return err
}
elemAsString := fmt.Sprintf("%v", elem)
if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
return err
}
}
if err := writeBuffer.PopContext("responseCodes", utils.WithRenderAsList(true)); err != nil {
if err := writeBuffer.PopContext("responseCodes"); err != nil {
return err
}
if err := writeBuffer.PopContext("PlcWriteResponse"); err != nil {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,31 +115,30 @@ public void serialize(WriteBuffer writeBuffer) throws SerializationException {
writeBuffer.pushContext(tagName);
PlcTag tag = tagValueItem.getTag();
if (!(tag instanceof Serializable)) {
throw new RuntimeException("Error serializing. Tag doesn't implement XmlSerializable");
throw new RuntimeException("Error serializing. Tag doesn't implement Serializable");
}
((Serializable) tag).serialize(writeBuffer);
final PlcValue value = tagValueItem.getValue();
if (value instanceof PlcList) {
PlcList list = (PlcList) value;
for (PlcValue plcValue : list.getList()) {
String plcValueString = plcValue.getString();
writeBuffer.writeString("value",
plcValueString.getBytes(StandardCharsets.UTF_8).length * 8,
plcValueString, WithOption.WithEncoding(StandardCharsets.UTF_8.name()));
}
} else {
String plcValueString = value.getString();
writeBuffer.writeString("value",
plcValueString.getBytes(StandardCharsets.UTF_8).length * 8,
plcValueString, WithOption.WithEncoding(StandardCharsets.UTF_8.name()));
}
serializePlcValue(value, writeBuffer);
writeBuffer.popContext(tagName);
}
writeBuffer.popContext("tags");

writeBuffer.popContext("PlcWriteRequest");
}

protected void serializePlcValue(PlcValue plcValue, WriteBuffer writeBuffer) throws SerializationException {
if(plcValue instanceof Serializable) {
Serializable serializable = (Serializable) plcValue;
serializable.serialize(writeBuffer);
} else {
String plcValueString = plcValue.getString();
writeBuffer.writeString("value",
plcValueString.getBytes(StandardCharsets.UTF_8).length * 8,
plcValueString, WithOption.WithEncoding(StandardCharsets.UTF_8.name()));
}
}

public static class Builder implements PlcWriteRequest.Builder {

private final PlcWriter writer;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ public void serialize(WriteBuffer writeBuffer) throws SerializationException {
if (request instanceof Serializable) {
((Serializable) request).serialize(writeBuffer);
}
writeBuffer.pushContext("tags");
writeBuffer.pushContext("responseCodes");
for (Map.Entry<String, PlcResponseCode> tagEntry : responseCodes.entrySet()) {
String tagName = tagEntry.getKey();
final PlcResponseCode tagResponseCode = tagEntry.getValue();
Expand All @@ -78,7 +78,7 @@ public void serialize(WriteBuffer writeBuffer) throws SerializationException {
result.getBytes(StandardCharsets.UTF_8).length * 8,
result, WithOption.WithEncoding(StandardCharsets.UTF_8.name()));
}
writeBuffer.popContext("tags");
writeBuffer.popContext("responseCodes");

writeBuffer.popContext("PlcWriteResponse");
}
Expand Down
22 changes: 11 additions & 11 deletions protocols/eip/src/main/resources/protocols/eip/eip.mspec
Original file line number Diff line number Diff line change
Expand Up @@ -30,18 +30,18 @@
[array uint 8 senderContext count '8']
[simple uint 32 options]
[typeSwitch command
['0x0065' EipConnectionRequest
[const uint 16 protocolVersion 0x01]
[const uint 16 flags 0x00]
]
['0x0066' EipDisconnectRequest
]
['0x006F' CipRRData(uint 16 packetLength)
[reserved uint 32 '0x00000000']
[reserved uint 16 '0x0000']
[simple CipExchange('packetLength - 6') exchange]
]
['0x0065' EipConnectionRequest
[const uint 16 protocolVersion 0x01]
[const uint 16 flags 0x00]
]
['0x0066' EipDisconnectRequest
]
['0x006F' CipRRData(uint 16 packetLength)
[reserved uint 32 '0x00000000']
[reserved uint 16 '0x0000']
[simple CipExchange('packetLength - 6') exchange]
]
]
]
[type CipExchange (uint 16 exchangeLen) //We pass then length down to evey sub-type to be able to provide the remaining data size
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -432,13 +432,13 @@
<numberOfElements dataType="uint" bitLength="16">1</numberOfElements>
<dataType dataType="string" bitLength="32" encoding="UTF-8">REAL</dataType>
</ModbusTagHoldingRegister>
<value dataType="string" bitLength="72" encoding="UTF-8">3.1415927</value>
<PlcREAL dataType="float" bitLength="32">3.1415927410125732</PlcREAL>
</hurz>
</tags>
</PlcWriteRequest>
<tags>
<responseCodes>
<hurz dataType="string" bitLength="16" encoding="UTF-8">OK</hurz>
</tags>
</responseCodes>
</PlcWriteResponse>
</api-response>
</steps>
Expand Down Expand Up @@ -519,14 +519,16 @@
<numberOfElements dataType="uint" bitLength="16">2</numberOfElements>
<dataType dataType="string" bitLength="32" encoding="UTF-8">REAL</dataType>
</ModbusTagHoldingRegister>
<value dataType="string" bitLength="72" encoding="UTF-8">3.1415927</value>
<value dataType="string" bitLength="72" encoding="UTF-8">3.1415927</value>
<PlcList>
<PlcREAL dataType="float" bitLength="32">3.1415927410125732</PlcREAL>
<PlcREAL dataType="float" bitLength="32">3.1415927410125732</PlcREAL>
</PlcList>
</hurz>
</tags>
</PlcWriteRequest>
<tags>
<responseCodes>
<hurz dataType="string" bitLength="16" encoding="UTF-8">OK</hurz>
</tags>
</responseCodes>
</PlcWriteResponse>
</api-response>
</steps>
Expand Down

0 comments on commit 1997380

Please sign in to comment.