private void BackgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { if (e.UserState is AnalysisResultEventArgs) { _analysisResult = (AnalysisResultEventArgs)e.UserState; UpdateScope(); UpdateAnalysisResults(); UpdateMatchIndicator(); } if (e.UserState is SignalGenerationResultEventArgs) { var signalGenerationResult = (SignalGenerationResultEventArgs)e.UserState; UpdateSignalGenerationInformation(signalGenerationResult); } }
private void AnalysisCompletedHandler(object sender, AnalysisResultEventArgs e) { backgroundWorker1.ReportProgress(0, e); }
public void DrawScope(float[] samples, AnalysisResultEventArgs analysisResult, int sampleRate, int baudRate, int numberOfSymbols, int desiredSamplesPerSymbol = 100) { var samplesPerSymbol = sampleRate / baudRate; // Debug.WriteLine($"[ScopeControl] Samples per symbol: {samplesPerSymbol}, desired samples per symbol: {desiredSamplesPerSymbol}"); var imageWidth = (int)(desiredSamplesPerSymbol * numberOfSymbols); var imageHeight = (int)Math.Floor(_pictureBoxOriginalHeight * _imageHeightFactor); var audioScaler = (IAudioScaler) new AudioScaler(); samples = audioScaler.Scale(samples, sampleRate, baudRate, numberOfSymbols, imageWidth, imageHeight); var image = new Bitmap(imageWidth, imageHeight); using (Graphics g = Graphics.FromImage(image)) { g.Clear(Color.Black); g.DrawLine(new Pen(Color.LightGreen), new Point(0, imageHeight / 2), new Point(imageWidth, imageHeight / 2)); var greenPen = new Pen(Color.Green); var yellowPen = new Pen(Color.Yellow); var sampleFramePositions = new List <int>(); for (var n = 1; n < numberOfSymbols; n++) { sampleFramePositions.Add((int)(n * audioScaler.SamplesPerSymbol)); } for (int x = 0; x < imageWidth - 1; x++) { g.DrawLine(greenPen, new Point(x, (int)samples[x]), new Point(x + 1, (int)samples[x + 1])); if (sampleFramePositions.Contains(x)) { // Debug.WriteLine($"[ScopeControl] Drawing symbol frame at {x} ({imageWidth - 1})"); g.DrawLine(yellowPen, new Point(x, 0), new Point(x, imageHeight)); } } var textBrush = new SolidBrush(Color.White); var mediumFont = new Font("Arial", 10); var smallFont = new Font("Arial", 8); if (analysisResult != null && analysisResult.AnalysisResult != null && analysisResult.AnalysisResult.AnalysisFrames != null) { var analysisFrames = new AnalysisFrame[analysisResult.AnalysisResult.AnalysisFrames.Count]; analysisResult.AnalysisResult.AnalysisFrames.CopyTo(analysisFrames, 0); var frame = 0; for (int x = 0; x < imageWidth - 1; x++) { if (x == 0 || sampleFramePositions.Contains(x)) { var frequency = analysisFrames[frame].Frequency; var frequencyDifference = analysisFrames[frame].DifferenceFromExpectedFrequencies; var symbol = analysisFrames[frame].Bit.HasValue ? (analysisFrames[frame].Bit.Value == true ? "1" : "0") : "-"; var currentTimeMicroseconds = analysisFrames[frame].TimeOffsetMicroseconds; var line1 = $"{frequency} Hz"; var line2 = $"({frequencyDifference} Hz dev)"; var line3 = $"@ {currentTimeMicroseconds:N1} μs"; var line4 = $"{symbol}"; g.DrawString(line1, mediumFont, textBrush, new PointF(x + 2, imageHeight - 65)); g.DrawString(line2, smallFont, textBrush, new PointF(x + 2, imageHeight - 50)); g.DrawString(line3, mediumFont, textBrush, new PointF(x + 2, imageHeight - 35)); g.DrawString(line4, mediumFont, textBrush, new PointF(x + 2, imageHeight - 18)); frame++; } } } } scopePictureBox.Image = image; scopePictureBox.Refresh(); }