Пример #1
0
        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();
        }
Пример #2
0
    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();
    }