Código para o menu no LCD

Dependencies:   mbed SDFileSystemSD TextLCD

Fork of TextLCD_HelloWorld2 by Wim Huiskamp

classes.h

Committer:
claraluques
Date:
2018-05-23
Revision:
32:c293f89170b0
Parent:
31:77eb51d4ee18
Child:
33:0149960e95c1

File content as of revision 32:c293f89170b0:

#define tx PC_10
#define rx PC_11

Serial Mach(tx, rx);
Timer t;

string file_name;
vector <string> filenames;

class Machine { 
    int n;
    string buffer;
    char buffer_char[2];
    
    public:
        int debug;
    
        // PUBLIC FUNCTIONS ----------------------------------------------------------------------------------------------------------------------------------------
        void move_to(float x, float y, float z, string type, int speed){
            
        }
        
        void move(int x_axis, int y_axis, int z_axis, float pct_speed){
            buffer = "";
        
            buffer.append("f");
            
            //buffer.append("X");
            n = sprintf(buffer_char, "%d", x_axis);
            buffer.append(buffer_char);
            
            //buffer.append("Y");
            n = sprintf(buffer_char, "%d", y_axis);
            buffer.append(buffer_char);
            
            //buffer.append("Z");
            n = sprintf(buffer_char, "%d", z_axis);
            buffer.append(buffer_char);
            
            buffer.append("F");
            n = sprintf(buffer_char, "%.2f", pct_speed);
            buffer.append(buffer_char);
            
            send(buffer);
        } 
        
        void save_point(int mode, float pct_speed){
            buffer = "";
            
            buffer.append("s");
            
            n = sprintf(buffer_char, "M%d", mode);
            buffer.append(buffer_char);
            
            n = sprintf(buffer_char, "F%.2f", pct_speed);
            buffer.append(buffer_char);
            
            send(buffer);
        }
        
        void start_program(void){
            send("b");  
            printf("b\n\r");  
        }
        
        void cancel_program(void){
            send("c");    
        }
        
        void get_status(void){
            send("s");
        }
        
        void machine_zero(void){
            send("zm");
        }
        
        void set_zero(string axis){
            buffer = "";            
            buffer.append("z");
            buffer+=axis;
            send(buffer);    
        }
        
        void jog(void){
            send("j");
            printf("j\n\r"); 
        }
        
        void kill_jog(void){
            send("jk");
            printf("jk\n\r"); 
        }
        
        void reset (void){
            send("r");
        }
        
        void upload_gcode(string gcode){
            buffer = "";
            buffer.append("u");
            buffer.append(gcode);
            
            send(buffer);
        }
        
        void get_saved_points(void){
            send("l");    
        }
        
        private:
            
            // PRIVATE FUNCTIONS ----------------------------------------------------------------------------------------------------------------------------------------
            void send(string msg){
                msg.append("x");
                
                for(int i = 0; i < msg.length(); i++){
                    Mach.putc(msg[i]);
                    wait_ms(20);   
                }
            }       
};


Machine machine;

SDFileSystem sd(PB_15, PB_14, PB_13, PB_1, "sd"); //MOSI - D4, MISO - D5, SCLK - D3, CS - D7
DIR *dp;

string folderString = "Programas";

class SDCard{
    public:        
        int save_GCODE(string name, string gcode){
            string file_path = "/sd/" + folderString + "/" + name; 
            char * path = str_to_char(file_path);
            
            printf(path);
            
            printf("going...\n\r");
            
            FILE *fp = fopen(path, "w");
            
            if(fp == NULL) {
                error("Could not open file for write\n\r");
                return 0;
            }
            
            char * write_file = str_to_char(gcode);
            
            fprintf(fp, write_file);
            fclose(fp);
            
            printf("Cool\n\r");
            
            return 1;
        }
        
        int send_gcode(string name){
            string file_path = "/sd/" + folderString + "/" + name; 
            char * path = str_to_char(file_path);
            unsigned char c;
            string buffer;
            
            printf(path);
            
            printf("going...\n\r");
            
            FILE *fp = fopen(path, "r");
            
            if(fp == NULL) {
                error("Could not open file for write\n\r");
                return 0;
            }  
            
            t.start();
            
            while(1){
                if(t.read() > 4.0){
                    fclose(fp);
                    return 0;    
                }
                c = fgetc(fp);
                printf("%c\n\r", c);
                buffer.push_back(c);
                
                if(c == ';'){
                    fclose(fp);
                    break;    
                }
            }
            fclose(fp);
            
            printf("%s\n\r", buffer);
            
            machine.upload_gcode(buffer);
            return 1;
        }
        
        int check_name_available(string name){
            string file_path = "/sd/" + folderString;
            char * dir = str_to_char(file_path);
            struct dirent *dirp;
            string filename;
            
            printf(dir);
            
            dp = opendir(dir);
        
            t.start();
            
            while((dirp = readdir(dp)) != NULL) {
                if(t.read() > 2.0){
                    t.stop();
                    closedir(dp);
                    return 0;    
                }
                filename = (dirp->d_name);
                printf("%s\n\r", filename);
                if(filename == name){
                    closedir(dp);
                    return 0;  
                }                  
            } 
            closedir(dp);
            return 1; 
        }
        
        int get_file_names(void){
            string file_path = "/sd/" + folderString;
            char * dir = str_to_char(file_path);
            struct dirent *dirp;
            string filename;
            
            filenames.empty();
            
            printf(dir);
            
            dp = opendir(dir);
        
            while((dirp = readdir(dp)) != NULL) {
                filename = (dirp->d_name);
                printf("%s\n\r", filename);
                filenames.push_back(filename);                 
            } 
            return 1; 
        }
        
        int create_folders(void){
            int gotFolder = 0;
            string filename;
            struct dirent *dirp;
            
            dp = opendir("/sd");
            
            t.start();
        
            while((dirp = readdir(dp)) != NULL) {
                if(t.read() > 2){
                    t.stop();
                    return 0;    
                }
                filename = (dirp->d_name);
                printf("%s\n\r", filename);
                if(filename == folderString){
                    gotFolder = 1;
                }   
            }
            
            if(!gotFolder){
                char * path = str_to_char(("/sd/" + folderString));
                mkdir(path, 0777);
            }
            
            closedir(dp);
            return 1;
        }    
        
        private:
            char * str_to_char(string str){
                char * path = new char[str.length() + 1];
                std::strcpy(path, str.c_str());
                return path;
            } 
};

SDCard sdcard;

//criar classe "menu" (funções para as telas)
class Menu{
    
    public:
    int linha;
    int func;
    string nome;
   
    
    void movercursor(int min, int max, int col){ //função para mover cursor de seleção
        linha = min;
        lcd.locate(col,min);
        lcd.printf("%c", 0x3E);
        while (bot_enter==penter){
            if (bot_cima==0){
                if (linha==min){
                    lcd.locate(col,min);
                    lcd.printf(" ");
                    linha=max;
                    lcd.locate(col, linha);
                    lcd.printf("%c", 0x3E);
                    } 
                else {
                    lcd.locate(col,linha);
                    lcd.printf(" ");
                    linha--;
                    lcd.locate(col, linha);
                    lcd.printf("%c", 0x3E);
                    }  
                bot_cima = 1;
                }
            else if (bot_baixo==0){
                if (linha==max){
                    lcd.locate(col,max);
                    lcd.printf(" ");
                    linha=min;
                    lcd.locate(col, linha);
                    lcd.printf("%c", 0x3E);
                    }
                else {
                    lcd.locate(col,linha);
                    lcd.printf(" ");
                    linha++;
                    lcd.locate(col, linha);
                    lcd.printf("%c", 0x3E);
                    }
                bot_baixo = 1;
                }
            //função para printar as coordenadas nas telas 2 e 8
            /*else if (func==2 || func==8){
                //x
                if (cx<=-1 && cx>=-9){                    
                    lcd.locate(2,1);
                    lcd.printf("  %.2f ", cx);
                    }
                if (cx<=-10 && cx>=-99){
                    lcd.locate(2,1);
                    lcd.printf(" %.2f ", cx);
                    }
                if (cx<=-100){
                    lcd.locate(2,1);
                    lcd.printf("%.2f ", cx);
                    }                        
                if (cx<=9 && cx>=0){                    
                    lcd.locate(2,1);
                    lcd.printf("   %.2f ", cx);
                    }
                if (cx>=10 && cx<=99){
                    lcd.locate(2,1);
                    lcd.printf("  %.2f ", cx);
                    }
                if (cx>=100){
                    lcd.locate(2,1);
                    lcd.printf(" %.2f ", cx);
                    }
                //y
                if (cy<=-1 && cy>=-9){                    
                    lcd.locate(2,2);
                    lcd.printf("  %.2f ", cy);
                    }
                if (cy<=-10 && cx>=-99){
                    lcd.locate(2,2);
                    lcd.printf(" %.2f ", cy);
                    }
                if (cy<=-100){
                    lcd.locate(2,2);
                    lcd.printf("%.2f ", cy);
                    } 
                if (cy<=9 && cy>=0){                    
                    lcd.locate(2,2);
                    lcd.printf("   %.2f ", cy);
                    }
                if (cy>=10 && cx<=99){
                    lcd.locate(2,2);
                    lcd.printf("  %.2f ", cy);
                    }
                if (cy>=100){
                    lcd.locate(2,2);
                    lcd.printf(" %.2f ", cy);
                    }
                //z
                if (cz<=-1 && cz>=-9){                    
                    lcd.locate(2,3);
                    lcd.printf("  %.2f ", cz);
                    }
                if (cz<=-10 && cx>=-99){
                    lcd.locate(2,3);
                    lcd.printf(" %.2f ", cz);
                    }
                if (cz<=-100){
                    lcd.locate(2,3);
                    lcd.printf("%.2f ", cz);
                    }
                if (cz<=9 && cz>=0){                    
                    lcd.locate(2,3);
                    lcd.printf("   %.2f ", cz);
                    }
                if (cz>=10 && cx<=99){
                    lcd.locate(2,3);
                    lcd.printf("  %.2f ", cz);
                    }
                if (cz>=100){
                    lcd.locate(2,3);
                    lcd.printf(" %.2f ", cz);
                    }
                } //até aqui, para alinhar os números
            if (Mach.readable()){
                readSerial();
                }*/
            }          
            
        }
        
    /*void inicializar(){
        while (1){
            printf("%d,%d\n\r", bot_enter, penter); 
            wait(0.5);
            }
        }*/
                       
    //func 0
    void inicializar(){ //função tela incial de boas-vindas
        int status;
        
        printf("Starting...\n\r");
        
        machine.reset();
        lcd.cls();
        lcd.locate(4,0);
        lcd.printf("Bem-vindo(a)");
        lcd.locate(0,1);
        lcd.printf("Utilize seu EPI para operar a maquina.");
        wait(1);
        
        /*status = sdcard.get_file_names();
        if(status){
            printf("Filenames: \n\r");
            for(int i = 0; i < filenames.size(); i++){
                 printf("%s\n\r", filenames[i]);
            }    
        }*/
        func = 1;
        }
    
    //func 1    
    void menuprincipal(){ //função menu principal
        bot_enter = penter;
        lcd.cls();
        lcd.locate(1,0);
        lcd.printf("Modo JOG");
        lcd.locate(1,1);
        lcd.printf("Modo Automatico");
        lcd.locate(1,2);
        lcd.printf("Zerar");
        lcd.locate(1,3);
        lcd.printf("Config");
        movercursor(0,3,0);
        if (bot_enter!=penter){
            if (linha==0){
                func = 2;
                }
            else if (linha==1) {
                func = 3;
                }
            else if (linha==2) {
                func = 8;
                }
            else if (linha==3) {
                func = 4;
                }
            }
        } 
        
    //func 2    
    void jog(){ //função tela jog
        lcd.cls();
        bot_enter = penter;
        machine.kill_jog();
        wait(0.1);
        machine.jog();
        lcd.locate(4,0);
        lcd.printf("Coordenadas:");
        lcd.locate(0,1);
        lcd.printf("X:");
        lcd.locate(0,2);
        lcd.printf("Y:");
        lcd.locate(0,3);
        lcd.printf("Z:");
        lcd.locate(11,1);
        lcd.printf("Salvar");
        lcd.locate(11,2);
        lcd.printf("Concluir");
        lcd.locate(11,3);
        lcd.printf("Cancelar");        
        movercursor(1,3,10);       
        if (bot_enter!=penter){
            if (linha==1){                
                /*if (pontos==0 && maxpontos>=1){
                    cx_salva = 0;
                    cy_salva = 0;
                    cz_salva = 0;
                    pontos++;
                    maxpontos--;
                    func = 5;
                    }
                else if (pontos>=1 && maxpontos>=1){
                    cx_salva = cx;
                    cy_salva = cy;
                    cz_salva = cz;
                    */pontos++;
                    maxpontos--;
                    func = 5;/*
                    }
                else if (maxpontos==0){
                    func = 16;
                    }*/
                }
            else if (linha==2) {
                machine.kill_jog();
                func = 17;
                }
            else if (linha==3) {
                machine.kill_jog();
                wait(0.1);
                machine.cancel_program();
                func = 1;
                pontos = 10;
                }
            }    
        }
        
    //func 3
    void automatico(){ //tela modo automatico
        lcd.cls();
        bot_enter = penter;
        lcd.printf("Modo automatico");
        lcd.locate(7,2);
        lcd.printf("OK");
        lcd.locate(7,3);
        lcd.printf("Voltar");
        movercursor(2,3,6);
        if (bot_enter!=penter) {
            if (linha==2){
                func = 12;
                }
            else if (linha==3){
                func = 1;
                }
            }
        }
    
    //func 4
    void config() {
        lcd.cls();
        bot_enter = penter;
        //printf("%d,tela\n\r", penter);
        lcd.locate(1,0);
        lcd.printf("Definir velocidade");
        lcd.locate(1,1);
        lcd.printf("Limpar seringa cola");
        lcd.locate(1,2);
        lcd.printf("Origem maquina");
        lcd.locate(1,3);
        lcd.printf("Voltar");
        movercursor(0,3,0);
        if (bot_enter!=penter){
            if (linha==0) {
                func = 13;
                }
            else if (linha==1) {
                func = 14;
                }
            else if (linha==2) {
                home = 1;
                func = 18;
                }
            else if (linha==3) {
                func = 1;
                }
            }        
        }
        
    //func 5
    void telasalvamento(){ //função para quando salvar um ponto
        lcd.cls();
        lcd.locate(0,0);
        lcd.printf("Voce salvou");
        lcd.locate(1,1);
        lcd.printf("X:%.2f  ", cx_salva);
        lcd.locate(1,2);
        lcd.printf("Y:%.2f  ", cy_salva);
        lcd.locate(1,3);
        lcd.printf("Z:%.2f  ", cz_salva);
        lcd.locate(13,1);
        lcd.printf("Pontos");
        lcd.locate(13,2);
        lcd.printf("livres");
        lcd.locate(16,3);
        lcd.printf("%d", maxpontos);
        wait(1);
        if (pontos>0){
            func = 6;
            }
        else if (pontos==0){
            func = 2;
            }
        }
        
    //func 6
    void telacola(){ //tela para escolher o tipo de sequencia da cola
        lcd.cls();
        bot_enter = penter;
        lcd.printf("P/ o proximo ponto:");
        lcd.locate(3,1);
        lcd.printf("Sem cola");
        lcd.locate(3,2);
        lcd.printf("Cola no ponto");
        lcd.locate(3,3);
        lcd.printf("Cola continua");
        movercursor(1,3,2);
        if (bot_enter!=penter){
            if (linha==1){
                cola = 0;
                func = 2;
                }
            else if (linha==2) {
                cola = 1;
                func = 2;
                }
            else if (linha==3) {
                cola = 2;
                func = 2;
                }
            machine.save_point(cola,2);
            }
        }
    
    //func 7        
    void executarprograma() { //tela para selecionar se deseja executar o programa
        lcd.cls();
        bot_enter = penter;
        lcd.locate(2,0);
        lcd.printf("VOCE CONCLUIU SEU");
        lcd.locate(5,1);
        lcd.printf("PROGRAMA.");
        lcd.locate(0,2);
        lcd.printf("Deseja");
        lcd.locate(0,3);
        lcd.printf("executa-lo?");
        lcd.locate(14,2);
        lcd.printf("Sim");
        lcd.locate(14,3);
        lcd.printf("Voltar");
        movercursor(2,3,13);
        if (bot_enter!=penter) {
            if (linha==2){
                machine.kill_jog();
                wait(0.1);
                //machine.start_program();
                exec = 1;
                func = 9;
                }
            else if (linha==3){
                exec = 0;
                func = 2;
                }
            }
        }
    
    //func 8
    void telazerar(){ //tela para zerar a máquina
        lcd.cls();
        bot_enter = penter;
        machine.kill_jog();
        machine.jog();
        lcd.locate(2,0);
        lcd.printf("Zerar:");
        lcd.locate(0,1);
        lcd.printf("X:");
        lcd.locate(0,2);
        lcd.printf("Y:");
        lcd.locate(0,3);
        lcd.printf("Z:");
        lcd.locate(13,0);
        lcd.printf("X");
        lcd.locate(13,1);
        lcd.printf("Y");
        lcd.locate(13,2);
        lcd.printf("Z");  
        lcd.locate(13,3);
        lcd.printf("Voltar");          
        movercursor(0,3,12);
        if (bot_enter!=penter) {
            if (linha==0){
                cx = 0;
                func = 10;
                machine.set_zero("X");
                }
            else if (linha==1){
                cy = 0;
                func = 10;
                machine.set_zero("Y");
                }
            else if (linha==2){
                cz = 0;
                func = 10;
                machine.set_zero("Z");
                }
            else if (linha==3){
                func = 1;
                machine.kill_jog();
                }
            }
        }
        
    //func 9
    void executando(){ //tela de executando
        lcd.cls();
        machine.start_program();
        lcd.locate(4,1);
        lcd.printf("Executando");
        while (exec == 1){
            if (Mach.readable()){
                readSerial();
                }/*
            lcd.locate(14,1);
            lcd.printf(".  ");
            wait(0.5);
            lcd.locate(14,1);
            lcd.printf(".. ");
            wait(0.5);
            lcd.locate(14,1);
            lcd.printf("...");
            wait(0.5);
            lcd.locate(14,1);
            lcd.printf("   ");
            wait(0.5);*/
            }
        printf("saiu\n\r");
        func = 11;
        }
    
    //func 10
    void zerado() { //tela avisando que a máquina foi zerada
        lcd.cls();
        lcd.locate(5,1);
        lcd.printf("Voce zerou");
        lcd.locate(6,2);
        lcd.printf("o eixo!");
        wait(1);
        func = 8;
        }
        
    //func 11
    void finalizado() { //tela aviso programa finalizado
        lcd.cls();
        lcd.locate(6,1);
        lcd.printf("PROGRAMA");
        lcd.locate(5,2);
        lcd.printf("FINALIZADO");
        wait(1);
        func = 1;
        }     
        
    //func 12
    
    //func 13
    
    //func 14
    
    //func 15
    void gohome(){
        lcd.cls();
        machine.machine_zero();
        while (home == 1){
            if (Mach.readable()){
                readSerial();
                }
            }
        func = 19;
        }
    
    //func 16
    void limitepontos(){ //tela para quando acabam os pontos
        lcd.cls();
        lcd.printf(" Voce atingiu o n%c   maximo de pontos", 0xDF);
        lcd.locate(9,2);
        lcd.printf("(%d)", pontos);
        lcd.locate(0,3);
        lcd.printf("Conclua seu programa");
        wait(1);
        func = 2;
        }   
    
    //func 17
    void salvarprog(){
        lcd.cls();
        bot_enter = penter;
        lcd.printf("Voce deseja salvar  este programa?");
        lcd.locate(5,2);
        lcd.printf("Sim");
        lcd.locate(5,3);
        lcd.printf("Nao");
        movercursor(2,3,4);
        if (bot_enter!=penter){
            if (linha==2){
                salvar = 1;
                //printf("salvar\n\r");
                func = 20;
                }
            if (linha==3){
                salvar = 0;
                func = 7;
                }
            }
        }
    
    //func 18
    void ctzhome(){
        lcd.cls();
        bot_enter = penter;
        lcd.printf("Certifique-se de que a maquina pode se");
        lcd.locate(5,2);
        lcd.printf("movimentar");
        lcd.locate(9,3);
        lcd.printf("OK");
        movercursor(3,3,8);
        if (bot_enter!=penter){
            if (linha==3){
                func = 15;
                }
            }
        }
        
    //func 19
    void origem(){
        lcd.cls();
        lcd.locate(5,1);
        lcd.printf("A MAQUINA");
        lcd.locate(2,2);
        lcd.printf("ESTA NA ORIGEM");
        wait(1);
        func = 4;
        }
        
    //func 20
    void nomeprog(){
        nome = "";
        sair = 0;
        lcd.cls();        
        bot_enter = penter;
        escrever();
        if (sair==1){
            printf("hey\n\r");
            nome.append(".txt");
            printf("%s\n\r", nome);
            int verificar = sdcard.check_name_available(nome);
            printf("%d", verificar);
            if (verificar==1){
                file_name = nome;
                machine.get_saved_points();
                printf("ok\n\r");
                func = 1;
                }
            else if (verificar==0){
                func = 21;
                printf("nok\n\r");
                }
            }
        }
        
    //func 21
    void mudar_nome(){
        lcd.cls();
        wait(1);
        func = 20;
        }
        
    //função para escrever nome arquivo
    void escrever(){
        char alfabeto[38] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
        '0','1','2','3','4','5','6','7','8','9','-','_'};
        int imax = 37;
        int imin = 0;
        lcd.locate(1,1); 
        while (sair==0){
            int i = 0;
            lcd.locate(1,1);
            lcd.printf("%s", nome);
            while (bot_enter==penter){
                if (bot_cima == 0){
                    if (i==imin){
                        i = imax;
                        }
                    else if (i>imin && i<=imax){
                            i--;
                        }
                    bot_cima = 1;
                    }
                else if (bot_baixo == 0){
                    if (i==imax){
                        i = imin;
                        }
                    else if (i<imax && i>=imin){
                        i++;
                        }
                    bot_baixo = 1;
                    }  
                lcd.locate(coluna, 1);
                lcd.printf("%c", alfabeto[i]);
                }
            if (coluna<=18){
                if (coluna<18){
                    coluna++;
                    }
                char carac = alfabeto[i];
                nome.push_back(carac);
                printf("%s\n\r", nome);
                bot_enter = penter;
                }
            }
        }
        
    //função para ler os pontos
    void readSerial(){
        char recv;
        int points = 0;
        int pointx = 0;
        int pointy = 0;
        int pointz = 0;
        int action = 0;
        int uploading_saved = 0;
        string coordx = "";
        string coordy = "";
        string coordz = "";
        string recv_buffer;
    
     
        while(1){
            recv = Mach.getc();
            printf("%c\n\r", recv);
            if (recv == 'a'){
                home = 0;
                exec = 0;
                printf("oi\n\r");
                action = 1;
                }
            if (recv == 'p'){
                points = 1;
                }
            if(recv == 'u'){
                uploading_saved = 1;    
            }
            if (points){                
                if (recv == 'X'){
                    pointx = 1;
                    pointy = 0;
                    pointz = 0;
                    }
                else if (recv == 'Y'){
                    pointy = 1;
                    pointx = 0;
                    pointz = 0;
                    }
                else if (recv == 'Z'){
                    pointz = 1;
                    pointx = 0;
                    pointy = 0;
                    }
                else if (recv == 'x'){
                    cx = atof(coordx.c_str());
                    cy = atof(coordy.c_str());
                    cz = atof(coordz.c_str());
                    printf("%s,%s,%s\n\r", coordx, coordy, coordz);
                    break;
                    }
                }
            if (pointx){
                if (recv!='X'){
                    coordx.push_back(recv);
                    }
                }
            if (pointy){
                if (recv!='Y'){
                    coordy.push_back(recv);
                    }
                }
            if (pointz){
                if (recv!='Z'){
                    coordz.push_back(recv);
                    }
                }
            if (action){
                if (recv=='x'){
                     break;
                    }
                } 
            if(recv == 'x' && uploading_saved){
                sdcard.save_GCODE(file_name, recv_buffer);
                break;
            } else if(uploading_saved && recv != 'u'){
                recv_buffer.push_back(recv);
            }
        }
    }
    
    
                    
    Menu(); //não apagar
};