//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();
                }
            }
        }