aboutsummaryrefslogtreecommitdiffstats
path: root/Software
diff options
context:
space:
mode:
authorRoy <roy.mail.net@gmail.com>2018-01-03 01:57:58 +0200
committerRoy <roy.mail.net@gmail.com>2018-01-03 01:57:58 +0200
commit63b2a192ba12f8239668b6818db4ad02db68dbbc (patch)
treec9c1de011b38fbff94ce87ac2771667b9a3e773d /Software
parentf917366c405a4308b4b60e30eb1bd0dcf880532c (diff)
downloadTango-63b2a192ba12f8239668b6818db4ad02db68dbbc.tar.gz
Tango-63b2a192ba12f8239668b6818db4ad02db68dbbc.zip
Implemented abstraction of message encoding/decoding by adding another layer of "Encoders" to Transporters.
Diffstat (limited to 'Software')
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/MachineOperator.java4
-rw-r--r--Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/ExternalBridgeService.java4
-rw-r--r--Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/ITangoMessage.java24
-rw-r--r--Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/MessageFactory.java26
-rw-r--r--Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/TangoMessage.java47
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportAdapter.java15
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportEncoder.java30
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransporter.java14
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportAdapterBase.java82
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransporterBase.java138
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/encoders/ProtoEncoder.java29
-rw-r--r--Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/transporters/BasicTransporter.java6
-rw-r--r--Software/Visual_Studio/Tango.Integration/Services/ExternalBridgeClient.cs2
-rw-r--r--Software/Visual_Studio/Tango.PMR/ITangoMessage.cs34
-rw-r--r--Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj1
-rw-r--r--Software/Visual_Studio/Tango.PMR/TangoMessage.cs10
-rw-r--r--Software/Visual_Studio/Tango.Transport/Encoders/ProtoEncoder.cs47
-rw-r--r--Software/Visual_Studio/Tango.Transport/ITransportAdapter.cs10
-rw-r--r--Software/Visual_Studio/Tango.Transport/ITransportEncoder.cs37
-rw-r--r--Software/Visual_Studio/Tango.Transport/ITransporter.cs5
-rw-r--r--Software/Visual_Studio/Tango.Transport/Tango.Transport.csproj5
-rw-r--r--Software/Visual_Studio/Tango.Transport/TransportAdapterBase.cs31
-rw-r--r--Software/Visual_Studio/Tango.Transport/TransporterBase.cs61
-rw-r--r--Software/Visual_Studio/Tango.Transport/Transporters/BasicTransporter.cs (renamed from Software/Visual_Studio/Tango.Transport/Transporters/ProtoTransporter.cs)10
-rw-r--r--Software/Visual_Studio/Tango.Transport/Transporters/JsonTransporter.cs60
-rw-r--r--Software/Visual_Studio/Utilities/Tango.MachineEM.UI/ViewModels/MainViewVM.cs2
-rw-r--r--Software/Visual_Studio/Utilities/Tango.MobileEM.UI/App.xaml.cs2
27 files changed, 469 insertions, 267 deletions
diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/MachineOperator.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/MachineOperator.java
index f23c8c705..c690435f9 100644
--- a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/MachineOperator.java
+++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/operators/MachineOperator.java
@@ -1,13 +1,13 @@
package com.twine.tango.integration.operators;
import com.twine.tango.transport.ITransportAdapter;
-import com.twine.tango.transport.transporters.ProtoTransporter;
+import com.twine.tango.transport.transporters.BasicTransporter;
/**
* Created by Roy on 12/23/2017.
*/
-public class MachineOperator extends ProtoTransporter implements IMachineOperator
+public class MachineOperator extends BasicTransporter implements IMachineOperator
{
public MachineOperator()
{
diff --git a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/ExternalBridgeService.java b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/ExternalBridgeService.java
index 4788a8082..189c21d3f 100644
--- a/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/ExternalBridgeService.java
+++ b/Software/Android_Studio/Tango.Integration/src/main/java/com/twine/tango/integration/services/ExternalBridgeService.java
@@ -21,7 +21,7 @@ import com.twine.tango.pmr.integration.ExternalClientLoginRequestOuterClass.Exte
import com.twine.tango.pmr.integration.ExternalClientLoginResponseOuterClass.ExternalClientLoginResponse;
import com.twine.tango.transport.ResponseErrorException;
import com.twine.tango.transport.adapters.TcpTransportAdapter;
-import com.twine.tango.transport.transporters.ProtoTransporter;
+import com.twine.tango.transport.transporters.BasicTransporter;
import java.io.IOException;
import java.net.DatagramPacket;
@@ -40,7 +40,7 @@ import static br.com.zbra.androidlinq.Linq.stream;
* Created by Roy on 12/22/2017.
*/
-public class ExternalBridgeService extends ProtoTransporter implements IExternalBridgeService
+public class ExternalBridgeService extends BasicTransporter implements IExternalBridgeService
{
private ServerSocket listener;
private boolean isStarted;
diff --git a/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/ITangoMessage.java b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/ITangoMessage.java
index 83153d154..f64411a62 100644
--- a/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/ITangoMessage.java
+++ b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/ITangoMessage.java
@@ -1,9 +1,31 @@
package com.twine.tango.pmr;
+import com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer;
+import com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType;
+
/**
* Created by Roy on 1/3/2018.
*/
-
public interface ITangoMessage
{
+ /**
+ * Gets the container that will encapsulate the actual PMR message.
+ *
+ * @return the container
+ */
+ MessageContainer.Builder getContainer();
+
+ /**
+ * Gets or sets the PMR message type.
+ *
+ * @return the type
+ */
+ MessageType getType();
+
+ /**
+ * Serializes the Tango message to byte array.
+ *
+ * @return the byte [ ]
+ */
+ byte[] toBytes();
}
diff --git a/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/MessageFactory.java b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/MessageFactory.java
index 413824e8d..689d2c25a 100644
--- a/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/MessageFactory.java
+++ b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/MessageFactory.java
@@ -121,6 +121,7 @@ public class MessageFactory
*
* @param <T> the type parameter
* @param typeName the type name
+ * @param message the message
* @param token the token
* @return the tango message
*/
@@ -135,9 +136,8 @@ public class MessageFactory
/**
* Creates a new tango message with the specified message token.
*
- * @param <T> the type parameter
- * @param typeName the type name
- * @param token the token
+ * @param container the container
+ * @param message the message
* @return the tango message
*/
public static TangoMessage createTangoMessage(MessageContainer container, GeneratedMessageV3 message)
@@ -188,6 +188,24 @@ public class MessageFactory
}
}
+
+ /**
+ * Parses the specified byte array to an unknown Tango message type.
+ *
+ * @param data the data
+ * @return the tango message
+ * @throws InvalidProtocolBufferException the invalid protocol buffer exception
+ * @throws NoSuchMethodException the no such method exception
+ * @throws IllegalAccessException the illegal access exception
+ * @throws InvocationTargetException the invocation target exception
+ */
+ public static TangoMessage parseTangoMessageAgnostic(byte[] data) throws InvalidProtocolBufferException, NoSuchMethodException, IllegalAccessException, InvocationTargetException
+ {
+ MessageContainer container = parseContainer(data);
+ GeneratedMessageV3 message = parseMessageFromContainerAgnostic(container);
+ return MessageFactory.createTangoMessage(container, message);
+ }
+
/**
* Parses the internal PMR message from the message container.
*
@@ -212,7 +230,7 @@ public class MessageFactory
* Parses the internal PMR message from the message container and returns the basic protobuf message interface.
*
* @param container the container
- * @return GeneratedMessageV3
+ * @return GeneratedMessageV3 generated message v 3
* @throws NoSuchMethodException the no such method exception
* @throws InvocationTargetException the invocation target exception
* @throws IllegalAccessException the illegal access exception
diff --git a/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/TangoMessage.java b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/TangoMessage.java
index 8403f2cab..eaf6de233 100644
--- a/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/TangoMessage.java
+++ b/Software/Android_Studio/Tango.PMR/src/main/java/com/twine/tango/pmr/TangoMessage.java
@@ -1,6 +1,7 @@
package com.twine.tango.pmr;
import com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer;
+import com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer.Builder;
import com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType;
import java.lang.reflect.ParameterizedType;
@@ -12,8 +13,9 @@ import java.util.UUID;
*
* @param <T> the type parameter
*/
-public class TangoMessage<T extends com.google.protobuf.GeneratedMessageV3> {
-
+public class TangoMessage<T extends com.google.protobuf.GeneratedMessageV3> implements ITangoMessage
+{
+
private T message;
private MessageType type;
private MessageContainer.Builder container;
@@ -24,10 +26,11 @@ public class TangoMessage<T extends com.google.protobuf.GeneratedMessageV3> {
* @param message The message.
* @param type The message type.
*/
- public TangoMessage(T message, MessageType type) {
+ public TangoMessage(T message, MessageType type)
+ {
this.message = message;
this.type = type;
-
+
this.container = MessageContainer.newBuilder()
.setToken(UUID.randomUUID().toString())
.setType(type);
@@ -38,7 +41,8 @@ public class TangoMessage<T extends com.google.protobuf.GeneratedMessageV3> {
*
* @return The inner message.
*/
- public T getMessage() {
+ public T getMessage()
+ {
return message;
}
@@ -47,16 +51,14 @@ public class TangoMessage<T extends com.google.protobuf.GeneratedMessageV3> {
*
* @param message The inner message.
*/
- public void setMessage(T message) {
+ public void setMessage(T message)
+ {
this.message = message;
}
- /**
- * Gets the inner message type.
- *
- * @return The inner message type.
- */
- public MessageType getType() {
+ @Override
+ public MessageType getType()
+ {
return type;
}
@@ -65,16 +67,14 @@ public class TangoMessage<T extends com.google.protobuf.GeneratedMessageV3> {
*
* @param type Inner message type.
*/
- public void setType(MessageType type) {
+ public void setType(MessageType type)
+ {
this.type = type;
}
- /**
- * Gets the message container.
- *
- * @return the message container.
- */
- public MessageContainer.Builder getContainer() {
+ @Override
+ public Builder getContainer()
+ {
return container;
}
@@ -83,15 +83,12 @@ public class TangoMessage<T extends com.google.protobuf.GeneratedMessageV3> {
*
* @param container the container
*/
- public void setContainer(MessageContainer.Builder container) {
+ public void setContainer(MessageContainer.Builder container)
+ {
this.container = container;
}
- /**
- * Serializes the container and message to byte array.
- *
- * @return Container and message byte array.
- */
+ @Override
public byte[] toBytes()
{
container.setData(message.toByteString());
diff --git a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportAdapter.java b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportAdapter.java
index 2e076b1c8..0d46d9e0f 100644
--- a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportAdapter.java
+++ b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportAdapter.java
@@ -54,7 +54,6 @@ public interface ITransportAdapter extends ITransportComponent {
*/
TransportAdapterMode getAdapterMode();
-
/**
* Gets whether this adapter is authenticated.
*
@@ -68,4 +67,18 @@ public interface ITransportAdapter extends ITransportComponent {
* @param authenticated the authenticated
*/
void setAuthenticated(boolean authenticated);
+
+ /**
+ * Gets the total number of bytes received.
+ *
+ * @return the total bytes received
+ */
+ long getTotalBytesReceived();
+
+ /**
+ * Gets the total number of bytes sent.
+ *
+ * @return the total bytes sent
+ */
+ long getTotalBytesSent();
}
diff --git a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportEncoder.java b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportEncoder.java
index 96013d3d1..5279655ca 100644
--- a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportEncoder.java
+++ b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransportEncoder.java
@@ -1,9 +1,35 @@
package com.twine.tango.transport;
+import com.google.protobuf.InvalidProtocolBufferException;
+import com.twine.tango.pmr.ITangoMessage;
+import com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer;
+
/**
- * Created by Roy on 1/3/2018.
+ * Represents a Transport message encoder capable of encoding or decoding {@link ITangoMessage}.
*/
-
public interface ITransportEncoder
{
+ /**
+ * Encodes the specified tango message.
+ *
+ * @param tangoMessage the tango message
+ * @return the byte [ ]
+ */
+ byte[] encode(ITangoMessage tangoMessage);
+
+ /**
+ * Decodes the specified data.
+ *
+ * @param data the data
+ * @return the tango message
+ */
+ ITangoMessage decode(byte[] data);
+
+ /**
+ * Decodes only the message container part from the specified data.
+ *
+ * @param data the data
+ * @return the message container
+ */
+ MessageContainer decodeContainer(byte[] data) throws InvalidProtocolBufferException;
}
diff --git a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransporter.java b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransporter.java
index 5531f69c9..161a71dce 100644
--- a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransporter.java
+++ b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/ITransporter.java
@@ -34,6 +34,20 @@ public interface ITransporter extends ITransportComponent
void setAdapter(ITransportAdapter adapter);
/**
+ * Gets the transport encoder used to encode and decode the messages.
+ *
+ * @return the encoder
+ */
+ ITransportEncoder getEncoder();
+
+ /**
+ * Sets the transport encoder used to encode and decode the messages.
+ *
+ * @param encoder the encoder
+ */
+ void setEncoder(ITransportEncoder encoder);
+
+ /**
* Send a request to all adapters.
*
* @param <Request> the type parameter
diff --git a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportAdapterBase.java b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportAdapterBase.java
index e3335ad92..e88ce5dab 100644
--- a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportAdapterBase.java
+++ b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransportAdapterBase.java
@@ -18,13 +18,20 @@ import io.reactivex.Completable;
*/
public abstract class TransportAdapterBase implements ITransportAdapter
{
- protected static final int MAX_BUFFER_SIZE = 1024; //10 MB.
+ /**
+ * The constant MAX_BUFFER_SIZE.
+ */
+ protected static final int MAX_BUFFER_SIZE = 1024; //1 KB.
private boolean isAuthenticated;
private String address;
private Event<TransportComponentState> stateChangedEvent;
private IEventHandler<byte[]> dataAvailableListener;
private TransportComponentState state;
private TransportAdapterMode adapterMode;
+ private long totalBytesReceived;
+ private long totalBytesSent;
+
+ //region Constructors
/**
* Instantiates a new Transport adapter base.
@@ -36,6 +43,10 @@ public abstract class TransportAdapterBase implements ITransportAdapter
setAuthenticated(true);
}
+ //endregion
+
+ //region Public Methods
+
public abstract void write(byte[] data) throws ObjectDisposedException, IOException;
public abstract Completable connect();
@@ -49,6 +60,29 @@ public abstract class TransportAdapterBase implements ITransportAdapter
}
@Override
+ public void dispose()
+ {
+ disconnect().blockingAwait();
+ setState(TransportComponentState.Disposed);
+ }
+
+ @Override
+ public void addStateChangedListener(IEventHandler<TransportComponentState> listener)
+ {
+ stateChangedEvent.addListener(listener);
+ }
+
+ @Override
+ public void removeStateChangedListener(IEventHandler<TransportComponentState> listener)
+ {
+ stateChangedEvent.removeListener(listener);
+ }
+
+ //endregion
+
+ //region Properties
+
+ @Override
public String getAddress()
{
return this.address;
@@ -85,18 +119,6 @@ public abstract class TransportAdapterBase implements ITransportAdapter
}
@Override
- public void addStateChangedListener(IEventHandler<TransportComponentState> listener)
- {
- stateChangedEvent.addListener(listener);
- }
-
- @Override
- public void removeStateChangedListener(IEventHandler<TransportComponentState> listener)
- {
- stateChangedEvent.removeListener(listener);
- }
-
- @Override
public TransportComponentState getState()
{
return state;
@@ -123,12 +145,21 @@ public abstract class TransportAdapterBase implements ITransportAdapter
}
@Override
- public void dispose()
+ public long getTotalBytesReceived()
{
- disconnect().blockingAwait();
- setState(TransportComponentState.Disposed);
+ return totalBytesReceived;
+ }
+
+ @Override
+ public long getTotalBytesSent()
+ {
+ return totalBytesSent;
}
+ //endregion
+
+ //region Protected Methods
+
/**
* Throws an exception if the component is in a disposed state.
*
@@ -153,6 +184,7 @@ public abstract class TransportAdapterBase implements ITransportAdapter
{
try
{
+ totalBytesReceived += data.length;
dataAvailableListener.invoke(this, data);
} catch (Exception e)
{
@@ -181,16 +213,26 @@ public abstract class TransportAdapterBase implements ITransportAdapter
*/
protected byte[] postProcessBuffer(byte[] data)
{
+ byte[] postData = data;
+
if (adapterMode == TransportAdapterMode.NO_HEADER)
{
- return data;
+ postData = data;
} else
{
byte[] size = ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt(data.length).array();
- return concatByteArrays(size, data);
+ postData = concatByteArrays(size, data);
}
+
+ totalBytesSent += postData.length;
+
+ return postData;
}
+ //endregion
+
+ //region Private Methods
+
/**
* Concat byte arrays byte [ ].
*
@@ -198,10 +240,12 @@ public abstract class TransportAdapterBase implements ITransportAdapter
* @param second the second
* @return the byte [ ]
*/
- protected byte[] concatByteArrays(byte[] first, byte[] second)
+ private byte[] concatByteArrays(byte[] first, byte[] second)
{
byte[] result = Arrays.copyOf(first, first.length + second.length);
System.arraycopy(second, 0, result, first.length, second.length);
return result;
}
+
+ //endregion
}
diff --git a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransporterBase.java b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransporterBase.java
index 8901b4c20..2a7e13711 100644
--- a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransporterBase.java
+++ b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/TransporterBase.java
@@ -5,9 +5,7 @@ import android.os.SystemClock;
import com.elvishew.xlog.XLog;
import com.google.protobuf.GeneratedMessageV3;
-import com.google.protobuf.InvalidProtocolBufferException;
import com.twine.tango.core.Event;
-import com.twine.tango.core.Func;
import com.twine.tango.core.IEventHandler;
import com.twine.tango.core.ObjectDisposedException;
import com.twine.tango.pmr.MessageFactory;
@@ -17,10 +15,10 @@ import com.twine.tango.pmr.common.KeepAliveRequestOuterClass.KeepAliveRequest;
import com.twine.tango.pmr.common.KeepAliveResponseOuterClass.KeepAliveResponse;
import com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer;
import com.twine.tango.pmr.common.MessageTypeOuterClass.MessageType;
+import com.twine.tango.transport.encoders.ProtoEncoder;
import org.joda.time.Period;
-import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -55,6 +53,7 @@ public abstract class TransporterBase implements ITransporter
private Period requestTimeout;
private boolean useKeepAlive;
private boolean failsWithAdapter;
+ private ITransportEncoder encoder;
//region Events
@@ -94,6 +93,18 @@ public abstract class TransporterBase implements ITransporter
}
@Override
+ public ITransportEncoder getEncoder()
+ {
+ return encoder;
+ }
+
+ @Override
+ public void setEncoder(ITransportEncoder encoder)
+ {
+ this.encoder = encoder;
+ }
+
+ @Override
public TransportComponentState getState()
{
return state;
@@ -175,25 +186,6 @@ public abstract class TransporterBase implements ITransporter
}
/**
- * On serializing message func.
- *
- * @param <T> the type parameter
- * @param message the message
- * @return the func
- */
- protected <T extends GeneratedMessageV3> Func<byte[]> onSerializingMessage(TangoMessage<T> message)
- {
- return new Func<byte[]>()
- {
- @Override
- public byte[] invoke()
- {
- return message.toBytes();
- }
- };
- }
-
- /**
* On failed.
*
* @param ex the ex
@@ -215,40 +207,6 @@ public abstract class TransporterBase implements ITransporter
if (requestReceivedListener != null) requestReceivedListener.invoke(this, request);
}
- /**
- * On parse container message container.
- *
- * @param data the data
- * @return the message container
- * @throws InvalidProtocolBufferException the invalid protocol buffer exception
- */
- protected MessageContainer onParseContainer(byte[] data) throws InvalidProtocolBufferException
- {
- return MessageFactory.parseContainer(data);
- }
-
- /**
- * On parse message generated message v 3.
- *
- * @param container the container
- * @return the generated message v 3
- * @throws InvalidProtocolBufferException the invalid protocol buffer exception
- * @throws NoSuchMethodException the no such method exception
- * @throws IllegalAccessException the illegal access exception
- * @throws InvocationTargetException the invocation target exception
- */
- protected GeneratedMessageV3 onParseMessage(MessageContainer container) throws InvalidProtocolBufferException, NoSuchMethodException, IllegalAccessException, InvocationTargetException
- {
- return MessageFactory.parseMessageFromContainerAgnostic(container);
- }
-
- protected TangoMessage onParseTangoMessage(byte[] data) throws InvalidProtocolBufferException, NoSuchMethodException, IllegalAccessException, InvocationTargetException
- {
- MessageContainer container = onParseContainer(data);
- GeneratedMessageV3 message = onParseMessage(container);
- return MessageFactory.createTangoMessage(container, message);
- }
-
//endregion
//region Constructors
@@ -258,6 +216,7 @@ public abstract class TransporterBase implements ITransporter
*/
public TransporterBase()
{
+ setEncoder(new ProtoEncoder());
stateChangedEvent = new Event<>();
pendingResponses = new HashMap<>();
sendingQueue = new ConcurrentLinkedQueue<>();
@@ -318,7 +277,8 @@ public abstract class TransporterBase implements ITransporter
XLog.i("Transporter connected...");
x.onComplete();
- } catch (Exception e)
+ }
+ catch (Exception e)
{
XLog.e("Error connecting transporter", e);
x.onError(e);
@@ -345,7 +305,8 @@ public abstract class TransporterBase implements ITransporter
XLog.i("Transporter disconnected...");
x.onComplete();
- } catch (Exception e)
+ }
+ catch (Exception e)
{
x.onError(e);
}
@@ -366,7 +327,7 @@ public abstract class TransporterBase implements ITransporter
XLog.i("Expected response: " + Response.Builder.class.getSimpleName());
PublishSubject<TangoMessage<Response>> subject = PublishSubject.create();
- TransportMessage<TangoMessage<Response>> message = new TransportMessage<>(request.getContainer().getToken(), request, TransportMessageDirection.Request, onSerializingMessage(request), subject);
+ TransportMessage<TangoMessage<Response>> message = new TransportMessage<>(request.getContainer().getToken(), request, TransportMessageDirection.Request, () -> encoder.encode(request), subject);
sendingQueue.add(message);
Completable.timer(getRequestTimeout().getSeconds(), TimeUnit.SECONDS)
@@ -394,7 +355,7 @@ public abstract class TransporterBase implements ITransporter
request.getContainer().setCompleted(false);
PublishSubject<TangoMessage<Response>> subject = PublishSubject.create();
- TransportMessage<TangoMessage<Response>> message = new TransportMessage<>(request.getContainer().getToken(), request, TransportMessageDirection.Request, onSerializingMessage(request), subject);
+ TransportMessage<TangoMessage<Response>> message = new TransportMessage<>(request.getContainer().getToken(), request, TransportMessageDirection.Request, () -> encoder.encode(request), subject);
message.setContinuous(true);
sendingQueue.add(message);
@@ -429,12 +390,14 @@ public abstract class TransporterBase implements ITransporter
{
XLog.i("Removing matching request token...");
pendingResponses.remove(token);
- } else if (response.getContainer().getCompleted())
+ }
+ else if (response.getContainer().getCompleted())
{
XLog.i("Response completed. Removing matching request token...");
pendingResponses.remove(token);
}
- } else
+ }
+ else
{
//This should never happen.
XLog.w("Matching request token was not found...");
@@ -442,7 +405,7 @@ public abstract class TransporterBase implements ITransporter
}
PublishSubject<Response> subject = PublishSubject.create();
- TransportMessage<Response> message = new TransportMessage<>(token, response, TransportMessageDirection.Response, onSerializingMessage(response), subject);
+ TransportMessage<Response> message = new TransportMessage<>(token, response, TransportMessageDirection.Response, () -> encoder.encode(response), subject);
sendingQueue.add(message);
return subject.singleOrError().toCompletable();
@@ -515,11 +478,13 @@ public abstract class TransporterBase implements ITransporter
if (message.getDirection() == TransportMessageDirection.Request)
{
pendingRequests.add(message);
- } else
+ }
+ else
{
message.setResult(new Object(), true);
}
- } catch (Exception ex)
+ }
+ catch (Exception ex)
{
message.setException(ex);
}
@@ -529,7 +494,8 @@ public abstract class TransporterBase implements ITransporter
SystemClock.sleep(10);
}
- } catch (Exception ex)
+ }
+ catch (Exception ex)
{
onFailed(ex);
}
@@ -564,8 +530,9 @@ public abstract class TransporterBase implements ITransporter
try
{
- container = onParseContainer(data);
- } catch (Exception e)
+ container = encoder.decodeContainer(data);
+ }
+ catch (Exception e)
{
XLog.e("Invalid message container received!", e);
continue;
@@ -589,18 +556,21 @@ public abstract class TransporterBase implements ITransporter
if (container.getError() == ErrorCode.NONE)
{
XLog.i("Response has returned with error: " + container.getError().toString());
- request.setResult(onParseTangoMessage(data), true);
- } else
+ request.setResult(encoder.decode(data), true);
+ }
+ else
{
XLog.i("Parsing inner response message and setting pending request task result...");
- request.setException(new ResponseErrorException(container.getError(), onParseTangoMessage(data)));
+ request.setException(new ResponseErrorException(container.getError(), (TangoMessage) encoder.decode(data)));
}
- } catch (Exception ex)
+ }
+ catch (Exception ex)
{
XLog.e("Error parsing inner message", ex);
request.setException(ex);
}
- } else
+ }
+ else
{
XLog.i("Pending request was identified as 'continuous response'. keeping pending request.");
@@ -613,19 +583,22 @@ public abstract class TransporterBase implements ITransporter
{
XLog.i("Continuous sequence completed.");
}
- request.setResult(onParseTangoMessage(data), container.getCompleted());
- } else
+ request.setResult(encoder.decode(data), container.getCompleted());
+ }
+ else
{
XLog.i("Response has returned with error: " + container.getError().toString());
- request.setException(new ResponseErrorException(container.getError(), onParseTangoMessage(data)));
+ request.setException(new ResponseErrorException(container.getError(), (TangoMessage) encoder.decode(data)));
}
- } catch (Exception ex)
+ }
+ catch (Exception ex)
{
XLog.e("Error parsing inner message", ex);
request.setException(ex);
}
}
- } else
+ }
+ else
{
XLog.i("Message was identified as a new request message: " + container.getType().toString());
@@ -643,12 +616,14 @@ public abstract class TransporterBase implements ITransporter
{
//ex.printStackTrace();
});
- } else
+ }
+ else
{
XLog.i("Invoking RequestReceived event...");
AsyncTask.execute(() -> onRequestReceived(container));
}
- } catch (Exception ex)
+ }
+ catch (Exception ex)
{
//Ignore any exception that might occur on the event handler side...
}
@@ -659,7 +634,8 @@ public abstract class TransporterBase implements ITransporter
SystemClock.sleep(10);
}
- } catch (Exception ex)
+ }
+ catch (Exception ex)
{
onFailed(ex);
}
diff --git a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/encoders/ProtoEncoder.java b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/encoders/ProtoEncoder.java
index 113a677ae..47d8b906f 100644
--- a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/encoders/ProtoEncoder.java
+++ b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/encoders/ProtoEncoder.java
@@ -1,9 +1,32 @@
package com.twine.tango.transport.encoders;
+import com.google.protobuf.InvalidProtocolBufferException;
+import com.twine.tango.pmr.ITangoMessage;
+import com.twine.tango.pmr.MessageFactory;
+import com.twine.tango.pmr.common.MessageContainerOuterClass.MessageContainer;
+import com.twine.tango.transport.ITransportEncoder;
+
/**
- * Created by Roy on 1/3/2018.
+ * Represents a Transport message encoder capable of encoding or decoding {@link ITangoMessage}.
*/
-
-public class ProtoEncoder
+public class ProtoEncoder implements ITransportEncoder
{
+ @Override
+ public byte[] encode(ITangoMessage tangoMessage)
+ {
+ return tangoMessage.toBytes();
+ }
+
+ @Override
+ public ITangoMessage decode(byte[] data)
+ {
+ return MessageFactory.parseTangoMessage(data);
+ }
+
+ @Override
+ public MessageContainer decodeContainer(byte[] data) throws InvalidProtocolBufferException
+ {
+ MessageContainer container = MessageContainer.parseFrom(data);
+ return container;
+ }
}
diff --git a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/transporters/BasicTransporter.java b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/transporters/BasicTransporter.java
index eeb9bfa08..aa6defd47 100644
--- a/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/transporters/BasicTransporter.java
+++ b/Software/Android_Studio/Tango.Transport/src/main/java/com/twine/tango/transport/transporters/BasicTransporter.java
@@ -7,12 +7,12 @@ import com.twine.tango.transport.TransporterBase;
/**
* Represents an {@link com.twine.tango.transport.ITransporter} which communicates using protobuf protocol.
*/
-public class ProtoTransporter extends TransporterBase {
+public class BasicTransporter extends TransporterBase {
/**
* Instantiates a new Proto transporter.
*/
- public ProtoTransporter() {
+ public BasicTransporter() {
}
/**
@@ -20,7 +20,7 @@ public class ProtoTransporter extends TransporterBase {
*
* @param adapter the adapter
*/
- public ProtoTransporter(ITransportAdapter adapter) {
+ public BasicTransporter(ITransportAdapter adapter) {
super(adapter);
}
}
diff --git a/Software/Visual_Studio/Tango.Integration/Services/ExternalBridgeClient.cs b/Software/Visual_Studio/Tango.Integration/Services/ExternalBridgeClient.cs
index b783ec261..aec9c0db0 100644
--- a/Software/Visual_Studio/Tango.Integration/Services/ExternalBridgeClient.cs
+++ b/Software/Visual_Studio/Tango.Integration/Services/ExternalBridgeClient.cs
@@ -12,7 +12,7 @@ using Tango.Transport.Transporters;
namespace Tango.Integration.Services
{
- public class ExternalBridgeClient : ProtoTransporter, IExternalBridgeClient
+ public class ExternalBridgeClient : BasicTransporter, IExternalBridgeClient
{
private String _serialNumber;
diff --git a/Software/Visual_Studio/Tango.PMR/ITangoMessage.cs b/Software/Visual_Studio/Tango.PMR/ITangoMessage.cs
new file mode 100644
index 000000000..90b33a6bb
--- /dev/null
+++ b/Software/Visual_Studio/Tango.PMR/ITangoMessage.cs
@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.PMR.Common;
+
+namespace Tango.PMR
+{
+ public interface ITangoMessage
+ {
+ /// <summary>
+ /// Gets the container that will encapsulate the actual PMR message.
+ /// </summary>
+ MessageContainer Container { get; }
+
+ /// <summary>
+ /// Gets or sets the PMR message type.
+ /// </summary>
+ MessageType Type { get; set; }
+
+ /// <summary>
+ /// Serializes the Tango message to byte array.
+ /// </summary>
+ /// <returns></returns>
+ byte[] ToBytes();
+
+ /// <summary>
+ /// Serializes the Tango message to byte array representing a serialized JSON object of this Tango message.
+ /// </summary>
+ /// <returns></returns>
+ byte[] ToJsonBytes();
+ }
+}
diff --git a/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj b/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj
index 7226685ea..e3846da7a 100644
--- a/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj
+++ b/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj
@@ -55,6 +55,7 @@
<Compile Include="Integration\ExternalClientLoginResponse.cs" />
<Compile Include="Integration\OverrideDataBaseRequest.cs" />
<Compile Include="Integration\OverrideDataBaseResponse.cs" />
+ <Compile Include="ITangoMessage.cs" />
<Compile Include="MessageFactory.cs" />
<Compile Include="NativePMR.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
diff --git a/Software/Visual_Studio/Tango.PMR/TangoMessage.cs b/Software/Visual_Studio/Tango.PMR/TangoMessage.cs
index 4819ac509..c99fc0dfb 100644
--- a/Software/Visual_Studio/Tango.PMR/TangoMessage.cs
+++ b/Software/Visual_Studio/Tango.PMR/TangoMessage.cs
@@ -13,10 +13,10 @@ namespace Tango.PMR
/// Represents a wrapper class for PRM messages.
/// </summary>
/// <typeparam name="T"></typeparam>
- public class TangoMessage<T> where T : IMessage<T>
+ public class TangoMessage<T> : ITangoMessage where T : IMessage<T>
{
/// <summary>
- /// Gets the container.
+ /// Gets the container that will encapsulate the actual PMR message.
/// </summary>
public MessageContainer Container { get; }
@@ -26,7 +26,7 @@ namespace Tango.PMR
public T Message { get; set; }
/// <summary>
- /// Gets or sets the message type.
+ /// Gets or sets the PMR message type.
/// </summary>
public MessageType Type { get; set; }
@@ -46,7 +46,7 @@ namespace Tango.PMR
}
/// <summary>
- /// Generates a new <see cref="MessageContainer"/> containing the message of type <see cref="T"/> and returns a byte array.
+ /// Serializes the Tango message to byte array.
/// </summary>
/// <returns></returns>
public byte[] ToBytes()
@@ -61,7 +61,7 @@ namespace Tango.PMR
}
/// <summary>
- /// Generates a new <see cref="MessageContainer"/> containing the message of type <see cref="T"/> and returns a byte array.
+ /// Serializes the Tango message to byte array representing a serialized JSON object of this Tango message.
/// </summary>
/// <returns></returns>
public byte[] ToJsonBytes()
diff --git a/Software/Visual_Studio/Tango.Transport/Encoders/ProtoEncoder.cs b/Software/Visual_Studio/Tango.Transport/Encoders/ProtoEncoder.cs
new file mode 100644
index 000000000..689b331e6
--- /dev/null
+++ b/Software/Visual_Studio/Tango.Transport/Encoders/ProtoEncoder.cs
@@ -0,0 +1,47 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.PMR;
+using Tango.PMR.Common;
+
+namespace Tango.Transport.Encoders
+{
+ /// <summary>
+ /// Represents a protobuf <see cref="ITransportEncoder">Transport Encoder</see>.
+ /// </summary>
+ /// <seealso cref="Tango.Transport.ITransportEncoder" />
+ public class ProtoEncoder : ITransportEncoder
+ {
+ /// <summary>
+ /// Decodes the specified data.
+ /// </summary>
+ /// <param name="data">The data.</param>
+ /// <returns></returns>
+ public ITangoMessage Decode(byte[] data)
+ {
+ return MessageFactory.ParseTangoMessageAgnostic(data) as ITangoMessage;
+ }
+
+ /// <summary>
+ /// Decodes only the container part of the message.
+ /// </summary>
+ /// <param name="data">The data.</param>
+ /// <returns></returns>
+ public MessageContainer DecodeContainer(byte[] data)
+ {
+ return MessageFactory.ParseContainer(data);
+ }
+
+ /// <summary>
+ /// Encodes the specified tango message.
+ /// </summary>
+ /// <param name="tangoMessage">The tango message.</param>
+ /// <returns></returns>
+ public byte[] Encode(ITangoMessage tangoMessage)
+ {
+ return tangoMessage.ToBytes();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/Tango.Transport/ITransportAdapter.cs b/Software/Visual_Studio/Tango.Transport/ITransportAdapter.cs
index 5ab48e503..413ea7559 100644
--- a/Software/Visual_Studio/Tango.Transport/ITransportAdapter.cs
+++ b/Software/Visual_Studio/Tango.Transport/ITransportAdapter.cs
@@ -15,6 +15,16 @@ namespace Tango.Transport
public interface ITransportAdapter : ITransportComponent
{
/// <summary>
+ /// Gets the total bytes received.
+ /// </summary>
+ long TotalBytesReceived { get; }
+
+ /// <summary>
+ /// Gets the total bytes sent.
+ /// </summary>
+ long TotalBytesSent { get; }
+
+ /// <summary>
/// Writes the specified data to the stream.
/// </summary>
/// <param name="data">The data.</param>
diff --git a/Software/Visual_Studio/Tango.Transport/ITransportEncoder.cs b/Software/Visual_Studio/Tango.Transport/ITransportEncoder.cs
new file mode 100644
index 000000000..beae60d14
--- /dev/null
+++ b/Software/Visual_Studio/Tango.Transport/ITransportEncoder.cs
@@ -0,0 +1,37 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.PMR;
+using Tango.PMR.Common;
+
+namespace Tango.Transport
+{
+ /// <summary>
+ /// Represents a Transport message encoder capable of encoding or decoding <see cref="ITangoMessage">Tango Messages</see>.
+ /// </summary>
+ public interface ITransportEncoder
+ {
+ /// <summary>
+ /// Encodes the specified tango message.
+ /// </summary>
+ /// <param name="tangoMessage">The tango message.</param>
+ /// <returns></returns>
+ byte[] Encode(ITangoMessage tangoMessage);
+
+ /// <summary>
+ /// Decodes the specified data.
+ /// </summary>
+ /// <param name="data">The data.</param>
+ /// <returns></returns>
+ ITangoMessage Decode(byte[] data);
+
+ /// <summary>
+ /// Decodes only the container part of the message.
+ /// </summary>
+ /// <param name="data">The data.</param>
+ /// <returns></returns>
+ MessageContainer DecodeContainer(byte[] data);
+ }
+}
diff --git a/Software/Visual_Studio/Tango.Transport/ITransporter.cs b/Software/Visual_Studio/Tango.Transport/ITransporter.cs
index 9d6f13446..0c06e68f8 100644
--- a/Software/Visual_Studio/Tango.Transport/ITransporter.cs
+++ b/Software/Visual_Studio/Tango.Transport/ITransporter.cs
@@ -25,6 +25,11 @@ namespace Tango.Transport
ITransportAdapter Adapter { get; set; }
/// <summary>
+ /// Gets or sets the transport encoder used to encode and decode tango messages.
+ /// </summary>
+ ITransportEncoder Encoder { get; set; }
+
+ /// <summary>
/// Sends a request.
/// </summary>
/// <typeparam name="Request">The type of the request.</typeparam>
diff --git a/Software/Visual_Studio/Tango.Transport/Tango.Transport.csproj b/Software/Visual_Studio/Tango.Transport/Tango.Transport.csproj
index aa5b5ef67..88e2a3b75 100644
--- a/Software/Visual_Studio/Tango.Transport/Tango.Transport.csproj
+++ b/Software/Visual_Studio/Tango.Transport/Tango.Transport.csproj
@@ -66,9 +66,11 @@
<Link>GlobalVersionInfo.cs</Link>
</Compile>
<Compile Include="Adapters\UsbTransportAdapter.cs" />
+ <Compile Include="Encoders\ProtoEncoder.cs" />
<Compile Include="ITransportComponent.cs" />
<Compile Include="ITransportAdapter.cs" />
<Compile Include="Adapters\TcpTransportAdapter.cs" />
+ <Compile Include="ITransportEncoder.cs" />
<Compile Include="ITransportRouter.cs" />
<Compile Include="PendingResponse.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
@@ -81,8 +83,7 @@
<Compile Include="TransportAdapterMode.cs" />
<Compile Include="TransportComponentState.cs" />
<Compile Include="TransporterBase.cs" />
- <Compile Include="Transporters\JsonTransporter.cs" />
- <Compile Include="Transporters\ProtoTransporter.cs" />
+ <Compile Include="Transporters\BasicTransporter.cs" />
<Compile Include="TransportMessage.cs" />
<Compile Include="TransportMessageBase.cs" />
<Compile Include="TransportMessageDirection.cs" />
diff --git a/Software/Visual_Studio/Tango.Transport/TransportAdapterBase.cs b/Software/Visual_Studio/Tango.Transport/TransportAdapterBase.cs
index 100990d0e..b996c82b2 100644
--- a/Software/Visual_Studio/Tango.Transport/TransportAdapterBase.cs
+++ b/Software/Visual_Studio/Tango.Transport/TransportAdapterBase.cs
@@ -31,6 +31,26 @@ namespace Tango.Transport
#region Properties
+ private long _totalBytesReceived;
+ /// <summary>
+ /// Gets the total bytes received.
+ /// </summary>
+ public long TotalBytesReceived
+ {
+ get { return _totalBytesReceived; }
+ protected set { _totalBytesReceived = value; }
+ }
+
+ private long _totalBytesSent;
+ /// <summary>
+ /// Gets the total bytes sent.
+ /// </summary>
+ public long TotalBytesSent
+ {
+ get { return _totalBytesSent; }
+ protected set { _totalBytesSent = value; }
+ }
+
/// <summary>
/// Gets or sets the channel address.
/// </summary>
@@ -76,6 +96,7 @@ namespace Tango.Transport
/// <param name="data">The data.</param>
protected virtual void OnDataAvailable(byte[] data)
{
+ TotalBytesReceived += data.Length;
DataAvailable?.Invoke(this, data);
}
@@ -106,14 +127,20 @@ namespace Tango.Transport
/// <returns></returns>
protected virtual byte[] PostProcessBuffer(byte[] data)
{
+ byte[] postData = data;
+
if (AdapterMode == TransportAdapterMode.NO_HEADER)
{
- return data;
+ return postData;
}
else
{
- return BitConverter.GetBytes(data.Length).Concat(data).ToArray();
+ postData = BitConverter.GetBytes(data.Length).Concat(data).ToArray();
}
+
+ TotalBytesSent += postData.Length;
+
+ return postData;
}
#endregion
diff --git a/Software/Visual_Studio/Tango.Transport/TransporterBase.cs b/Software/Visual_Studio/Tango.Transport/TransporterBase.cs
index 756738ee8..2e25d5bf1 100644
--- a/Software/Visual_Studio/Tango.Transport/TransporterBase.cs
+++ b/Software/Visual_Studio/Tango.Transport/TransporterBase.cs
@@ -14,6 +14,7 @@ using Tango.PMR;
using Tango.PMR.Common;
using System.Reactive.Linq;
using System.ServiceModel;
+using Tango.Transport.Encoders;
namespace Tango.Transport
{
@@ -57,6 +58,11 @@ namespace Tango.Transport
set { _adapter = value; OnAdapterChanged(value); }
}
+ /// <summary>
+ /// Gets or sets the transport encoder used to encode and decode tango messages.
+ /// </summary>
+ public ITransportEncoder Encoder { get; set; }
+
private TransportComponentState _state;
/// <summary>
/// Gets the component state.
@@ -103,6 +109,7 @@ namespace Tango.Transport
/// </summary>
public bool FailsWithAdapter { get; set; }
+
#endregion
#region Virtual Methods
@@ -183,47 +190,6 @@ namespace Tango.Transport
StateChanged?.Invoke(this, state);
}
- /// <summary>
- /// Override in order to provide a method serializer for <see cref="TangoMessage{T}"/>.
- /// </summary>
- /// <typeparam name="Request">The type of the request.</typeparam>
- /// <param name="message">The message.</param>
- /// <returns></returns>
- protected virtual Func<byte[]> OnSerializeingMessage<Request>(TangoMessage<Request> message) where Request : IMessage<Request>
- {
- return message.ToBytes;
- }
-
- /// <summary>
- /// Override in order to provide a deserialized message container part of the message.
- /// </summary>
- /// <param name="data">The data.</param>
- /// <returns></returns>
- protected virtual MessageContainer OnParseContainer(byte[] data)
- {
- return MessageFactory.ParseContainer(data);
- }
-
- /// <summary>
- /// Override in order to provide a deserialized message from a container.
- /// </summary>
- /// <param name="container">The container.</param>
- /// <returns></returns>
- protected virtual IMessage OnParseMessage(MessageContainer container)
- {
- return MessageFactory.ParseMessageFromContainer(container);
- }
-
- /// <summary>
- /// Called when [parse tango message].
- /// </summary>
- /// <param name="bytes">The bytes.</param>
- /// <returns></returns>
- protected virtual Object OnParseTangoMessage(byte[] bytes)
- {
- return MessageFactory.ParseTangoMessageAgnostic(bytes);
- }
-
#endregion
#region Constructors
@@ -233,6 +199,7 @@ namespace Tango.Transport
/// </summary>
public TransporterBase()
{
+ Encoder = new ProtoEncoder();
_pendingResponses = new Dictionary<string, PendingResponse>();
_sendingQueue = new ConcurrentQueue<TransportMessageBase>();
_pendingRequests = new List<TransportMessageBase>();
@@ -297,7 +264,7 @@ namespace Tango.Transport
LogManager.Log("Expected response: " + typeof(Response).Name);
TaskCompletionSource<TangoMessage<Response>> source = new TaskCompletionSource<TangoMessage<Response>>();
- TransportMessage<TangoMessage<Response>> message = new TransportMessage<TangoMessage<Response>>(request.Container.Token, request, TransportMessageDirection.Request, OnSerializeingMessage(request), source);
+ TransportMessage<TangoMessage<Response>> message = new TransportMessage<TangoMessage<Response>>(request.Container.Token, request, TransportMessageDirection.Request, () => Encoder.Encode(request), source);
_sendingQueue.Enqueue(message);
Task.Delay(timeout != null ? timeout.Value : RequestTimeout).ContinueWith((x) =>
{
@@ -329,7 +296,7 @@ namespace Tango.Transport
request.Container.Continuous = true;
request.Container.Completed = false;
- TransportMessage<TangoMessage<Response>> message = new TransportMessage<TangoMessage<Response>>(request.Container.Token, request, TransportMessageDirection.Request, OnSerializeingMessage(request), null)
+ TransportMessage<TangoMessage<Response>> message = new TransportMessage<TangoMessage<Response>>(request.Container.Token, request, TransportMessageDirection.Request, () => Encoder.Encode(request), null)
{
IsContinuous = true,
ContinuesResponseSubject = subject,
@@ -389,7 +356,7 @@ namespace Tango.Transport
}
TaskCompletionSource<object> source = new TaskCompletionSource<object>();
- TransportMessage<object> message = new TransportMessage<object>(token, response, TransportMessageDirection.Response, OnSerializeingMessage(response), source);
+ TransportMessage<object> message = new TransportMessage<object>(token, response, TransportMessageDirection.Response, () => Encoder.Encode(response), source);
_sendingQueue.Enqueue(message);
return source.Task;
}
@@ -492,7 +459,7 @@ namespace Tango.Transport
LogManager.Log("Message received on adapter: " + Adapter.Address);
LogManager.Log("Parsing message container...");
- MessageContainer container = OnParseContainer(data);
+ MessageContainer container = Encoder.DecodeContainer(data);
LogManager.Log("Searching for pending request token: " + container.Token);
TransportMessageBase request = _pendingRequests.SingleOrDefault(x => x.Token == container.Token);
@@ -511,7 +478,7 @@ namespace Tango.Transport
if (container.Error == ErrorCode.None)
{
LogManager.Log("Parsing inner response message and setting pending request task result...");
- request.SetResult(OnParseTangoMessage(data), true);
+ request.SetResult(Encoder.Decode(data), true);
LogManager.Log("Message enquirer released...");
}
else
@@ -538,7 +505,7 @@ namespace Tango.Transport
{
LogManager.Log("Continuous sequence completed.");
}
- request.SetResult(OnParseTangoMessage(data), container.Completed);
+ request.SetResult(Encoder.Decode(data), container.Completed);
}
else
{
diff --git a/Software/Visual_Studio/Tango.Transport/Transporters/ProtoTransporter.cs b/Software/Visual_Studio/Tango.Transport/Transporters/BasicTransporter.cs
index 7c82639d2..06c1f3921 100644
--- a/Software/Visual_Studio/Tango.Transport/Transporters/ProtoTransporter.cs
+++ b/Software/Visual_Studio/Tango.Transport/Transporters/BasicTransporter.cs
@@ -21,23 +21,23 @@ namespace Tango.Transport.Transporters
/// Represents an <see cref="ITransporter"/> which send and receive <see cref="TangoMessage{T}"/> messages using Protobuf binary data.
/// </summary>
/// <seealso cref="Tango.Transport.TransporterBase" />
- public class ProtoTransporter : TransporterBase
+ public class BasicTransporter : TransporterBase
{
#region Constructors
/// <summary>
- /// Initializes a new instance of the <see cref="ProtoTransporter"/> class.
+ /// Initializes a new instance of the <see cref="BasicTransporter"/> class.
/// </summary>
- public ProtoTransporter() : base()
+ public BasicTransporter() : base()
{
}
/// <summary>
- /// Initializes a new instance of the <see cref="ProtoTransporter"/> class.
+ /// Initializes a new instance of the <see cref="BasicTransporter"/> class.
/// </summary>
/// <param name="adapter">The transport adapter.</param>
- public ProtoTransporter(ITransportAdapter adapter) : base(adapter)
+ public BasicTransporter(ITransportAdapter adapter) : base(adapter)
{
}
diff --git a/Software/Visual_Studio/Tango.Transport/Transporters/JsonTransporter.cs b/Software/Visual_Studio/Tango.Transport/Transporters/JsonTransporter.cs
deleted file mode 100644
index d490d4a61..000000000
--- a/Software/Visual_Studio/Tango.Transport/Transporters/JsonTransporter.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using Google.Protobuf;
-using Tango.PMR;
-using Tango.PMR.Common;
-
-namespace Tango.Transport.Transporters
-{
- /// <summary>
- /// Represents an <see cref="ITransporter"/> which send and receive <see cref="TangoMessage{T}"/> messages using JSON formatted strings.
- /// </summary>
- /// <seealso cref="Tango.Transport.TransporterBase" />
- public class JsonTransporter : TransporterBase
- {
- #region Constructors
-
- /// <summary>
- /// Initializes a new instance of the <see cref="JsonTransporter"/> class.
- /// </summary>
- public JsonTransporter() : base()
- {
-
- }
-
- /// <summary>
- /// Initializes a new instance of the <see cref="JsonTransporter"/> class.
- /// </summary>
- /// <param name="adapter">The transport adapter.</param>
- public JsonTransporter(ITransportAdapter adapter) : base(adapter)
- {
-
- }
-
- #endregion
-
- /// <summary>
- /// Override in order to provide a method serializer for <see cref="TangoMessage{T}" />.
- /// </summary>
- /// <typeparam name="Request">The type of the request.</typeparam>
- /// <param name="message">The message.</param>
- /// <returns></returns>
- protected override Func<byte[]> OnSerializeingMessage<Request>(TangoMessage<Request> message)
- {
- return message.ToJsonBytes;
- }
-
- /// <summary>
- /// Override in order to provide a deserialized message container part of the message.
- /// </summary>
- /// <param name="data">The data.</param>
- /// <returns></returns>
- protected override MessageContainer OnParseContainer(byte[] data)
- {
- return MessageFactory.ParseContainerJson(data);
- }
- }
-}
diff --git a/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/ViewModels/MainViewVM.cs b/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/ViewModels/MainViewVM.cs
index ad5c449c8..0ffc89fdf 100644
--- a/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/ViewModels/MainViewVM.cs
+++ b/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/ViewModels/MainViewVM.cs
@@ -153,7 +153,7 @@ namespace Tango.MachineEM.UI.ViewModels
LogManager.RegisterLogger(logger);
- Emulator = new MachineEmulator(new ProtoTransporter());
+ Emulator = new MachineEmulator(new BasicTransporter());
StartCommand = new RelayCommand(Start, (x) => !Emulator.IsStarted);
StopCommand = new RelayCommand(Stop,(x) => Emulator.IsStarted);
diff --git a/Software/Visual_Studio/Utilities/Tango.MobileEM.UI/App.xaml.cs b/Software/Visual_Studio/Utilities/Tango.MobileEM.UI/App.xaml.cs
index 306da384f..36c360c5a 100644
--- a/Software/Visual_Studio/Utilities/Tango.MobileEM.UI/App.xaml.cs
+++ b/Software/Visual_Studio/Utilities/Tango.MobileEM.UI/App.xaml.cs
@@ -21,7 +21,7 @@ namespace Tango.MobileEM.UI
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
- Emulator = new MobileEmulator(new ProtoTransporter(new UsbTransportAdapter("COM2")));
+ Emulator = new MobileEmulator(new BasicTransporter(new UsbTransportAdapter("COM2")));
}
}
}