public Argument(Oscilloscope device, int recordLength, int averages, int measurementAverages)
 {
     this.device = device;
     this.recordLength = recordLength;
     this.averages = averages;
     this.measurementAverages = measurementAverages;
 }
 public MainWindow()
 {
     InitializeComponent();
     backgroundWorker = (BackgroundWorker)this.FindResource("backgroundWorker");
     oscilloscope = new B380("192.168.255.148", 0x6871);
     //generator = new B330("192.168.255.143", 0x6871);
 }
        public static void StartMeasurements(Oscilloscope device, int recordLength, int averages, int measurementAverages,
            System.ComponentModel.BackgroundWorker backgroundWorker)
        {
            int connectionThreshold = 0;
            DateTime begin = DateTime.Now;


            //Text.Text += Environment.NewLine + "Запуск измерения";
            List<double> histCh1 = new List<double>();
            List<double> histCh2 = new List<double>();
            List<double> histCh3 = new List<double>();
            List<double> histCh4 = new List<double>();
            List<double> histArg = new List<double>();

            while (true)
            {
                double[][] data =
                {
                new double[recordLength], new double[recordLength], new double[recordLength],
                new double[recordLength]
                };


                device.StartMeasurement();
                //Text.Text += Environment.NewLine + "Ожидание данных";
                while (!device.IsDataReady())
                {
                    Task.Delay(1);
                    connectionThreshold++;
                    if (connectionThreshold > 5000) throw new Exception();
                }
                connectionThreshold = 0;
                double[][] buffer = device.GetData();
                //for (int j = 0; j < buffer.Length; j++)
                //{
                //    double mean = Mean(buffer[j]);
                //    for (int k = 0; k < buffer[0].Length; k++)
                //    {
                //        buffer[j][k] -= mean;
                //    }
                //}

                for (int j = 0; j < data.Length; j++)
                {
                    for (int k = 0; k < data[0].Length; k++)
                    {
                        data[j][k] += buffer[j][k];
                    }
                }
                
               
                //for (int j = 0; j < data.Length; j++)
                //{
                //    double mean = Mean(data[j]);
                //    for (int k = 0; k < data[0].Length; k++)
                //    {
                //        data[j][k] -= mean;
                //    }
                //}

                DateTime end = DateTime.Now;
                //Text.Text += Environment.NewLine + "Результаты";
                //for (int i = 0; i < data[0].Length; i++)
                //{
                //    Text.Text += Environment.NewLine + $"{i}; {data[0][i]}; {data[1][i]}; {data[2][i]}; {data[3][i]};";
                //}
                //Text.Text += Environment.NewLine + $"Измерение завершено. Количество усреднений: {averages}";
                ////Text.Text += Environment.NewLine + "RMS:";
                //Text.Text += Environment.NewLine +
                //             $"1-й канал: {Rms(data[0])}, 2-й канал: {Rms(data[1])}, 3-й канал: {Rms(data[2])}, 4-й канал: {Rms(data[3])},";

                //var sb = new StringBuilder(8 * 1024);
                //sb.AppendLine("Результаты:");

                //for (int i = 0; i < device.GetRecordLength(); i++)
                //    sb.AppendLine(string.Format("{0}: {1}\t|\t{2}\t|\t{3}\t|\t{4}", i, buffer[0][i], buffer[1][i], buffer[2][i], buffer[3][i]));

                //sb.AppendLine("Завершили");

                //Text.Text += Environment.NewLine + sb;

                TimeSpan result = end - begin;
                //Text.Text += Environment.NewLine +
                //             $"Затрачено времени: {(result).Seconds.ToString()} с, {(result).Milliseconds.ToString()} мс";
                //Text.ScrollToEnd();

                if (histCh1.Count >= measurementAverages)
                {
                    histCh1.RemoveAt(0);
                    histCh1.Add(Rms(data[0]));
                }
                else histCh1.Add(Rms(data[0]));

                if (histCh2.Count >= measurementAverages)
                {
                    histCh2.RemoveAt(0);
                    histCh2.Add(Rms(data[1]));
                }
                else histCh2.Add(Rms(data[1]));

                if (histCh3.Count >= measurementAverages)
                {
                    histCh3.RemoveAt(0);
                    histCh3.Add(Rms(data[2]));
                }
                else histCh3.Add(Rms(data[2]));

                if (histCh4.Count >= measurementAverages)
                {
                    histCh4.RemoveAt(0);
                    histCh4.Add(Rms(data[3]));
                }
                else histCh4.Add(Rms(data[3]));

                if (histArg.Count >= measurementAverages)
                {
                    histArg.RemoveAt(0);
                    histArg.Add(Rms(data[2])/Rms(data[3]));
                }
                else histArg.Add(Rms(data[2])/Rms(data[3]));

                double[] avg = { histCh1.Sum()/histCh1.Count, histCh2.Sum() / histCh2.Count , histCh3.Sum() / histCh3.Count , histCh4.Sum() / histCh4.Count, histArg.Sum() / histArg.Count };
                double[] max = {histCh1.Max(), histCh2.Max(), histCh3.Max(), histCh4.Max(), histArg.Max()};
                double[] min = { histCh1.Min(), histCh2.Min(), histCh3.Min(), histCh4.Min(), histArg.Min()};
                double[] instability = new double[5];
                for (int i = 0; i < 5; i++) instability[i] = (max[i] - min[i])*100/avg[i];

                if (backgroundWorker.CancellationPending)
                {
                    // Возврат
                    histCh1.Clear();
                    histCh2.Clear();
                    histCh3.Clear();
                    histCh4.Clear();
                    return;
                }

                if (backgroundWorker.WorkerReportsProgress)
                {
                    //float progress = ((float)(i + 1)) / list.Length * 100;
                    string report =
                        $"1-й канал: rms: {Rms(data[0]):f6}; avg: {avg[0]:f6}; max: {max[0]:f6}; min: {min[0]:f6}; instability: {instability[0]} %; \n\n" +
                        $"2-й канал: rms: {Rms(data[1]):f6}; avg: {avg[1]:f6}; max: {max[1]:f6}; min: {min[1]:f6}; instability: {instability[1]} %; \n\n" +
                        $"3-й канал: rms: {Rms(data[2]):f6}; avg: {avg[2]:f6}; max: {max[2]:f6}; min: {min[2]:f6}; instability: {instability[2]} %; \n\n" +
                        $"4-й канал: rms: {Rms(data[3]):f6}; avg: {avg[3]:f6}; max: {max[3]:f6}; min: {min[3]:f6}; instability: {instability[3]} %; \n\n" +
                        $"аргумент: {Rms(data[2]) / Rms(data[3]):f6}; avg: {avg[4]:f6}; max: {max[4]:f6}; min: {min[4]:f6}; instability: {instability[4]} %; \n\n";
                    MainWindow.Answer ans = new MainWindow.Answer(report);
                    backgroundWorker.ReportProgress(0, ans);
                    //(int)Math.Round(progress));
                }

                Task.Delay(50);
            }

        }