/// <summary> /// Method used for the "Collection Thread" /// </summary> /// <param name="operation"></param> private async void CollectTelemetryData(IAsyncAction operation) { DataReader reader; uint unconsumedBufferLength = 0; lock (m_pConnectedSocket) { reader = new DataReader(m_pConnectedSocket.InputStream); } while (IsClientConnected | (unconsumedBufferLength > 0)) { await m_pTelemetryReaderSemaphoreSlim.WaitAsync(); try { await reader.LoadAsync(sizeof (byte)); unconsumedBufferLength = reader.UnconsumedBufferLength; } finally { m_pTelemetryReaderSemaphoreSlim.Release(); } if (reader.UnconsumedBufferLength <= 0) continue; await m_pTelemetryReaderSemaphoreSlim.WaitAsync(); try { byte b; var e = new OnTelemetryDataReceivedEventArgs(); b = reader.ReadByte(); var commandInformation = (CommandInformation) b; switch (commandInformation) { case CommandInformation.Information: await reader.LoadAsync(sizeof (uint)); var n = reader.ReadUInt32(); await reader.LoadAsync(n*sizeof (char)); e.CommandData = reader.ReadString(n); e.CommandType = CommandInformation.Information; break; case CommandInformation.Gyroscope: float angleX, angleY, angleZ; long gyroTime; await reader.LoadAsync(3*sizeof (double)); await reader.LoadAsync(sizeof (long)); angleX = Convert.ToSingle(reader.ReadDouble()); angleY = Convert.ToSingle(reader.ReadDouble()); angleZ = Convert.ToSingle(reader.ReadDouble()); gyroTime = reader.ReadInt64(); e.CommandData = new GyroscopeData() { Angle = new Vector3(angleX, angleY, angleZ), TimeStamp = new DateTime(gyroTime) }; e.CommandType = CommandInformation.Gyroscope; break; case CommandInformation.Accelerometer: float accX, accY, accZ; long accTime; await reader.LoadAsync(3*sizeof (double)); await reader.LoadAsync(sizeof (long)); accX = Convert.ToSingle(reader.ReadDouble()); accY = Convert.ToSingle(reader.ReadDouble()); accZ = Convert.ToSingle(reader.ReadDouble()); accTime = reader.ReadInt64(); e.CommandData = new AccelerometerData() { Acceleration = new Vector3(accX, accY, accZ), TimeStamp = new DateTime(accTime) }; e.CommandType = CommandInformation.Accelerometer; break; case CommandInformation.Servo: byte id, velocity; long servoTime; await reader.LoadAsync(2*sizeof (byte)); await reader.LoadAsync(sizeof (long)); id = reader.ReadByte(); velocity = reader.ReadByte(); servoTime = reader.ReadInt64(); e.CommandData = new ServoControllerData() {ServoId = id, VelocityValue = velocity, TimeStamp = new DateTime(servoTime)}; e.CommandType = CommandInformation.Servo; break; } var handler = OnTelemetryDataReceived; handler?.Invoke(this, e); } finally { m_pTelemetryReaderSemaphoreSlim.Release(); } } }
public static async void connect() { HostName hostname = new HostName("myaustin.iptime.org"); String servicename = "21122"; Debug.WriteLine("Connecting"); try { // Connect to the server (in our case the listener we created in previous step). await socket.ConnectAsync(hostname, servicename); Debug.WriteLine("Connected"); Debug.WriteLine("onconnection start"); DataReader reader = new DataReader(socket.InputStream); try { String data = ""; uint stringLength = 1; while (true) { uint actualStringLength = await reader.LoadAsync(stringLength); data = reader.ReadString(actualStringLength); if (data.Equals("S")) { uint actualdataLength = await reader.LoadAsync(4); byte[] color_array = new byte[4]; reader.ReadBytes(color_array); Color temp_color = new Color(); temp_color.A = color_array[0]; temp_color.R = color_array[1]; temp_color.G = color_array[2]; temp_color.B = color_array[3]; SolidColorBrush color = new SolidColorBrush(temp_color); double x1,x2,y1,y2,thick; var list = new List<Windows.UI.Xaml.UIElement>(); while (true) { actualStringLength = await reader.LoadAsync(1); data = reader.ReadString(actualStringLength); if (data.Equals("P")) { actualStringLength = await reader.LoadAsync(sizeof(double) * 5); x1 = reader.ReadDouble(); y1 = reader.ReadDouble(); x2 = reader.ReadDouble(); y2 = reader.ReadDouble(); thick = reader.ReadDouble(); Line l = new Line() { X1 = x1, Y1 = y1, X2 = x2, Y2 = y2, StrokeThickness = thick, Stroke = color, StrokeStartLineCap = PenLineCap.Round, StrokeEndLineCap = PenLineCap.Round, StrokeLineJoin = PenLineJoin.Round, }; list.Add(l); } else if (data.Equals("E")) { OnNetworkRecieved(list); Debug.WriteLine("Get one stroke"); break; } else Debug.WriteLine("Expected P or E, {0} ,Network Error!!",data); } } else Debug.WriteLine("Expected S, {0} , Network Error!!",data); } } catch (Exception exception) { // If this is an unknown status it means that the error is fatal and retry will likely fail. if (SocketError.GetStatus(exception.HResult) == SocketErrorStatus.Unknown) { throw; } Debug.WriteLine("Read stream failed with error: " + exception.Message); } // Mark the socket as connected. Set the value to null, as we care only about the fact that the property is set. //CoreApplication.Properties.Add("connected", null); } catch (Exception exception) { // If this is an unknown status it means that the error is fatal and retry will likely fail. if (SocketError.GetStatus(exception.HResult) == SocketErrorStatus.Unknown) { throw; } Debug.WriteLine("Connect failed with error: " + exception.Message); } }