protected override void Loop(CancellationToken token) { using (var tcpClient = new TcpClient(_networkConfiguration.DroneHostname, ControlPort)) using (NetworkStream stream = tcpClient.GetStream()) { var buffer = new byte[NetworkBufferSize]; Stopwatch swConfigTimeout = Stopwatch.StartNew(); while (token.IsCancellationRequested == false && swConfigTimeout.ElapsedMilliseconds < ConfigTimeout) { int offset = 0; if (tcpClient.Available > 0) { offset += stream.Read(buffer, offset, buffer.Length); // config eof check if (offset > 0 && buffer[offset - 1] == 0x00) { var data = new byte[offset]; Array.Copy(buffer, data, offset); var packet = new ConfigurationPacket { Timestamp = DateTime.UtcNow.Ticks, Data = data }; _configurationAcquired(packet); return; } } Thread.Sleep(10); } } }
public static bool TryUpdate(DroneConfiguration configuration, ConfigurationPacket packet) { bool updated = false; using (var ms = new MemoryStream(packet.Data)) using (var sr = new StreamReader(ms)) { string line; while ((line = sr.ReadLine()) != null) { Match match = _reKeyValue.Match(line); if (match.Success) { string key = match.Groups["key"].Value; IConfigurationItem item; if (configuration.Items.TryGetValue(key, out item)) { string value = match.Groups["value"].Value; if (item.TryUpdate(value)) { updated = true; } } else { Trace.TraceWarning("Configuration key {0} is not supported by parser. Original line: {1}", key, line); } } } } return(updated); }
/// <summary> /// Gets the configuration. /// </summary> /// <returns>The configuration.</returns> public Configuration GetConfiguration() { Configuration configuration = null; ConfigurationPacket configurationPacket = SendCommandAndWaitForAnswer <ConfigurationPacket>(new GetConfigurationPacket()); return(configuration); }
private void OnConfigurationPacketAcquired(ConfigurationPacket packet) { if (UpdateConfiguration(packet)) { if (_DroneClient.RequestedState == RequestedState.GetConfiguration) { _DroneClient.RequestedState = RequestedState.None; } } }
private void OnConfigurationPacketAcquired(ConfigurationPacket packet) { if (UpdateConfiguration(packet)) { if (_DroneClient.RequestedState == RequestedState.GetConfiguration) { _DroneClient.RequestedState = RequestedState.None; } ConfigurationViewModelHelper.UpdateConfigurationSections(_DroneClient.ConfigurationSectionsViewModel, _DroneClient.Configuration); } }
public DroneConfiguration GetConfiguration(CancellationToken token) { using (var tcpClient = new TcpClient(_client.NetworkConfiguration.DroneHostname, ControlPort)) using (NetworkStream stream = tcpClient.GetStream()) try { _client.NavigationDataAcquired += OnNavigationData; var buffer = new byte[NetworkBufferSize]; Stopwatch swConfigTimeout = Stopwatch.StartNew(); while (swConfigTimeout.ElapsedMilliseconds < ConfigTimeout) { token.ThrowIfCancellationRequested(); int offset = 0; if (tcpClient.Available == 0) { Thread.Sleep(10); } else { offset += stream.Read(buffer, offset, buffer.Length); swConfigTimeout.Restart(); // config eof check if (offset > 0 && buffer[offset - 1] == 0x00) { var data = new byte[offset]; Array.Copy(buffer, data, offset); var packet = new ConfigurationPacket { Timestamp = DateTime.UtcNow.Ticks, Data = data }; var configuration = new DroneConfiguration(); if (ConfigurationPacketParser.TryUpdate(configuration, packet)) { return(configuration); } throw new InvalidDataException(); } } } throw new TimeoutException(); } finally { _client.NavigationDataAcquired -= OnNavigationData; } }
private void OnConfigurationPacketAcquired(ConfigurationPacket packet) { if (ConfigurationPacketAcquired != null) { ConfigurationPacketAcquired(packet); } if (ConfigurationPacketParser.TryUpdate(_droneConfiguration, packet)) { if (ConfigurationUpdated != null) { ConfigurationUpdated(_droneConfiguration); } } }
internal bool UpdateConfiguration(ConfigurationPacket packet) { using (var ms = new MemoryStream(packet.Data)) { using (var sr = new StreamReader(ms)) { string line; while ((line = sr.ReadLine()) != null) { UpdateConfigurationLine(line); } } } return(true); }
private void OnDataReadCompletion(uint bytesRead, Streams.DataReader reader) { if (reader == null) { return; } uint unreadLength = reader.UnconsumedBufferLength; if (unreadLength == 0) { return; } byte[] buffer = new byte[unreadLength]; reader.ReadBytes(buffer); StringBuilder stringBuffer = new StringBuilder(); stringBuffer.Append(Encoding.UTF8.GetString(buffer, 0, buffer.Length)); Debug.WriteLine("Configuration Brute: " + stringBuffer.ToString()); var packet = new ConfigurationPacket { Timestamp = DateTime.UtcNow.Ticks, Data = buffer }; if (UpdateConfiguration(packet)) { if (_DroneClient.RequestedState == RequestedState.GetConfiguration) { _DroneClient.RequestedState = RequestedState.None; } ConfigurationViewModelHelper.UpdateConfigurationSections(_DroneClient.ConfigurationSectionsViewModel, _DroneClient.Configuration); } }
private void OnConfigurationPacketAcquired(ConfigurationPacket packet) { if (ConfigurationPacketAcquired != null) ConfigurationPacketAcquired(packet); if (ConfigurationPacketParser.TryUpdate(_configuration, packet)) { if (ConfigurationUpdated != null) ConfigurationUpdated(_configuration); } }