LCD editor

Papp Zoltán zombi at c2.hu
Sat Jul 1 01:59:53 CEST 2006


2006.06.30. 13:40:04 dátumon Moczik Gabor <pm at progzmaster.hu> írta:

> En ugy tervezem megoldani, hogy eleve a karakterkeszlet lesz  
> proporcionalis,
> azaz le lesz tarolva az adott karakter szelessege, es nem lesz felesleges
> ures pixel oszlop. Ez karakterenkent 1 byte tobblet, viszont  
> osszessegeben
> nem okoz ennyit, mert az elhagyott ures oszlopok miatt kevesebb adatot  
> kell
> tarolni.
> Az overhead annyi, hogy ha mondjuk a 254-es kodu betu kell, akkor nem
> tudjuk, hogy az adatteruleten hol kezdodik, mert ossze kell szamolni az
> elotte levo betuk szelesseget.
>
> Lehet indextablat csinalni minden karakterhez, de az rengeteg helyet  
> foglal,
> lehet minden 16-ik karakterhez, ez mar kevesebbet, de rossz esetben 15-ot
> kell szamolni.
> Ha a ROM keves, de RAM van meg, akkor ki lehet szamolni a betukeszlet
> kivalasztasakor a tipikus indexeket, es ez alapjan dolgozni.

Ez igaz, a sebesség és a helyméret fordítottan arányos...


>> Én valamilyen "paraméterezhető" kimeneti formátumra gondolok, amit
>> mindenki magának állíthat be. Persze ez nagy meló, de univerzális. (nézd
>
> Vegul is...
> Kellhet egy olyan kimenet, ami egyszer szukseges (pl. valtozonev), blokk
> kezdo jel, elvalasztojel, blokk zaro jel, adat formatum.
>
> Pl. C nyelvu tomb eseten:
> start: 'const char %font_name%[%font_size_bytes%] ='
> block start:  '{'
> blockend: '}'
> delimiter: ', '
> formatum: '0x%2X'
>
> Ezt egyszeru leprogramozni, de ezzel meg mindig nem lehet meta-adatokat
> tarolni, tovabba ki kell valasztani, hogy 1byte egy oszlopot vagy egy  
> sort
> ir le, stb.
>

Én inkább valamilyen egyszerű BASIC/C hibrid leíró-nyelvre gondolok, egy  
printf-szerű lekezeléssel, valami ilyesmire:

Mondjuk hagyjuk el a "printf" szót, és ami a kimenet, azt tegyük  
macskakörmök közé. Az egyes változókat és azok leírását ugyanúgy  
definiáljuk, mint a printf-nél. Legyen egy 3D tömbünk (ez is parancs):  
PX(karakterkód,oszlop,sor) aminek értéke 0/1 lehet, ezek a pixelek.  
Ugyanígy két másik tömbünk: ROW(karakterkód,sor,msb),  
COL(karakterkód,oszlop,msb), ami adott sor ill. oszlop értékét adja, ha  
MSB==TRUE, akkor balra ill. fent van az MSB, ha FALSE, akkor jobbra, ill.  
lent. Használhassunk változókat, mondjuk max. 26-ot ($A-$Z, a $ jel  
mutatja, hogy ezek változók), ezekkel el tudjuk végezni pár alapműveletet  
(+,-,/,*,%,>>,<<), természetesen zárójelezve; legyen egy egyszerű  
FOR($V,kezdő,vég)/NEXT(lépésszám) ciklus [lépésszám elhagyható, ekkor  
alapban 1]. Használhassunk egy IF(feltétel)/ELSE/ENDIF utasítást,  
feltételként kiértékelhető legyen boolean változó, ill. pár művelet  
(<,>,==,,||). A fontkészlet egyéb paramétereit nevesítsük, pl: FONTNAME,  
WIDTH, HEIGHT, CHAR_FIRST, CHAR_LAST, PROP (proporcionális? ->  
TRUE/FALSE), COLDATA (adatok oszloponként? -> TRUE/FALSE(soronként)).
Speciális feltételes utasítás (megfelel a C-ben a  
(feltétel?igaz:hamis)-nak) : SEL(feltétel,igaz,hamis)
FOR,NEXT,IF,ELSE,ENDIF,SEL után már ne lehessen utasítást írni az  
egyszerűség, a lekezelhetőség és az átláthatóság kedvéért.
A kimeneti fájlnevet a FILENAME(...) paranccsal állítjuk be, ami egy  
printf-szerűség egyben; ha nem adjuk meg, akkor a program rákérdez, hogy  
ez legyen-e a neve.
Lehessen használni //-t megjegyzésként.

Vannak használható rendszer-konstansok (a fontkészlet beállításaiban  
szerepelnek):
FONTNAME="Font5x7"
WIDTH=5
HEIGHT=7
CHAR_FIRST=65
CHAR_LAST=67
PROP=FALSE //nem proporcionális, azaz fix méret
COLDATA=TRUE //adatok oszloponként
//a LETTERSPACING és ROWSPACING gondolom a karaterek és a sorok közti  
távolság
LETTERSP=1
ROWSP=1
//és még lehet sok más változó, ami majd kialakul


A leírás pl. így nézne ki, ami mondjuk a MOCZIK.OUT :-) fájl tartalma is  
egyben:

//========= Moczik Gábor így szereti a fontkimenetet :-) ==========
FILENAME("%s.fnt",fontname) //"Font5x7.fnt"

"unsigned char %s_data[] = {\n",fontname
FOR($C,char_first,char_last)
   "     "
   FOR($X,0,WIDTH-1)
     "0x%2X",COL($C,$X,FALSE)
     SEL(($C<WIDTH-1)&&($C<CHAR_LAST),",","")
   NEXT
   "\n"
NEXT
"};\n\n"

"const struct GFont St%s = {\n",FONTNAME
"   GF_%s,\n",SEL(PROP,"PROP","FIXED")
"   GF_%s,\n",SEL(COLDATA,"COLDATA","ROWDATA")
"   %d, /* first char */\n",CHAR_FIRST
"   %d, /* last char */\n",CHAR_LAST
"   %d, /* width */\n",WIDTH
"   %d, /* height */\n",HEIGHT
"   %d, /* letterspacing */\n",LETTERSP
"   %d, /* rowspacing */\n",ROWSP
"   sizeof(%s_data),\n",FONTNAME
"   %s_data\n",FONTNAME
"};\n\n"

"const struct GFont* %s = &St%s;\n",FONTNAME,FONTNAME

//================ Itt a vége, fuss el véle ===============


Aminek a kimenete olyan, ami neked kell:

> Nekem pl. ilyen formatum kell:
és tényleg :-)

> unsigned char Font5x7_data[] = {
>      0x7E,0x11,0x11,0x11,0x7E,
>      0x7F,0x49,0x49,0x49,0x36,
>      0x3E,0x41,0x41,0x41,0x22
> };
>
> const struct GFont StFont5x7 = {
>      GF_FIXED,
>      GF_COLDATA,
>      65, /* first char */
>      67, /* last char */
>      5, /* width */
>      7, /* height */
>      1, /* letterspacing */
>      1, /* rowspacing */
>      sizeof(Font5x7_data),
>      Font5x7_data
> };
>
> const struct GFont* Font5x7 = &StFont5x7;


Ez egyébként egy szép nagy interpreter és egy szép feladat, de nem  
kivitelezhetetlen, de ezzel bármilyen szöveges formátumot ki tudsz  
exportálni. Gondolom kell majd még bele pár parancs, pl: BYTE(x,y), ami az  
x szám y-ik bájtját adja vissza alulról, pl. a BYTE(0x12345678,2) a  
0x34-et adja vissza, ha x 16bites szám, akkor BYTE(x,0) megfelel az alsó  
bájtnak, stb...

Bináris kimenetnél a "....%c..." formázást érdemes használni, ill. a  
"....\x0A\x0C...." hexa-karakter-definíciókat
Ekkor a ".....%c....",ROW($C,$X,TRUE) vagy ilyesmi használható, 16 bitnél  
pl:

$Z=ROW($C,$X,TRUE)
"....%c%c....",BYTE($Z,0),BYTE($Z,1)

parancsokkal lehetne két-bájtos kiírást készíteni, konfigurálható a big-  
ill. little-endian is (vagy akármi)



Na röviden ennyi.... :-)


-- 
Papp Zoltán
OneWay Electronics



More information about the Elektro mailing list