Final code for Klaus, the glue applying machine.

Dependencies:   mbed TextLCD

main.cpp

Committer:
julianonn
Date:
2019-06-14
Revision:
3:f183d2ffae11
Parent:
2:ad0b044d0a10

File content as of revision 3:f183d2ffae11:

#include "mbed.h"
#include "TextLCD.h"
#include "string"

//-----------Botões Anna----------
// ------------------------Portas X ----------------------------
DigitalOut dirX(PC_10);
DigitalOut stepX(PC_12);
DigitalOut enableX(PA_14);


// ------------------------Portas Y ----------------------------
DigitalOut dirY(A1);
DigitalOut stepY(A0);
DigitalOut enableY(PC_3);

// ------------------------Portas Z ----------------------------
DigitalOut dirZ(PB_7);
DigitalOut stepZ(PC_13);
DigitalOut enableZ(A2);

// ------------------------Portas IHM --------------------------
/*DigitalIn mais(A5);
DigitalIn menos(A4);
InterruptIn X(PA_13);
InterruptIn Z(PA_15);*/
/*InterruptIn enter(D9);
InterruptIn X(D10);
InterruptIn Y(D11);
InterruptIn Z(D12);
DigitalIn mais(D13);
DigitalIn menos(D14);*/
InterruptIn enter(A4);
InterruptIn X(PC_2); 
InterruptIn Y(D11);
InterruptIn Z(D12);

InterruptIn cancelar(PC_4);

DigitalIn mais(D13);
DigitalIn menos(A3);

DigitalOut LedX(PC_0);
DigitalOut LedY(PC_11);
DigitalOut LedZ(PC_5);

DigitalOut Valvula_embolo(PC_8);
DigitalOut Valvula_ponta(PC_6);

DigitalIn fdcx2(PB_1);
DigitalIn fdcx1(PB_2);
DigitalIn fdcy2(PB_11);
DigitalIn fdcy1(PB_15);
DigitalIn fdcz2(PB_12);
DigitalIn fdcz1(PB_14); 

InterruptIn Emergencia(D15);
DigitalIn Emerg(D15);


//Varíaveis auxiliares
int ponto = 0;

int continuax = 0;
int continuay = 0;
int continuaz = 0;
bool seguranca = 1;
bool printou = 0;
bool check_cancela = 1;
int iteracoes = 1;

#define velocidade_jog 20
#define velocidade_padrao 20
#define velocidade_lenta 100
#define velocidade_mais_lenta 300
#define velocidade_rapida 10

int velocidade = velocidade_padrao;
float tempo_acionado;
//--------------------------------

//------Varíaveis Juliano---------
InterruptIn button_UP(D13);//A5);
InterruptIn button_DOWN(A3);//A4);
/*InterruptIn enter(USER_BUTTON);*/

TextLCD lcd(D2, D3, D4, D5, D6, D7, TextLCD::LCD20x4); // rs, e, d4-d7

//Listas Programa e posicao atual do bico
int posicao[3] = {0,0,0};
double passo = 0.0015625;
float passox = 0.0009375f;
float Px;
int trajetoriax[100] = {0,0,0};
int trajetoriay[100] = {0,0,0};
int trajetoriaz[100] = {0,0,0};
int Pcola[100] = {0,1,2,2,1,2,2,2,1,1};
int Pcola_quant[100] = {0,1,2,2,2,2,1,2,2,1};

int tam_pontos = 2;

//Variaveis auxiliares
int fim = 3;
int i = 0;
int aux = 0;
int escolha = 0;

//Listas de menus e variaveis relacionadas aos menus
char* tela_Inicial[6] = {"------Klaus-------","Programa","Referenciar","Teste Vazao"};
char* tela_Programar[5] = {"Voltar","Iniciar Programa","Editar Programa","Novo Programa"};
char* tela_Informacoes[10] = {"Voltar","KLAUS","Desenvolvedores:","Giovana Lemes","Andre Annunziato","Anna","Ana Henrique","Arthur Rizzo","Juliano Nassar"};
char* tela_Editar[4] = {"Voltar","Redefinir","Cola:","Quant:"};
char* tela_Cola_Quant[3] = {"Padrao","Pouco","Muita"};
char* tela_Cola[3] = {"Nao","Ponto","trajeto"};
int tam_Editar = 4;
int tam_Inicial = 4;
int tam_Programar = 4;
int tam_Informacoes = 9;
int tam_Cola= 3;
int tam_Cola_Quant = 3;
int tam;
int select = 0;
int select1 = 0;
//Posicao do cursor
int cursor_row = 0;
int cursor_column = 0;

//Flags para rodar funcoes
bool flagMenu = 1;
bool flagSelect = 0;
bool referencia = 0;


// ------------------------ Movimentação -----------------------------
void atualiza_posicao(int eixo, bool dir) {  // eixo: X=0 Y=1 Z=2
    if(dir == 1){
        posicao[eixo] = posicao[eixo]+ 1;
    }
    else{
        posicao[eixo] = posicao[eixo]- 1;
    }
}
void movimentax(bool enable,bool dir,int velocidade){
        if(posicao[0]<0 && dir == 0 && referencia ==0 || fdcx1 == 1 && dir ==0 && referencia == 0 || fdcx2 == 1 && dir ==1){
            enableX = 1;
            }
        else{
            enableX=enable;
            dirX = dir;
            stepX = !stepX;
            atualiza_posicao(0,dir);
            wait_us(velocidade);
            stepX = !stepX;
            wait_us(velocidade);
        }
}

void movimentay(bool enable,bool dir,int velocidade){
        if(posicao[1]<0 && dir == 0 && referencia ==0 || fdcy1 == 1 && dir ==0 && referencia == 0 || fdcy2 == 1 && dir ==1){
            enableY = 1;
            }
        else{
            enableY=enable;
            dirY = dir;
            stepY = !stepY;
            atualiza_posicao(1,dir);
            wait_us(velocidade);
            stepY = !stepY;
            wait_us(velocidade);
        }
}

void movimentaz(bool enable,bool dir,int velocidade){
        if(posicao[2]>0 && dir == 1 && referencia ==0 || fdcz1 == 1 && dir ==1 && referencia == 0  || fdcz2 == 1 && dir ==0){
            enableZ = 1;
            }
        else{
            enableZ=enable;
            dirZ = dir;
            stepZ = !stepZ;
            atualiza_posicao(2,dir);
            wait_us(velocidade);
            stepZ = !stepZ;
            wait_us(velocidade);
        }
    
}
//------------------------Válvula----------------------------------

void aciona_valvula(){
        Valvula_embolo = 1;
        Valvula_ponta = 0;
    }
    
void desliga_valvula(){
        Valvula_embolo = 0;
        Valvula_ponta = 1;
    }

void aciona_eixos()
{
    X.enable_irq();
    Y.enable_irq();
    Z.enable_irq();
    
}

void desliga_eixos()
{
    X.disable_irq();
    Y.disable_irq();
    Z.disable_irq();
}
//--------------------------------
void pressionado(){
        if (printou == 0){
                desliga_valvula();
                enableX = 1;
                enableY = 1;
                enableZ = 1;
                lcd.cls();
                lcd.locate(5,0);
                lcd.printf("EMERGENCIA\n MAQUINA DESLIGADA");
                LedX = 0;
                LedY = 0;
                LedZ = 0;
                desliga_eixos();
                printou = 1;
            }
    }
    
// ------------------- Referenciamento ------------------------------
void posicao_ref(int eixo){
    posicao[eixo]= 0;
}

void referenciamentox(){
    if(seguranca){
        while(fdcx1 == 0 && check_cancela){
            if (seguranca){
            movimentax(0,0,velocidade_rapida);      // 1 = pra esquerda, pra porta
            }
            else{
                break;
                }   
        }
        if(seguranca){wait(0.1);}
        int i = 0;
        while (i<10000 && check_cancela){
            if (seguranca){
            movimentax(0,1,velocidade_padrao);
            i=i+1;
            }
            else{
                break;
                }   
            }
        if(seguranca){wait(0.1);}
        while (fdcx1 == 0 && check_cancela){
            if (seguranca){
            movimentax(0,0,velocidade_lenta);
            }
            else{
                break;
                }   
            }
        if(seguranca){wait(0.1);}
        i = 0;
        while (i < 5000 && check_cancela){
            if (seguranca){
            movimentax(0,1,velocidade_lenta);
            i=i+1;
            }
            else{
                break;
                }   
            }
        if(seguranca){wait(0.1);}
        while (fdcx1 == 0 && check_cancela){
            if (seguranca){
            movimentax(0,0,velocidade_mais_lenta);
            }
            else{
                break;
                }   
            }
        if(seguranca){
            wait(0.1);
            enableX = 1;
            posicao_ref(0);
            }
        else{
            pressionado();
            }
        }
    else{
        pressionado();
        }
    
}


void referenciamentoy(){
    while(fdcy1 == 0 && check_cancela){
        if (seguranca){
        movimentay(0,0,velocidade_rapida);          // 1 = pra direita -> mais pra perto de nós  // aplicar seguranca x
        }
        else{
            pressionado();
            break;
            }   
    }
    if(seguranca){wait(0.1);}
    int i = 0;
    while (i<10000 && check_cancela){
        if (seguranca){
        movimentay(0,1,velocidade_padrao);
        i=i+1;
        }
        else{
            pressionado();
            break;
            }   
        }
    if(seguranca){wait(0.1);}
    while (fdcy1 == 0 && check_cancela){
        if (seguranca){
        movimentay(0,0,velocidade_lenta);
        }
        else{
            pressionado();
            break;
            }   
        }
    if(seguranca){wait(0.1);}
    i = 0;
    while (i < 5000 && check_cancela){
        if (seguranca){
        movimentay(0,1,velocidade_lenta);
        i=i+1;
        }
        else{
            pressionado();
            break;
            }   
        }
    if(seguranca){wait(0.1);}
    while (fdcy1 == 0 && check_cancela){
        if (seguranca){
        movimentay(0,0,velocidade_mais_lenta);
        }
        else{
            pressionado();
            break;
            }   
        }
    if(seguranca){wait(0.1);}
    enableY = 1;
    posicao_ref(1);
    
}


void referenciamentoz(){
    while(fdcz1 == 0 && check_cancela){
        if (seguranca){
            movimentaz(0,1,velocidade_padrao);   
        } 
        else{
            pressionado();
            break;
            }      
    }
    if(seguranca){wait(0.1);}
    int i = 0;
    while (i<10000 && check_cancela){
        if (seguranca){
            movimentaz(0,0,velocidade_padrao);
            i=i+1;
        }
        else{
            pressionado();
            break;
            }    
        }
    if(seguranca){wait(0.1);}
    while (fdcz1 == 0 && check_cancela){
        if (seguranca){
        movimentaz(0,1,velocidade_lenta);
        }
        else{
            pressionado();
            break;
            }    
        }
    if(seguranca){wait(0.1);}
    i = 0;
    while (i < 5000 && check_cancela){
        if (seguranca){
        movimentaz(0,0,velocidade_lenta);
        i=i+1;
        }
        else{
            pressionado();
            break;
            } 
        }
    if(seguranca){wait(0.1);}
    while (fdcz1 == 0 && check_cancela){
        if (seguranca){
        movimentaz(0,1,velocidade_mais_lenta);
        }
        else{
            pressionado();
            break;
            } 
        }
    wait(0.1);
    enableZ = 1;
    posicao_ref(2);
    //lcd.cls();
    
}

void referenciamento(){
    referencia = 1;
    referenciamentox();
    referenciamentoy();
    referenciamentoz();
    referencia = 0;
    }

//------------------------------------------------------------
void cancela()
{
    check_cancela = 0;
    desliga_eixos();
    LedX = 0;
    LedY= 0;
    LedZ= 0;
}

void disable_buttons()
{
    button_UP.disable_irq();
    button_DOWN.disable_irq();
    enter.disable_irq();
}
    
void enable_buttons()
{
    button_UP.enable_irq();
    button_DOWN.enable_irq();
    enter.enable_irq();
    
}

//Cursor para cima e atualiza o Menu
void change_menu_UP(void)
{
    flagMenu = !flagMenu;
    cursor_row-=1;
}
    
//Cursor para baixo e atualiza o Menu    
void change_menu_DOWN(void)
{
    flagMenu = !flagMenu;
    cursor_row+=1;
}

//Seleciona o menu
void select_menu(void)
{  
    flagMenu = !flagMenu;
    flagSelect = !flagSelect;
}  
    
void define_fim(int limite)
{
    lcd.cls();
    if(select == 0 && select1 ==0)
    {
     if (cursor_row >= 3)
        {
            fim = cursor_row;
            i = cursor_row - 3;
        }
     if (cursor_row <1)
        {
            fim = tam-1;
            cursor_row = tam-1;
            i = cursor_row - 3;
        }  
     if (cursor_row >= tam)
        {
            cursor_row = 1;
            fim = 3;
            i = 0;
        }
     if (tam < 4)
        {
            fim = tam-1;
            i= 0;
        }
    }
    else
    {
        if (cursor_row >= 3)
        {
            fim = cursor_row;
            i = cursor_row - 3;
        } 
        if (cursor_row <limite)
        {
            fim = limite + tam-1;
            cursor_row = limite + tam-1;
            i = cursor_row - 3 - limite;
        }       
        if (cursor_row >= tam+limite)
        {
            cursor_row = limite;
            fim = 3-limite;
            i = 0;
            
        }
        if (tam < 4)
        {
            fim = tam-1;
            i= 0;
        }
        else
        {
            fim = 3;
            i = 0;
        }
    }
}

void posiciona_cursor(int column)
{
    if (cursor_row >3)
    {
     lcd.locate(column,3);   
    }
    else
    {
        lcd.locate(column,cursor_row);
    }
    lcd.printf(">");
    aux = 0;
    i = 0;
    wait(0.15);
}

//Mostra o menu inicial
void Menu_Inicial()
{ 
    tam = tam_Inicial;  
    define_fim(0);
    while(i<=fim)
    {
        lcd.locate(1,aux);
        lcd.printf(tela_Inicial[i]);
        i+=1;
        aux+=1;
    }  
    posiciona_cursor(0);
}    

//Mostra o menu progamar
void Menu_Programar()
{ 
    tam = tam_Programar;  
    define_fim(0);
    while(i<=fim)
    {
        lcd.locate(1,aux);
        lcd.printf(tela_Programar[i]);
        i+=1;
        aux+=1;
    }  
    posiciona_cursor(0);
} 

void edit_ponto()
{
    select1 = -1;
    cursor_row = 0;
    int dir = 0;
    int save_pos = 0;
    while(check_cancela)
    {   
        if(seguranca)
        {
            if(flagMenu)
            {
            lcd.cls();
            disable_buttons();
            
            if(flagSelect)
            {
                select1 = cursor_row;
                flagSelect = !flagSelect;
            }
            
            if (select1 == 0)
            {
                flagMenu = 0;
                break;    
            }
            
            switch(select1)
            {
                    
                case 1:
                wait(0.2);
                flagSelect = 0;
                flagMenu = 1;
                enable_buttons();
                
                    while(check_cancela)
                    {
                        if(seguranca)
                        {
                            if(flagMenu)
                            {
                                disable_buttons();
                                if (flagSelect)
                                {
                                    select1 = -1;
                                    cursor_row = select - 3;
                                    flagSelect = !flagSelect;
                                    break;
                                }
                                
                                aciona_eixos();

                                if (mais==1)
                                {
                                    dir = 1;
                                }
                                else if (menos==1)
                                {
                                    dir = 0;
                                }
                                
                                if (mais ==1 || menos==1)
                                {
                                       if(seguranca){
                                        lcd.cls();
                                        lcd.locate(0,1);
                                        if(continuax && posicao[0]<=0 && dir == 0|| continuax && fdcx1 == 1 && dir ==0){
                                            lcd.printf("Final do curso x \n      disponivel");
                                        }
                                        else if (continuax){
                                            lcd.printf("Movimentando eixo x");
                                            }
                                        else if(continuay && posicao[1]<0 && dir == 0 || continuay && fdcy1 == 1 && dir ==0){
                                            lcd.printf("Final do curso y \n      disponivel");
                                            }
                                        else if(continuay){
                                            lcd.printf("Movimentando eixo y");
                                        }
                                        else if(continuaz && posicao[2]<0 && dir == 0 || continuaz && fdcz1 == 1 && dir ==0){
                                            lcd.printf("Final do curso z \n      disponivel");
                                            }
                                        else if (continuaz){
                                            lcd.printf("Movimentando eixo z");
                                        }
                                        else{
                                            lcd.locate(2,1);
                                            lcd.printf("Selecione um eixo");
                                            }
                                    }
                                    else{
                                        pressionado();
                                        }
                                }
                                
                                while(mais ==1 || menos==1 && check_cancela)
                                {   if(seguranca)
                                    {
                                        if(continuax)
                                        {
                                            movimentax(0,dir,velocidade_jog);
                                        }
                                        else if(continuay)
                                        {
                                            movimentay(0,dir,velocidade_jog);
                                        }
                                        else if(continuaz)
                                        {
                                            movimentaz(0,dir,velocidade_jog);
                                        }
                                    }
                                    else
                                    {
                                        pressionado();
                                        break;
                                    }
                                }
                                if(seguranca)
                                {
                                    lcd.cls();
                                    enableX = 1;
                                    enableY = 1;
                                    enableZ = 1;
                                    lcd.locate(0,0);
                                    lcd.printf("x:");
                                    lcd.locate(0,1);
                                    lcd.printf("%.2f",posicao[0]*passox);
                                    lcd.locate(7,0);
                                    lcd.printf("y:");
                                    lcd.locate(7,1);
                                    lcd.printf("%.2f",posicao[1]*passo);
                                    lcd.locate(14,0);
                                    lcd.printf("z:");
                                    lcd.locate(14,1);
                                    lcd.printf("%.2f",posicao[2]*passo);
                                    
                                    lcd.locate(0,3);
                                    lcd.printf(">Definir Ponto %d",select - 2);
                                }
                                else
                                {
                                    pressionado();
                                }
                                enable_buttons();
                                flagMenu = !flagMenu;
                            }
                        }
                        
                        else
                        {
                            save_pos = select;
                            while(!seguranca)
                            {
                            pressionado();
                            }
                            seguranca = 1;
                            select1 = -1;
                            select = save_pos;
                            cursor_row = 0;
                            flagMenu = 0;
                            printou = 0;
                            break;
                        }
                    } 
            LedX = 0;
            LedY = 0;
            LedZ= 0;           
            
            if(check_cancela)
            {
            trajetoriax[select-3] = posicao[0];
            trajetoriay[select-3] = posicao[1];
            trajetoriaz[select-3] = posicao[2];
            select1 = -1;
            cursor_row = select - 3;
            }
            LedX = 0;
            LedY = 0;
            LedZ = 0;
            check_cancela = 1;
            break;
            case 2:
            Pcola[select-3] += 1;
            if (Pcola[select-3]>2)
            {
            Pcola[select-3] = 0;    
            }
            if (Pcola[select-3]>1 && select-3 ==0)
            {
            Pcola[select-3] = 0;    
            }
            break;  
            case 3:
            Pcola_quant[select-3] += 1;
            if (Pcola_quant[select-3]>2)
            {
            Pcola_quant[select-3] = 0;
            }
            break;      
            }
            select1 = -1;
            
            switch(Pcola[select-3])
            {
            case 0:
            tela_Editar[2] = "Cola:nao";
            break;
            case 1:
            tela_Editar[2] ="Cola:ponto";
            break;
            case 2:
            tela_Editar[2] ="Cola:traj";
            break;
            }
            switch(Pcola_quant[select-3])
            {
            case 0:
            tela_Editar[3] ="Qtd:Padr";
            break;
            case 1:
            tela_Editar[3] ="Qtd:pouco";
            break;
            case 2:
            tela_Editar[3] ="Qtd:muito";
            break;
            } 
            //--------------
            tam = tam_Editar;
            if(Pcola[select-3] == 0)
            {
            tam -=1;   
            }
            define_fim(0);
            
            lcd.locate(12,0);
            lcd.printf("PONTO %d",select-2);
            lcd.locate(12,1);
            lcd.printf("x:%3.2f",trajetoriax[select-3]*passo);
            lcd.locate(12,2);
            lcd.printf("y:%3.2f",trajetoriay[select-3]*passo);
            lcd.locate(12,3);
            lcd.printf("z:%3.2f",trajetoriaz[select-3]*passo);
            
            while(i<=fim)
            {
                lcd.locate(1,aux);
                lcd.printf(tela_Editar[i]);
                i+=1;
                aux+=1;
            }  
            posiciona_cursor(0);
            LedX = 0;
            LedY = 0;
            LedZ= 0;
            flagMenu = !flagMenu;
            enable_buttons();
            }
            //--------------   
        }
        else{
            pressionado();
            break;
            }
    }
    select1 = 0;
    flagMenu = 0;
    check_cancela = 1;
}

//Mostra Menu Editar
void Programar_editar()
{
    bool k = 0;
    lcd.cls();
    cursor_row=1;
    flagMenu = 1;
    enable_buttons();
    select = -1;
    while(check_cancela)
    {
        if(seguranca){
    
            if(flagMenu)
            {
                disable_buttons();
                
                if (flagSelect)
                {
                    select = cursor_row;
                    flagSelect = !flagSelect;
    //--------define_fim personalizado------------
                    switch(select)
                    {   case 0:
                        select = 1;
                        select1 = 0;
                        escolha = -1;
                        cursor_row = 1;
                        flagMenu = 0;
                        k = 1;
                        break;
                        case 1:
                        if (tam_pontos >0)
                        {
                            tam_pontos -= 1;
                            flagMenu = 0;
                        }
                        break;
                        case 2:
                        select1 = -1;
                        trajetoriax[tam_pontos] = posicao[0];
                        trajetoriay[tam_pontos] = posicao[1];
                        trajetoriaz[tam_pontos] = posicao[2];
                        Pcola[tam_pontos] = 0;
                        Pcola_quant[tam_pontos] = 0;
                        
                        tam_pontos += 1;
                        select = tam_pontos+2;
                        
                        edit_ponto();
                        
                        cursor_row = 2;
                        select = -1;
                        select1 = -1;
                        break; 
                    }
                }
                if(k)
                {
                break;    
                }
                tam = tam_pontos+2;
                lcd.cls();
                if (select >2)
                {
                    select1 = -1;
                    
                    edit_ponto();
                    
                    cursor_row = select;
                    select = -1;
                    select1 = -1;
                    
                }
                else
                {
                    
                    if (cursor_row <3)
                    {
                        fim = 3;
                        i = 0;
                    } 
                    
                    if (cursor_row >= 3)
                    {
                        fim = cursor_row;
                        i = cursor_row - 3;
                    } 
                    if (cursor_row <0)
                    {
                        fim = tam;
                        cursor_row = tam;
                        i = cursor_row - 3;
                    }       
                    if (cursor_row >= tam+1)
                    {
                        cursor_row = 0;
                        fim = 3;
                        i = 0;
                    }
                    if (tam ==2)
                    {
                        fim = 2;
                        i= 0;
                    }
                     
        //-------------------------
                    while(i<=fim && check_cancela )
                    {
                        switch(i)
                        {
                             case 0:
                             lcd.locate(1,aux);
                             lcd.printf("Voltar");
                             break;
                             case 1:
                             lcd.locate(1,aux);
                             lcd.printf("exc P%d",tam_pontos);
                             break;
                             case 2:
                             lcd.locate(1,aux);
                             lcd.printf("Def P%d",tam_pontos+1);
                             break;
                        }
                        if (i>2)
                        {
                            lcd.locate(1,aux);
                            lcd.printf("P%i",i-2);
                            switch(Pcola[i-3])
                            {
                            case 1:
                            lcd.printf(".");
                            break;
                            case 2:
                            lcd.printf("-");
                            
                            break;
                            }
                            if (Pcola[i-3]!= 0)
                            {
                            switch(Pcola_quant[i-3])
                            {
                            case 0:
                            lcd.printf("Padrao");
                            break;
                            case 1:
                            lcd.printf("pouco");
                            break;
                            case 2:
                            lcd.printf("muita");
                            break;
                            }    
                            }
                        }
                        
                        i+=1;
                        aux+=1;
                    }
                    
                }
                flagMenu = !flagMenu;
                
                lcd.locate(12,0);
                lcd.printf("Pos At");
                lcd.locate(12,1);
                lcd.printf("x:%.2f",posicao[0]*passo);
                lcd.locate(12,2);
                lcd.printf("y:%.2f",posicao[1]*passo);
                lcd.locate(12,3);
                lcd.printf("z:%.2f",posicao[2]*passo);
                posiciona_cursor(0);
                enable_buttons();
            }
        }
        else{
            pressionado();
            break;
            }
    }
    
    select = 1;
    select1 = 0;
    escolha = -1;
    cursor_row = 1;
    flagMenu = 0;
    check_cancela = 1;
} 


// ------------------------- Rodando Programa ---------------------------------------

void rodar_programa(){
    int ponto_rodando = 0;
    //int cola_inicial = 0
    while(ponto_rodando <= tam_pontos-1 && check_cancela){
         velocidade = velocidade_padrao;
         if(seguranca){
            if(Pcola[ponto_rodando] == 2){
                if(Pcola_quant[ponto_rodando] == 1){
                    velocidade = velocidade_rapida;
                    }
                if(Pcola_quant[ponto_rodando] == 2){
                    velocidade = velocidade_lenta;
                    }
                aciona_valvula();
                }
            if(posicao[2] < trajetoriaz[ponto_rodando]) {
                while(posicao[2] != trajetoriaz[ponto_rodando] && check_cancela){
                    if(seguranca){
                        movimentaz(0,1, velocidade);
                    }
                    else{
                        pressionado();
                        break;
                        }
                }
            }
            enableZ=1;
                while(posicao[0] != trajetoriax[ponto_rodando] && check_cancela){
                    if(seguranca){
                        if(posicao[0]< trajetoriax[ponto_rodando]){
                            movimentax(0,1, velocidade_jog);
                            } 
                        if(posicao[0]> trajetoriax[ponto_rodando]){
                            movimentax(0,0, velocidade);
                            } 
                    }
                    else{
                        pressionado();
                        break;
                        }
                }
                
                enableX= 1;
                while(posicao[1] != trajetoriay[ponto_rodando] && check_cancela){
                    if(seguranca){
                        if(posicao[1]< trajetoriay[ponto_rodando]){
                            movimentay(0,1, velocidade);
                            } 
                        if(posicao[1]> trajetoriay[ponto_rodando]){
                            movimentay(0,0, velocidade);
                            } 
                    }
                    else{
                        pressionado();
                        break;
                        }
                }
                enableY=1;
                if(posicao[2] > trajetoriaz[ponto_rodando]) {
                    while(posicao[2] != trajetoriaz[ponto_rodando] && check_cancela){
                        if(seguranca){
                        movimentaz(0,0, velocidade); 
                        }
                        else{
                        pressionado();
                        break;
                        }
                    }
                }
                enableZ=1;
                
            
            if(seguranca){
                wait(1);
            }
            if(Pcola[ponto_rodando] == 1){
                aciona_valvula();
                if(Pcola_quant[ponto_rodando] == 0){
                    tempo_acionado =0.3;
                    }
                else if (Pcola_quant[ponto_rodando] == 1){
                    tempo_acionado =0.5;
                    }
                else{
                    tempo_acionado =0.1;
                    }
                wait(tempo_acionado);
                desliga_valvula();
                }
            if(Pcola[ponto_rodando] == 2){
                desliga_valvula();
                }
            ponto_rodando++;
            }
        else{
            pressionado();
            break;
            }
        
    }
}
void sim_nao(char* titulo)
{
    if (flagMenu)
        {
        lcd.cls();
        disable_buttons();
        if (cursor_row<2)
        {
            cursor_row= 3;     
        }
        if (cursor_row>3)
        {
            cursor_row = 2;
        }
        lcd.locate(0,0);
        lcd.printf(titulo);
        lcd.locate(1,2);
        lcd.printf("sim");
        lcd.locate(1,3);
        lcd.printf("nao");
        posiciona_cursor(0);
        if (flagSelect)
        {
            escolha = cursor_row-1;
            flagSelect = !flagSelect;
        }
            
        flagMenu = !flagMenu;
            
        enable_buttons();
        }
    
    
}

void Referenciar()
{
    lcd.cls();
    select = 0;
    select1 = 0;
    escolha = 0;
    cursor_row =2;
    flagMenu = 1;
    flagSelect = 0;
    
    enable_buttons();
    while(check_cancela)
    {  
        if(seguranca){
            printou = 0;
            sim_nao("Deseja Referenciar?");
            
            if (escolha ==1)
            {
                disable_buttons();
                lcd.cls();
                lcd.locate(0,1);
                lcd.printf("  REFERENCIANDO...");
                referenciamento();
                escolha = 0;
                cursor_row =1;
                enable_buttons();
                flagMenu = 1; 
                break;
            }
            
            if (escolha ==2)
            {
                lcd.cls();
                escolha = 0;
                cursor_row =1;
                select = 0;
                select1 = 0;
                flagMenu=1;
                break;      
            }
        }
        else{
            pressionado();
            }
    
    }
    
    if(!check_cancela)
    {
        lcd.cls();
        lcd.locate(1,1);
        lcd.printf("operacao cancelada");
        wait(1.2);
    }
    escolha = 0;
    cursor_row =1;
    select = 0;
    select1 = 0;
    flagMenu=1;
    check_cancela =1;
    
}
void teste_vazao(){
    if(seguranca){
        while(posicao[0] > 0 && check_cancela){
            if (seguranca){
            movimentax(0,0,velocidade_padrao);      // 1 = pra esquerda, pra porta
            }
            else{
                pressionado();
                break;
                }   
        }
        while(posicao[1] > 0 && check_cancela){
            if (seguranca){
            movimentay(0,0,velocidade_padrao);      // 1 = pra esquerda, pra porta
            }
            else{
                pressionado();
                break;
                }   
        }
        while(posicao[2] > 0 && check_cancela){
            if (seguranca){
            movimentaz(0,1,velocidade_padrao);      // 1 = pra esquerda, pra porta
            }
            else{
                pressionado();
                break;
                }   
        }
        if(seguranca){aciona_valvula();}
        if(seguranca){wait(1);}
        if(seguranca){desliga_valvula();}
    }
    else{
        pressionado();
        }
    }

void Vazao()
{
    lcd.cls();
    select = 0;
    select1 = 0;
    escolha = 0;
    cursor_row =2;
    flagMenu = 1;
    flagSelect = 0;
    
    enable_buttons();
    while(check_cancela)
    {  
        if(seguranca){
            printou = 0;
            sim_nao("Deseja testar vazao?");
            
            if (escolha ==1)
            {
                disable_buttons();
                lcd.cls();
                lcd.locate(0,1);
                lcd.printf("  TESTANDO...");
                teste_vazao();
                escolha = 0;
                cursor_row =1;
                enable_buttons();
                flagMenu = 0; 
                break;
            }
            
            if (escolha ==2)
            {
                lcd.cls();
                escolha = 0;
                cursor_row =1;
                select = 0;
                select1 = 0;
                flagMenu=0;
                break;      
            }
        }
        else{
            pressionado();
            }
    
    }
    
    if(!check_cancela)
    {
        lcd.cls();
        lcd.locate(1,1);
        lcd.printf("operacao cancelada");
        wait(1.2);
    }
    
    lcd.cls();
    escolha = 0;
    cursor_row =1;
    select = 0;
    select1 = 0;
    flagMenu=0;
    check_cancela = 1;
}


void eixox(){
    continuax = 1;
    continuay = 0;
    continuaz = 0;
    LedX = 1;
    LedY = 0;
    LedZ = 0;
}
void eixoy(){
    continuax = 0;
    continuay = 1;
    continuaz = 0;
    LedX = 0;
    LedY = 1;
    LedZ = 0;
}
    
void eixoz(){
    continuax = 0;
    continuay = 0;
    continuaz = 1;
    
    LedX = 0;
    LedY = 0;
    LedZ = 1;
}

 
void programar()
{
    
    tam_pontos = 0;
    escolha = 0;
    select = 0;
    select1 = 0;
    lcd.cls();
    flagMenu = 1;
    flagSelect = 0;
    cursor_row = 0;
    int dir = 0;
    bool k = 0;
    enable_buttons();
    while(check_cancela)
    {
        if(seguranca){
            if(flagMenu)
            {
                disable_buttons();
                if(flagSelect)
                {
                    wait(0.2);
                    select +=1;
                    select1 = cursor_row;
                    escolha = cursor_row-1;
                    flagSelect = !flagSelect;
                    cursor_row = 1;
                }
                
                switch(select)
                {
                    case 0:
                    
                    aciona_eixos();
                    if (mais==1)
                     {
                        dir = 1;
                    }
                    else if (menos==1)
                    {
                        dir = 0;
                    }
                    
                    if (mais ==1 || menos==1)
                    {   if(seguranca){
                            lcd.cls();
                            lcd.locate(0,1);
                            if(continuax && posicao[0]<=0 && dir == 0|| continuax && fdcx1 == 1 && dir ==0|| continuax && fdcx2 == 1 && dir ==1){
                                lcd.printf("Final do curso x \n      disponivel");
                            }
                            else if (continuax){
                                lcd.printf("Movimentando eixo x");
                                }
                            else if(continuay && posicao[1]<0 && dir == 0 || continuay && fdcy1 == 1 && dir ==0 || continuay && fdcy2 == 1 && dir ==1){
                                lcd.printf("Final do curso y \n      disponivel");
                                }
                            else if(continuay){
                                lcd.printf("Movimentando eixo y");
                            }
                            else if(continuaz && posicao[2]>0 && dir == 1 || continuaz && fdcz1 == 1 && dir ==1 || continuaz && fdcz2 == 1 && dir ==0){
                                lcd.printf("Final do curso z \n      disponivel");
                                }
                            else if (continuaz){
                                lcd.printf("Movimentando eixo z");
                            }
                            else{
                                lcd.locate(2,1);
                                lcd.printf("Selecione um eixo");
                                }
                        }
                        else{
                            pressionado();
                            }
                    }
                    
                    while(mais ==1 || menos==1 && check_cancela)
                    {   if(seguranca){
                            if(continuax){
                                movimentax(0,dir,velocidade_jog);
                                }
                            else if(continuay){
                                movimentay(0,dir,velocidade_jog);
                                }
                            else if(continuaz){
                                movimentaz(0,dir,velocidade_jog);
                            }
                        }
                        else{
                            pressionado();
                            break;
                            }
                    }
                    if(seguranca){
                        lcd.cls();
                        enableX = 1;
                        enableY = 1;
                        enableZ = 1;
                        lcd.locate(0,0);
                        lcd.printf("x:");
                        lcd.locate(0,1);
                        Px = posicao[0]*passox;
                        lcd.printf("%.1f",Px);
                        lcd.locate(7,0);
                        lcd.printf("y:");
                        lcd.locate(7,1);
                        lcd.printf("%.1f",posicao[1]*passo);
                        lcd.locate(14,0);
                        lcd.printf("z:");
                        lcd.locate(14,1);
                        lcd.printf("%.1f",posicao[2]*passo);
                        
                        lcd.locate(0,3);
                        lcd.printf(">Definir Ponto %d",tam_pontos+1);
                    }
                    else{
                        pressionado();
                        }
                    break;
                    case 1:
                    LedX = 0;
                    LedY= 0;
                    LedZ= 0;
                    desliga_eixos();
                    lcd.cls();
                    sim_nao("Definir essas\ncoordenadas?");
                    flagMenu=1;
                    break;
                    case 2:
                    if (escolha == 2){
                        select -=2;
                        flagMenu = 0;
                        break;
                        }
                    lcd.cls();
                    trajetoriax[tam_pontos] = posicao[0];
                    trajetoriay[tam_pontos] = posicao[1];
                    trajetoriaz[tam_pontos] = posicao[2];
                    if (tam_pontos == 0)
                    {
                    sim_nao("Depositar cola no   ponto");
                    lcd.locate(5,1);
                    lcd.printf(" %d?",tam_pontos + 1);
                    flagMenu = 1;
                    }
                    else
                    {
                        tam = tam_Cola;  
                        define_fim(1);
                        aux = 1;
                        lcd.locate(0,0);
                        lcd.printf("Depositar cola?");
                        while(i<=fim && check_cancela)
                        {
                            if(i<2)
                            {
                            lcd.locate(1,aux);
                            lcd.printf(tela_Cola[i]);
                            lcd.printf("(P%d)",tam_pontos+1);
                            i+=1;
                            aux+=1;
                            }
                            else
                            {
                            lcd.locate(1,aux);
                            lcd.printf(tela_Cola[i]);
                            lcd.printf("(P%d-",tam_pontos);
                            lcd.printf("P%d)",tam_pontos+1);
                            i+=1;
                            aux+=1;
                            }
                        }  
                    posiciona_cursor(0);
                    }
                    break;
                    case 3:
                    lcd.cls();
                    if (escolha ==2 && tam_pontos==0)
                    {
                        Pcola[tam_pontos] = 0;
                    }
                    else if (select1 >1)
                    {
                    escolha = 1;
                    }
                    else
                    {
                        escolha = 0;    
                    }
                    
                    if (escolha ==1 && select>1)
                    {   
                        
                        Pcola[tam_pontos] = select1 - 1;
                        tam = tam_Cola_Quant;  
                        define_fim(1);
                        aux = 1;
                        lcd.locate(0,0);
                        lcd.printf("Quantidade de cola?");
                        while(i<=fim && check_cancela)
                        {
                            lcd.locate(1,aux);
                            lcd.printf(tela_Cola_Quant[i]);
                            i+=1;
                            aux+=1;
                        }  
                    posiciona_cursor(0);
                    }
                    else
                    {
                        Pcola[tam_pontos] = 0;    
                        Pcola_quant[tam_pontos] = 0;
                        flagMenu = 0;
                        select+=1;
                    }
                    
                    
                    break;
                    case 4:
                    lcd.cls();
                    Pcola_quant[tam_pontos] = select1 - 1;
                    sim_nao("Deseja definir mais um ponto?");
                    flagMenu = 1;
                    break;
                    case 5:
                    tam_pontos +=1;
                    lcd.cls();
                    if (escolha ==1)
                    {
                        select = 0;
                        select1 = -1;
                    }
                    else
                    {
                        select = 0;
                        select1= 0;
                        lcd.cls();
                        lcd.locate(3,1);
                        lcd.printf("Programa Salvo");
                        wait(2);
                        k = 1;
                    }
                    flagMenu = 0;
                    break;
                }
                enable_buttons();
                if (k)
                {
                    break;    
                }
            flagMenu= !flagMenu;
            }
        }
        else{
            pressionado();
            break;
            }
    }
}
 
void novo_programa()
{
    
    escolha = 0;
    check_cancela = 1;
    lcd.cls();
    lcd.locate(1,0);
    lcd.printf("Este processo ira");
    lcd.locate(5,1);
    lcd.printf("deletar");
    lcd.locate(1,2);
    lcd.printf("o antigo programa");
    wait(3);
    lcd.cls();
    
    while(check_cancela)
    {   if(seguranca){
            
            sim_nao("Criar novo programa?");
            if (escolha ==1)
            {
                lcd.cls();
                programar();
                select = 1;
                select1 = 0;
                cursor_row = 1;
                flagMenu = 0;
                break;
            }
            if (escolha == 2)
            {
                select = 1;
                select1 = 0;
                cursor_row = 1;
                flagMenu = 0;
                break;
            }
        }
        else{
            pressionado();
            break;
            }
        
    }
    
    if (!check_cancela)
    {
        lcd.cls();
        lcd.locate(1,1);
        lcd.printf("Operacao cancelada");
        wait(1.2);
    }
    select = 1;
    select1 = 0;
    cursor_row = 1;
    flagMenu = 0;
    check_cancela = 1;
} 


void desliga(){
    seguranca=0;
    }
void liga(){
    seguranca=1;
    flagMenu=1;
    select = 0;
    select1 = 0;
    cursor_row = 1;
    }

int main() {
    enableX = 1;
    enableY= 1;
    enableZ= 1;
    
    Valvula_embolo = 0;
    Valvula_ponta = 1;
    
    Emergencia.fall(&desliga);
    Emergencia.rise(&liga);
    
    X.rise(&eixox);
    Y.rise(&eixoy);
    Z.rise(&eixoz);
    cancelar.rise(&cancela);
    desliga_eixos();
    lcd.cls();
    
    button_UP.rise(&change_menu_UP);
    button_DOWN.rise(&change_menu_DOWN);
    enter.rise(&select_menu);
    if(Emerg){
        Referenciar();
    }
    else{
        while(Emerg==0){
            if (printou == 0){
                pressionado();
            }
        }
        Referenciar();
        }
       
    
    cursor_row = 1;
    
    while (true)
    {
        if (seguranca && Emerg){
                printou = 0;
                if(!check_cancela)
                    {
                        select = 0;
                        select1 = 0;
                        cursor_row = 1;
                        check_cancela = 1;
                        flagMenu = 1;
                    }
                if (flagMenu)
                {
                    
                    if (flagSelect)
                    {
                        check_cancela = 1;
                        if (select ==0)
                        {
                            select = cursor_row;
                            cursor_row = 0;
                        }
                        else if (cursor_row ==0)
                        {
                            select = 0;
                            select1 = 0;
                        }
                        else if(select !=0 && select1 ==0)
                        {
                            select1 = select;
                            select = cursor_row;
                        }
                        else
                        {
                            select1 = cursor_row;
                        }
                    cursor_row = 1;
                    flagSelect = !flagSelect;
                    
                    }
                    
                    disable_buttons();
                    switch(select1)
                    {
                     case 0:
                     switch(select)
                        {
                            case 0:
                            Menu_Inicial();
                            break;
                            case 1:
                            Menu_Programar();
                            break;
                            case 2:
                            Referenciar();
                            if(seguranca){
                                Menu_Inicial();
                            }
                            break;
                            case 3:
                            Vazao();
                            break;
                        };
                        break;
                        
                        case 1:
                        int iter = 21;
                        switch(select)
                            {
                            case 0:
                            Menu_Inicial();
                            break;
                            //Iniciar
                            case 1:
                            lcd.cls();
                            lcd.printf("Quantas iteracoes?");
                            lcd.locate(7,2);
                            lcd.printf("N = ");
                            cursor_row = 1;
                            flagMenu = 1;
                            flagSelect = 0;
                            
                            while(check_cancela)
                            {
                                if(seguranca)
                                {
                                    if(flagMenu)
                                    {            
                                        disable_buttons();
                                        if(cursor_row >= 21)
                                        {
                                            cursor_row = 1;
                                        }
                                        if(cursor_row <= 0)
                                        {
                                            cursor_row = 20;    
                                        }
                                        
                                        if(flagSelect)
                                        {
                                            iteracoes = iter - cursor_row;
                                            cursor_row = 1;
                                            flagSelect = !flagSelect;
                                            break;
                                        } 
                                        
                                        lcd.locate(12,2);
                                        lcd.printf(" ");
                                        lcd.locate(11,2);
                                        lcd.printf("%i", iter - cursor_row);
                                        flagMenu = !flagMenu;
                                        wait(0.2);
                                        enable_buttons();
                                    }
                                }
                                else
                                {
                                    break;
                                }
                                
                            }
                            
                            disable_buttons();
                            lcd.cls();
                            lcd.locate(2,1);
                            lcd.printf("Rodando codigo");
                            lcd.locate(2,2);
                            lcd.printf("iteracao:");
                            select = 0;
                            while(select < iteracoes && check_cancela)
                            {
                                if(seguranca){
                                lcd.locate(11,2);
                                lcd. printf("%d",select+1);
                                rodar_programa();
                                select++;
                                }
                                else{
                                    pressionado();
                                    break;
                                    }
                            }
                            
                            if (!check_cancela)
                            {
                                lcd.cls();
                                lcd.locate(1,1);
                                lcd.printf("Operacao cancelada");
                                wait(1.2);
                            }
                            if (!seguranca)
                            {
                            pressionado();
                            }
                            check_cancela = 1;
                            select1 = 0;
                            select = 0;
                            flagMenu = 1;
                            cursor_row =1;
                            select_menu();
                            break;
                            //Editar
                            case 2:
                            Programar_editar();
                            break;
                            //Novo Programa
                            case 3:
                            novo_programa();
                            check_cancela = 1;
                            break;
                        };
                        break;
                        
                    }
                        
                    enable_buttons();
                    
                    flagMenu = !flagMenu;
                    
                    }
            }
            else{
                pressionado();
                }
        }
}