Announcement

Collapse
No announcement yet.

Qwerty keyboard and save a file

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Qwerty keyboard and save a file

    Hi, i am doing a qwerty keyboard on screen using img_Touched() function. My idea is to write a note in the qwerty and then save it whit a name i can choose.But i am having a few problems. I have a function called get_qwerty() that read the key pressed and return the character pressed. This is the function:
    Code:
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Esta función lee la tecla pulsada del teclado qwerty y saca su valor de la tabla y lo devuelve. Si esta presionado   ////CAPS o ALT retorna el valor para el CAPS o ALT.                                                                      ////Versión 1.0       20/01/2011      Andrés Torti        Creación                                                       ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////#CONSTSYM 1000        //tecla "sym"ARRIBA 1001     //flechas arribaABAJO 1002      //flecha abajoIZQUIERDA 1003  //flecha izquierdaDERECHA 1004    //flecha derechaOK 1005         //tecla OKBACK 1006       //tecla volverBORRAR 1007     //tecla borrarCAPS_KEY 1008   //tecla caps presionadaALT_KEY 1009    //tecla alt presionadaENTER 1010      //tecla enterSCREEN 1011     //pantalla (si se toca la pantalla se carga un archivo)#END#DATA    word qwerty    "QWERTYUIOPASDFGHJKL",CAPS_KEY,"ZXCVBNM",ARRIBA,OK,BACK,",. ",IZQUIERDA,ABAJO,DERECHA,ALT_KEY,BORRAR,"[{"    word qwerty_m    "qwertyuiopasdfghjkl",CAPS_KEY,"zxcvbnm",ARRIBA,OK,BACK,",. ",IZQUIERDA,ABAJO,DERECHA,ALT_KEY,BORRAR,"[{"    word symbol    "0123<>-+=",'"',"/456^",SYM,"()|_789!?$%",ARRIBA,OK,BACK,";: ",IZQUIERDA,ABAJO,DERECHA,ALT_KEY,BORRAR,"]}"#ENDfunc get_qwerty ()var l;var private alt := 0;var private caps := 0;if(touch_Get(TOUCH_STATUS) == TOUCH_PRESSED)    l := img_Touched(img_qwerty,ALL);    x := touch_Get(TOUCH_GETX);    y := touch_Get(TOUCH_GETY);    wait_release();else    return -1;endifif(x>=33 &amp;&amp; x<=260 &amp;&amp; y>=0 &amp;&amp; y<=119)    return SCREEN;endifif(qwerty[l]==ALT_KEY)    if(alt==1)        alt := 0;        gfx_Button(NO_PRESS,288,0,GRAY,WHITE,FONT3,1,1,"$%");    else        alt := 1;        gfx_Button(PRESSED,288,0,GRAY,RED,FONT3,1,1,"$%");    endifendifif(qwerty[l]==CAPS_KEY)    if(caps==0)        caps := 1;        gfx_Button(PRESSED,288,32,GRAY,RED,FONT3,1,1,"Aa");    else        caps := 0;        gfx_Button(NO_PRESS,288,32,GRAY,WHITE,FONT3,1,1,"Aa");    endifendifif(caps==0 &amp;&amp; alt==0)    return qwerty_m[l];endifif(caps==1 &amp;&amp; alt==0)    return qwerty[l];endifif(alt==1)    return symbol[l];endifendfunc
    As you see it returns the character from an array. And this is the rest of the program which save what i have wrote in a file.
    Code:
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Despliega el teclado qwerty y una pantalla de escritura para escribir notas de un máximo de 500 caracteres           ////Si se presiona la tecla OK se guardará la nota en la tarjeta de memoria con el nombre de archivo que se pedira       ////Si hay otro archivo con el mismo nombre se preguntará si desea sobreescribirlo                                       ////Si se toca la pantalla donde se escribe se mostrará un nuevo menú para seleccionar un archivo .txt que se desee      ////cargar desde la tarjeta de memoria.                                                                                  ////Versión 1.0       07/02/2011      Andrés Torti        Creación                                                       ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////func notes()var count := 0;      //contador de caracteresvar cursor_x := 0;var cursor_y := 0;   //posicion inicial del cursorgfx_Cls();    gfx_Set(BEVEL_WIDTH, 4);    gfx_Set(SCREEN_MODE, LANDSCAPE);        //pantalla en posición LANDSCAPE    txt_Set(FONT_SIZE, FONT3);              //tamaño de letra 12x16    txt_Set(TEXT_OPACITY, OPAQUE);          //texto opaco    txt_FGcolour(WHITE);                    //texto color negro    img_Show(img_qwerty,ALL);               //muestro tecladogfx_Button(NO_PRESS,288,0,GRAY,WHITE,FONT3,1,1,"$%");    gfx_Button(NO_PRESS,288,32,GRAY,WHITE,FONT3,1,1,"Aa");file_save := mem_Alloc(200);    txt_MoveCursor(0,0);                    //cursor en posición inicialget_qwerty.alt := 0;    get_qwerty.caps := 0;    txt_Wrap(240);                          //el texto "baja" en el píxel 290    pokeW(TEXT_MARGIN,40);                  //el texto empieza en el pixel 40    putch('\r');                            //retorno de carro para empezar en el pixel 40repeat        j := get_qwerty();        if(j == BORRAR &amp;&amp; count > 0)            //si presioné borrar y no estoy en el límite de la matriz            if(cursor_x > 5)                    //y el cursor es mayor a 5, por lo menos 6                --cursor_x;                     //me muevo una posición hacia atras                txt_MoveCursor(cursor_y,cursor_x);            endif            putch(' ');                         //y borro            txt_MoveCursor(cursor_y,cursor_x);  //luego vuelvo al lugar donde estba            str_PutByte(--n,' ');               //y un lugar hacia atras en la matriz borro            --count;else if(j == BACK)            gfx_Set(SCREEN_MODE,PORTRAIT);            mem_Free(file_save);            return;else if(j == OK)            //si presioné OKsave:       k := get_file_name();   //tecleo el nombre del archivo                if(k == OK)                     //si escribí el nombre y presiono OK                    str_PutByte(++n,0);                    k := save_file();           //guardo el archivo                        if(k == 1)              //si el archivo se guardó bien continúo normalmente el programa                            img_Show(img_qwerty,ALL);                            putstr(file_save);                        else                    //sino vuelvo a pedir nombre del archivo                            str_PutByte(--n,' ');                            goto save;                        endif                else if(k == BACK)              //sino presioné back y muestro el qwerty de nuevo                    img_Show(img_qwerty,ALL);                    putstr(file_save);endifelse if(j == SCREEN)            k := load_file();            gfx_Cls();            img_Show(img_qwerty,ALL);            if(k != -1)                print("s: ");                putstr(file_save);            else                print("NO s ");            endifelse if((isprint(j) || isspace(j)) &amp;&amp; count < 199)   //si se presionó algun caracter y todavia hay espacio para escribir            putch(j);                           //imprimo el caracter            str_PutByte(n++,j);                 //lo coloco en la matriz, incremento el cursor, el puntero a la matriz y el contador            ++cursor_x;                         //de las letras            ++count;            if(cursor_x > 20)                cursor_x := 0; ++cursor_y; print("\n\r");            endifendifforeverendfunc///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Esta función se usa para guardar un nombre de archivo en la tarjeta de memoria.                                      ////Para salir se debe presionar OK o BACK y la funcion retorna un OK o BACK dependiendo de la tecla.                    ////Versión 1.0       08/02/2011      Andrés Torti        Creación                                                       ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////func get_file_name ()var count := 0;var cur_x := 9, cur_y := 6;var ptr,char;txt_Set(TEXT_OPACITY, OPAQUE);    txt_FGcolour(WHITE);    ptr := str_Ptr(file_name);    to(file_name); putstr(00000000000000);file_save_box();    txt_MoveCursor(6,9);              //escribo donde alla dicho el usuariorepeat                      //tomo el nombre hasta que se presione BACK o OKchar := get_qwerty();   //tomo qwerty    if(char == BORRAR)      //si presione la tecla borrar        if(count > 0)            --cur_x;        //una posición hacia atras            txt_MoveCursor(cur_y, cur_x);            putch(' ');         //borro el texto            txt_MoveCursor(cur_y, cur_x);            str_PutByte(--ptr,' ');            --count;        endifelse if(char == OK)        str_PutByte(++ptr,0);       //fin de línea        return OK;else if(char == BACK)        str_PutByte(++ptr,0);       //fin de línea        return BACK;else if(count<12 &amp;&amp; (isprint(char) || isspace(char)))        putch(char);        //tomo la letra y la escribo siempre que no alla escrito mas letras que las que paso el usuario        str_PutByte(ptr++,char);        ++count; ++cur_x;endifforeverreturn -1;endfunc///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Esta función testea si el archivo con el nombre en la variable global file_name ya existe en la tarjeta de memoria   ////Si ya existe al archivo se abre un cuadro preguntando si se desea sobreescribirlo, en caso afirmativo se procede     ////a guardar el archivo contenido en file_save con el nombre contenido en file_name y se retorna un 1, en caso de que no////se desee sobreescribirlo se borra la matriz file_name, se vuelve a mostrar el cuadro para guardar la nota y se       ////retorna un -1 para que se vuelva a pedir el nombre del archivo.                                                      ////Versión 1.0       07/02/2011      Andrés Torti        Creación                                                       ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////func save_file()var handle;if(file_Exists(str_Ptr(file_name)))      //si ya existe un archivo con el nombre que escribi    file_exist_box();    repeat        get_touch(&amp;x,&amp;y,0); //tomo coordenadas        if(x>80 &amp;&amp; x<130 &amp;&amp; y>60 &amp;&amp; y<90)      //botón SI sobreescribir archivo              gfx_Button(PRESSED,80,60,GRAY,WHITE,FONT3,1,1,"SI");              wait_release();              file_Erase(str_Ptr(file_name));                //borro el archivo porque si se sobreescribe genera un error              handle := file_Open(str_Ptr(file_name),'w');   //creo un nuevo archivo con el nombre en la matriz file_name              file_PutS(file_save,handle);                   //escribo en el archivo la nota que esta en la matriz file_save              file_Close(handle);                            //cierro archivo              gfx_Button(NO_PRESS,80,60,GRAY,WHITE,FONT3,1,1,"SI");              return 1;     //salgo de la función indicando que se sobreescribió        endifif(x>130 &amp;&amp; x<180 &amp;&amp; y>60 &amp;&amp; y<90)      //botón NO sobreescribir archivo              gfx_Button(PRESSED,130,60,GRAY,WHITE,FONT3,1,1,"NO");              wait_release();              gfx_Button(NO_PRESS,130,60,GRAY,WHITE,FONT3,1,1,"NO");              return -1;    //retorno -1 indicando que se debe volver a pedir el nombre del archivo        endif    foreverelse        //si no existe un archivo con el mismo nombre    handle := file_Open(str_Ptr(file_name),'w');     //creo un nuevo archivo con el nombre en la matriz file_name terminado en .txt    file_PutS(file_save,handle);                     //escribo en el archivo la nota que esta en la matriz file_save    file_Close(handle);                              //cierro archivo    return 1;               //salgo de la función indicando que se guardóendifendfunc///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Esta función muestra el numero de archivos con extensión .txt y los muestra en una lista, cuando se toca la pantalla ////se muestra el teclado qwerty y se pregunta por el archivo a cargar, el ususario escribe el nombre y al presionar OK  ////se carga el archivo en file_save y se vuelve de la función retornando un 1. Si la cantidad de archivos son demasiados////y no hay suficiente memoria para mostrarlos se muestra en la pantalla el error y se espera a que se toque el touch   ////para salir y se retorna un -1.                                                                                       ////Versión 1.0       07/02/2011      Andrés Torti        Creación                                                       ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////func load_file()var size_l, size_h, v;gfx_Cls();     //borro pantalla    txt_MoveCursor(0,0);    txt_Set(FONT_SIZE, FONT3);  //tamaño de letra 12x16    txt_FGcolour(WHITE);    putstr("Buscando archivos...\n");n := file_Count("*.txt");   //cantidad de archivos en MMC con formato .txt    putch('\n');  print(n," archivo(s) .txt\n"); //escribo la cantidad de archivos .txt    print("Presione para continuar...\n\n");file_Dir("*.txt");          //muestro el listado de archivos con el formato .txtget_touch(&amp;x,&amp;y,2);         //click para continuarif(n != 0)repeatgfx_Cls(); img_Show(img_qwerty, ALL);        v := get_file_name();               //tomo nombre de archivo        if(v == OK) //cargo el archivo            v := file_Open(str_Ptr(file_name),'r'); //abro el archivo para leer            file_Size(v,&amp;size_h,&amp;size_l);            //file_Read(file_save,size_l,v);            file_GetS(file_name,5,v);            file_Close(v);            return 1;                               //retorno 1 indicando accion completa        else            return -1;        endifforever    endifreturn -1;endfunc#CONST    WINDOW_COLOR        GRAY    BORDER_COLOR        BLUE    TITLE_COLOR         WHITE    TXT_COLOR           WHITE#END///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Dibuja el cuadro para escribir el nombre del archivo                                                                 ////Versión 1.0       26/02/2011      Andrés Torti        Creación                                                       ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////func file_save_box()gfx_RectangleFilled(50,12,270,106,BORDER_COLOR);gfx_RectangleFilled(53,22,267,103,WINDOW_COLOR);gfx_RectangleFilled(62,60,256,90,BLACK);gfx_MoveTo(62,40);txt_FGcolour(TITLE_COLOR);txt_Set(TEXT_OPACITY, TRANSPARENT);print("Guardar/Cargar archivo");txt_Set(TEXT_OPACITY, OPAQUE);txt_FGcolour(WHITE);endfunc///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Dibuja el cuadro preguntando si se deseea o no sobreescribir el archivo existente                                    ////Versión 1.0       26/02/2011      Andrés Torti        Creación                                                       ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////func file_exist_box()gfx_RectangleFilled(50,12,270,106,BORDER_COLOR);gfx_RectangleFilled(53,22,267,103,WINDOW_COLOR);gfx_MoveTo(62,40);txt_FGcolour(TITLE_COLOR);txt_Set(TEXT_OPACITY, TRANSPARENT);print("Archivo ya existente");gfx_Button(NO_PRESS,80,60,GRAY,WHITE,FONT3,1,1,"SI");gfx_Button(NO_PRESS,130,60,GRAY,WHITE,FONT3,1,1,"NO");txt_Set(TEXT_OPACITY, OPAQUE);txt_FGcolour(WHITE);endfunc
    I have two problems. One problem if that when i write more than 3 characters the function file_exists_box() is executed because i see that the box appear on the screen and no matter what i press it only redraws the box forever. So i cant write more then 3 characters.The other problem is that when i save a file whit i name that i write it is writted correctly because i see the file in the SD card but when i open it whit load_file function it doesnt returns nothing when i put: putstr(file_save); I have been trying to fix it for about 4 weeks but i dont have any more ideas so i ask you for help.
    Thanks you very much

  • #2


    If you could please edit this post, and place the code between code tags so its not mangled, we can load it up and have a closer look. At a quick glance,the way that func notes() deals with varable n looks a bit suspicious.
    Regards,
    Dave

    Comment


    • #3


      Ok its done

      Comment


      • #4


        Ouch, seems like the code tags make it even worse

        How about a zip attachment ?
        Regards,
        Dave

        Comment


        • #5


          Here are the files

          Attached files Functions.zip (4.3 KB)

          Comment


          • #6


            No solution? Its an strange problem i think it could be an stack problem.

            Comment


            • #7


              Can you please provide a simple main() function to tie it together so we can test.
              We are unaware of any stack problems, there are no reported issues.
              I would say it is more likely a pointer problem but will test for you as soon as
              we can make your code run.
              Regards,
              Dave

              Comment


              • #8


                Mmm... I think you are right i forgot to put n := str_Ptr to get the pointer of the string to use str_PutByte() later, a stupid error sorry. And i suppose that i dont have anything from the string because i didnt defined the correct pointer lol.I will try now again thanks =).
                Attached files Libraries.zip (7 KB)

                Comment

                Working...
                X