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()); }
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); }
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; }