Go Down

Topic: Librería gameduino 2 modificada para pantallas FT81X  (Read 50581 times) previous topic - next topic

TFTLCDCyg

#135
Apr 06, 2017, 09:16 am Last Edit: Apr 06, 2017, 10:05 am by TFTLCDCyg
Así es, usa 15 imágenes con diferentes niveles de escala.

Existe una función que permite realizar un zoom en las imágenes, en alguno de los ejemplos está la función zoom. Mas adelante trataremos el tema con un ejercicio.

Rotación de imágenes: complemento

Para que la instrucción de rotación surta efecto hay que usar inmediatamente la instrucción:

Code: [Select]
GD.cmd_setmatrix();

Los ángulos que usemos son acumulativos y afectan a todas las imágenes dibujadas en pantalla, ubicadas después del primer llamado de rotación.

Con el fin de aislar cada giro, sin que se acumule o afecte a otras imágenes, hay que usar la instrucción:

Code: [Select]
GD.cmd_loadidentity();

Recomiendo conservar la plantilla de diseño previa (colores, transparencias, etc), insertando la función de giro entre las instrucciones

Code: [Select]
GD.SaveContext();
GD.RestoreContext();


De esta manera aislamos el giro solo en el elemento que deseamos mover, como por ejemplo las manecillas de un reloj o las agujas de un tablero de instrumentos.

Code: [Select]
//#include <EEPROM.h>
#include <SPI.h>
//#include <GD3.h>
#include <GD3_SDIO.h>

//SDIO
  File archivo1, archivo2;
  SdFatSdioEX SD;
//SDIO

//Aguja indicadora
  int Centro=400/2;  //AE8.png, 400x400 px, Centro=400/2
  float AnguloG=40;  //compensación para ajustar a la escala del dial
  float avance, rapidez;
//Aguja indicadora

void setup()
{
  GD.begin();

//Sin SDIO
//  GD.BitmapHandle(0);
//  GD.cmd_loadimage(0, 0);
//  GD.load("AE6.jpg");

  //GD.BitmapHandle(1);
  //GD.cmd_loadimage(-1, 0);
  //GD.load("AE8.png");
//Sin SDIO

//SDIO
  SD.begin();
  archivo1 = SD.open("AE6.jpg");
    GD.BitmapHandle(0);
    GD.cmd_loadimage(0, 0);
    GD.loadSDIO(archivo1);

  archivo2 = SD.open("AE8.png");
    GD.BitmapHandle(1);
    GD.cmd_loadimage(-1, 0);
    GD.loadSDIO(archivo2);
//SDIO


  tacometro();
}

void loop(){}

float dato;

void tacometro()
{
  while(1){
  GD.Clear();

  GD.Begin(BITMAPS);
    GD.Vertex2ii(175, 10, 0);
  GD.End();

  GD.SaveContext();
  GD.Begin(BITMAPS);
    avance = (1.27*2)*dato;
    dato = dato + rapidez;
    if((AnguloG+avance)>=294){rapidez=-0.5;}
    if((AnguloG+avance)<=40){rapidez=0.5;}
    rotate_Center(DEGREES(AnguloG+avance), Centro);
    //rotate_Center(DEGREES(40), Centro);  //0
    //rotate_Center(DEGREES(306), Centro);  // fin
    //rotate_Center(DEGREES(294), Centro);  // 10
    GD.cmd_setmatrix();
    //GD.Vertex2ii(250, 88, 1);
    GD.Vertex2ii(200, 38, 1);
    GD.cmd_loadidentity();
  GD.End();
  GD.RestoreContext();

  GD.SaveContext();
    GD.ColorA(100);  GD.ColorRGB(0,0,0); GD.printNfloat(405, 324, dato/10, 1, 29);  GD.ColorA(255);
    if (dato>=90){GD.ColorRGB(255,0,0);}else{GD.ColorRGB(255,255,255);}
        GD.printNfloat(400, 315, dato/10, 1, 29);
  GD.RestoreContext();
  
  GD.swap();}
}

static void rotate_Center(float a, int CXY)
{
  GD.cmd_translate(F16(CXY),F16(CXY));
  GD.cmd_rotate(a);
  GD.cmd_translate(F16(-CXY), F16(-CXY));
}




Video: FT813-tacómetro

Cabe señalar que las imágenes png son compatibles al 100% con las pantallas FT81X, en las pantallas FT80X no las podemos usar directamente; sin embargo, podemos crear un asset con la herramienta gd2asset.exe, con las imágenes png, conservando las transparencias.

lightcalamar

#136
Apr 06, 2017, 11:04 am Last Edit: Apr 06, 2017, 01:39 pm by lightcalamar
Ayer le dí un vistazo a la DataSheet en la pagina 203 y 205 viene muy bien explicado como rotar los widget.

La data esta basadas en FT81x y he visto que la GD2 originalde James incorpora funciones de esta guia. Aquí dejo este comentario... he visto inclusive unos comandos llamados "snapshot" (pagina 244) y lo estoy investigando.

Buen código el anterior. Se podría poner como otro ejemplo mas a la librería. Que bien!

Por cierto encontré el repositorio de NewHaven Display con lo cual compilan todos los ejemplos de la librería oficial de FTDI con IDE Arduino 1.8.1 este es el repositorio
Mi proyecto Radio FM con RDS -  MDC v1.0;
https://forum.arduino.cc/index.php?topic=400484.0
https://forum.arduino.cc/index.php?topic=448606.0
https://github.com/lightcalamar

TFTLCDCyg

De hecho cuando Riverdi sacó por primera vez la linea FT80X, tuve oportunidad de bajar la librería FTDI para la serie FT801 y hasta el momento es la que mejor compila: en MEGA, UNO, Teensy 3.6, arduino Due, Teensy 3.2.

De cuando en cuando me aventuro al "mar de sargazos", pero luego de invertir algunas horas para tratar de convertir el código a algo que podamos usar en el gameduino 2, termino por darme por vencido, ya que solo saltan errores por todos lados.

La App que siempre he querido migrar a GDX es la que ellos llaman FT_AppImageviewer, me parece genial, es un visor de imágenes jpg que tiene la característica de crear un reflejo de la imagen en la parte inferior, y la parte que mas me llama la la atención es que pre-carga la siguiente imagen, proporcionando continuidad de imagenes, sin parpadeos.

Y no me aventuro con las otras demos: FT_App_Restaurant, FT_App_WashingMachine, FT_App_Refrigerator, FT_App_Jackpot...

Acá está el link de descarga

lightcalamar

La App que siempre he querido migrar a GDX es la que ellos llaman FT_AppImageviewer, me parece genial, es un visor de imágenes jpg que tiene la característica de crear un reflejo de la imagen en la parte inferior, y la parte que mas me llama la la atención es que pre-carga la siguiente imagen, proporcionando continuidad de imagenes, sin parpadeos.
Tienes toda la razón es de lo mejor que he visto. Ayer la probré y a cada imagen realiza el reflejo de la misma imagen en un tanto por ciento.

Crees realmente que es dificil exportantal?
Ayer al ver el código hasta me parece sencillo, no sé, posiblemente le meta mano y lo haga...
Mi proyecto Radio FM con RDS -  MDC v1.0;
https://forum.arduino.cc/index.php?topic=400484.0
https://forum.arduino.cc/index.php?topic=448606.0
https://github.com/lightcalamar

lightcalamar

En mi repositorio he subido las fuentes modificadas para la herramienta GD3Asset. Con el fin de superar la barrera de sus antecesoras FT80X y con esta versión se llega a generar assets con 2MBytes de RAM.

La instalación esta también documentada para ser instalado en Linux. Concretamente la versión 16.04 de Ubuntu.
Mi proyecto Radio FM con RDS -  MDC v1.0;
https://forum.arduino.cc/index.php?topic=400484.0
https://forum.arduino.cc/index.php?topic=448606.0
https://github.com/lightcalamar

TFTLCDCyg

Gracias por el instructivo y las modificaciones. En cuanto tenga a punto Linux en la PC instalaré las fuentes, mientras tanto les daré varias revisiones para aprenderme el procedimiento.

lightcalamar

En las fuentes observé el máximo de imagen a transformar, estas son de 480x272 (supongo que esto te tiene que sonar algo en tus oídos), bien es la máxima resolución.

Se puede modificar a 800x480 pixels siendo esta ultima la máxima para FT81x no lo realice por varios motivos entre otros no sería factible poner assets con estos pixels y ademas podría crear problemas en las imágenes de múltiples Handles supongo, esto sí se podría hacer y probar.

Sea de una forma u otra las fuentes ahora alcanzan el MByte que se necesita, otra cosa mas adelante veamos si lo mejoramos.
Mi proyecto Radio FM con RDS -  MDC v1.0;
https://forum.arduino.cc/index.php?topic=400484.0
https://forum.arduino.cc/index.php?topic=448606.0
https://github.com/lightcalamar

RndMnkIII

Saludos y animo con esos proyectos, me alegra ver esos progresos con las pantallas FT8xx. De momento no puedo dedicarme a echar una mano por aqui e investigar algunos desarrollos pendientes para las FT81x y placas Teensy 3.5/3.6 por cuestiones personales pero espero q en poco tiempo pueda ponerme al dia otra vez y compartirlo aqui en el foro.

TFTLCDCyg

#143
Apr 13, 2017, 04:24 pm Last Edit: Apr 13, 2017, 04:28 pm by TFTLCDCyg
En las fuentes observé el máximo de imagen a transformar, estas son de 480x272 (supongo que esto te tiene que sonar algo en tus oídos), bien es la máxima resolución.

Se puede modificar a 800x480 pixels siendo esta ultima la máxima para FT81x no lo realice por varios motivos entre otros no sería factible poner assets con estos pixels y ademas podría crear problemas en las imágenes de múltiples Handles supongo, esto sí se podría hacer y probar.

Sea de una forma u otra las fuentes ahora alcanzan el MByte que se necesita, otra cosa mas adelante veamos si lo mejoramos.
Vaya pensé que esa parte no se podría modificar también. Otra razón mas para apresurarme con los pendientes del trabajo. Gracias

Saludos y animo con esos proyectos, me alegra ver esos progresos con las pantallas FT8xx. De momento no puedo dedicarme a echar una mano por aqui e investigar algunos desarrollos pendientes para las FT81x y placas Teensy 3.5/3.6 por cuestiones personales pero espero q en poco tiempo pueda ponerme al dia otra vez y compartirlo aqui en el foro.
Saludos mi estimado, esperemos que vaya todo bien con tus proyectos personales. Paciencia.

PD: aprovechando para dejar la pregunta en el aire... En efecto hay una petición aguardando: crear una lista de archivos con una determinada extensión (jpg, bmp, png) pero desde el lector SDIO. Luego con ayuda del FT8XX, presentar la lista y seleccionar aquella que nos interese.

Adjunto un ejemplo que está en el foro de James, lo modifiqué para que muestre el listado siempre y por tanto, la imagen que deseemos seleccionar. En el ejemplo original solo se carga una vez, hay que reiniciar el MCU para mostrar el listado inicial. Además se puede seleccionar la resolución de pantalla, con lo que podemos usarlo en FT80X o en FT81X.


TFTLCDCyg

#144
Apr 13, 2017, 06:38 pm Last Edit: Apr 13, 2017, 06:42 pm by TFTLCDCyg
Monitoreo de tags

Cuando estamos trabajando con las entradas táctiles, podemos usar la superficie completa de la pantalla. Sin embargo no asignamos posiciones (x, y) directamente. De eso se encarga la instrucción
Code: [Select]
GD.Tag(IDtag);

Donde IDtag comprende valores de 0 a 255.

Hay algunas consideraciones asociadas al rango de entradas táctiles

- 0 a veces causa conflictos al usarlo, por lo que sugiero no emplearlo en un sketch
- 255 indica que ya no se aplicará un tag o marcador de entrada táctil en las instrucciones siguientes

Técnicamente podemos asignar el rango 1-254, como entradas táctiles útiles, aparentemente es un rango limitado, sin embargo es mas que suficiente para trabajar con una sola pantalla a la vez.

Podemos asociar a un tag, cualquier elemento que decidamos enviar a pantalla, además de los típicos botones: un reloj, un polígono, un circulo, un texto, un numero, una imagen, etc. No tenemos que preocuparnos por la posición gráfica.

Para saber que tag estamos usando en un momento dado, podemos recurrir a la siguiente linea:

Code: [Select]
if((1<=GD.inputs.tag)&&(GD.inputs.tag<=TagMAX))

Donde TagMAX, puede tomar un valor entre 2 y 254. Resulta muy útil para asociar un determinado tag ya asignado a una acción específica, como por ejemplo cargar en pantalla un determinado archivo de imagen o de audio, de una lista creada previamente en la pantalla en uso o bien desde otra pantalla o menu.

Este es un ejemplo práctico:

Code: [Select]
//#include <EEPROM.h>
#include <SPI.h>
#include <GD3.h>

byte IDSeleccionada;

void setup()
{
  GD.begin();
  MP();
}

void loop(){}

void MP()
{
  while(1)
  {
    GD.ClearColorRGB(0x404040);
    GD.Clear(); GD.get_inputs();

    GD.SaveContext();
      GD.LineWidth(10); GD.Begin(RECTS);
      GD.ColorRGB(0x0000cc);  GD.Tag(206);  GD.Vertex2f(16*125,16*120);  GD.Vertex2f(16*275,16*150);
      GD.ColorRGB(0xffffff); GD.cmd_text(200, 133, 28, OPT_CENTER, "Menu 1 (206)"); GD.Tag(255);

      GD.LineWidth(10);  GD.Begin(RECTS);
      GD.ColorRGB(0x0000cc); GD.Tag(207); GD.Vertex2f(16*125,16*170); GD.Vertex2f(16*275,16*200);
      GD.ColorRGB(0xffffff); GD.cmd_text(200,183,28,OPT_CENTER,"Menu 2 (207)"); GD.Tag(255);
    GD.RestoreContext();

    if((1<=GD.inputs.tag)&&(GD.inputs.tag<=254))
      {
        IDSeleccionada=GD.inputs.tag;
      }
    GD.cmd_number(40,250,31,OPT_CENTER|OPT_SIGNED,IDSeleccionada);
  GD.swap();
  }
}

lightcalamar

#145
Apr 14, 2017, 12:58 am Last Edit: Apr 14, 2017, 01:01 am by lightcalamar
SURPRISE !!!

En esta tarde he descubierto algunas cosas sobre la ultima revisión del GD2Assets del código fuente de James Bowman, concretamente la versión ultima 2.0.18 ...

Resulta que los ficheros de audio .wav también se pueden subir a la pantalla, sea FT80x o FT81x
Hasta me he emocionado y resulta que FUNCIONA!!!



En este caso use un gran fichero de 10MBytes y obviamente reprodujo solo hasta el mega... pero funcionó repito. Esto si con fichero "pequeños" por ejemplo el sonido de un reloj CUCU ... Wow que ideas me da el sistema de las FT81X ...

Ya pondré un ejemplo.



Mi proyecto Radio FM con RDS -  MDC v1.0;
https://forum.arduino.cc/index.php?topic=400484.0
https://forum.arduino.cc/index.php?topic=448606.0
https://github.com/lightcalamar

TFTLCDCyg

Impresionante!. Pensé que solo los archivos de audio comprimidos podían ser reproducidos.

Has descubierto nuevas posibilidades, a la espera de los avances que tengas con el tema.

PD: vaya si que la versión gd2asset para Linux tiene bastantes recursos por ofrecer.

lightcalamar

#147
Apr 17, 2017, 10:38 am Last Edit: Apr 17, 2017, 10:44 am by lightcalamar
He realizado esta función para poner un marco de color blanco alrededor de la pantalla. El problema al ser llamada solo sale el mismo sin lo previo.

Code: [Select]

void marco()  {
            
      do {
      GD.Clear();
      GD.Begin(LINES);
      GD.SaveContext();
      GD.Vertex2ii(0, 70, 20, 0);         // DOS LINEAS DEBAJO DEL MENU SUPERIOR
      GD.Vertex2ii(480, 70, 20, 0);
      GD.VertexTranslateX(16*320); GD.Vertex2ii(480, 70, 20, 0);
      GD.VertexTranslateX(16*320); GD.Vertex2ii(0, 70, 20, 0);
      GD.RestoreContext();

      
      GD.SaveContext();
      GD.Vertex2ii(0, 65, 20, 0);
      GD.Vertex2ii(480, 65, 20, 0);
      GD.VertexTranslateX(16*320); GD.Vertex2ii(480, 65, 20, 0);
      GD.VertexTranslateX(16*320); GD.Vertex2ii(0, 65, 20, 0);
      GD.RestoreContext();

      
      GD.SaveContext();
      GD.Vertex2ii(0, 478, 20, 0);        // LINEA INFERIOR DE LA PANTALLA
      GD.Vertex2ii(478, 478, 20, 0);
      GD.VertexTranslateX(16*320); GD.Vertex2ii(0, 478, 20, 0);
      GD.VertexTranslateX(16*320); GD.Vertex2ii(478, 478, 20, 0);    
      GD.RestoreContext();

      
      GD.SaveContext();
      GD.Vertex2ii(0, 480, 20, 0);        // LINEA LATERAL IZQUIERDA
      GD.Vertex2ii(0, 65, 20, 0);
      GD.RestoreContext();
      
                                          // LINEA LATERAL DERECHA
      GD.SaveContext();
      GD.VertexTranslateX(16*318); GD.Vertex2ii(480, 65, 20, 0);    
      GD.VertexTranslateX(8*636);  GD.Vertex2ii(480, 480, 20, 0);                    
      GD.RestoreContext();      
            
      GD.End();
      GD.swap();
      }
    while(1);  
}

luego la llamo dentro de otra función e.j.

Code: [Select]

void menu1() {
GD.ClearColorRGB(0x000000);
GD.cmd_fgcolor(CHERRY);  
GD.ColorRGB(WHITE);
GD.cmd_button(0, 0, 800, 62, 31, 0, "Multi Data Center");
marco();
}


Y el botón del menú no aparece. Alguna idea?

P.S. Saludos RndMnkIII !!! tiempo sin saber de ti. Espero tus proyectos sean fructíferos.
Mi proyecto Radio FM con RDS -  MDC v1.0;
https://forum.arduino.cc/index.php?topic=400484.0
https://forum.arduino.cc/index.php?topic=448606.0
https://github.com/lightcalamar

lightcalamar

Añado un tips de estas pantallas. Supongo que lo saben, no obstante creo conveniente escribir.

Tenía en mi proyecto una FT800, y estoy emigrando el proyecto exactamente igual pero a pantalla FT810. Todo correcto, salvo una pequeñez...

Realizando la calibración de la pantalla, no guarda los cambios, por lo tanto siempre hay que poner el se setup;
Code: [Select]

  GD.begin();
  GD.cmd_setrotate(0);
  GD.self_calibrate();

 y llega a ser agotador tener que poner siempre la instrucción para calibrar. Esto pasa porque la anterior pantalla memorizó en la EEPROM del MCU sus datos.

Solución: abrir el ejemplo del IDE de Arduino EEPROM -> eeprom_clear y mano de santo.
Luego a cargar otra vez el proyecto con el anterior código, pide la pantalla por dos veces que se le calibre, como confirmación, luego desmarcamos el comando GD.self_calibrate(); yla pantalla vuelve a ser funcional sus posiciones táctiles nuevas. Ojo que hablo de Arduino MEGA.

Mi proyecto Radio FM con RDS -  MDC v1.0;
https://forum.arduino.cc/index.php?topic=400484.0
https://forum.arduino.cc/index.php?topic=448606.0
https://github.com/lightcalamar

TFTLCDCyg

Simple y bastante útil. Como hace un buen rato que uso el teensy 3.6 y las pantallas en la misma posición, no había usado la calibración automática, que salta la primer vez en las tarjetas que tienen EEPROM.

Es un consejo bastante útil.

Por cierto, ¿funcionó en el MEGA la pantalla de calibración modificada?


Go Up