//Armazena as configurações da sessão em um arquivo - na próxima sessão, esta //configuração será usada como default/inicial (sobrescreve o anterior). public void saveConfig() { // Create new file and open it for read and write, if the file exists overwrite it. //todos os doubles serão armezanados no arquivo txt com 6 casas decimais. string fnConfig; string exePath = Application.ExecutablePath; //diretório do executável fnConfig = Path.GetDirectoryName(exePath) + "\\" + sviptFileConstant.fileNameConfig; using (StreamWriter writer = new StreamWriter(@fnConfig)) { // Write the contents //String identificador de arquivo de configuração writer.Write(sviptFileConstant.stringIDfileConfig); //String descritor da tarefa executada na sessão. writer.Write("\r\n" + sviptFileConstant.sviptTask + SVIPT_Task); //quantidade de repetições da tarefa durante a sessão writer.Write("\r\n" + sviptFileConstant.taskRepetitions + SVIPT_TaskRepetitions.ToString()); //taxa de amostragem para coleta de sinais de força //writer.Write("\r\n" + sviptFileConstant.samplingRate + Sampling_Rate.ToString("n6")); //unidade usada para força writer.Write("\r\n" + sviptFileConstant.forceUnity + Force_Unity); //valor de força sem carga (na unidade Force_Unity) writer.Write("\r\n" + sviptFileConstant.baseLineForceVal + baseLineForceVal.ToString("n6")); //valor de força máxima do voluntário (MVF - na unidade Force_Unity) writer.Write("\r\n" + sviptFileConstant.maxVoluntForceVal + maxForceVal.ToString("n6")); //Percentual de força máxima que pode ser usado para deslocamento máximo numa dada tarefa. writer.Write("\r\n" + sviptFileConstant.maxForcePercentage + maxForcePercentage.ToString()); //Percentual de força mínima que pode ser usado para deslocamento máximo numa dada tarefa. writer.Write("\r\n" + sviptFileConstant.minForcePercentage + minForcePercentage.ToString()); //Percentual de força máxima usado nas TAREFAS desta sessão. writer.Write("\r\n" + sviptFileConstant.taskMaxForcePercentage + taskMaxForcePercentage.ToString()); //Percentual de oscilação máximo aceitável para determinar undershoot writer.Write("\r\n" + sviptFileConstant.oscillationPercent + SVIPT_TaskOscilationPercent.ToString()); //Close writer writer.Close(); } }
//Salvar dados da sessão em arquivo public void saveDataFile() { string fn; Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US"); StreamWriter writer; //todos os doubles serão armezanados no arquivo txt com 6 casas decimais. // string exePath = Application.ExecutablePath; //diretório do executável // fnConfig = Path.GetDirectoryName(exePath) + "\\" + // bcFileConstant.fileNameConfig; /*SaveFileDialog saveFileDialog1 = new SaveFileDialog(); * * saveFileDialog1.Filter = "txt files (*.txt)|*.txt"; * //saveFileDialog1.FilterIndex = 1; * saveFileDialog1.RestoreDirectory = true; * * if (saveFileDialog1.ShowDialog() != DialogResult.OK) * return; * //ok * fn = saveFileDialog1.FileName;*/ if (MessageBox.Show("Deseja salvar os dados?", "Aviso", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { string exePath = Application.ExecutablePath; //diretório do executável string fnConfig = Path.GetDirectoryName(exePath) + "\\"; fn = fnConfig + this.ID_Volunteer + "_" + this.id + ".txt"; using (writer = new StreamWriter(@fn)) { // Write the contents. //String identificador de arquivo SVIPT writer.Write(sviptFileConstant.sviptFileID); //String identificador da sessão writer.Write("\r\n" + sviptFileConstant.sviptSession + id); //identificador do voluntário writer.Write("\r\n" + sviptFileConstant.idVolunteer + ID_Volunteer); //String descritor da tarefa executada na sessão. writer.Write("\r\n" + sviptFileConstant.sviptTask + SVIPT_Task); //quantidade de repetições da tarefa durante a sessão writer.Write("\r\n" + sviptFileConstant.taskRepetitions + SVIPT_TaskRepetitions.ToString()); //taxa de amostragem para coleta de sinais de força writer.Write("\r\n" + sviptFileConstant.samplingRate + Sampling_Rate.ToString("n6")); //unidade usada para força writer.Write("\r\n" + sviptFileConstant.forceUnity + Force_Unity); //valor de força sem carga (na unidade Force_Unity) writer.Write("\r\n" + sviptFileConstant.baseLineForceVal + baseLineForceVal.ToString("n6")); //valor de força máxima do voluntário (MVF - na unidade Force_Unity) writer.Write("\r\n" + sviptFileConstant.maxVoluntForceVal + maxForceVal.ToString("n6")); //pontos A e B que definem a cuva da celula de carga do tipo A*X(Volts) + B = Y(Kgf) writer.Write("\r\n" + sviptFileConstant.ConversionFunction + A.ToString("n6") + "X +" + B.ToString("n6") + " = Y"); //Percentual de força máxima que pode ser usado para deslocamento máximo numa dada tarefa. writer.Write("\r\n" + sviptFileConstant.maxForcePercentage + maxForcePercentage.ToString()); //Percentual de força mínima que pode ser usado para deslocamento máximo numa dada tarefa. writer.Write("\r\n" + sviptFileConstant.minForcePercentage + minForcePercentage.ToString()); //Percentual de força máxima usado nas TAREFAS desta sessão. writer.Write("\r\n" + sviptFileConstant.taskMaxForcePercentage + taskMaxForcePercentage.ToString()); //Descrevendo os limites de movimento writer.Write("\r\nLimites de movimento do cursor: " + this.cursorLimits[0].ToString() + "\t" + this.cursorLimits[1].ToString()); //Descrevendo o objeto do cursor writer.Write("\r\nCursor"); writer.Write("\r\nLocation: " + this.cursor.Location.X.ToString() + "\t" + this.cursor.Location.Y.ToString()); writer.Write("\r\nSize: " + this.cursor.Size.Width.ToString() + "\t" + this.cursor.Size.Height.ToString()); //Descrevendo a posição Home writer.Write("\r\nHome"); writer.Write("\r\nLocation: " + this.home.Location.X.ToString() + "\t" + this.home.Location.Y.ToString()); writer.Write("\r\nSize: " + this.home.Size.Width.ToString() + "\t" + this.home.Size.Height.ToString()); //Detalhes dos targets for (int i = 0; i < numberOfTrials; i++) { for (int j = 0; j < 2; j++) { //Como o target 5 não possui limites, ele não é especificado por duas //picturebox, portanto, a última iteração deste laço não deve ser //realizada if (i == numberOfTrials - 1 & j == 1) { break; } //Escreve o identificador do target //Ex: Target 1 - Left --> indicando os detalhes do limite esquerdo do target 1 string title = "Target " + (i + 1).ToString(); if (j == 0 && i < numberOfTrials - 1) { title += " - Left"; } else if ((j == 1 && i < numberOfTrials - 1)) { title += " - Right"; } //Escreve o identificador do target writer.Write("\r\n" + title); //Escrevendo os detalhes necessários para redesenhar o target //Localização writer.Write("\r\nLocation: " + this.targets[i, j].Location.X.ToString() + "\t" + this.targets[i, j].Location.Y.ToString()); //Tamanho writer.Write("\r\nSize: " + this.targets[i, j].Size.Width.ToString() + "\t" + this.targets[i, j].Size.Height.ToString()); } } //Ordem das curvas A'(1,2,3,4,5,6), caso seja sessao modificada if (SVIPT_Task == sviptConstant.sviptTaskModifed || SVIPT_Task == sviptConstant.sviptTaskModifed2) { writer.Write("\r\nCurvas Usadas: "); for (int i = 0; i < SVIPT_TaskRepetitions; i++) { writer.Write("\r\n" + ListaDeCurvas[i].ToString()); } } //Série temporal com os valores de força coletados. writer.Write("\r\n" + sviptFileConstant.forceSignal); // loop over all data values foreach (double val in data) { writer.Write("\r\n"); writer.Write(val.ToString("n6")); //writer.Write(val.ToString().PadLeft(4, '0'));//writer.Write(val.ToString("n6")); //tava mostrando 6 digitos decimais, entretando, como estou salvando o valor de 0-1023, nao ha necessidade de decimais // agora esta mostrando sempre 4 digitos. 50 -> 0050, 1011 -> 1011 } //Serie dos numsamples e epoch40 writer.Write("\r\n" + "NumSamples tab Epoch40"); // loop over all data values foreach (string val in EpochQueue) { writer.Write("\r\n"); writer.Write(val); //writer.Write(val.ToString().PadLeft(4, '0'));//writer.Write(val.ToString("n6")); //tava mostrando 6 digitos decimais, entretando, como estou salvando o valor de 0-1023, nao ha necessidade de decimais // agora esta mostrando sempre 4 digitos. 50 -> 0050, 1011 -> 1011 } writer.Write("\r\n" + "Localizacao:"); int auxili = 0; for (int i = 0; i < SVIPT_TaskRepetitions; i++) { for (int j = 0; j < numberOfTrials; j++) { while (PosPixels[i, j].Count > 0) { // loop over all data values writer.Write("\r\n"); auxili = PosPixels[i, j].Dequeue(); writer.Write(i.ToString() + "\t" + j.ToString() + "\t" + auxili.ToString("D")); } } } //Close writer writer.Close(); //Autor: Andrei //22/03/2017 //Modificação: Criando um novo arquivo para armazenar os resultados //O nome do arquivo é igual ao nome do arquivo de dados seguido de "_results" string[] aux = fn.Split('.'); writer = new StreamWriter(aux[0] + "_results.txt"); //Sequencia informando se houve undershoot ou overshoot nas trials. writer.Write(sviptFileConstant.SessionAccuracy); for (int i = 0; i < SVIPT_TaskRepetitions; i++) { for (int j = 0; j < numberOfTrials; j++) {//loop pra montar o array com overshoots, acertos e undershoots if (overshoot[i, j]) { accuracy[i, j] = 1; } else if (undershoot[i, j]) { accuracy[i, j] = -1; } else { accuracy[i, j] = 0; } } } //Salvando a acurácia em cada tentativa identificando qual era o target int targetId = 1; foreach (int val in accuracy) {// loop over all data values writer.Write("\r\n"); writer.Write(targetId.ToString() + "\t" + val.ToString("D")); targetId++; if (targetId > numberOfTrials) { targetId = 1; } } targetId = 1; writer.Write("\r\n" + sviptFileConstant.TrialErrors); foreach (double val in error) {// loop over all data values writer.Write("\r\n"); writer.Write(targetId.ToString() + "\t" + val.ToString("n6")); targetId++; if (targetId > numberOfTrials) { targetId = 1; } } //Necessário verificar a melhor forma de calcular o tempo //de duração, pois não sei se o StopWatch é a melhor opção //considerando o uso de multi-threading /* * writer.Write("\r\n" + sviptFileConstant.TrialTimes); * foreach (long val in times) * {// loop over all data values * writer.Write("\r\n"); * writer.Write(val.ToString().PadLeft(5, '0')); * } */ writer.Close(); } } }