I/O de consola funcionando en Bennu embebido en C

Started by Patonsky1, November 25, 2009, 01:35:24 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Patonsky1

Necesito hacer una aplicación en C en la cual necesitaré scripts Bennu que escriban en pantalla, y recojan strings.

Aparte... ¿Hay alguna funcion de recogida de caracteres que se comporte como getch() de conio o similar (o alguna manera de crear el efecto, vaya)?

Saludos.

osk

Existe la variable SCAN_CODE, que vale el valor de la tecla que se ha pulsado por última vez... Y la variable ASCII, ídem pero para el valor ascii...A partir de ahí te puedes hacer una rutinilla (por el foro hay algún ejemplo, en mi manualillo también, apartado "trabajar con teclado") que tenga un switch que mire qué tecla/letra se ha recibido para hacer lo que sea con ella (descartarla, imprimirla, etc).

Patonsky1


SplinterGU

solo sirve para aplicaciones con eventos de teclado (entiendase video=SDL)

tenes que hacerte tu propio modulo, pero si vas a hacer algo embebido, eso te sera simple.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

Para lectura de cadenas tengo por ahí un módulo que se encarga de ello, lo hice a partir de trocitos que había por el foro y le metí algo más, se puede escribir, borrar, vamos... Normal

Si lo necesita pide por esa boquita :-*
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

panreyes

No sé de dónde la saqué, es de la época Div :)

[code language="bennu"]
Function string input();
Private
   char prompt="_";
   inputtext;
   string texto;
Begin   
   let_me_alone();
   delete_text(all_text);
   Loop
       If(scan_code==_backspace) scan_code=0; texto=substr(texto, 0, -1); End
       If(scan_code==_enter) return texto; End  
       If(ascii>=32) //con esto controlo que no me metan caracteres raros
           texto+=chr(ascii) ;
      scan_code=0;
       End
       if(i<20)
          inputText=write(0, x, y, 0, texto + prompt);
       else
          inputText=write(0, x, y, 0, texto);
       end
       Frame;
       delete_text(inputText) ;
   End
End
[/code]

Patonsky1

que MOD necesito para manejar cosas como el SCAN_CODE, el ascii, y demas posibles funciones de input? xd

(ojo, en modo consola >_<)

Patonsky1

[code language="bennu"]PROCESS pluginMain()
BEGIN
    LOOP
      IF (key(_A))
         say("Hola!");
         FRAME;
         BREAK;
      END
   END
   return 0;
END[/code]

No me funciona, se me queda en un continuo estado de espera xd

Seguramente no hace falta el frame ahí, pero lo puse por precaución xD

panreyes

El frame te hará falta si no quieres que se te bloquee el programa.

Pruébalo así a ver

[code language="bennu"]PROCESS pluginMain()
BEGIN
    LOOP
   IF (key(_A))
      say("Hola!");
      BREAK;
   END
   FRAME;
   END
END

[/code]

Prg

yo tenía un ejemplo, le acabo de corregir algunos bugs, te lo dejo aquí :)
puedes ponerle un gráfico a la función para que la pantalla no se vea como la consola de windows.
la función escanea_teclado esta lista para que la uses si te gusta, o para que la modifiques a tu gusto.  un saludo
[code language="bennu"]import "mod_say";
import "mod_wm";
import "mod_key";
import "mod_mem";
import "mod_proc";
import "mod_dir";
import "mod_math";
import "mod_grproc";
import "mod_video";
import "mod_map";
import "mod_string";
import "mod_rand";
import "mod_file";
import "mod_regex";
import "mod_text";
import "mod_draw";
import "mod_sound";
import "mod_sys";

private

string mitexto;
begin
set_mode(800,600,32);

write(0,400,200,4,"presiona enter para terminar de recibir el texto");
escanea_teclado(0,200,300,0,&mitexto,0);
delete_text(all_text);
write(0,400,200,4,"recibimos lo que la función nos retorna y escribimos en 200,300 el texto");
write(0,200,300,4,mitexto);
while (not key (_esc))
frame;
end
end

//alin=alineación del texto en pantalla, los parámetros son los mismos de write
//mi texto es un puntero a string donde almacenar la cadena
//gr es un gráfico del file 0 que la función usará en pantalla, 0 si no se quiere gráfico alguno

function escanea_teclado(int fuente_int,x,y,alin,string * mi_texto,int gr)
private
   
   contador=0, contador1;
   car_act;
   mitexto_string;
   press;

   string trabajo;
   int  pos,possel;
   
begin

   z=-206;
   graph=gr;
   mitexto_string=write_var(fuente_int,x,y,alin,trabajo);

   trabajo=mi_texto[0];
   pos=len(mi_texto[0]);

   while (not key(_enter))

      if (ascii<>0 or key(_backspace) or key(_space) or key(_del))
         if (press ==false)
         if (key(_backspace)or key(_del))
                                       if (pos>0)
                                       while (key(_backspace))
                                       if (pos<>0)
               mi_texto[0]=substr(mi_texto[0],0,pos-1)+substr(mi_texto[0],pos,len(mi_texto[0]));
               end
               pos--;
               trabajo=substr(mi_texto[0],0,pos)+"_"+substr(mi_texto[0],pos,len(mi_texto[0]));
               frame(300);
               end
               end
                                       if (pos<len(*mi_texto))
               while (key(_del))
               mi_texto[0]=substr(mi_texto[0],0,pos)+substr(mi_texto[0],pos+1,len(mi_texto[0]));

               trabajo=substr(mi_texto[0],0,pos)+"_"+substr(mi_texto[0],pos+1,len(mi_texto[0]));
               frame(300);
               end
               end
         elseif (ascii > 32 AND ascii < 126)

         mi_texto[0]=substr(mi_texto[0],0,pos)+chr(ascii)+substr(mi_texto[0],pos,len(mi_texto[0]));
         pos++;
                       //len(mi_texto[0])-1

         elseif (key(_space))
         mi_texto[0]=substr(mi_texto[0],0,pos)+" "+substr(mi_texto[0],pos,len(mi_texto[0]));
         pos++;
                       end


                               press=true;
                               ascii=0;
         end
      else
         press=false;
      end
      contador++;
               trabajo=mi_texto[0];
               if (contador>15)
               car_act=true;

                               if (car_act==true)
                               trabajo=substr(mi_texto[0],0,pos)+"_"+substr(mi_texto[0],pos,len(mi_texto[0]));
                               end
               else

               car_act=false;
               end
               if (contador>30)
               contador=0;
               end
               while (key(_left)or key(_right))
               trabajo=substr(mi_texto[0],0,pos)+"_"+substr(mi_texto[0],pos,len(mi_texto[0]));

               if (key(_left) & pos>0) pos--; frame(300); end
               if (key(_right) & pos<len(mi_texto[0])) pos++; frame(300); end
               frame;
               end
               if (key(_end) ) pos=len(mi_texto[0]);  end
               if (key(_home) ) pos=0;  end
      frame;
   end
   delete_text(mitexto_string);
   while (key(_enter))  frame; end

end
[/code]
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

SplinterGU

ya lo dije, no se pueden hacer cosas que corran en varios frames... en modo embebido, el proceso corre un solo frame... toda la logica que este codificada para 1 solo frame...

En este modo no hay ningun manejador de eventos (teclados, window, render, etc).

Por favor, lean...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Patonsky1

Joder...

¿Y de qué manera puedo hacer una input desde C y pasarla a bennu sin parámetros? ¿Si utilizo punteros declarados en C y paso la dirección de memoria a bennu funcionará igual? ¿Bennu leerá el tipo de dato String de C++? xD

Drumpi

Juer, que complicado: en C tienes CIN para leer datos (al menos es lo que yo usaba).
Si no quieres usar parámetros (que son fáciles de usar, en serio, creo que tegno un ejemplo por aqui si lo quieres) puedes usar ficheros.
Y creo que sockets.
¿Bennu aun no tiene soporte para lectura de PIPEs y FIFOs, verdad? ni para lectura de ficheros de dispositivo, sería interesante leer del USB en serie o de algún HW de forma directa, sólo por curiosidad ^^U
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Patonsky1

Lo de cin ya lo sabía xd

Sé que los parámetros son faciles de usar, pero si quiero compartir datos casi prefiero punteros...

Con que C pueda acceder a las direcciones de memoria de bennu y viceversa, sobra xd

SplinterGU

puedes usar CHAR[], o crear una string y pasarla a bennu por diferentes formas...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2