//plot data from circular buffer private void DoSomething() { int num = 0; while (working) { if (!CoordenaDados.circularBufferEMG.IsEmpty) { int buff; int n = CoordenaDados.circularBufferEMG.SamplesToRead; for (int i = 0; i < n; i++) { num++; if (num >= 200) { Disconnect(); break; } buff = CoordenaDados.HandleEMG(); resultadoEMG[i] = buff; } } } calculos(); Console.WriteLine("EMG encerrado! "); }
double t = 0; //tempo atual //plot data from circular buffer private void DoSomething() { while (working) { if (!CoordenaDados.circularBufferEMG.IsEmpty) //se o buffer não está vazio podemos remover dados { float buff; int samples = CoordenaDados.circularBufferEMG.SamplesToRead; //numero de amostras disponíveis for (int i = 0; i < samples; i++) { buff = CoordenaDados.HandleEMG() / 205.0f; //retira um valor do buffer circular //verifica se está no modo coleta ou calibração switch (calibra) { //modo calibração case "calibrando": if (num < tam) //se ainda não chegou na quantidade de amotras/ tempo suficiente { tc += 1.0f / sampFreq; resultadoEMG[num] = buff; //insere o valor no vetor file.WriteLine(buff.ToString()); //armazena em arquivo this.chart2.BeginInvoke(new Action(() => this.chart2.Series[0].Points.AddXY(tc, buff))); //plota o valor num++; } else { calculos(); //efetua a media e o desvio padrão para calcular o limiar Disconnect(); //fecha as conexões com a porta e para de receber dados } break; //modo coleta case "coletando": file.WriteLine(buff.ToString()); //armazena o dado no arquivo //se o sinal ultrapassou o limiar e o estado mudou if (buff > limiar) { estadoAtualEMG = true; } else { estadoAtualEMG = false; } //se os estados são diferentes e se encontram acima do limiar if (estadoAnteriorEMG != estadoAtualEMG && estadoAtualEMG) { SendKeys.SendWait(" "); //envia a tecla espaço } estadoAnteriorEMG = estadoAtualEMG; //t += 1.0f / sampFreq; //contagem do tempo de plotagem //this.chart1.BeginInvoke(new Action(() => this.chart1.Series[0].Points.AddXY(t,buff))); //plota o valor //caminhando com o gráfico if (t > chart1.ChartAreas[0].AxisX.Maximum) { chart1.Invoke(new Action(() => chart1.ChartAreas[0].AxisX.Maximum = chart1.ChartAreas[0].AxisX.Maximum + 0.1)); chart1.Invoke(new Action(() => chart1.ChartAreas[0].AxisX.Minimum = chart1.ChartAreas[0].AxisX.Minimum + 0.1)); } break; } } } } //terminado o processo... //salva o tempo final da coleta string timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture); file.WriteLine(timestamp); file.Close();//fecha o arquivo Console.WriteLine("EMG encerrado! "); }