diff options
| author | Roy <roy.mail.net@gmail.com> | 2017-12-26 21:16:15 +0200 |
|---|---|---|
| committer | Roy <roy.mail.net@gmail.com> | 2017-12-26 21:16:15 +0200 |
| commit | 2ea2bb5bcd96045f1bd6cb4c3d8b8416dbaa05dc (patch) | |
| tree | a21ff27fff08876e835df82c5242def1f0d09c17 /Software/Visual_Studio/Tango.Transport | |
| parent | 6450fc175114a6f8d0b75cb21386d1bb0c902711 (diff) | |
| download | Tango-2ea2bb5bcd96045f1bd6cb4c3d8b8416dbaa05dc.tar.gz Tango-2ea2bb5bcd96045f1bd6cb4c3d8b8416dbaa05dc.zip | |
MERGE
Diffstat (limited to 'Software/Visual_Studio/Tango.Transport')
7 files changed, 134 insertions, 9 deletions
diff --git a/Software/Visual_Studio/Tango.Transport/Adapters/TcpTransportAdapter.cs b/Software/Visual_Studio/Tango.Transport/Adapters/TcpTransportAdapter.cs index 97757deac..1e897f85a 100644 --- a/Software/Visual_Studio/Tango.Transport/Adapters/TcpTransportAdapter.cs +++ b/Software/Visual_Studio/Tango.Transport/Adapters/TcpTransportAdapter.cs @@ -40,6 +40,7 @@ namespace Tango.Transport.Adapters /// </summary> public TcpTransportAdapter() { + AdapterMode = TransportAdapterMode.PREPEND_HEADER; Address = "127.0.0.1"; Port = 9999; } @@ -63,6 +64,7 @@ namespace Tango.Transport.Adapters { _initializedFromConstructor = true; _socket = socket; + SetSocketProperties(); } #endregion @@ -86,6 +88,7 @@ namespace Tango.Transport.Adapters if (!_initializedFromConstructor) { _socket = new TcpClient(Address, Port); + SetSocketProperties(); } State = TransportComponentState.Connected; @@ -137,6 +140,7 @@ namespace Tango.Transport.Adapters try { + data = PostProcessBuffer(data); _socket.GetStream().Write(data, 0, data.Length); } catch (Exception ex) @@ -157,11 +161,38 @@ namespace Tango.Transport.Adapters { while (State == TransportComponentState.Connected) { - if (_socket.Available > 0) + if (AdapterMode == TransportAdapterMode.NO_HEADER) { - byte[] data = new byte[_socket.Available]; - _socket.GetStream().Read(data, 0, data.Length); - OnDataAvailable(data); + if (_socket.Available > 0) + { + byte[] data = new byte[_socket.Available]; + _socket.GetStream().Read(data, 0, data.Length); + OnDataAvailable(data); + } + } + else + { + if (_socket.Available > 4) + { + byte[] size = new byte[4]; + _socket.GetStream().Read(size, 0, size.Length); + int expectedSize = BitConverter.ToInt32(size, 0); + + byte[] data = new byte[expectedSize]; + + while (_socket.Available < expectedSize) + { + Thread.Sleep(10); + + if (State != TransportComponentState.Connected) + { + break; + } + } + + _socket.GetStream().Read(data, 0, data.Length); + OnDataAvailable(data); + } } Thread.Sleep(10); @@ -191,7 +222,17 @@ namespace Tango.Transport.Adapters { OnFailed(ex); } - } + } + + #endregion + + #region Private Methods + + private void SetSocketProperties() + { + _socket.SendBufferSize = MAX_BUFFER_SIZE; + _socket.ReceiveBufferSize = MAX_BUFFER_SIZE; + } #endregion } diff --git a/Software/Visual_Studio/Tango.Transport/Adapters/UsbTransportAdapter.cs b/Software/Visual_Studio/Tango.Transport/Adapters/UsbTransportAdapter.cs index 665f2d779..a97f55ee6 100644 --- a/Software/Visual_Studio/Tango.Transport/Adapters/UsbTransportAdapter.cs +++ b/Software/Visual_Studio/Tango.Transport/Adapters/UsbTransportAdapter.cs @@ -58,6 +58,8 @@ namespace Tango.Transport.Adapters _serialPort = new SerialPort(); _serialPort.DataReceived += OnSerialPortDataReceived; _serialPort.PortName = Address; + _serialPort.ReadBufferSize = MAX_BUFFER_SIZE; + _serialPort.WriteBufferSize = MAX_BUFFER_SIZE; _serialPort.Open(); _serialPort.DiscardInBuffer(); _serialPort.DiscardOutBuffer(); @@ -118,6 +120,7 @@ namespace Tango.Transport.Adapters try { + data = PostProcessBuffer(data); _serialPort.Write(data, 0, data.Length); } catch (Exception ex) @@ -137,9 +140,37 @@ namespace Tango.Transport.Adapters { if (e.EventType == SerialData.Eof) return; Thread.Sleep(10); - byte[] data = new byte[_serialPort.BytesToRead]; - _serialPort.Read(data, 0, data.Length); - OnDataAvailable(data); + + if (AdapterMode == TransportAdapterMode.NO_HEADER) + { + byte[] data = new byte[_serialPort.BytesToRead]; + _serialPort.Read(data, 0, data.Length); + OnDataAvailable(data); + } + else + { + if (_serialPort.BytesToRead > 4) + { + byte[] size = new byte[4]; + _serialPort.Read(size, 0, size.Length); + int expectedSize = BitConverter.ToInt32(size, 0); + + byte[] data = new byte[expectedSize]; + + while (_serialPort.BytesToRead < expectedSize) + { + Thread.Sleep(10); + + if (State != TransportComponentState.Connected) + { + break; + } + } + + _serialPort.Read(data, 0, data.Length); + OnDataAvailable(data); + } + } } catch (Exception ex) { diff --git a/Software/Visual_Studio/Tango.Transport/ITransportAdapter.cs b/Software/Visual_Studio/Tango.Transport/ITransportAdapter.cs index b0e055cde..5ab48e503 100644 --- a/Software/Visual_Studio/Tango.Transport/ITransportAdapter.cs +++ b/Software/Visual_Studio/Tango.Transport/ITransportAdapter.cs @@ -29,5 +29,10 @@ namespace Tango.Transport /// Gets or sets the channel address. /// </summary> String Address { get; set; } + + /// <summary> + /// Gets or sets the adapter reading/writing mode. + /// </summary> + TransportAdapterMode AdapterMode { get; set; } } } diff --git a/Software/Visual_Studio/Tango.Transport/Tango.Transport.csproj b/Software/Visual_Studio/Tango.Transport/Tango.Transport.csproj index 7b0b1a121..8aea62da8 100644 --- a/Software/Visual_Studio/Tango.Transport/Tango.Transport.csproj +++ b/Software/Visual_Studio/Tango.Transport/Tango.Transport.csproj @@ -77,6 +77,7 @@ <Compile Include="Servers\ClientConnectedEventArgs.cs" /> <Compile Include="Servers\TcpServer.cs" /> <Compile Include="TransportAdapterBase.cs" /> + <Compile Include="TransportAdapterMode.cs" /> <Compile Include="TransportComponentState.cs" /> <Compile Include="TransporterBase.cs" /> <Compile Include="Transporters\JsonTransporter.cs" /> diff --git a/Software/Visual_Studio/Tango.Transport/TransportAdapterBase.cs b/Software/Visual_Studio/Tango.Transport/TransportAdapterBase.cs index 670ef20c3..04ecdc394 100644 --- a/Software/Visual_Studio/Tango.Transport/TransportAdapterBase.cs +++ b/Software/Visual_Studio/Tango.Transport/TransportAdapterBase.cs @@ -13,6 +13,8 @@ namespace Tango.Transport /// <seealso cref="Tango.Transport.ITransportAdapter" /> public abstract class TransportAdapterBase : ITransportAdapter { + protected const int MAX_BUFFER_SIZE = 1024 * 1024 * 10; //10 MB. + #region Events /// <summary> @@ -48,6 +50,11 @@ namespace Tango.Transport } } + /// <summary> + /// Gets or sets the adapter reading/writing mode. + /// </summary> + public TransportAdapterMode AdapterMode { get; set; } + #endregion #region Virtual Methods @@ -92,6 +99,23 @@ namespace Tango.Transport } } + /// <summary> + /// Applies any additional headers if required. + /// </summary> + /// <param name="data">The data.</param> + /// <returns></returns> + protected virtual byte[] PostProcessBuffer(byte[] data) + { + if (AdapterMode == TransportAdapterMode.NO_HEADER) + { + return data; + } + else + { + return BitConverter.GetBytes(data.Length).Concat(data).ToArray(); + } + } + #endregion #region Dispose diff --git a/Software/Visual_Studio/Tango.Transport/TransportAdapterMode.cs b/Software/Visual_Studio/Tango.Transport/TransportAdapterMode.cs new file mode 100644 index 000000000..e89eba38d --- /dev/null +++ b/Software/Visual_Studio/Tango.Transport/TransportAdapterMode.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.Transport +{ + /// <summary> + /// Represents an <see cref="ITransportAdapter"/> read/write mode. + /// </summary> + public enum TransportAdapterMode + { + /// <summary> + /// Pure protobuf message with no message size. + /// </summary> + NO_HEADER, + /// <summary> + /// Prepends and truncates the message size before writing and reading. + /// </summary> + PREPEND_HEADER + } +} diff --git a/Software/Visual_Studio/Tango.Transport/TransporterBase.cs b/Software/Visual_Studio/Tango.Transport/TransporterBase.cs index cf7c79864..b6f8ac529 100644 --- a/Software/Visual_Studio/Tango.Transport/TransporterBase.cs +++ b/Software/Visual_Studio/Tango.Transport/TransporterBase.cs @@ -300,7 +300,7 @@ namespace Tango.Transport { if (!source.Task.IsCompleted) { - LogManager.Log("Request message: " + typeof(Response).Name + " had timed out after " + RequestTimeout.TotalSeconds + " seconds."); + LogManager.Log("Request message: " + typeof(Request).Name + " had timed out after " + RequestTimeout.TotalSeconds + " seconds."); LogManager.Log("Setting request task exception..."); source.SetException(new TimeoutException()); } |
