/// <summary> /// Worker to monitor think gear data /// </summary> private void ThinkGearWorker(object sender, DoWorkEventArgs e) { // stopwatch for timing Stopwatch sw = new Stopwatch(); sw.Start(); // main loop, until worker is cancelled while (true) { // check if we should cancel if (_Worker.CancellationPending) { e.Cancel = true; break; } // Read all currently available Packets, one at a time int packetsRead = ThinkGear.TG_ReadPackets(connectionId, 1); if (packetsRead == 1) { double _etime = (double)sw.ElapsedMilliseconds / 1000; // elapsed time since start in seconds ReadPacket(connectionId, ThinkGear.DATA_ATTENTION, _etime, "atn"); ReadPacket(connectionId, ThinkGear.DATA_MEDITATION, _etime, "med"); ReadPacket(connectionId, ThinkGear.DATA_POOR_SIGNAL, _etime, "sig"); } } }
/// <summary> /// Check if packet that was read contains a certain data type, and prints its value /// </summary> /// <param name="connectionId">ThinkGear connectionId</param> /// <param name="DATA_TYPE">ThinkGear.DATA_* code</param> /// <param name="etime">ellapsed time in seconds</param> /// <param name="label">label for list box output</param> private void ReadPacket(int connectionId, int DATA_TYPE, double etime, string label) { // format string for print out string fmt1 = "{0,10:f3}: {1,5:s}: {2,6:g} 0x{2,4:X4}"; if (ThinkGear.TG_GetValueStatus(connectionId, DATA_TYPE) != 0) { float res = ThinkGear.TG_GetValue(connectionId, DATA_TYPE); string sout = String.Format(fmt1, etime, label, (short)res); lstBoxLog.Invoke((Action <string>)AddItem, sout); } }
/// <summary> /// Start/Stop button event /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnStart_Click(object sender, EventArgs e) { // Start collecting data if (btnStart.Text.StartsWith("Start")) { bool StartSuccess = true; // update COM port Properties.Settings.Default.userCOMPort = cmboCOM.SelectedIndex; // remember user's selection Properties.Settings.Default.Save(); portName = @"\\.\" + (string)cmboCOM.SelectedItem; // Update text btnStart.Enabled = false; lstBoxLog.Items.Add("Starting data collection on ThinkGear DLL version: " + ThinkGear.TG_GetDriverVersion().ToString()); // Request connection ID connectionId = ThinkGear.TG_GetNewConnectionId(); if (connectionId < 0) { lstBoxLog.Items.Add("ERROR: TG_GetNewConnectionId() returned " + connectionId.ToString()); StartSuccess = false; } // start Stream/Data Loggers if (!_Log(connectionId, "data_log.txt", ThinkGear.TG_SetDataLog) || !_Log(connectionId, "stream_log.txt", ThinkGear.TG_SetStreamLog)) { StartSuccess = false; } // Do connection int errCode = ThinkGear.TG_Connect(connectionId, portName, ThinkGear.BAUD_57600, ThinkGear.STREAM_PACKETS); if (errCode != 0) { lstBoxLog.Items.Add("ERROR: TG_Connect() returned " + errCode.ToString()); StartSuccess = false; } // done setting up if (StartSuccess) { _Worker.RunWorkerAsync(); // start thread btnStart.Text = "Stop Collecting Data"; } btnStart.Enabled = true; } // stop collecting data else if (btnStart.Text.StartsWith("Stop")) { btnStart.Enabled = false; // Stop worker _Worker.CancelAsync(); // Disconnect ThinkGear.TG_FreeConnection(connectionId); // print out btnStart.Text = "Start connection on port " + portName; lstBoxLog.Items.Add("done stopping worker"); btnStart.Enabled = true; } else { MessageBox.Show("Error in btnStart_Click"); } }