You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by jm...@apache.org on 2018/01/05 03:01:46 UTC
[incubator-plc4x] 02/02: refactor and clean up switches
This is an automated email from the ASF dual-hosted git repository.
jmclean pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git
commit 641c99f40b80bc7012602ec75a621a8871020037
Author: Justin Mclean <jm...@apache.org>
AuthorDate: Fri Jan 5 14:01:36 2018 +1100
refactor and clean up switches
---
.../plc4x/java/isotp/netty/IsoTPProtocol.java | 243 ++++++++++++---------
1 file changed, 137 insertions(+), 106 deletions(-)
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/IsoTPProtocol.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/IsoTPProtocol.java
index def2b39..07a2870 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/IsoTPProtocol.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/IsoTPProtocol.java
@@ -91,44 +91,22 @@ public class IsoTPProtocol extends MessageToMessageCodec<IsoOnTcpMessage, Tpdu>
// The fixed header of a TCP TP Packet depends highly on the selected type.
switch (in.getTpduCode()) {
case CONNECTION_REQUEST:
- case CONNECTION_CONFIRM: {
- ConnectionTpdu connectionTpdu = (ConnectionTpdu) in;
- buf.writeShort(connectionTpdu.getDestinationReference());
- buf.writeShort(connectionTpdu.getSourceReference());
- buf.writeByte(connectionTpdu.getProtocolClass().getCode());
- outputParameters(buf, in.getParameters());
+ case CONNECTION_CONFIRM:
+ encodeConnecton(in, buf);
break;
- }
- case DATA: {
- DataTpdu dataTpdu = (DataTpdu) in;
- // EOT (Bit 8 = 1) / TPDU (All other bits 0)
- buf.writeByte((byte) (dataTpdu.getTpduRef() | (dataTpdu.isEot() ? 0x80 : 0x00)));
- // Note: A Data TPDU in Class 0 doesn't have parameters
+ case DATA:
+ encodeData((DataTpdu) in, buf);
break;
- }
case DISCONNECT_REQUEST:
- case DISCONNECT_CONFIRM: {
- DisconnectTpdu disconnectTpdu = (DisconnectTpdu) in;
- buf.writeShort(disconnectTpdu.getDestinationReference());
- buf.writeShort(disconnectTpdu.getSourceReference());
- if (disconnectTpdu instanceof DisconnectRequestTpdu) {
- DisconnectRequestTpdu disconnectRequestTpdu = (DisconnectRequestTpdu) disconnectTpdu;
- buf.writeByte(disconnectRequestTpdu.getDisconnectReason().getCode());
- }
- outputParameters(buf, in.getParameters());
+ case DISCONNECT_CONFIRM:
+ encodeDisconnect(in, buf);
break;
- }
- case TPDU_ERROR: {
- ErrorTpdu errorTpdu = (ErrorTpdu) in;
- buf.writeShort(errorTpdu.getDestinationReference());
- buf.writeByte(errorTpdu.getRejectCause().getCode());
- outputParameters(buf, in.getParameters());
+ case TPDU_ERROR:
+ enocdeError(in, buf);
break;
- }
- default: {
- logger.error("TDPU Value {} not implemented yet", new Object[]{in.getTpduCode().name()});
+ default:
+ logger.error("TDPU Value %s not implemented yet", in.getTpduCode().name());
return;
- }
}
// Add the user-data itself.
buf.writeBytes(in.getUserData());
@@ -136,6 +114,38 @@ public class IsoTPProtocol extends MessageToMessageCodec<IsoOnTcpMessage, Tpdu>
out.add(new IsoOnTcpMessage(buf));
}
+ private void enocdeError(Tpdu in, ByteBuf buf) {
+ ErrorTpdu errorTpdu = (ErrorTpdu) in;
+ buf.writeShort(errorTpdu.getDestinationReference());
+ buf.writeByte(errorTpdu.getRejectCause().getCode());
+ outputParameters(buf, in.getParameters());
+ }
+
+ private void encodeDisconnect(Tpdu in, ByteBuf buf) {
+ DisconnectTpdu disconnectTpdu = (DisconnectTpdu) in;
+ buf.writeShort(disconnectTpdu.getDestinationReference());
+ buf.writeShort(disconnectTpdu.getSourceReference());
+ if (disconnectTpdu instanceof DisconnectRequestTpdu) {
+ DisconnectRequestTpdu disconnectRequestTpdu = (DisconnectRequestTpdu) disconnectTpdu;
+ buf.writeByte(disconnectRequestTpdu.getDisconnectReason().getCode());
+ }
+ outputParameters(buf, in.getParameters());
+ }
+
+ private void encodeData(DataTpdu in, ByteBuf buf) {
+ // EOT (Bit 8 = 1) / TPDU (All other bits 0)
+ buf.writeByte((byte) (in.getTpduRef() | (in.isEot() ? 0x80 : 0x00)));
+ // Note: A Data TPDU in Class 0 doesn't have parameters
+ }
+
+ private void encodeConnecton(Tpdu in, ByteBuf buf) {
+ ConnectionTpdu connectionTpdu = (ConnectionTpdu) in;
+ buf.writeShort(connectionTpdu.getDestinationReference());
+ buf.writeShort(connectionTpdu.getSourceReference());
+ buf.writeByte(connectionTpdu.getProtocolClass().getCode());
+ outputParameters(buf, in.getParameters());
+ }
+
@Override
protected void decode(ChannelHandlerContext ctx, IsoOnTcpMessage in, List<Object> out) throws Exception {
if(logger.isTraceEnabled()) {
@@ -161,49 +171,22 @@ public class IsoTPProtocol extends MessageToMessageCodec<IsoOnTcpMessage, Tpdu>
List<Parameter> parameters = new LinkedList<>();
switch (tpduCode) {
case CONNECTION_REQUEST:
- case CONNECTION_CONFIRM: {
- short destinationReference = userData.readShort();
- short sourceReference = userData.readShort();
- ProtocolClass protocolClass = ProtocolClass.valueOf(userData.readByte());
- switch (tpduCode) {
- case CONNECTION_REQUEST:
- tpdu = new ConnectionRequestTpdu(destinationReference, sourceReference, protocolClass, parameters, userData);
- break;
- case CONNECTION_CONFIRM:
- tpdu = new ConnectionConfirmTpdu(destinationReference, sourceReference, protocolClass, parameters, userData);
- ctx.channel().pipeline().fireUserEventTriggered(
- new S7ConnectionEvent(S7ConnectionState.ISO_TP_CONNECTION_RESPONSE_RECEIVED));
- break;
- }
+ case CONNECTION_CONFIRM:
+ tpdu = decodeConnection(ctx, userData, tpduCode, parameters);
break;
- }
- case DATA: {
- byte tmp = userData.readByte();
- boolean eot = (tmp & 0x80) == 0x80;
- byte tpduRef = (byte) (tmp & 0x7F);
- tpdu = new DataTpdu(eot, tpduRef, parameters, userData);
+ case DATA:
+ tpdu = decodeData(userData, parameters);
break;
- }
case DISCONNECT_REQUEST:
- case DISCONNECT_CONFIRM: {
- short destinationReference = userData.readShort();
- short sourceReference = userData.readShort();
- if (tpduCode == TpduCode.DISCONNECT_REQUEST) {
- DisconnectReason disconnectReason = DisconnectReason.valueOf(userData.readByte());
- tpdu = new DisconnectRequestTpdu(
- destinationReference, sourceReference, disconnectReason, parameters, userData);
- } else {
- tpdu = new DisconnectConfirmTpdu(
- destinationReference, sourceReference, parameters, userData);
- }
+ case DISCONNECT_CONFIRM:
+ tpdu = decodeDisconnect(userData, tpduCode, parameters);
break;
- }
- case TPDU_ERROR: {
- short destinationReference = userData.readShort();
- RejectCause rejectCause = RejectCause.valueOf(userData.readByte());
- tpdu = new ErrorTpdu(destinationReference, rejectCause, parameters, userData);
+ case TPDU_ERROR:
+ tpdu = decodeError(userData, parameters);
+ break;
+ default:
+ logger.trace("Tpdu Code %s not implemented", tpduCode.name());
break;
- }
}
// Read variable header parameters
@@ -227,6 +210,56 @@ public class IsoTPProtocol extends MessageToMessageCodec<IsoOnTcpMessage, Tpdu>
}
}
+ private Tpdu decodeError(ByteBuf userData, List<Parameter> parameters) {
+ Tpdu tpdu;
+ short destinationReference = userData.readShort();
+ RejectCause rejectCause = RejectCause.valueOf(userData.readByte());
+ tpdu = new ErrorTpdu(destinationReference, rejectCause, parameters, userData);
+ return tpdu;
+ }
+
+ private Tpdu decodeDisconnect(ByteBuf userData, TpduCode tpduCode, List<Parameter> parameters) {
+ Tpdu tpdu;
+ short destinationReference = userData.readShort();
+ short sourceReference = userData.readShort();
+ if (tpduCode == TpduCode.DISCONNECT_REQUEST) {
+ DisconnectReason disconnectReason = DisconnectReason.valueOf(userData.readByte());
+ tpdu = new DisconnectRequestTpdu(
+ destinationReference, sourceReference, disconnectReason, parameters, userData);
+ } else { // TpduCode.DISCONNECT_CONFIRM
+ tpdu = new DisconnectConfirmTpdu(
+ destinationReference, sourceReference, parameters, userData);
+ }
+ return tpdu;
+ }
+
+ private Tpdu decodeData(ByteBuf userData, List<Parameter> parameters) {
+ Tpdu tpdu;
+ byte tmp = userData.readByte();
+ boolean eot = (tmp & 0x80) == 0x80;
+ byte tpduRef = (byte) (tmp & 0x7F);
+ tpdu = new DataTpdu(eot, tpduRef, parameters, userData);
+ return tpdu;
+ }
+
+ private Tpdu decodeConnection(ChannelHandlerContext ctx, ByteBuf userData, TpduCode tpduCode, List<Parameter> parameters) {
+ Tpdu tpdu;
+ short destinationReference = userData.readShort();
+ short sourceReference = userData.readShort();
+ ProtocolClass protocolClass = ProtocolClass.valueOf(userData.readByte());
+
+ if (tpduCode == TpduCode.CONNECTION_REQUEST) {
+ tpdu = new ConnectionRequestTpdu(destinationReference, sourceReference, protocolClass, parameters, userData);
+
+ } else { // TpduCode.CONNECTION_CONFIRM
+ tpdu = new ConnectionConfirmTpdu(destinationReference, sourceReference, protocolClass, parameters, userData);
+ ctx.channel().pipeline().fireUserEventTriggered(
+ new S7ConnectionEvent(S7ConnectionState.ISO_TP_CONNECTION_RESPONSE_RECEIVED));
+
+ }
+ return tpdu;
+ }
+
private void outputParameters(ByteBuf out, List<Parameter> parameters) {
if (parameters != null) {
for (Parameter parameter : parameters) {
@@ -234,33 +267,28 @@ public class IsoTPProtocol extends MessageToMessageCodec<IsoOnTcpMessage, Tpdu>
out.writeByte((byte) (getParameterLength(parameter) - 2));
switch (parameter.getType()) {
case CALLED_TSAP:
- case CALLING_TSAP: {
+ case CALLING_TSAP:
TsapParameter tsap = (TsapParameter) parameter;
out.writeByte(tsap.getDeviceGroup().getCode());
out.writeByte((byte)
((tsap.getRackNumber() << 4) | (tsap.getSlotNumber())));
break;
- }
- case CHECKSUM: {
+ case CHECKSUM:
ChecksumParameter checksum = (ChecksumParameter) parameter;
out.writeByte(checksum.getChecksum());
break;
- }
- case DISCONNECT_ADDITIONAL_INFORMATION: {
+ case DISCONNECT_ADDITIONAL_INFORMATION:
DisconnectAdditionalInformationParameter disconnectAdditionalInformation = (DisconnectAdditionalInformationParameter) parameter;
out.writeBytes(disconnectAdditionalInformation.getData());
break;
- }
- case TPDU_SIZE: {
+ case TPDU_SIZE:
TpduSizeParameter tpduSize = (TpduSizeParameter) parameter;
out.writeByte(tpduSize.getTpduSize().getCode());
break;
- }
- default: {
+ default:
logger.error("TDPU tarameter type {} not implemented yet",
new Object[]{parameter.getType().name()});
return;
- }
}
}
}
@@ -276,7 +304,7 @@ public class IsoTPProtocol extends MessageToMessageCodec<IsoOnTcpMessage, Tpdu>
*/
private short getHeaderLength(Tpdu tpdu) {
if (tpdu != null) {
- short headerLength = 0;
+ short headerLength;
switch (tpdu.getTpduCode()) {
case CONNECTION_REQUEST:
case CONNECTION_CONFIRM:
@@ -294,6 +322,9 @@ public class IsoTPProtocol extends MessageToMessageCodec<IsoOnTcpMessage, Tpdu>
case TPDU_ERROR:
headerLength = 5;
break;
+ default:
+ headerLength = 0;
+ break;
}
return (short) (headerLength + getParametersLength(tpdu.getParameters()));
}
@@ -318,14 +349,15 @@ public class IsoTPProtocol extends MessageToMessageCodec<IsoOnTcpMessage, Tpdu>
return 4;
case CHECKSUM:
return 3;
- case DISCONNECT_ADDITIONAL_INFORMATION: {
+ case DISCONNECT_ADDITIONAL_INFORMATION:
DisconnectAdditionalInformationParameter disconnectAdditionalInformationParameter =
(DisconnectAdditionalInformationParameter) parameter;
return (short) (2 + ((disconnectAdditionalInformationParameter.getData() != null) ?
disconnectAdditionalInformationParameter.getData().length : 0));
- }
case TPDU_SIZE:
return 3;
+ default:
+ return 0;
}
}
return 0;
@@ -340,38 +372,37 @@ public class IsoTPProtocol extends MessageToMessageCodec<IsoOnTcpMessage, Tpdu>
byte length = out.readByte();
switch (parameterCode) {
case CALLING_TSAP:
- case CALLED_TSAP: {
- DeviceGroup deviceGroup = DeviceGroup.valueOf(out.readByte());
- byte tmp = out.readByte();
- byte rackId = (byte) ((tmp & 0xF0) >> 4);
- byte slotId = (byte) (tmp & 0x0F);
- switch (parameterCode) {
- case CALLING_TSAP:
- return new CallingTsapParameter(deviceGroup, rackId, slotId);
- case CALLED_TSAP:
- return new CalledTsapParameter(deviceGroup, rackId, slotId);
- default:
- logger.error("Parameter not implemented yet " + parameterCode.name());
- return null;
- }
- }
- case CHECKSUM: {
+ case CALLED_TSAP:
+ return parseCallParameter(out, parameterCode);
+ case CHECKSUM:
byte checksum = out.readByte();
return new ChecksumParameter(checksum);
- }
- case DISCONNECT_ADDITIONAL_INFORMATION: {
+ case DISCONNECT_ADDITIONAL_INFORMATION:
byte[] data = new byte[length];
out.readBytes(data);
return new DisconnectAdditionalInformationParameter(data);
- }
- case TPDU_SIZE: {
+ case TPDU_SIZE:
TpduSize tpduSize = TpduSize.valueOf(out.readByte());
return new TpduSizeParameter(tpduSize);
- }
- default: {
+ default:
+ logger.error("Parameter not implemented yet " + parameterCode.name());
+ return null;
+ }
+ }
+
+ private Parameter parseCallParameter(ByteBuf out, ParameterCode parameterCode) {
+ DeviceGroup deviceGroup = DeviceGroup.valueOf(out.readByte());
+ byte tmp = out.readByte();
+ byte rackId = (byte) ((tmp & 0xF0) >> 4);
+ byte slotId = (byte) (tmp & 0x0F);
+ switch (parameterCode) {
+ case CALLING_TSAP:
+ return new CallingTsapParameter(deviceGroup, rackId, slotId);
+ case CALLED_TSAP:
+ return new CalledTsapParameter(deviceGroup, rackId, slotId);
+ default:
logger.error("Parameter not implemented yet " + parameterCode.name());
return null;
- }
}
}
--
To stop receiving notification emails like this one, please contact
"commits@plc4x.apache.org" <co...@plc4x.apache.org>.