private bool Receive2Processed(string scriptName, ref utils.testFrames tf)
        {
            if (scriptName.IndexOf("js") < 0)
            {
                tf.processed = tf.raw;
            }
            else
            {
                utils.ScriptAnswer sa = new utils.ScriptAnswer();


                try
                {
                    sa = utils.callScript(scriptName, "", tf.raw, 0);

                    if (!String.IsNullOrWhiteSpace(sa.error))
                    {
                        MessageBox.Show($"O script retornou o seguinte erro: {sa.error}");
                        scriptRunning = false;
                        this.screenText.Dispatcher.Invoke((Action)(() => updateScreenButtons(state.connected)));
                        return(true);
                    }
                    else
                    {
                        tf.processed = sa.processed_frame;
                    }
                }
                catch (Exception exce)
                {
                    MessageBox.Show(exce.Message, "Error");
                    return(true);
                }
            }
            return(false);
        }
        private void RunScript(List <utils.command> command_list, int timeOut)
        {
            List <utils.test_results> _test = new List <utils.test_results>();

            utils.test_results commandOnTest = new utils.test_results();
            for (int i = 0; i < command_list.Count; i++)
            {
                if (!scriptRunning)
                {
                    return;
                }

                receive = "";

                utils.command c = command_list[i];
                htmlTextOutput.Add($"<p><b>[{i}] - {c.name}</b></p>");

                for (int j = 0; j < replacer.Count; j++)
                {
                    c.send    = c.send.ToUpper().Replace($"#{tags[j]}#", utils.getFrameFormat(replacer[j], false));
                    c.receive = c.receive.ToUpper().Replace($"#{tags[j]}#", utils.getFrameFormat(replacer[j], false));
                }
                commandOnTest.sent.raw       = c.send;
                commandOnTest.expectedAnswer = c.receive;
                if (c.send_script == null)
                {
                    c.send_script = "";
                }

                if (c.send_script.ToLower().IndexOf("js") < 0)
                {
                    if (commandOnTest.sent.raw.IndexOf("#CS#") > 0)
                    {
                        commandOnTest.sent.raw = commandOnTest.sent.raw
                                                 .Replace("#CS#",
                                                          c.checksum.calcCRC(commandOnTest.sent.raw.Substring
                                                                                 (c.checksum.from, commandOnTest.sent.raw.IndexOf("#CS#") - c.checksum.from)));
                    }
                    commandOnTest.sent.processed = commandOnTest.sent.raw;
                    byte[] b = utils.str2Hex(commandOnTest.sent.processed);
                    receive = "";
                    s0.Write(b, 0, b.Length);
                    this.screenText.Dispatcher.Invoke((Action)(() => write2Screen(commandOnTest.sent.processed)));
                    Thread.Sleep(timeOut);
                    commandOnTest.realAnswer.raw = receive;
                    if (c.receive_script == null)
                    {
                        c.receive_script = "";
                    }
                    if (Receive2Processed(c.receive_script, ref commandOnTest.realAnswer))
                    {
                        return;
                    }
                    if (!String.IsNullOrWhiteSpace(commandOnTest.realAnswer.processed))
                    {
                        this.Dispatcher.Invoke((Action)(() => read2Screen(commandOnTest.realAnswer.processed)));
                    }
                }
                else
                {
                    utils.ScriptAnswer sa = new utils.ScriptAnswer();
                    sa.newRound = true;
                    int round = 0;
                    commandOnTest.realAnswer.raw = "";
                    while (sa.newRound)
                    {
                        if (!scriptRunning)
                        {
                            return;
                        }

                        sa = utils.callScript(c.send_script, commandOnTest.sent.raw, commandOnTest.realAnswer.raw, round);

                        if (!String.IsNullOrWhiteSpace(sa.error))
                        {
                            MessageBox.Show($"{sa.error}", "Error ao executar o script", MessageBoxButton.OK, MessageBoxImage.Error);
                            scriptRunning = false;
                            this.screenText.Dispatcher.Invoke((Action)(() => updateScreenButtons(state.connected)));
                            return;
                        }
                        else
                        {
                            commandOnTest.sent.processed = sa.processed_frame;
                            if (!String.IsNullOrWhiteSpace(commandOnTest.sent.processed))
                            {
                                if (commandOnTest.sent.processed.IndexOf("#CS#") > 0)
                                {
                                    commandOnTest.sent.processed = commandOnTest.sent.processed
                                                                   .Replace("#CS#",
                                                                            c.checksum.calcCRC(commandOnTest.sent.processed.Substring
                                                                                                   (c.checksum.from, commandOnTest.sent.processed.IndexOf("#CS#") - c.checksum.from)));
                                }
                                byte[] b = utils.str2Hex(commandOnTest.sent.processed);
                                receive = "";
                                s0.Write(b, 0, b.Length);
                                this.screenText.Dispatcher.Invoke((Action)(() => write2Screen(commandOnTest.sent.processed)));
                                Thread.Sleep(timeOut);
                                commandOnTest.realAnswer.raw = receive;
                                if (c.receive_script == null)
                                {
                                    c.receive_script = "";
                                }
                                if (Receive2Processed(c.receive_script, ref commandOnTest.realAnswer))
                                {
                                    return;
                                }
                                if (!String.IsNullOrWhiteSpace(commandOnTest.realAnswer.processed))
                                {
                                    this.Dispatcher.Invoke((Action)(() => read2Screen(commandOnTest.realAnswer.processed)));
                                }
                                round++;
                            }
                        }
                    }
                }
                try
                {
                    commandOnTest.expectedAnswer = commandOnTest.expectedAnswer.Replace(" ", "");
                    string ans = "";
                    if (commandOnTest.realAnswer.processed != null)
                    {
                        ans = commandOnTest.realAnswer.processed.Replace(" ", "");
                    }
                    for (int ch = 0; ch < commandOnTest.expectedAnswer.Length; ch++)
                    {
                        if (commandOnTest.expectedAnswer[ch] == 'X')
                        {
                            char[] array = commandOnTest.expectedAnswer.ToCharArray();
                            array[ch] = ans[ch];
                            commandOnTest.expectedAnswer = new string(array);
                        }
                    }
                    if (commandOnTest.expectedAnswer.IndexOf("#CS#") > 0)
                    {
                        commandOnTest.expectedAnswer = commandOnTest.expectedAnswer
                                                       .Replace("#CS#",
                                                                c.checksum.calcCRC(
                                                                    commandOnTest.expectedAnswer.Substring(c.checksum.from,
                                                                                                           commandOnTest.expectedAnswer.IndexOf("#CS#") - c.checksum.from))).ToUpper();
                        Console.WriteLine(commandOnTest.expectedAnswer.Length);
                    }
                    commandOnTest.evaluation = commandOnTest.expectedAnswer.Replace(" ", "").Equals(ans);
                }
                catch
                {
                    commandOnTest.evaluation = false;
                }

                if (!String.IsNullOrWhiteSpace(commandOnTest.expectedAnswer))
                {
                    total_evaluation &= commandOnTest.evaluation;
                }

                _test.Add(commandOnTest);

                this.Dispatcher.Invoke((Action)(() =>
                {
                    if (total_evaluation)
                    {
                        this.partial_result.Background = Brushes.Green;
                    }
                    else
                    {
                        this.partial_result.Background = Brushes.Red;
                    }
                }));
            }

            scriptRunning = false;
            htmlTextOutput.Add("<br><br><h3>Análise automática dos resultados:</h3>");
            htmlTextOutput.Add("<table  class=\"table table-striped\">");
            htmlTextOutput.Add("<tr>");
            htmlTextOutput.Add($"<th>ID</th>");
            htmlTextOutput.Add($"<th>Resultado</th>");
            htmlTextOutput.Add("</tr>");
            int id = 0;

            foreach (utils.test_results r in _test)
            {
                string eval = "";
                if (r.expectedAnswer == "")
                {
                    eval = "Análise manual";
                }
                else
                {
                    eval = r.evaluation ? "Aprovado" : "Reprovado";
                }

                htmlTextOutput.Add("<tr>");
                htmlTextOutput.Add($"<td>{id}</td>");
                htmlTextOutput.Add($"<td>{eval}</td>");
                htmlTextOutput.Add("</tr>");
                id++;
            }
            htmlTextOutput.Add("</table>");
            this.screenText.Dispatcher.Invoke((Action)(() => updateScreenButtons(state.connected)));
        }