// Monitor de Temperatura utilizando interface GUI do Scilab
// Comunicação através de porta serial
// Referência: http://www.openeering.com/

clear
clc

// Dados de Simulação
// Parâmetros de Comunicação
global param
param =[];
param.com_port = 4; // Porta de comunicação
param.baud = 9600; // Baud Rate ()
param.parity = 'n'; // Paridade (n, o, e, m, s)
param.data_bits = 8; // Bits de dados (5 a 8)
param.stop_bits = 1; // Bits de Parada (1 ou 2)
param.conectado = %f;

// Variáveis de tempo
sim = [];
sim.Tbegin = 0; // Tempo Inicial
sim.Tend = 120; // Tempo Final
sim.Tstep = 1; // Tempo de Passo

// Parâmetros Globais Gráficos
global margin_x margin_y;
global frame_w frame_h plot_w plot_h;

// Paramêtros de Inicialização Gráfica
frame_w = 300; frame_h = 550; // Largura e Altura do Quadro
plot_w = 600; plot_h = frame_h; // Largura e Altura do Gráfico
margin_x = 15; margin_y = 15; // Elementos Verticais e Horizontais de Margem
defaultfont = "arial"; // Fonte Padrão
axes_w = 3*margin_x + frame_w + plot_w; // Largura dos eixos
axes_h = 2*margin_y + frame_h; // Altura dos eixos (100 => Altura da barra de ferramentas)
due_temp = scf(100001); // Cria a janela com id=100001 e a torna a principal

// Fundo e Texto
due_temp.background = -2;
due_temp.figure_position = [100 100];
due_temp.figure_name = gettext("SCILAB Daga");

// Mudar as dimenções da Figura
due_temp.axes_size = [axes_w axes_h];

// Remoção do menu e barra de ferramentas
delmenu(due_temp.figure_id,gettext("&File"));
delmenu(due_temp.figure_id,gettext("&Tools"));
delmenu(due_temp.figure_id,gettext("&Edit"));
delmenu(due_temp.figure_id,gettext("&?"));
toolbar(due_temp.figure_id,"off");

// Novo Menu
h1 = uimenu("parent",due_temp, "label",gettext("Arquivo"));
h2 = uimenu("parent",due_temp, "label",gettext("COM Port"));
h3 = uimenu("parent",due_temp, "label",gettext("Sobre"));

// Preencher o menu: Aqrquivo
uimenu("parent",h1, "label",gettext("Conectar"),"callback","param.conectado = %t;conectar()");
uimenu("parent",h1, "label",gettext("Desconectar"),"callback","param.conectado = %f;desconectar()","callback_type",10);
uimenu("parent",h1, "label",gettext("Fechar"),"callback","due_temp=get_figure_handle(100001);delete(due_temp);","tag","close_menu");

// Preencher o menu: Com Port
h20 = uimenu("parent",h2, "label",gettext("Configuração da COM Port"));
uimenu("parent",h20, "label", gettext("COM 01"),"callback","param.com_port = 1");
uimenu("parent",h20, "label", gettext("COM 02"),"callback","param.com_port = 2");
uimenu("parent",h20, "label", gettext("COM 03"),"callback","param.com_port = 3");
uimenu("parent",h20, "label", gettext("COM 04"),"checked","on","callback","param.com_port = 4");
uimenu("parent",h20, "label", gettext("COM 05"),"callback","param.com_port = 5");
uimenu("parent",h20, "label", gettext("COM 06"),"callback","param.com_port = 6");
h21 = uimenu("parent",h2, "label",gettext("BaudRate"));
uimenu("parent",h21, "label",gettext("9600"),"checked","on","callback","param.baud = 9600");
uimenu("parent",h21, "label",gettext("19200"),"callback","param.baud = 19200");
uimenu("parent",h21, "label",gettext("38400"),"callback","param.baud = 38400");
uimenu("parent",h21, "label",gettext("57600"),"callback","param.baud = 57600");
uimenu("parent",h21, "label",gettext("74880"),"callback","param.baud = 74880");
uimenu("parent",h21, "label",gettext("115200"),"callback","param.baud = 115200");
h22 = uimenu("parent",h2, "label",gettext("Paridade"));
uimenu("parent",h22, "label",gettext("n"),"checked","on","callback","param.parity = ascii(110)");
uimenu("parent",h22, "label",gettext("o"),"callback","param.parity = ascii(111)");
uimenu("parent",h22, "label",gettext("e"),"callback","param.parity = ascii(101)");
uimenu("parent",h22, "label",gettext("m"),"callback","param.parity = ascii(109)");
uimenu("parent",h22, "label",gettext("s"),"callback","param.parity = ascii(115)");
h23 = uimenu("parent",h2, "label",gettext("Bits de Dados"));
uimenu("parent",h23, "label",gettext("5"),"callback","param.data_bits = 5");
uimenu("parent",h23, "label",gettext("6"),"callback","param.data_bits = 6");
uimenu("parent",h23, "label",gettext("7"),"callback","param.data_bits = 7");
uimenu("parent",h23, "label",gettext("8"),"checked","on","callback","param.data_bits = 8");
h24 = uimenu("parent",h2, "label",gettext("Bits de Parada"));
uimenu("parent",h24, "label",gettext("1"),"checked","on","checked","on","callback","param.stop_bits = 1");
uimenu("parent",h24, "label",gettext("2"),"checked","off","callback","param.stop_bits = 2");

// Preencher o menu: Sobre
uimenu("parent",h3, "label",gettext("Sobre"),"callback","due_temp_About()");

xinfo("Parabéns, você está utilizando um programa desenvolvido por Alisson Luan Daga!");

// Sleep to guarantee a better display (avoiding to see a sequential display)
sleep(500);

function due_temp_About()
    msg = msprintf(gettext("Monitor de porta Serial\nAutor: Eng. Alisso Daga"));
    messagebox(msg, gettext("Sobre"), "info", "modal");
endfunction

// Criação de quadro [Parâmetros da COM Port]
my_frame = uicontrol("parent",due_temp, "relief","groove","style","frame", "units","pixels", ...
"position",[margin_x 405 frame_w 160],"horizontalalignment","center", "background",[1 1 1], ...
"tag","frame_control");

// Título do Quadro
my_frame_title = uicontrol("parent",due_temp, "style","text","string","Configuração COM Port", "units","pixels", ...
"position",[30+margin_x margin_y+frame_h-10 frame_w-60 20],"fontname",defaultfont, "fontunits","points", ...
"fontsize",16, "horizontalalignment","center","background",[1 1 1], "tag","title_frame_control");

// Adicionando parâmetros da comunicação
guih1 = frame_w;
guih1o = 240;

// Lista de rótulos
global labels1
labels1 = ["COM Port:", "Baud Rate:", "Start Bits:", "Stop Bits:"];

// Posição dos rótulos
function atualiza_com()
    global labels1
    values1 = [param.com_port, param.baud, param.data_bits, param.stop_bits];
    guih1 = frame_w;
    guih1o = 240;
    for k=1:size(labels1,2)
    guientry1(k) = uicontrol("parent",due_temp, "style","edit","string",string(values1(k)),...
    "position",[l3,guih1-k*20+guih1o,180,20],"horizontalalignment","left", "fontsize",14, ...
    "background",[.9 .9 .9], "tag",labels1(k));
end   
endfunction

l1 = 40; l2 = 100; l3 = 110;
for k=1:size(labels1,2)
    uicontrol("parent",due_temp, "style","text","string",labels1(k), "position",...
    [l1,guih1-k*20+guih1o,l2,20],"horizontalalignment","left", "fontsize",14,"background",[1 1 1]);
end

// Adicionando botão
combutton = uicontrol(due_temp, "style","pushbutton","Position",[110 420 100 20], "String","Atualizar", ...
"BackgroundColor",[.9 .9 .9], "fontsize",14,"Callback","atualiza_com");

function desconectar()
    global %serial_port
    closeserial(%serial_port);
endfunction

function conectar()
    global param
    disp(param.conectado);
    global %serial_port
    global data
    if (param.conectado) then
        if (getos() == "Windows") then
            if ~(atomsIsInstalled('serial')) then
                msg=_("ERRO: É necessário instalar a toolbox de comunicação serial.");
                messagebox(msg, "Error", "error");
                error(msg);
                return;
            end            
        end
        if param.com_port == 0 then
            msg=_("ERRO: Nenhuma porta serial foi selecionada. ");
            messagebox(msg, "ERROR", "error");
            error(msg);
            return;
        end
        param_com = [string(param.baud)+','+param.parity+','+string(param.data_bits)+','+string(param.stop_bits)];
        %serial_port=openserial(param.com_port,param_com);
        disp(%serial_port);
        // Tratamento dos valores recebidos na porta serial
        values=[ascii(0)];
        data = [ascii(0)];
        value=ascii(0);
        while param.conectado
            if (readserial(%serial_port,1)) == ascii(36) then
                while(value~=ascii(42))
                    value=readserial(%serial_port,1);
                    values=values+value;
                end
                disp(values);
                data = strsplit(values,',');
                values=[ascii(0)];
                value=ascii(0);
            end
            //Aqui vai o programa que será executado no loop
            
            
            
        end
    end
endfunction
