Forum: Projekte & Code FT800 / FT810 Library


von Rudolph R. (rudolph)


Angehängte Dateien:

Lesenswert?

Also so schwierig ist das nicht mit PlatformIO, im Gegenteil hat das 
eigentlich nur Vorteile, zum Beispiel kann man in der Arduino IDE keine 
Projekt-Defines setzen.

Wie auch immer, man kann meine Library auch mit der Arduino IDE 
verwenden, ich habe mal was ich im Laufwerk liegen hatte auf den 
aktuellen Stand der Dateien gebracht und angehängt.
Die größte Herausforderung das mit der Arduino IDE zu kompilieren 
bestand darin das ich die 2.x installiert und eine Weile nicht verwendet 
habe, das hat einen Moment gebraucht um sich zu aktualisieren.

In der EVE_config.h ist das Display eingestellt, normalerweise mache ich 
das über die platformio.ini und es gibt eben keine Projekt-Datei für 
Arduino.
Ich kann nicht sagen ob das wirklich läuft da ich das nicht extra 
nochmal ausprobiert habe, aber es kompiliert auf jeden Fall für UNO R3, 
UNO R4, ESP32 und "Generic STM32F4 series".
Die Pins für die Targets sind in den Dateien im EVE_target Verzeichnis 
definiert, die zeigt die Arduino IDE nicht direkt mit an, für den Editor 
gibt es die nicht, beim Kompilieren werden die aber benutzt.
Da muss man dann eventuell noch mal mit einem extra Editor die 
Einstellungen für das gewünschte Target prüfen.

Der eigentliche Code ist in der tft.c, wenn das so grundsätzlich läuft 
kann man das ja nach Belieben anpassen.

von Christoph M. (mchris)


Lesenswert?

Könnte Deine Library das CYD unterstützen?
Beitrag "Cheap Yellow Display"

von Rudolph R. (rudolph)


Lesenswert?

Christoph M. schrieb:
> Könnte Deine Library das CYD unterstützen?

Nein, das ist von der Technik her was völlig anderes, so ziemlich die 
einzige Gemeinsamkeit zwischen einem ILI9341 und einem FT81x / BT81x ist 
das die SPI verwenden.

von Luky S. (luky)


Lesenswert?

Danke @Rudolph, werde ich am Abend gleich mal ausprobieren!
Noch eine Frage: wenn ich jetzt doch größere Bilder oder als Gag gar ein 
Filmchen aus dem eingebauten Flash abspielen will, wie bekomme ich die 
am einfachsten dort hinein? Riverdi beschreibt zwar den extra 
Programmüberanschluss fur den Speicher (ein TagConnect TC2050-IDC-NL) 
aber ohne weitere Infos. Hat das schon mal jemand verwendet?

von Rudolph R. (rudolph)


Lesenswert?

Der EVE Asset Builder kann per USB/SPI Adapter durch den EVE Chip den 
externen Flash beschreiben.
Unterstützt werden dabei "FT4222", "MPSSE" und "Raspberry Pi Pico".

Die Software für den Pi-Pi-Co ist hier: 
https://github.com/Bridgetek/pico-brteve

MPSSE wäre sowas:
https://riverdi.com/de/blog/hermes-board-spi-usb-brueckenboard (ist 
meine ich eingestellt)
https://www.matrixorbital.com/interface-module/eve2-usb2spi-kit-a
https://www.matrixorbital.com/interface-module/eve-usb2spi-kit-b

Das Hermes und das EVE2-USB2SPI-KIT-A habe ich hier, das 
EVE-USB2SPI-KIT-B habe ich noch nirgendwo konkret zu kaufen gefunden.

Was ich aber auch gerne mache ist das Flash über mein Programm zu 
beschreiben, das hat vor allem den Vorteil das ich dafür nicht umstecken 
muss, die FFC Kabel sind nicht gerade auf Steckzyklen ausgelegt.
Der Nachteil ist, erstmal muss der Controller das Flash-Image speichern, 
da bietet sich aber zum Beispiel ein ESP32 an, und dann benutze ich 
CMD_FLASHUPDATE was über RAM_G läuft, das Flash-Image darf also entpackt 
nicht größer sein als 1MB.
Schau mal nach "TEST_UTF8" in der TFT.c, das Image dazu ist in der 
tft_data.c.

von Luky S. (luky)


Lesenswert?

Ich bin ja aktuell leider auf den UNO beschränkt. Da bringt es mir dann 
eh keinen Vorteil, das Bild zuerst in den Flash vom EVE zu laden, oder? 
Also wenn ich mit dem Speicher vom AVR auskommen muss/will?

Anscheinend kann das STM32 Evalboard von Riverdi auch als Bridge 
konfiguriert werden, das könnte ich mir aus ausborgen.

von Rudolph R. (rudolph)


Lesenswert?

Nun ja, kommt erstmal darauf an wie groß das Bild ist, ich empfehle für 
die BT81x auf jeden Fall ASTC und 8x8 liefert dabei eine gute Qualität 
bei nur 2 Bits pro Pixel.
Der nächste Schritt ist das mit EAB zu komprimieren, bzw. wenn das nur 
ein Bild ist kann man das gleich im Bild-Konverter machen.

Wenn dabei nur ein paar kiB raus und das Programm noch lange nicht die 
30kiB überschreitet, klar, kann man einfach im Programm lassen und 
jedesmal beim Start ins RAM_G laden.
Wenn das Bild oder die Bilder den Platz im Controller sprengen, dann 
kann man ein eigenes Programm dafür machen, das einmal ins Flash 
abkippen und dann mit dem eigentlichen Programm von da nutzen.

An dem Beispiel hängt zwar ein 7kiB Flash-Image für einen Font in 
tft_data.c, solange das nicht verwendet wird taucht das im eigentlichen 
Programm aber nicht auf.

In meinem aktuellen Projekt spiele ich gerade mit Icons aus Googles 
Material Icons Set, bei 64x64 Pixel und ASTC 8x8 sind das 1024 Bytes pro 
Bild.
Mein _iconlibrary.astc für den Test hat gerade 29kiB und als 
_iconlibrary.zopfli sind das 7262 Bytes.
Das könnte ich jetzt in das Flash-Image werfen, der ATSAME51 Controller 
den ich verwende hat aber ohnehin 512kiB Flash und ich weiß gerade weder 
welche Icons ich dann am Ende benutzen werde, noch stört mich gerade das 
die Start-Zeit ein paar ms länger ist als sie sein könnte.

Oh ja, aus Erfahrung kann ich nur dazu raten das Anzeigen von irgendwas 
direkt aus dem Flash nur sehr sparsam zu benutzen, sei es Zeichensätze 
oder Bilder.
Bei Auflösungen von 800x480 oder höher, also wenn die Pixel-Engine recht 
wenig Zeit hat die Bildzeilen zusammen zu basteln, wirkt sich zunehmend 
die zwar recht hohe aber am Ende doch begrenzte Bandbreite vom externen 
Flash aus, gerade größere Fonts sind ein Problem, zum einen sind das ja 
auch nur Bilder, zum anderen ist der wahlfreie Zugriff auf das Flash 
ganz gut mit Overhead behaftet.
Also Best Practice ist das RAM_G möglichst voll auszureizen, man kann ja 
auch beim Programmstart vom externen Flash ins RAM_G kopieren lassen.
Mit ASTC 8x8 bekommt man das RAM_G auch lange nicht so schnell voll.

von Luky S. (luky)


Lesenswert?

Whow! Danke!
Eine Frage stellt sich mir aber noch: Wie gehe ich mit den "extended" 
Bitmapformaten EVE_ASTC_8X8 etc. um? Muss man da was besonderes 
beachten?
Ich habe hier ein Bild, das im ASTC_8X8 Format 32640 Bytes groß ist

von Luky S. (luky)


Lesenswert?

Und noch zwei damit zusammenhängende Fragen: Der Eve Asset Builder wirft 
für die umgewandelten Bilder ja leider eine recht unübersichtliche Datei 
.binh aus (alles Deimalzahlen, keine Zeilenumbrüch etc.). Gibt es noch 
eine andere Ausgabe oder einen Trick, um die Zahlenkolonne einfach in 
eine ansprechendere Form zu bringen?
Und gibt es einen speziellen grund wieso im Beispiel die memory-map 
defines an diesen Stellen liegen? Bzw. genauer gesagt warum wird nicht 
bei 0x000000 gestartet?

von Rudolph R. (rudolph)


Lesenswert?

Luky S. schrieb:
> Eine Frage stellt sich mir aber noch: Wie gehe ich mit den "extended"
> Bitmapformaten EVE_ASTC_8X8 etc. um? Muss man da was besonderes
> beachten?
> Ich habe hier ein Bild, das im ASTC_8X8 Format 32640 Bytes groß ist

Nö, da gibt es nicht wirklich was besonderes, anzeigen wie andere Bilder 
auch, z.B. EVE_cmd_setbitmap(ICON_ACCESS_ALARM, EVE_ASTC_8X8, 64U, 64U);
Und was man sonst noch so braucht aber nicht anders ist. :-)

Das sind eine ganze Menge Pixel und in den alten Formaten wären das so 
260kiB.
Also ich würde das auf jedem Fall in das RAM_G legen.
Für wie das da landet gibt es ein paar Optionen:

a) Einfach so aus dem Controller heraus: EVE_memWrite_flash_buffer()
b) Erst in EAB durch den "Asset Compressor" schicken, das in den 
Controller legen und dann EVE_cmd_inflate() benutzen
c) Das ins Flash schreiben und EVE_cmd_flashread() benutzen
d) Das packen, ins Flash schreiben und EVE_cmd_inflate2() benutzen

Die .rawh vom Bilder-Umwandeln werfe ich immer weg, keine Ahnung für was 
die gut sein soll, die .astc, die .json und und _converted.png lösche 
ich auch immer.
Das "BIN2C" Modul im EAB erzeugt ordentliche Arrays und lässt sich auch 
noch konfigurieren.

von Luky S. (luky)


Lesenswert?

Was machen in deinem Code eigentlich
1
SPI.endTransaction();
2
SPI.beginTransaction(SPISettings(8UL * 1000000UL, MSBFIRST, SPI_MODE0));
3
SPI.endTransaction();
4
SPI.beginTransaction(SPISettings(16UL * 1000000UL, MSBFIRST, SPI_MODE0));
nach TFT_init();
?

von Rudolph R. (rudolph)


Lesenswert?

Ich gebe es zu, diese Makro Wüste ist etwas hässlich geworden, aber das 
Beispiel baut für und läuft auf einer ganzen Liste unterschiedlicher 
Arduinos.

Das SPI.endTransaction(); gibt den SPI frei und 
SPI.beginTransaction(SPISettings(8UL * 1000000UL, MSBFIRST, SPI_MODE0)); 
konfiguriert den dann wieder neu.

Das TFT_init(); läuft in dem Beispiel mit dem SPI auf 1MHz.
Und dann wird der Takt hoch gedreht.

Der Hintergrund ist das der SPI Takt für das Init der EVE Chips unter 
11MHz sein muss.

Nochmal so drüber nachgedacht ist das vermutlich albern komplex für den 
Beispiel Code, ist etwas gewachsen mit den verschiedenen Optionen.
Auf 8MHz einstellen und fertig wäre auch eine Option.
Das zeigt aber auch, dass die Kontrolle über den SPI Takt nicht in 
meiner Library vergraben ist, wenn man mehr als ein Device am SPI muss 
man ja vielleicht sogar zwischen den Transfers den Takt und/oder den 
Mode umschalten.

von Luky S. (luky)


Lesenswert?

War nur etwas verwirrt, weil die SPI zuerst auf 8MHz gestellt wird, dann 
nochmal auf 8Mhz und sofort auf dann 16MHz.

Darf ich fragen wie die Memory Map aussehen soll? Wie viel Speicher (von 
- bis) kann man da jetzt wirklich verwenden und was ist der Startpunkt? 
Im Programming Manual ist auch erwähnt, das es gewisse Einschränkungen 
beim Alignment geben soll?
Warum wird nicht bei 0x00000000 gestartet?
1
/* memory-map defines */
2
#define MEM_FONT 0x000f7e00 /* the .xfont file for the UTF-8 font is copied here */
3
#define MEM_LOGO 0x000f8000 /* start-address of logo, needs 6272 bytes of memory */
4
#define MEM_PIC1 0x000fa000 /* start of 100x100 pixel test image, ARGB565, needs 20000 bytes of memory */

von Rudolph R. (rudolph)


Lesenswert?

Luky S. schrieb:
> War nur etwas verwirrt, weil die SPI zuerst auf 8MHz gestellt wird, dann
> nochmal auf 8Mhz und sofort auf dann 16MHz.

Nee, das wird erst auf 1MHz und dann entweder auf 8, 16, 20 oder 16 MHz 
eingestellt.
Wie ich schrieb, für das Beispiel-Programm ist das inzwischen 
übertrieben kompliziert.

> Darf ich fragen wie die Memory Map aussehen soll?

Wie Du meinst.

> Wie viel Speicher (von
> - bis) kann man da jetzt wirklich verwenden und was ist der Startpunkt?

Das RAM_G geht von 0 bis 0xfffff.

> Im Programming Manual ist auch erwähnt, das es gewisse Einschränkungen
> beim Alignment geben soll?

Ja, je nachdem was man macht, z.B. wenn man Bilder aus dem Flash 
anzeigen möchte, dann müssen die 32 Byte aligned abgelegt sein.

> Warum wird nicht bei 0x00000000 gestartet?

Kein besonderer Grund, ich habe in dem Beispiel nur von oben angefangen 
um zusätzliche Dinge wie Zeichensätze spontan auf 0x0000 werfen zu 
können.

>
1
> /* memory-map defines */
2
> #define MEM_FONT 0x000f7e00 /* the .xfont file for the UTF-8 font is 
3
> copied here */
4
> #define MEM_LOGO 0x000f8000 /* start-address of logo, needs 6272 bytes 
5
> of memory */
6
> #define MEM_PIC1 0x000fa000 /* start of 100x100 pixel test image, 
7
> ARGB565, needs 20000 bytes of memory */
8
>

Da folgt auch noch MEM_DL_STATIC.

In meinem aktuellen Projekt habe ich:
#define MEM_ICON_BASE 0x000f0000UL
Für 55 Icons in ASTC 8x8 mit 64x64 Pixel.
Aber ich habe noch keine Idee ob ich überhaupt 55 Icons brauche.
Das ist gefolgt von sechs Bereichen für .xfont Daten.
Aktuell sieht es aber danach aus das ich die .glyph Daten der 
Zeichensätze auch noch nach RAM_G verschieben muss.

: Bearbeitet durch User
von Luky S. (luky)


Lesenswert?

Danke nochmals für deine Library und deine Hilfe Rudolph!
Der Speicher im Arduino ist mir leider zu knapp geworden - aber ich 
bekomme heute vielleicht noch das Riverdi STM32 Evaluation Board von 
einem Arbeitskollegen und kann dann am Abend weiterspielen. Das Board 
hat ja u.A. eine USB FT232H Bridge und damit sollte man ja den Flash auf 
dem Display direkt bespielen können. Das scheint mir für meine 
einzellösung die einfachste Variante zu sein, 1x umstecken wird das 
Kabel schon noch aushalten.
Was mir aber noch nicht klar ist: Wenn ich die Bilder (und eventuell 
auch 2 Fonts) in den Flash gespielt habe, wie genau kann ich sie dann 
anzeigen bzw die Fonts verwenden lassen? Irgendwelche Empfehlungen für 
die zu verwendenden Formate?

von Rudolph R. (rudolph)


Lesenswert?

Wie man einen Zeichensatz aus dem Flash benutzt ist in meinem Beispiel 
drin.
Erstmal muss alles was aus dem Flash angezeigt werden soll im ASTC 
Format sein.
Also für den Font eben "Extended Format" und da am besten auf 8x8 
umstellen.
Die .glyph enthält die ganzen Bilder, die .xfont die 
Verwaltungsinformationen.
Die Adresse im Font-Converter ist quasi egal, wenn man in den "Flash 
Utilities" die .glyph und die .xfont für einen Font verwendet, dann wird 
die Adresse in der .xfont darauf angepasst wo die .glyph landet.
Um das Alignement kümmert sich das auch.

Um einen Font zu benutzen muss man die .font nach RAM_G kopieren:
EVE_cmd_flashread(MEM_FONT_28, 38464, 320);
Dann noch mit CMD_SETFONT2 benutzen:
EVE_cmd_setfont2(18,MEM_FONT_28,32);

Wenn man einen Font ins Flash gelegt hat und aus dem RAM_G benutzen 
will, dann wird es minimal komplizierter.
Dann muss man nämlich die Adresse der .glyph Daten in .xfont im RAM_G 
schreiben.

Bei Bildern braucht man die .raw Dateien die aus dem Converter fallen, 
nicht etwa die .astc.
Der Unterschied ist, die .astc hat noch einen 16 Byte Header.
Da kümmert EAB auch um das Alignment, das muss 32 Byte sein.

Beim Anzeigen von Bildern aus dem Flash wird es etwas seltsam,
die Adresse ist nämlich in Blöcken von 32 anzugeben mit dem obersten Bit 
der 24 Bit Adresse gesetzt:
EVE_cmd_setbitmap_burst(0x800000 | (4096/32), EVE_ASTC_8x8, 64, 64);

Siehe auch hier:
https://github.com/RudolphRiedel/FT800-FT813/discussions/116

von Rudolph R. (rudolph)


Lesenswert?

So, in less than two weeks the BT822 is launched at the Embedded World 
2024 North America.

What little information I have so far is what I gathered from published 
pictures and this article: 
https://brtchip.com/discover-bt822-next-evolution-bridgetek-5th-gen-eve/

- two channel LVDS TX for displays with up to 1920 x 1200
- two channel LVDS RX for Video input up to 1920 x 1200
- "Embedded 1Gbit DDR3L SDRAM" - so 128MB of RAM
- "Advanced EVE with Frame Buffer support for High Resolution HMI"
- 16kiB display list
- SD card support
- Audio is stereo now and output is by I2S
- integrated Watchdog timer
- enhanced touch engine
- live video feed
- both resistive and capacive touch support in one chip
- clock source is a 38.4MHz crystal

And yet Bridgetek wrote: "Despite the frame buffer inside, we've 
retained the same features that made EVE so good and the screens are 
still created using the command/display lists etc. The frame buffer 
combined with the 16K RAM_DL will help with the more complex user 
interfaces without underrun etc. but from the application side it will 
still feel very familiar."

What I take away from this:
The changes to EVE5 are probably even bigger than between EVE1 and EVE2, 
so I probably will support BT822 with a new library instead of trying to 
fit EVE5 support into my current library.

I expect the API will move away from 22 bit adressing to 29 or 30 bit 
adressing and of course the memory map will be completely different.
I also wouldn't be surprised if RAM_CMD is doubled as well.

And I wonder what all the SDRAM is supposed to be used for.
A frame buffer for 1920x1200 would take 9MiB and there are likeley two 
to switch between display lists, another 9MiB for the video input.
That still leaves 100MiB, wow.

Anyways, I will keep an eye out for the release of the datasheet and the 
programming manual as well as for BT822 hardware to buy.

von Paul (m_e99999)


Lesenswert?

Hallo Rudolph,
ich brauche mal etwas Unterstützung. Im Forum finde ich leider nichts.

Ich will zwei benutzerdefinierte Fonts auf einen BT817 schreiben. der 
erste Font funktioniert ohne Probleme. Den zweiten Font habe ich wie im 
Forum beschrieben erstellt.

###############

Will man zwei Fonts benutzen muss man also erstmal ein FLASH Image
generieren, so etwa mit Font1.glyph, Font1.xfont und irgendeiner anderen
Datei.
Dann die Adresse an der die andere Datei landet aufschreiben, mit dieser
Adresse den nächsten Font konvertieren und wieder von vorne.

###############


Die Dummy-Datei bringt

###############

default-fl.blob                       : 0     : 4096
aptos-semibold_200_ASTC.glyph         : 4096  : 91392
aptos-semibold_200_ASTC.xfont         : 95488 : 264
aptos-semibold_200_ASTC.xfont.padding : 95752 : 56
DUMMY.txt                             : 95808 : 0

##############


Mein Code funktioniert nicht

##############

EVE_cmd_inflate(0, font_1, sizeof(font_1));
EVE_memWrite32(95488UL + 32UL, 4096UL);

EVE_cmd_inflate(95808UL, font_2, sizeof(font_2));
EVE_memWrite32(95808UL + 39040UL + 32UL, 95808UL);

##############

Ich bin am verzweifeln und wäre über einen Hinweis sehr dankbar.

von Rudolph R. (rudolph)


Lesenswert?

Moin,

>Will man zwei Fonts benutzen muss man also erstmal ein FLASH Image
generieren,

Jain, kann man machen, aber das FLASH Image ist ja eigenlich für das 
externe Flash am BT817 gedacht und ich schreibe das in meinem Beispiel 
ja auch per EVE_cmd_flashupdate() erstmal ins Flash.

Und EVE_cmd_inflate() benutze ich da nur weil sich Fonts zum einen so 
gut komprimieren lassen, zum anderen kommt CMD_INFLATE nicht damit klar 
wenn die Daten nicht ganz korrekt sind.

Der Asset Compressor in EAB kann auch archive erzeugen in denen wie bei 
den Flash-Utilities mehrere Dateien hinternander gehängt sind.

Die Flash Utilities machen dann eben noch mehr, die "default-fl.blob" 
Datei ist der Flash-Treiber für den BT817.
Und dann kümmert sich das auch noch um das korrekte Alignment im Flash.

Wobei der Asset Compressor die Offsets zu den Datein nicht so 
komfortabel auswirft wie die Flash Utilities.

>so etwa mit Font1.glyph, Font1.xfont und irgendeiner anderen Datei.

Das können auch mehrere .glyph und .xfont sein und die seltsame .padding 
ist nur für das Alignment im Flash.

Paul schrieb:
> Dann die Adresse an der die andere Datei landet aufschreiben, mit dieser
> Adresse den nächsten Font konvertieren und wieder von vorne.

Nicht unbedingt, wenn man eine .glyph und eine .xfont zusammen in ein 
Flash-Image wirft, dann wird die .xfont automatisch angepasst.
Wenn man den Font allerdings aus dem RAM_G verwenden möchte, dann muss 
man den Offset in der .xfont selber anpassen - was Du ja auch machst.
Also das anpassen der Adressen beim Konvertieren ist nur notwendig, wenn 
man das wirklich direkt wie es ist in das RAM_G schreiben und so 
verwenden will ohne noch anzupassen.

Paul schrieb:
> Mein Code funktioniert nicht
>
> ##############
>
> EVE_cmd_inflate(0, font_1, sizeof(font_1));
> EVE_memWrite32(95488UL + 32UL, 4096UL);
>
> EVE_cmd_inflate(95808UL, font_2, sizeof(font_2));
> EVE_memWrite32(95808UL + 39040UL + 32UL, 95808UL);

Ok, was funktioniert denn da nicht?
Das entpackt zwei Images in das RAM_G, das eine an Adresse Null, das 
andere dahinter.
Dann werden noch die Offsets in den .xfont Dateien angepasst.

Das sieht soweit fast richtig aus, der Offset der zweiten .xfont wird 
aber auf den Anfang des zweiten Images gesetzt, wenn das auch ein 
Flash-Image ist sind doch die ersten 4096 Bytes wieder belegt.

Und das benutzt die Fonts doch aber noch nicht.

von Paul (m_e99999)


Lesenswert?

Danke für die schnelle Antwort!

ich habe deinen Hinweis mit dem Offset angepasst.
EVE_cmd_inflate(95808UL, font_2, sizeof(font_2));
EVE_memWrite32(95808UL + 39040UL + 32UL, 4096UL + 95808UL);

bekomme aber noch immer keine Ausgabe für font_2. Beide Fonts 
funktionieren - ich habe das Ausprobiert indem ich font_2 testweise an 
Adresse 0 beginnen lasse.

EVE_cmd_inflate(0, font_2, sizeof(font_2));
EVE_memWrite32(39040UL + 32UL, 4096UL);


Mein Programm ist so Aufgebaut:

define MEM_FONT_1  95488UL
define MEM_FONT_2  39040UL


EVE_color_rgb_burst(BLACK);

EVE_cmd_setfont2_burst(12,MEM_FONT_1,200);

EVE_cmd_text_burst(420, 70, 12, EVE_OPT_RIGHTX, "DATEN°");

EVE_color_rgb_burst(BLACK);

EVE_cmd_setfont2_burst(13,MEM_FONT_2,24);

EVE_cmd_text_burst(20, 20, 13, 0, "ÜBERSCHRIFT);



font_1

default-fl.blob                       : 0     : 4096

aptos-semibold_200_ASTC.glyph         : 4096  : 91392

aptos-semibold_200_ASTC.xfont         : 95488 : 264

aptos-semibold_200_ASTC.xfont.padding : 95752 : 56


font_2

default-fl.blob                      : 0     : 4096

aptos-semibold_24_ASTC.glyph         : 4096  : 34944

aptos-semibold_24_ASTC.xfont         : 39040 : 309

aptos-semibold_24_ASTC.xfont.padding : 39349 : 11

von Paul (m_e99999)


Lesenswert?

Hallo Rudolph,

ich konnte es jetzt lösen.
Man musste zum MEM_FONT_2 auch 95808UL addieren.

Vielen Dank für die Unterstützung - der Tip mit dem Offset brachte mich 
auf die richtige Spur.

von Rudolph R. (rudolph)


Lesenswert?

Prima.

Aber um das noch mal zu wiederholen, mit einem einzigen Flash-Image für 
alle Fonts zusammen wäre das ein klein wenig weniger fummelig. :-)

von Paul (m_e99999)


Lesenswert?

Alle Fonts in einem Image würde mir auch besser gefallen. Ich habe es 
bis jetzt aber noch nicht hinbekommen. Gibt es dafür eine Anleitung?

von Rudolph R. (rudolph)


Lesenswert?

Na, Du machst das gleiche was Du jetzt auch machst, nur ziehst Du eben 
mehr als eine .glyph und .xfont im EAB in das Flash-Image.

von Ufuk (horizon)


Lesenswert?

Hallo Rudolph,

ich habe gerade mit EVE und Co. angefangen. Zum spielen habe ich mir die 
"VM810C EVE2 CREDIT CARD MODULE" besorgt. Eine ESP32 Wroom 32D (China 
Shop) verorgt das Display mit Daten. Ich habe diesen Beitrag von Anfang 
bis fast zum Ende durchgelesen und teilweise einige Beiträge sogar 
mehrmals.
Die Datenblätter FT81x, Programmer guide und noch andere. EVE Asset 
Builder und EVE Screen Editor installiert und versucht einige Sachen 
parallel nachzuvollziehen. Ich bekomme auch einige Beispiel-Projekte zum 
laufen, soll heißen, die ESP und das Display verstehen sich und ich habe 
entsprechn eine Anzeige. Leider scheitere ich an den einfachsten Dingen 
wie z.B. ein etwas größeres Bild zu laden/anzuzeigen (statisch) ohne 
jeden schnick schnack.

Rudolph R. schrieb:
> Dann einfach in TFT_init() laden:
>
> EVE_cmd_loadimage(MEM_BIGPIC, EVE_OPT_NODL, bigpic, sizeof(bigpic));
>
> Das sind 2 Byte pro Pixel, bei 800x480 also mal eben 768000 Bytes.
> MEM_BIGPIC sollte also nicht zu weit hinten im Speicher liegen.
>
> Und anzeigen mit:
>
> EVE_cmd_setbitmap(MEM_BIGPIC, EVE_RGB565, 800, 480);
> EVE_cmd_dl(DL_BEGIN | EVE_BITMAPS);
> EVE_cmd_dl(VERTEX2F(0, 0));
> EVE_cmd_dl(DL_END);

Ich versteh ehrlich gesagt nicht wo das Bild in deinem Beispiel geladen 
wird. RAM_G (Speicher 1024*1024 Byte), alle anderen Speicher wären ja zu 
klein. Ich habe aus dem Datenblatt und in ESE nachvollziehen können das 
der RAM_G bei 0x00000000 anfängt und bis 0x000FFFFF (1.048.575). Wenn 
ich aus deinem Beispiel Projekt "EVE_Test_Arduino_PlatformIO" tft.c
1
/* memory-map defines */
2
#define MEM_FONT 0x000f7e00 /* the .xfont file for the UTF-8 font is copied here */
3
#define MEM_LOGO 0x000f8000 /* start-address of logo, needs 6272 bytes of memory */
4
#define MEM_PIC1 0x000fa000 /* start of 100x100 pixel test image, ARGB565, needs 20000 bytes of memory */
5
6
#define MEM_DL_STATIC (EVE_RAM_G_SIZE - 4096) /* 0xff000 - start-address of the static part of the display-list, upper 4k of gfx-mem */
anschaue, dachte ich mir ok MEM_PIC1 fängt bei 0x000fa000 (1.024.000) an 
und braucht 20000 bytes, also ist der Speicher am Ende (1.044.000) Rest 
(4.575) da passt kein Bild mehr rein.
Also setzte ich
1
 #define MEM_BIGPIC 0x00000000
 an den Anfang.
Trotzdem kein Bild. Ich habe mit EAB unterschiedliche Bilder in der 
Größenordnung von 50x50 bis ca. 400x200 convertiert. Laut ESE z.B. sieht 
es wie folgt aus. Size: 165888 Compressed: 67902 w:384 h:216 Line 
Stride:768
1
CLEAR(1, 1, 1)
2
BITMAP_HANDLE(0)
3
CMD_SETBITMAP(0, ARGB1555, 384, 216)
4
BEGIN(BITMAPS)
5
VERTEX2F(3504, 2064)
6
END()
BITMAP_HANDLE: 6%   RAM_DL: 0%   RAM_G: 15%

Übrigens, ich verändere nichts an dem Code. Ergänze lediglich im 
(tft_data files werden natürlich entsprechend angepasst)
1
void TFT_init(void)
2
{
3
.
4
.
5
EVE_cmd_loadimage(MEM_BIGPIC, EVE_OPT_NODL, bigpic, sizeof(bigpic));
6
}
und
1
void initStaticBackground(void)
2
{
3
    /* display the logo */
4
    EVE_color_rgb(WHITE);
5
    EVE_cmd_dl(DL_BEGIN | EVE_BITMAPS);
6
    EVE_cmd_setbitmap(MEM_LOGO, EVE_ARGB1555, 56U, 56U);
7
    EVE_cmd_dl(VERTEX2F(EVE_HSIZE - 58, 5));
8
    EVE_cmd_dl(DL_END);
9
10
    /* display BigPic
11
    EVE_cmd_setbitmap(MEM_BIGPIC, EVE_RGB565, 384, 216);
12
    EVE_cmd_dl(DL_BEGIN | EVE_BITMAPS);
13
    EVE_cmd_dl(VERTEX2F(EVE_HSIZE/2 - 192, 150));
14
    EVE_cmd_dl(DL_END);
15
}

Was mache falsch? Was übersehe ich?

von Rudolph R. (rudolph)


Lesenswert?

Hallo,

spontan würde ich sagen, Du versuchst konvertierte Daten mit 
CMD_LOADIMAGE zu laden.
Das CMD_LOADIMAGE ist aber für Rohdaten in .jpg oder .png Format.

Wenn Du in RGB565 konvertierst kannst Du in EAB den AssetCompressor 
benutzen um die resultieren binär Daten etwas zu packen.
Diese Daten werden dann mit CMD_INFLATE verschickt und in RAM_G 
entpackt.

von Ufuk (horizon)


Angehängte Dateien:

Lesenswert?

Hallo,

das wundert mich jetzt, weil der EAB bei der Validierung das hier 
ausspuckt.
1
Validating wallpaper3_320x180_RGB565_Converted.png...
2
3
Validated File: wallpaper3_320x180_RGB565_Converted.png
4
Compatible    : YES
5
Optimized File: N/A
6
Output Format : RGB565
7
RAM_G Usage   : 112.5 KB
8
9
The image wallpaper3_320x180_320x180_RGB565_Converted.png is compatible with cmd_loadimage and BT81X series.
10
DONE!
OK hab mich da beirren lassen.
Also den compress kann man nur über die console anwenden.
Output File: wallpaper3_320x180_RGB565.bin (58.2 KB)
Format     : RGB565
Width      : 320
Height     : 180
Compressed : yes

mit CMD_INFLATE bekomme ich etwas wie ein Bild aufs Display. Hänge an 
wie es aussehen sollte und wie es tatsächlich aussieht.

wallpaper, Bild aus dem Internet runtergeladen und einfach nur auf 
320x180px gespeichert

wallpaper2, ohne EXIF(Irfanview)

wallpaper3, ohne EXIF und 8Bit-Farbtiefe(Irfanview)

Bei allen das gleiche Ergebnis.
1
void TFT_init(void)
2
{
3
 .
4
 .
5
 .
6
        EVE_cmd_inflate(MEM_LOGO, logo, sizeof(logo)); /* load logo into gfx-memory and de-compress it */
7
        EVE_cmd_loadimage(MEM_PIC1, EVE_OPT_NODL, pic, sizeof(pic));
8
        EVE_cmd_inflate(MEM_WALL, wallpaper, sizeof(wallpaper));
9
10
11
        initStaticBackground();
12
    }
13
}
14
15
void initStaticBackground(void)
16
{
17
    .
18
    .
19
    /* display BigPic */
20
    EVE_cmd_dl(DL_BEGIN | EVE_BITMAPS);
21
    EVE_cmd_setbitmap(MEM_WALL, EVE_ARGB1555, 320U, 180U);
22
    EVE_cmd_dl(VERTEX2F(EVE_HSIZE/2 - 160, 150));
23
    EVE_cmd_dl(DL_END);
24
    .
25
    .

Außerdem verstehe ich nicht warum nurt etwas auf dem Display erscheint , 
wenn ich bei setbitmap(...,EVE_ARG1555,...) eintrage, obwohl das Bild 
mit RGB565 convertiert/erzeugt wird. Stehe aufm Schlauch...

: Bearbeitet durch User
von Rudolph R. (rudolph)


Lesenswert?

Welche Version vom EAB benutzt Du?

Edit: ich habe mir einfach mal das wallpaper3_320x180.jpg da oben 
gegriffen, in EAB umgewandelt in RGB565, Dithering ausgeschaltet, das 
macht nur Rauschen.
Dann in EAB mit dem Asset Compressor gezipped und mit dem BIN2C Tool im 
EAB in eine .c gewandelt.
Das Array hat 43091 Byte.

Das habe ich mein aktuelles Spielprojekt eingebaut.

Da ich da noch ein anderes Bild dran habe an Adress Null
musste ich das woanders hin entpacken:
EVE_cmd_inflate(0x16f00, wallpaper, sizeof(wallpaper));

Und dann habe ich das zusätzlich zu dem anderen Bild angezeigt:
1
        EVE_color_rgb(WHITE);
2
        EVE_cmd_dl(DL_BEGIN | EVE_BITMAPS);
3
        EVE_cmd_setbitmap(0, EVE_ARGB4, 288U, 163U);
4
        EVE_cmd_dl(VERTEX2F(20, 100));
5
6
        EVE_cmd_setbitmap(0x16f00, EVE_RGB565, 320U, 180U);
7
        EVE_cmd_dl(VERTEX2F(320, 100));
8
9
        EVE_cmd_dl(DL_END);

Das Display hat einen FT813.

Edit2: reich doch sonst mal die tft.c, tft_data.c und tft_data.h rüber.

: Bearbeitet durch User
von Ufuk (horizon)


Angehängte Dateien:

Lesenswert?

Guten morgen,
ich benutze die neueste EAB v2.12.2 hier gibt es keine Option für 
compress. Aber über die console kann man die Option mit -z ausführen.
Zum testen habe ich mir eine ältere Version runtergeladen v2.8.0

EVE Chip: FT81X Output Format: RGB565 Compressed=1 Dithering=0

Anschließend die erzeugte .bin mit bin2c convertiert und in die 
tft_data.c kopiert. Ergebnis ist genau so wie vorher...

Also mal ein/zwei Verständnisfragen:
EAB 2.8.0 & 2.12.2 erzeugen mehrere Dateien bei Compress=1

.bin

.binh --> die hab ich direkt mit CMD_INFLATE probiert


bei Compress=0 gibt es

.raw

.rawh --> die hatte ich auch mit CMD_LOADIMAGE probiert (kein Bild)


Mit der .binh hatte ich zumindest auch das verzerte(Bild ähnl.) Gebilde.
Warum muss ich die .bin nochmal mit bin2c jagen, obwohl doch anscheinend 
EAB die Aufgabe auch durchführt. Oder hab ich ein Denkfehler?

Welche Dateilänge gibt man an? 320x180 -> 2 Byte/px 640x180=115200
Bin2c gibt die comprimierte größe an oder?
1
/*
2
  C-file generated by Bin2C
3
  Compiled:    Oct 11 2024 at 10:28:35
4
5
  Copyright (C) 2018
6
  Segger Microcontroller GmbH
7
  www.segger.com
8
9
  The Embedded Experts
10
*/
11
12
static const unsigned char _acwallpaper_320_320x180_RGB565[43101UL + 1]

Nun denn, es wird nicht besser. Ich packe mal die gewünschte Datein 
rein.
Danke für Unterstützung.

von Ufuk (horizon)


Lesenswert?

Ich habs jetzt hinbekommen....

EVE_cmd_setbitmap(MEM_WALL, EVE_RGB565, 320U, 180U);

Ich hatte gestern bereits mit EVE_RGB565 probiert und es ging nicht, 
heute geht es (naja zugegeben hatte ich die Bilder nicht mit bin2c 
konvertiert sondern die .binc genommen).
Also EVE_ARGB1555 funktioniert nicht, eigl. auch klar, weil das Bild mit 
RGB565 konvertiert wird. OMG
Manchmal hat man einfach Tomaten auf den Augen.

Naja, vielleicht hilft es dem oder den anderen die auch solche Probleme 
haben.

: Bearbeitet durch User
von Rudolph R. (rudolph)


Angehängte Dateien:

Lesenswert?

Moin,

Ufuk schrieb:
> ich benutze die neueste EAB v2.12.2 hier gibt es keine Option für
> compress.

Stimmt, die Option habe ich auch nicht mehr.

> Anschließend die erzeugte .bin mit bin2c convertiert und in die
> tft_data.c kopiert. Ergebnis ist genau so wie vorher...

Also das sollte eigentlich funktionieren.

> Also mal ein/zwei Verständnisfragen:
> EAB 2.8.0 & 2.12.2 erzeugen mehrere Dateien bei Compress=1
>
> .bin
> .binh --> die hab ich direkt mit CMD_INFLATE probiert

Mal davon ab, dass die .xxxh keine Header File sind, die Zahlenwüste 
sollte sich eigentlich in ein Array packen lassen.

Aber diese Dateien benutze ich nie.

> .raw
> .rawh --> die hatte ich auch mit CMD_LOADIMAGE probiert (kein Bild)

Das sind unkomprimierte Rohdaten als Text, damit kann weder 
CMD_LOADIMAGE was anfangen, noch CMD_INFLATE.
Die müsste man direkt in den Speicher schreiben und dafür habe ich 
EVE_memWrite_flash_buffer().
Als .jpg / .png oder auch konvertiert und komprimiert sind es eben nur 
weniger Daten, das spart Platz im Controller und kostet weniger Zeit 
beim Übertragen per SPI.
Der Unterschied zwischen selber konvertieren und CMD_LOADIMAGE ist vor 
allem die Kontrolle über das Format das dabei heraus kommt.

Ich habe die Daten für das wallpaper array ersetzt, probier das mal mit 
CMD_INFLATE.

> Mit der .binh hatte ich zumindest auch das verzerte(Bild ähnl.) Gebilde.
> Warum muss ich die .bin nochmal mit bin2c jagen, obwohl doch anscheinend
> EAB die Aufgabe auch durchführt. Oder hab ich ein Denkfehler?

Ich benutze den in EAB eingebauten "ASSET COMPRESSOR", der erzeugt keine 
.xxxh Datei, da kommt eine .zlib oder .zopfli Datei raus und die sind 
Binär.
Wobei die zopfli Lib normalerweise besser komprimiert.

> Welche Dateilänge gibt man an? 320x180 -> 2 Byte/px 640x180=115200

Da hätte ich weiterlesen sollen bevor ich die tft_data.c verändert habe. 
:-)
Das Array muss natürlich die Länge der Daten haben.

> Bin2c gibt die comprimierte größe an oder?/*

Jain, die Länge der konvertierten Binär-Daten, ob nun komprimiert oder 
nicht.

>   C-file generated by Bin2C
>   Compiled:    Oct 11 2024 at 10:28:35
>   Copyright (C) 2018
>   Segger Microcontroller GmbH

In EAB ist ein BIN2C Tool mit eingebaut.
Nicht, das andere Tools nicht funktionieren, das ist einfach 
komfortabler zu nutzen direkt aus EAB heraus, statt erst eine Shell 
öffnen zu müssen.

> static const unsigned char _acwallpaper_320_320x180_RGB565[43101UL + 1]

Und das wäre richtig gewesen.

Die leicht abweichenden Daten die ich habe mit anderer Länge kommen wohl 
daher das ich die angehängte .jpg verwendet habe und Du ein .png benutzt 
hast.
Kann es sein, dass Dein .png einen transparenten Hintergrund hat?

Ein .png hier anzuhängen war allerdings zumindest als ich das zuletzt 
probiert habe nicht so hilfreich, aus irgendeinem Grund hat die 
Forens-Software die Datei verändert.

von Ufuk (horizon)


Angehängte Dateien:

Lesenswert?

Puh, wo soll ich anfangen...

Auf jeden Fall vielen Dank für die Erleuchtung, hab mich wohl 
tatsächlich im Kreis gedreht und die Ausfahrt nicht gefunden.

Jetzt wird mir so einiges klar.

Bin jetzt wieder auf die EAB 2.12.2 gewechselt, folgendes ist mir 
aufgefallen, wenn ich unter
1. "image utilities" meine Bilder konvertiere (ohne compress) bekomme 
ich nur Dateien wie: .raw, .rawh, .json etc.
diese lassen sich zwar mit dem
2. "asset compressor" in .zlib oder .zopfli "zippen" und anschließend 
mit dem
3. "bin2c" in header Dateien umwandeln, aber die Bilder werden nicht 
angezeigt.

Rudolph R. schrieb:
> In EAB ist ein BIN2C Tool mit eingebaut.
> Nicht, das andere Tools nicht funktionieren, das ist einfach
> komfortabler zu nutzen direkt aus EAB heraus, statt erst eine Shell
> öffnen zu müssen.

Ist mir vorher garnicht aufgefallen, wie gesagt, Tomaten auf den Augen 
:)

Also im Schritt 1 mit compress option (nur console) konvertieren. So 
erhält man .bin, .binh etc. Diese wiederum müssen praktisch gar nicht 
mehr den Schritt 2 durchlaufen, weil die bereits komprimiert sind. Wenn 
ich die "gezippten" Dateien nun mit bin2c konvertiere wird auch kein 
Bild dargestellt. Noch ein kleiner Nebeneffekt, in dem Fall wurde die 
Datei sogar ca. 12 bytes größer als ohne "zippen".

Nochmal kurz zusammengefasst:
1. "image utilities" (Command prompt)
1
eab_tools img_cvt -i "Dateipfad" -f 7 -o "Zielpfad" -d -z
2
// -f 7 = RGB565
3
// -d ohne Dithering
4
// -z compress
2. "bin2c" >> Datei.h
Den Inhalt[und größe] in die tft_data.c kopieren..
1
const uint8_t <dateiname>[12942] PROGMEM = 
2
{
3
    120, 218,   1, 131,  50, 124,.....
4
};
..und in tft_data.h eintragen.

Eigentl. ganz einfach ;)

Rudolph R. schrieb:
> Kann es sein, dass Dein .png einen transparenten Hintergrund hat?

Ich glaube nicht, ist ein .jpg gewesen. Soweit ich weiß können nur .png 
transparente Hintergründe haben.

Rudolph R. schrieb:
> Ein .png hier anzuhängen war allerdings zumindest als ich das zuletzt
> probiert habe nicht so hilfreich, aus irgendeinem Grund hat die
> Forens-Software die Datei verändert.

Ja, das stimmt. Heute habe ich es auch runtergeladen und die Datei war 
nur noch halb so groß.
Ich hänge mal die wallpaper nochmal an (so wie aus dem Netz ohne 
Manipulation) es sollte 640x360 und 28,6KB groß sein.

von Rudolph R. (rudolph)


Lesenswert?

Ufuk schrieb:
> Also im Schritt 1 mit compress option (nur console) konvertieren. So
> erhält man .bin, .binh etc. Diese wiederum müssen praktisch gar nicht
> mehr den Schritt 2 durchlaufen, weil die bereits komprimiert sind. Wenn
> ich die "gezippten" Dateien nun mit bin2c konvertiere wird auch kein
> Bild dargestellt. Noch ein kleiner Nebeneffekt, in dem Fall wurde die
> Datei sogar ca. 12 bytes größer als ohne "zippen".

Man kann sich so zwar den zweiten Schritt sparen, aber dafür hat man 
auch erheblich mehr Getippe. :-)
Und ich sehe da keine Zopfli Option.

wallpaper3_320x180_320x180_RGB565.raw - 115200
wallpaper3_320x180_320x180_RGB565.zlib - 43091
wallpaper3_320x180_320x180_RGB565.zopfli - 40692

Das schlägt sie 12 Bytes knapp. :-)

Ufuk schrieb:
> Ich glaube nicht, ist ein .jpg gewesen. Soweit ich weiß können nur .png
> transparente Hintergründe haben.

Siehe Deinen ersten Post:
"Validating wallpaper3_320x180_RGB565_Converted.png..."

von Ufuk (horizon)


Lesenswert?

Rudolph R. schrieb:
> Siehe Deinen ersten Post:
> "Validating wallpaper3_320x180_RGB565_Converted.png..."

Ja, das ist etwas verwirrend. Das war die log von EAB. Hochgeladen habe 
ich eine .jpg


Und wenn ich das richtig verstehe, jagst du die .raw durch den Asset 
compressor?
Muss ich gleich mal testen.

von Ufuk (horizon)


Lesenswert?

Ja, du hast natürlich Recht. Ich muss mich mit dem Konvertieren näher 
beschäftigen. Die .raw Dateien lassen sich mit asset compressor "zippen" 
und diese kann man mit bin2c umwandeln und mit CMD_INFLATE in den RAM_G 
laden. War diese Zusammenfassung korrekt?

Ich habe noch ein bischen mehr gespielt, und zwar habe ich ein Bild mit 
paint.net in vier Ebenen getrennt (Hintergrund Transparent) und vier 
einzelne .png Bilder gespeichert.
Diesmal mit ARGB1555 konvertiert (wegen transparens). Ich wollte die 
vier einzelbilder auf dem Display wieder als ein Bild darstellen lassen. 
Mit dem ESE funktioniert das:
1
Coprocessor:
2
CLEAR(1, 1, 1)
3
BITMAP_HANDLE(0)
4
CMD_SETBITMAP(0, ARGB1555, 499, 224)
5
BEGIN(BITMAPS)
6
VERTEX2F(800, 1600)
7
END()
8
BITMAP_HANDLE(1)
9
CMD_SETBITMAP(223552, ARGB1555, 499, 224)
10
BEGIN(BITMAPS)
11
VERTEX2F(800, 1600)
12
END()
13
BITMAP_HANDLE(2)
14
CMD_SETBITMAP(447104, ARGB1555, 499, 224)
15
BEGIN(BITMAPS)
16
VERTEX2F(800, 1600)
17
END()
18
BITMAP_HANDLE(3)
19
CMD_SETBITMAP(670656, ARGB1555, 499, 224)
20
BEGIN(BITMAPS)
21
VERTEX2F(800, 1600)
22
END()
und im Inspector (RAM_DL) steht es so:
1
Offset
2
(decimal)  Raw  Text
3
0  0x26000007  CLEAR(1, 1, 1)
4
1  0x05000000  BITMAP_HANDLE(0)
5
2  0x01000000  BITMAP_SOURCE(0)
6
3  0x29000000  BITMAP_SIZE_H(0, 0)
7
4  0x0803e6e0  BITMAP_SIZE(NEAREST, BORDER, BORDER, 499, 224)
8
5  0x28000000  BITMAP_LAYOUT_H(0, 0)
9
6  0x0707cce0  BITMAP_LAYOUT(ARGB1555, 998, 224)
10
7  0x1f000001  BEGIN(BITMAPS)
11
8  0x41900640  VERTEX2F(800, 1600)
12
9  0x21000000  END()
13
10  0x05000001  BITMAP_HANDLE(1)
14
11  0x01036940  BITMAP_SOURCE(223552)
15
12  0x29000000  BITMAP_SIZE_H(0, 0)
16
13  0x0803e6e0  BITMAP_SIZE(NEAREST, BORDER, BORDER, 499, 224)
17
14  0x28000000  BITMAP_LAYOUT_H(0, 0)
18
15  0x0707cce0  BITMAP_LAYOUT(ARGB1555, 998, 224)
19
16  0x1f000001  BEGIN(BITMAPS)
20
17  0x41900640  VERTEX2F(800, 1600)
21
18  0x21000000  END()
22
19  0x05000002  BITMAP_HANDLE(2)
23
20  0x0106d280  BITMAP_SOURCE(447104)
24
21  0x29000000  BITMAP_SIZE_H(0, 0)
25
22  0x0803e6e0  BITMAP_SIZE(NEAREST, BORDER, BORDER, 499, 224)
26
23  0x28000000  BITMAP_LAYOUT_H(0, 0)
27
24  0x0707cce0  BITMAP_LAYOUT(ARGB1555, 998, 224)
28
25  0x1f000001  BEGIN(BITMAPS)
29
26  0x41900640  VERTEX2F(800, 1600)
30
27  0x21000000  END()
31
28  0x05000003  BITMAP_HANDLE(3)
32
29  0x010a3bc0  BITMAP_SOURCE(670656)
33
30  0x29000000  BITMAP_SIZE_H(0, 0)
34
31  0x0803e6e0  BITMAP_SIZE(NEAREST, BORDER, BORDER, 499, 224)
35
32  0x28000000  BITMAP_LAYOUT_H(0, 0)
36
33  0x0707cce0  BITMAP_LAYOUT(ARGB1555, 998, 224)
37
34  0x1f000001  BEGIN(BITMAPS)
38
35  0x41900640  VERTEX2F(800, 1600)
39
36  0x21000000  END()
Einzeln werden die Bilder auf dem Display korrekt dargestellt, sobald 
eins dazu kommt gibt es eine "Suppe"
Ich habe u.a folgendes probiert...
1
    /* display 1/4 (Linie) */
2
    EVE_color_rgb(WHITE);  
3
    EVE_cmd_dl(DL_BEGIN | EVE_BITMAPS);
4
    EVE_cmd_setbitmap(MEM_SHLI, EVE_ARGB1555, 499U, 224U);
5
    EVE_cmd_dl(VERTEX2F(10, 70));
6
    EVE_cmd_dl(DL_END);    
7
    /* display 2/4 (Text oben)*/
8
    EVE_color_rgb(WHITE);
9
    EVE_cmd_dl(DL_BEGIN | EVE_BITMAPS);
10
    EVE_cmd_setbitmap(MEM_SHSO, EVE_ARGB1555, 499U, 224U);
11
    EVE_cmd_dl(VERTEX2F(10, 70));
12
    EVE_cmd_dl(DL_END);
13
    /* display 3/4 (Zahnrad)*/
14
    EVE_color_rgb(WHITE);
15
    EVE_cmd_dl(DL_BEGIN | EVE_BITMAPS);
16
    EVE_cmd_setbitmap(MEM_SHZA, EVE_ARGB1555, 499U, 224U);
17
    EVE_cmd_dl(VERTEX2F(10, 70));
18
    EVE_cmd_dl(DL_END);
19
    /* display 2/4 (Text unten)*/
20
    EVE_color_rgb(WHITE);
21
    EVE_cmd_dl(DL_BEGIN | EVE_BITMAPS);
22
    EVE_cmd_setbitmap(MEM_SHHO, EVE_ARGB1555, 499U, 224U);
23
    EVE_cmd_dl(VERTEX2F(10, 70));
24
    EVE_cmd_dl(DL_END);

Ich dachte ich könnte die vier Einzelbilder einfach übereinander legen.
Verstehe auch noch nicht ganz wie ich die ESE Anweisungen mit deiner Lib 
umsetzen kann. Ich habe auch schon versucht mit BITMAP_HANDLE(0..3)

EVE_cmd_dl(BITMAP_HANDLE(0));
oder
BITMAP_HANDLE(0);
oder
EVE_cmd_dl(DL_BITMAP_HANDLE);

da steige ich nicht wirklich durch.

von Rudolph R. (rudolph)


Lesenswert?

Hmm, sowas habe ich noch gar nicht probiert.
Aber ja, im Grunde genommen werden die einfach übereinander gelegt.

Das mit dem Bitmap-Handle ist dabei unnötig und man muss auch nicht alle 
Kommandos wiederholen:
1
    EVE_color_rgb(WHITE);  
2
    EVE_cmd_dl(DL_BEGIN | EVE_BITMAPS);
3
4
    /* display 1/4 (Linie) */
5
    EVE_cmd_setbitmap(MEM_SHLI, EVE_ARGB1555, 499U, 224U);
6
    EVE_cmd_dl(VERTEX2F(10, 70));
7
8
    /* display 2/4 (Text oben)*/
9
    EVE_cmd_setbitmap(MEM_SHSO, EVE_ARGB1555, 499U, 224U);
10
    EVE_cmd_dl(VERTEX2F(10, 70));
11
12
    /* display 3/4 (Zahnrad)*/
13
    EVE_cmd_setbitmap(MEM_SHZA, EVE_ARGB1555, 499U, 224U);
14
    EVE_cmd_dl(VERTEX2F(10, 70));
15
16
    /* display 2/4 (Text unten)*/
17
    EVE_cmd_setbitmap(MEM_SHHO, EVE_ARGB1555, 499U, 224U);
18
    EVE_cmd_dl(VERTEX2F(10, 70));
19
20
    EVE_cmd_dl(DL_END);

Also was ESE da treibt ist nicht optimal, der geht das einfach Zeile für 
Zeile durch ohne die vorherigen Zeilen zu berücksichtigen.

Aber das hier:
2  0x01000000  BITMAP_SOURCE(0)
3  0x29000000  BITMAP_SIZE_H(0, 0)
4  0x0803e6e0  BITMAP_SIZE(NEAREST, BORDER, BORDER, 499, 224)
5  0x28000000  BITMAP_LAYOUT_H(0, 0)
6  0x0707cce0  BITMAP_LAYOUT(ARGB1555, 998, 224)

Wird vom Kommando co-processor generiert aus CMD_SETBITMAP.
Also man könnte in dem Fall die resultierende Display-Liste optimieren 
indem man nicht CMD_SETBITMAP verwendet, sondern die resultierenden 
Kommandos, dabei aber den Satz nur einmal und für das zweite und 
folgende Bild nur noch BITMAP_SOURCE mit der jeweils passenden Adresse.

Das ändert nur alles nichts am Ergebnis, der Unterschied ist nur wie 
viel in der Display Liste landet um das Gleiche zu machen.

Ufuk schrieb:
> Einzeln werden die Bilder auf dem Display korrekt dargestellt, sobald
> eins dazu kommt gibt es eine "Suppe"

Pack die .png doch bitte mal in ein .zip und häng die an, damit ich das 
ausprobieren kann.
Es ist durchaus möglich, dass das Überlagern von Bildern in ESE anders 
funktioniert als auf dem Display, das würde ich dann aber als Fehler in 
ESE deklarieren.

von Ufuk (horizon)


Angehängte Dateien:

Lesenswert?

ich habe mal alle Dateien u.a.
.png
.raw
.zopfli
.c
eingepackt.

Rudolph R. schrieb:
> EVE_color_rgb(WHITE);
>     EVE_cmd_dl(DL_BEGIN | EVE_BITMAPS);
>     /* display 1/4 (Linie) */
>     EVE_cmd_setbitmap(MEM_SHLI, EVE_ARGB1555, 499U, 224U);
>     EVE_cmd_dl(VERTEX2F(10, 70));
>     /* display 2/4 (Text oben)*/
>     EVE_cmd_setbitmap(MEM_SHSO, EVE_ARGB1555, 499U, 224U);
>     EVE_cmd_dl(VERTEX2F(10, 70));
>     /* display 3/4 (Zahnrad)*/
>     EVE_cmd_setbitmap(MEM_SHZA, EVE_ARGB1555, 499U, 224U);
>     EVE_cmd_dl(VERTEX2F(10, 70));
>     /* display 2/4 (Text unten)*/
>     EVE_cmd_setbitmap(MEM_SHHO, EVE_ARGB1555, 499U, 224U);
>     EVE_cmd_dl(VERTEX2F(10, 70));
>     EVE_cmd_dl(DL_END);

Hat leider nichts gebracht.
Hab ich das eigl. richtig gemacht?
1
/* memory-map defines */
2
#define MEM_SHLI 0x0001f488 /* sh_logo linie 499x224, ARGB1555, size = 265 bytes*/
3
#define MEM_SHSO 0x00020488 /* sh_logo soft 499x224, ARGB1555, size = 1643 bytes*/
4
#define MEM_SHZA 0x00021488 /* sh_logo zahnrad 499x224, ARGB1555, size = 2885 bytes*/
5
#define MEM_SHHO 0x00022488 /* sh_logo horizon 499x224, ARGB1555, size = 4425 bytes*/
Ich habe pro #define 4kB reserviert, ich bin mir nicht mehr ganz sicher, 
aber in den letzten Tagen/Wochen habe ich soviel Zeug gelesen. Ich 
meine mich errinnern zu können das die Adresse durch vier teilbar sein 
muss. Vielleicht verwechsele ich auch gerade was.

von Rudolph R. (rudolph)


Lesenswert?

Ufuk schrieb:
> Hab ich das eigl. richtig gemacht?/* memory-map defines */
> #define MEM_SHLI 0x0001f488 /* sh_logo linie 499x224, ARGB1555, size =
> 265 bytes*/
> #define MEM_SHSO 0x00020488 /* sh_logo soft 499x224, ARGB1555, size =
> 1643 bytes*/
> #define MEM_SHZA 0x00021488 /* sh_logo zahnrad 499x224, ARGB1555, size =
> 2885 bytes*/
> #define MEM_SHHO 0x00022488 /* sh_logo horizon 499x224, ARGB1555, size =
> 4425 bytes*/

Also wenn die Bilder 499x224 haben and ARGB1555 sind, dann werden die im 
RAM_G ja 499 x 244 x 2 Bytes haben -> 223552 / 0x36940 jeweils.
Die machen zusammen ja schon fast den Speicher komplett voll.

Die Adressen in ESE sind ja auch so, entsprechend müsste auch die RAM_G 
Auslastungsanzeige in ESE aussehen.

Der FT810 kann Farb-Bilder leider nur mit 16 Bit pro Pixel anzeigen.

CMD_LOADIMAGE konvertiert und CMD_INFLATE entpackt, der resultierende 
Speicherverbrauch im RAM_G ist bei gleicher Auflösung identisch.

von Ufuk (horizon)


Lesenswert?

Ja, 85% laut ESE

Danke für die Ausführung. Kaum macht man es richtig und schon 
funktioniert es. Verständnisproblem meinerseits.
Ich habe die komprimierten Werte eingetragen, war natürlich falsch.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.