private void btnAdd_Click(object sender, EventArgs e) { if (tabControl.SelectedTab.Name == "tpLogfile") { CANStreamer_Logfile newStream = CANStreamer_Logfile.OpenNew(); if (newStream != null) { StreamManager.AddStream(newStream); } } else if (tabControl.SelectedTab.Name == "tpComPort2000") { StreamManager.AddStream(new CANStreamer_NGT1_2000() { PortName = (SerialPort.GetPortNames())[0], Name = "<New NMEA 2000 Stream>" }); } else if (tabControl.SelectedTab.Name == "tpComPort0183") { StreamManager.AddStream(new CANStreamer_N0183() { PortName = (SerialPort.GetPortNames())[0], Name = "<New NMEA 0183 Stream>" }); } else if (tabControl.SelectedTab.Name == "tpInternet") { CANStreamer_Network tcpServer = new CANStreamer_Network(); AddNetForm addForm = new AddNetForm(tcpServer); addForm.ShowDialog(); if (addForm.resultOK == true) { StreamManager.AddStream(tcpServer); } } else if (tabControl.SelectedTab.Name == "tpLogging") { SaveFileDialog oDialog = new SaveFileDialog(); oDialog.Filter = "XML Log File (*.xml)|*.xml"; if (oDialog.ShowDialog() == DialogResult.OK) { CANStreamer_Logger newStream = new CANStreamer_Logger() { FileName = oDialog.FileName, Name = Path.GetFileNameWithoutExtension(oDialog.FileName) }; StreamManager.AddStream(newStream); } } else if (tabControl.SelectedTab.Name == "tpGen") { StreamManager.AddStream(new CANStreamer_Generator() { Name = "<New Generator>", MessagePrefix = "$NEW" }); } UpdateButtons(); }
public async Task StartStream(string streamName, ChannelReader <string> streamContent) { // TODO: // Only allow each client to stream one at a time var channel = Channel.CreateBounded <string>(options: new BoundedChannelOptions(2) { FullMode = BoundedChannelFullMode.DropOldest }); if (!_streamManager.AddStream(streamName, channel)) { throw new HubException("This stream name has already been taken."); } await Clients.Others.SendAsync("NewStream", streamName); try { // TODO: I didn't think `Context.ConnectionAborted` was needed here... need to check that out while (await streamContent.WaitToReadAsync(Context.ConnectionAborted)) { while (streamContent.TryRead(out var content)) { await channel.Writer.WriteAsync(content); } } } catch (Exception exception) { channel.Writer.Complete(exception); } finally { _streamManager.RemoveStream(streamName); await Clients.Others.SendAsync("RemoveStream", streamName); } channel.Writer.Complete(); }