Exemple #1
0
        private static string GenerateGoertzelTableOutput(RefreshVisualOutputEventArgs e)
        {
            BBDMercury16Input bbdMercury16Input = waveSource as BBDMercury16Input;

            // Console Content
            consoleSB.Clear();

            if (bbdMercury16Input != null)
            {
                for (int c = 0; c < bbdMercury16Input.GoertzelOutputs.Length; c++)
                {
                    if ((bbdMercury16Input.GoertzelOutputs[c] == null) || (bbdMercury16Input.GoertzelOutputs[c].Count % 3 != 0))
                    {
                        continue;
                    }

                    lock (bbdMercury16Input.GoertzelOutputs[c])
                    {
                        float[] relevantValues = null;

                        consoleSB.AppendLine($"---- channel {c+1}");
                        relevantValues = bbdMercury16Input.GoertzelOutputs[c].Where((x, i) => (i % 3 == 0) && (i > bbdMercury16Input.GoertzelOutputs[c].Count - 43)).ToArray();
                        consoleSB.AppendLine($"- freq: {String.Format("{0, 10:##0.00}", bbdMercury16Input.GoertzelFrequency01)} Hz    values: {String.Join(" |", relevantValues.Select(v => String.Format("{0, 8:##0.00}", Math.Max(Math.Min(v, 9999.99), -9999.99))))}          ");
                        relevantValues = bbdMercury16Input.GoertzelOutputs[c].Where((x, i) => (i % 3 == 1) && (i > bbdMercury16Input.GoertzelOutputs[c].Count - 43)).ToArray();
                        consoleSB.AppendLine($"- freq: {String.Format("{0, 10:##0.00}", bbdMercury16Input.GoertzelFrequency02)} Hz    values: {String.Join(" |", relevantValues.Select(v => String.Format("{0, 8:##0.00}", Math.Max(Math.Min(v, 9999.99), -9999.99))))}          ");
                        relevantValues = bbdMercury16Input.GoertzelOutputs[c].Where((x, i) => (i % 3 == 2) && (i > bbdMercury16Input.GoertzelOutputs[c].Count - 43)).ToArray();
                        consoleSB.AppendLine($"- freq: {String.Format("{0, 10:##0.00}", bbdMercury16Input.GoertzelFrequency03)} Hz    values: {String.Join(" |", relevantValues.Select(v => String.Format("{0, 8:##0.00}", Math.Max(Math.Min(v, 9999.99), -9999.99))))}          ");
                        consoleSB.AppendLine();
                    }
                }
            }

            return(consoleSB.ToString());
        }
Exemple #2
0
        private static string GenerateConsoleTitle()
        {
            // Console Title
            double timeElapsed  = (DateTime.UtcNow - firstActivity).TotalSeconds;
            string consoleTitle = $"{SessionId}";

            if (waveSource is BBD8x8MatrixInput)
            {
                BBD8x8MatrixInput bbdInput = (BBD8x8MatrixInput)waveSource;

                consoleTitle += $" - {(bbdInput.COMPortBytesReceived / timeElapsed / 1024).ToString("0.00")} kbytes/sec - {((double)bbdInput.LLCommandReceived / timeElapsed).ToString("0.00")} fps";
            }
            if (waveSource is BBDMercury16Input)
            {
                BBDMercury16Input bbdInput = (BBDMercury16Input)waveSource;

                lock (bbdInput.BenchmarkEntries)
                {
                    if (bbdInput.BenchmarkEntries.Count > 0)
                    {
                        double time    = (bbdInput.BenchmarkEntries.Max(be => be.TimeStamp) - bbdInput.BenchmarkEntries.Min(be => be.TimeStamp)).TotalSeconds;
                        double speed   = (time <= 0 ? 0 : bbdInput.BenchmarkEntries.Sum(be => be.BytesTransferred) / time);
                        int    samples = bbdInput.BenchmarkEntries.Sum(be => be.SamplesTransferred);
                        consoleTitle += $" - {(speed / 1024).ToString("0.00")} kbytes/sec - {(samples / time).ToString("#,0")} Hz";
                    }
                }
            }
            if (recentValues != null)
            {
                consoleTitle += $" - sensibility { recentChangesSensitivity.ToString("0.0000")}";
            }

            if (wfo != null)
            {
                consoleTitle += $" - wav file: {(waveFileBytesWritten / 1024).ToString("#,0")} kbytes (jitter: {wfo.BufferJitter} samples, overflow warnings: {waveDataOverflowWarningCount})";
            }

            if (vtsfo != null)
            {
                consoleTitle += $" - vts file: {(vtsFileBytesWritten / 1024).ToString("#,0")} kbytes (overflow warnings: {vtsDataOverflowWarningCount})";
            }

            consoleTitle += "     ";

            return(consoleTitle);
        }
Exemple #3
0
        public static void StartSession(DataDisplayModes mode)
        {
            consoleSB = new StringBuilder();

            //Console.SetOut(File.AppendText($"{workingDirectory}{SessionId}.log"));
            Console.WriteLine($"Session '{SessionId}' starts at {DateTime.Now.ToString("yyyy-MM-dd HH\\:mm\\:sszzz")} ({DateTime.UtcNow.ToString("yyyy-MM-dd HH\\:mm\\:ss")} UTC)");

            try
            {
                Console.Write($"Checking if Mercury-16 is connected as PHDC USB device... ");
                BBDMercury16Input bbdMercury16Input = new BBDMercury16Input();
                waveSourceDevice = bbdMercury16Input;
                waveSource       = bbdMercury16Input;
                Console.WriteLine("OK");
            }
            catch (System.IO.IOException)
            {
                Console.WriteLine("not connected");
            }

            if (waveSource == null)
            {
                try
                {
                    Console.Write($"Checking if Arduino is connected on port '{arduinoPort}', expecting The 8x8 Matrix as data-source... ");
                    waveSource = new BBD8x8MatrixInput(arduinoPort, 64);
                    Console.WriteLine("OK");
                }
                catch (System.IO.IOException)
                {
                    Console.WriteLine("not connected");
                }
            }

            if (waveSource == null)
            {
                Console.Write($"No hardware source was detected, so creating an 8kHz 16ch sine signal generator as data-source... ");
                waveSource = new SineInput(8000, 16);
                Console.WriteLine("OK");
            }

            int fftSize = 1024 * 16;

            frequencyStep = (float)waveSource.SamplesPerSecond / fftSize;

            MultiChannelInput <IDataChannel> normalizedSource = FilterManager.ApplyFilters(waveSource, new NormalizeFilter()
            {
                Settings = new NormalizeFilterSettings()
                {
                    Enabled = true, SampleCount = waveSource.SamplesPerSecond * 3, Gain = 10.0f
                }
            });

            //MultiChannelInput<IDataChannel> filteredSource = FilterManager.ApplyFilters(waveSource, new ByPassFilter() { Settings = new ByPassFilterSettings() { Enabled = true } });
            //MultiChannelInput<IDataChannel> filteredSource = FilterManager.ApplyFilters(waveSource, new FillFilter() { Settings = new FillFilterSettings() { Enabled = true, ValueToFillWith = 0.75f } });

            //MultiChannelInput<IDataChannel> averagedSource = FilterManager.ApplyFilters(normalizedSource, new MovingAverageFilter() { Settings = new MovingAverageFilterSettings() { Enabled = true, InputDataDimensions = 2, MovingAverageLength = 10 } });

            wfo              = new WaveFileOutput(normalizedSource, $"{workingDirectory}{SessionId}.wav");
            wfo.DataWritten += Wfo_DataWritten;

            //vtkfo = new VTKFileOutput(filteredSource, $"{workingDirectory}{SessionId}.vts");
            //vtkfo.DataWritten += Wfo_DataWritten;

            //vtsfo = new SimpleVTSFileOutput(filteredSource, $"{workingDirectory}{SessionId}.vts", true);
            //vtsfo.DataWritten += Vtsfo_DataWritten;

            MultiChannelInput <IDataChannel> filteredSource = null;

            switch (mode)
            {
            case DataDisplayModes.NormalizedWaveform:
                peakToPeakValues = null;
                vo = new VisualOutput(normalizedSource, 25, VisualOutputMode.Waveform);
                break;

            case DataDisplayModes.FilteredSpectogram:
                filteredSource = FilterManager.ApplyFilters(normalizedSource, new FFTWFilter()
                {
                    Settings = new FFTWFilterSettings()
                    {
                        Enabled = true, FFTSampleCount = fftSize, IsBackward = false, PlanningRigor = FFTPlanningRigor.Estimate, IsRealTime = true, Timeout = 300, OutputFormat = FFTOutputFormat.Magnitude, BufferSize = fftSize * 16
                    }
                });
                vo = new VisualOutput(filteredSource, 25, VisualOutputMode.Spectrum);
                break;

            case DataDisplayModes.DominanceMatrix:
                filteredSource = FilterManager.ApplyFilters(normalizedSource, new FFTWFilter()
                {
                    Settings = new FFTWFilterSettings()
                    {
                        Enabled = true, FFTSampleCount = fftSize, IsBackward = false, PlanningRigor = FFTPlanningRigor.Estimate, IsRealTime = true, Timeout = 300, OutputFormat = FFTOutputFormat.FrequencyMagnitudePair
                    }
                });
                MultiChannelInput <IDataChannel> thresholdedSource = FilterManager.ApplyFilters(filteredSource, new ThresholdFilter()
                {
                    Settings = new ThresholdFilterSettings()
                    {
                        Enabled = true, MinValue = 0.002f, MaxValue = Single.MaxValue
                    }
                });
                vo = new VisualOutput(thresholdedSource, 25, VisualOutputMode.DominanceMatrix);
                break;

            case DataDisplayModes.GoertzelValues:
                vo = new VisualOutput(waveSource, 25, VisualOutputMode.GoertzelTable);
                break;
            }

            if (vo != null)
            {
                vo.RefreshVisualOutput += Vo_RefreshVisualOutput;
            }

            firstActivity = DateTime.UtcNow;

            Console.OutputEncoding = System.Text.Encoding.Unicode;
            Console.SetBufferSize(200, 500);
            Console.SetWindowSize(200, 63);
            consoleRefreshAtY = Console.CursorTop;
        }