/// <summary> /// Do work - process sensor data /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void AcquisitionWorker_DoWork(object sender, DoWorkEventArgs e) { backgroundIsFinished_ = false; BackgroundWorker worker = sender as BackgroundWorker; while (!worker.CancellationPending) //Do the work { foreach (USBdevice_GUI USB in USBdevices) { SingleTact singleTact = USB.singleTact; SingleTactFrame newFrame = singleTact.ReadSensorData(); //Get sensor data if (null != newFrame) //If we have data { USB.addFrame(newFrame); // use first timestamp only to quantise readings and match csv output AddData(USBdevices[0].lastTimeStamp, newFrame.SensorData, USB); //Add to stripchart } else // USB has been unplugged { new Thread(() => { guiTimer_.Stop(); backgroundIsFinished_ = true; var index = USBdevices.IndexOf(USB); var comPort = comPortList[index]; var result = MessageBox.Show( comPort.ToString() + " has been unplugged.\nWould you like to save your data before exiting?", "Error!", MessageBoxButtons.YesNo, MessageBoxIcon.Error); if (result == DialogResult.Yes) { buttonSave_Click(this, null); } Application.Exit(); }).Start(); backgroundIsFinished_ = false; StopAcquisitionThread(); break; } //Calculate rate double delta = newFrame.TimeStamp - USB.lastTimeStamp; // calculate delta relative to previous sensor's last reading if (delta != 0) { measuredFrequency_ = measuredFrequency_ * 0.95 + 0.05 * (1.0 / (delta)); //Averaging } //measuredFrequency_ = 1/delta; USB.setTimestamp(newFrame.TimeStamp); } } }