private void thinkGear_ThinkGearChanged(object sender, ThinkGearChangedEventArgs e)
 {
     int signal = 100 - (int)e.ThinkGearState.PoorSignal;
     if (signal != lastSignal)
     {
         SignalChangedEventArgs signalArgs = new SignalChangedEventArgs();
         signalArgs.NewSignal = signal;
         signalArgs.OldSignal = lastSignal;
         lastSignal = signal;
         OnSignalChanged(signalArgs);
     }
     ThinkGearStateEventArgs args = new ThinkGearStateEventArgs();
     args.Data = new EEGState(e.ThinkGearState);
     args.Timestamp = sw.ElapsedMilliseconds;
     OnDataReceived(args);
     if (IsLogging && logWriter != null)
     {
         string line = string.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12}",
             sw.ElapsedMilliseconds, e.ThinkGearState.Alpha1, e.ThinkGearState.Alpha2, e.ThinkGearState.Beta1, e.ThinkGearState.Beta2,
             e.ThinkGearState.Delta, e.ThinkGearState.Gamma1, e.ThinkGearState.Gamma2, e.ThinkGearState.Theta, e.ThinkGearState.Meditation,
             e.ThinkGearState.Attention, e.ThinkGearState.Raw, 100 - e.ThinkGearState.PoorSignal);
         logWriter.WriteLine(line);
     }
     Thread.Sleep(sleepTime);
 }
 private void ReplayLogAsync(object obj)
 {
     SortedDictionary<int, EEGState> log = ((Tuple<SortedDictionary<int, EEGState>,int>)obj).Item1;
     int interval = ((Tuple<SortedDictionary<int, EEGState>, int>)obj).Item2;
     foreach (KeyValuePair<int, EEGState> item in log)
     {
         if (!IsReplaying)
             break;
         ThinkGearStateEventArgs args = new ThinkGearStateEventArgs();
         args.Data = item.Value;
         args.Timestamp = item.Key;
         OnDataReceived(args);
         if (!string.IsNullOrWhiteSpace(args.Data.Comment))
             OnLogCommentFound(new CommentEventArgs(item.Key, args.Data.Comment));
         if ((int)item.Value.Signal != lastSignal)
         {
             SignalChangedEventArgs signalArgs = new SignalChangedEventArgs();
             signalArgs.NewSignal = (int)item.Value.Signal;
             signalArgs.OldSignal = lastSignal;
             lastSignal = (int)item.Value.Signal;
             OnSignalChanged(signalArgs);
         }
         lastSignal = (int)item.Value.Signal;
         Thread.Sleep(interval);
     }
     OnLogReplayFinished(null);
 }
 // --------------------------------------------------------------------------------------------------------------------
 void core_DataReceived(object sender, ThinkGearStateEventArgs e)
 {
     try
     {
         Invoke(updateUI, e);
     }
     catch (Exception)
     {
         // can happen when object is disposed
     }
 }
 protected virtual void OnDataReceived(ThinkGearStateEventArgs e)
 {
     EventHandler<ThinkGearStateEventArgs> handler = DataReceived;
     if (handler != null)
     {
         handler(this, e);
     }
 }
        // --------------------------------------------------------------------------------------------------------------------
        private void _updateUi(ThinkGearStateEventArgs e)
        {
            txtRaw.Text = e.Data.Raw.ToString();
            txtSignal.Text = e.Data.Signal.ToString();

            labelElapsedTime.Text = watch.Elapsed.Minutes.ToString("00") + ":" + watch.Elapsed.Seconds.ToString("00");

            // update channel values. this also updates all measures like avg5, avg15, avg60
            float timeInSec = (float)(watch.Elapsed.TotalSeconds + watch.Elapsed.Milliseconds * 1.0f / 1000);

            channelsRaw.alpha1.addSample(timeInSec, e.Data.Alpha1);
            channelsRaw.alpha2.addSample(timeInSec, e.Data.Alpha2);
            channelsRaw.beta1.addSample(timeInSec, e.Data.Beta1);
            channelsRaw.beta2.addSample(timeInSec, e.Data.Beta2);
            channelsRaw.gamma1.addSample(timeInSec, e.Data.Gamma1);
            channelsRaw.gamma2.addSample(timeInSec, e.Data.Gamma2);
            channelsRaw.delta.addSample(timeInSec, e.Data.Delta);
            channelsRaw.theta.addSample(timeInSec, e.Data.Theta);
            channelsRaw.meditation.addSample(timeInSec, e.Data.Meditation);
            channelsRaw.attention.addSample(timeInSec, e.Data.Attention);

            List<EEGChannelBuffer> lst = channelsRaw.ToList();
            foreach (EEGChannelBuffer ch in lst)
            {
                dataRows[ch.Name].Cells[1].Value = ch.CurrentValue.ToString("0");
                dataRows[ch.Name].Cells[2].Value = ch.Average15.ToString("0.00");
            }

            // update normalized channel values.
            channelsNormalized.alpha1.addSample(timeInSec,  channelsRaw.alpha1.CurrentValueNormalized);
            channelsNormalized.alpha2.addSample(timeInSec,  channelsRaw.alpha2.CurrentValueNormalized);
            channelsNormalized.beta1.addSample(timeInSec,   channelsRaw.beta1.CurrentValueNormalized);
            channelsNormalized.beta2.addSample(timeInSec,   channelsRaw.beta2.CurrentValueNormalized);
            channelsNormalized.gamma1.addSample(timeInSec,  channelsRaw.gamma1.CurrentValueNormalized);
            channelsNormalized.gamma2.addSample(timeInSec,  channelsRaw.gamma2.CurrentValueNormalized);
            channelsNormalized.delta.addSample(timeInSec,   channelsRaw.delta.CurrentValueNormalized);
            channelsNormalized.theta.addSample(timeInSec,   channelsRaw.theta.CurrentValueNormalized);
            channelsNormalized.meditation.addSample(timeInSec, channelsRaw.meditation.CurrentValueNormalized);
            channelsNormalized.attention.addSample(timeInSec, channelsRaw.attention.CurrentValueNormalized);

            lst = channelsNormalized.ToList();
            foreach (EEGChannelBuffer ch in lst)
            {
                dataRows[ch.Name].Cells[3].Value = ch.CurrentValue.ToString("0.00");
                dataRows[ch.Name].Cells[4].Value = ch.Average15.ToString("0.00");
            }

            _refreshUIAndSendOsc();
        }