Hola, este tema guarda relacion al OSD que estoy diseñando con el LPC1769:
http://www.todopic.com.ar/foros/index.php?topic=42254.0Finalmente pude pasar a modo gráfico. Para ello, tengo un buffer de (32x16) (512 pixel horiontal) x 230 pixeles de alto. Ese buffer es sacado por el MOSI del SPI línea por línea por medio del DMA.
Entonces ahora tengo que hacer rutinas para llenar ese buffer con informacion a mostrar en pantalla.
Por ahora solo he podido hacer lo siguiente:
#define PIX_Y 234
#define PIX_X 32 //En realidad es Char_X. Pixel sería 32x16
#define FIRST_LINE 30
#define LAST_LINE 220
#define FNT_H 14
.....
for(i=0;i<PIX_Y;i++)
for(j=0;j<PIX_X;j++)
memhead[i][j] = 0;
for(i=POS_Y;i<(POS_Y+FNT_H);i++){
idx=('e'-32)*FNT_H+(i-POS_Y);
memhead[i][0] = fnt3[idx];
idx=('l'-32)*FNT_H+(i-POS_Y);
memhead[i][1] = fnt3[idx];
idx=('g'-32)*FNT_H+(i-POS_Y);
memhead[i][2] = fnt3[idx];
idx=('a'-32)*FNT_H+(i-POS_Y);
memhead[i][3] = fnt3[idx];
idx=('r'-32)*FNT_H+(i-POS_Y);
memhead[i][4] = fnt3[idx];
idx=('b'-32)*FNT_H+(i-POS_Y);
memhead[i][5] = fnt3[idx];
idx=('e'-32)*FNT_H+(i-POS_Y);
memhead[i][6] = fnt3[idx];
idx=('T'-32)*FNT_H+(i-POS_Y);
memhead[i][14] = fnt3[idx];
idx=('E'-32)*FNT_H+(i-POS_Y);
memhead[i][15] = fnt3[idx];
idx=('S'-32)*FNT_H+(i-POS_Y);
memhead[i][16] = fnt3[idx];
idx=('T'-32)*FNT_H+(i-POS_Y);
memhead[i][17] = fnt3[idx];
idx=('O'-32)*FNT_H+(i-POS_Y);
memhead[i][26] = fnt3[idx];
idx=('S'-32)*FNT_H+(i-POS_Y);
memhead[i][27] = fnt3[idx];
idx=('D'-32)*FNT_H+(i-POS_Y);
memhead[i][28] = fnt3[idx];
}
Primero limpio la memoria. Luego en un lazo for recorro las FNT_H líneas que forman un caracter. La fuente que uso tiene este formato:
//
// Font data for Berlin Sans FB Demi 12pt
//
// Character bitmaps for Berlin Sans FB Demi 12pt
const short fnt3[] =
{
// @0 '!' (14 pixels wide)
0b0000000000000000, //
0b0000000000000000, //
0b0000000000000000, //
0b0000000000000000, //
0b0000000000000000, //
0b0000000000000000, //
0b0000000000000000, //
0b0000000000000000, //
0b0000000000000000, //
0b0000000000000000, //
0b0000000000000000, //
0b0000000000000000, //
0b0000000000000000, //
0b0000000000000000, //
El primer caracter es el ' ' espacio (CHR 32). Entonces para obtener el primer short de la fuente resto 32 al caracter que quiero escrivir y lo multiplico por 14. Luego, en funcion de la línea (son 14 por caracyer) voy sumando 1 de offset.
Esta forma para texto funciona, no es lo mejor, pero por ahora funaciona.
El tema está en si alguien tiene experiencia en llenar buffer de video con gráficos (líneas más que nada) y texto de forma más optima.
Yo voy a tener una serie de variables en memoria que siempre deben presenarce en el mismo lugar. Entonces pensé en hacer una lista enlazada y configurar un canal DMA para que llene el buffer de video de forma autónoma cada cierto tiempo...
El layout de un OSD es como este:
http://b.vimeocdn.com/ts/147/667/14766782_640.jpghttp://www.feiyu-tech.com/uploads/images/2012_11/1211270811053578.jpgEntonces las dudas son: sería útil configurar un nuevo DMA para recolectar las variables del sistema y copiarlas al buffer de memoria? esto me lo pregunto, porque yo voy a tener las variables en STRINGS, pero como vieron mas arriba, no es tan directo el paso de caracter a dato en el buffer, hay varios indices y offsets...
La otra duda es si alguien conoce alguna rutina que me permita dibujar líneas entre dos puntos dados...
aguardo comentarios!
Saludos