diff options
| author | Roy <roy.mail.net@gmail.com> | 2018-01-03 01:57:58 +0200 |
|---|---|---|
| committer | Roy <roy.mail.net@gmail.com> | 2018-01-03 01:57:58 +0200 |
| commit | 63b2a192ba12f8239668b6818db4ad02db68dbbc (patch) | |
| tree | c9c1de011b38fbff94ce87ac2771667b9a3e773d /Software | |
| parent | f917366c405a4308b4b60e30eb1bd0dcf880532c (diff) | |
| download | Tango-63b2a192ba12f8239668b6818db4ad02db68dbbc.tar.gz Tango-63b2a192ba12f8239668b6818db4ad02db68dbbc.zip | |
Implemented abstraction of message encoding/decoding by adding another layer of "Encoders" to Transporters.
Diffstat (limited to 'Software')
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"))); } } } |
