aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.Transport
diff options
context:
space:
mode:
authorRoy <roy.mail.net@gmail.com>2017-12-26 21:16:15 +0200
committerRoy <roy.mail.net@gmail.com>2017-12-26 21:16:15 +0200
commit2ea2bb5bcd96045f1bd6cb4c3d8b8416dbaa05dc (patch)
treea21ff27fff08876e835df82c5242def1f0d09c17 /Software/Visual_Studio/Tango.Transport
parent6450fc175114a6f8d0b75cb21386d1bb0c902711 (diff)
downloadTango-2ea2bb5bcd96045f1bd6cb4c3d8b8416dbaa05dc.tar.gz
Tango-2ea2bb5bcd96045f1bd6cb4c3d8b8416dbaa05dc.zip
MERGE
Diffstat (limited to 'Software/Visual_Studio/Tango.Transport')
-rw-r--r--Software/Visual_Studio/Tango.Transport/Adapters/TcpTransportAdapter.cs51
-rw-r--r--Software/Visual_Studio/Tango.Transport/Adapters/UsbTransportAdapter.cs37
-rw-r--r--Software/Visual_Studio/Tango.Transport/ITransportAdapter.cs5
-rw-r--r--Software/Visual_Studio/Tango.Transport/Tango.Transport.csproj1
-rw-r--r--Software/Visual_Studio/Tango.Transport/TransportAdapterBase.cs24
-rw-r--r--Software/Visual_Studio/Tango.Transport/TransportAdapterMode.cs23
-rw-r--r--Software/Visual_Studio/Tango.Transport/TransporterBase.cs2
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());
}