Final code for Klaus, the glue applying machine.

Dependencies:   mbed TextLCD

Revision:
3:f183d2ffae11
Parent:
2:ad0b044d0a10
--- a/main.cpp	Sat Dec 04 11:31:07 2010 +0000
+++ b/main.cpp	Fri Jun 14 00:25:17 2019 +0000
@@ -1,10 +1,1930 @@
-// Hello World! for the TextLCD
-
 #include "mbed.h"
 #include "TextLCD.h"
+#include "string"
 
-TextLCD lcd(p15, p16, p17, p18, p19, p20); // rs, e, d4-d7
+//-----------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() {
-    lcd.printf("Hello World!\n");
+    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();
+                }
+        }
 }