Aus Raspberry Pi Geek 04/2014

Grafische Ausgaben mit dem C-Berry-Display (Seite 2)

Wenn Sie eine SD-Karte verbauen, deren Kapazität 2 GByte deutlich übersteigt, dann lohnt es sich, mit einem Aufruf von rasp-config das Dateisystem (filesystem) auf die gesamte SD-Karte auszudehnen. Nachdem das Betriebssystem läuft, bringen Sie es zunächst auf den neuesten Stand (Listing 1, Zeile 1 und 2). Dann installieren Sie die Pakete zum Entwickeln von C-Programmen (Zeile 3).

Listing 1

 

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install cpp gcc

Anschließend benötigen Sie den Treiber für den Grafikcontroller. Um die Bibliotheken später in eigenen Programmen zu referenzieren, sollten Sie den aktuellen Quellcode von der Webseite der Entwickler [4] herunterladen und selbst kompilieren. Nach dem Herunterladen und Entpacken rufen Sie im Programmverzeichnis die ersten drei Befehle aus Listing 2 auf. Damit stehen die Bibliotheken des Treibers auch für die Software des C-Berry bereit. Diese stellt der Hersteller des Displays zum Download bereit [5]. Hier gehen Sie ebenfalls so vor, dass Sie den Code nach dem Entpacken kompilieren (Listing 2, Zeile 5 bis 7).

Listing 2

 

$ tar xvfz bcm2835-1.36.tar.gz
$ cd bcm2835-1.36
$ ./configure & make & sudo make install
[...]
$ tar xvfz C-Berry.tar.gz
$ cd C-Berry/SW/tft_test
$ make

Ob alles funktioniert hat, zeigt ein Aufruf des Testprogramms ./tft_test. Das sollte im Abstand von fünf Sekunden Ausgaben auf dem Display anzeigen. Das Testprogramm initialisiert dazu zunächst das Display und ruft dann nacheinander Funktionen aus der Bibliothek examples.c auf.

Für das Programmieren eigener Anwendungen zeigt der Code in tft_test die grundsätzliche Vorgehensweise: Sie binden die Bibliotheken bcm2835.h, tft.h und RAIO8870.h ein und initialisieren das Display mit den Funktionen TFT_init_board(), TFT_hard_reset() und RAIO_init(). Dann rufen Sie die Funktionen zum Zeichnen auf und melden den Treiber mit bcm2835_close() wieder ab.

Eigene Programme

Die Funktionen in den Quelltexten des Hersteller liefern den Ausgangspunkt für ein neues Projekt: ein Programm, das Bilder auf dem Display anzeigt. Das hilft, die grundsätzliche Vorgehensweise zu verstehen. Listing 3 zeigt das C-Programm loadbmp.c, das ein Bild im Bitmap-Format lädt und auf dem Display anzeigt.

Listing 4 enthält die entsprechende Header-Datei. Die Bitmap muss 320 Pixel breit und 240 Pixel hoch sein sowie eine Farbtiefe von 24 Bit aufweisen. Der Bitmap-Header darf nicht komprimiert sein oder erweiterte Meta-Informationen beinhalten. Um beliebige Formate zu verarbeiten, müssten Sie zusätzliche Grafikbibliotheken einbinden.

Listing 3

 

/* Datei: loadbmp.c */
#include "loadbmp.h"
void CB_DepictBMP( char const *file_name  )
{
  uint16_t picture[1][ PICTURE_PIXELS ];
  Read_bmp2memory ( file_name, &picture[0][ PICTURE_PIXELS-1 ] );
  RAIO_Write_Picture ( &picture[0][0], PICTURE_PIXELS );
}
int main( int argc, char **argv )
{
  if(!argv[1]) return 1;
  char *my_filename = malloc(strlen(argv[1]));
  strcpy(my_filename,argv[1]);
  printf("using: %s\n", my_filename);
  if (!bcm2835_init()) return 1;
  TFT_init_board();
  TFT_hard_reset();
  RAIO_init();
  CB_DepictBMP( &my_filename[0] );
  bcm2835_close();
  return 0;
}

Listing 4

 

/* Datei: loadbmp.h */
#ifndef LOADBMP_H
#define LOADBMP_H
#include <bcm2835.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>
#include "tft.h"
#include "RAIO8870.h"
#include "bmp.h"
void CB_DepictBMP( char const *file_name );
#endif

Zum Übersetzen des Codes benötigen Sie noch die Quellen der Bibliotheken tft.c, RAIO8870.c und bmp.c sowie die dazugehörigen Header-Dateien aus dem Beispiel von Admatec. Mit dem Makefile aus Listing 5 kompilieren Sie dann das Programm. Das Binary erlaubt das Laden der Bitmap-Datei mit dem folgenden Aufruf:

$ ./loadbmp Dateiname

Listing 5

 

all: loadbmp
loadbmp: loadbmp.o tft.o RAIO8870.o bmp.o
  gcc loadbmp.o tft.o RAIO8870.o bmp.o -lbcm2835 -lrt -lm -o loadbmp
tft.o: tft.c tft.h
  gcc -Os -c tft.c
loadbmp.o: loadbmp.c loadbmp.h
  gcc -Os -c loadbmp.c
RAIO8870.o: RAIO8870.c RAIO8870.h
  gcc -Os -c RAIO8870.c
bmp.o: bmp.c bmp.h RAIO8870.h
  gcc -Os -c bmp.c
clean:
  rm -rf *o loadbmp

Übergeben Sie dem Programm keine Datei, so beendet es sich ohne weiteren Hinweis. Es besteht die Möglichkeit, diese Software aus einem Skript heraus aufzurufen und so auf dem Display Statusmeldungen als Bilder auszugeben. Abbildung 3 zeigt die Ausgabe der Bitmap-Datei, die später als Startbild für den Player dient.

Abbildung 3: Die Anzeige einer Bitmap-Datei auf dem Display.

Abbildung 3: Die Anzeige einer Bitmap-Datei auf dem Display.

In Listing 6 sehen Sie ein Skript auf Basis von ImageMagick, das beliebige Formate in passende Bitmap-Dateien konvertiert. Das Konvertieren von Bilddateien in entsprechende Bitmaps geschieht mit folgendem Aufruf:

$ ./convert_to_bmp.sh Dateiname

Die so erzeugte Datei gibt das Skript anschließend mit dem Programm aus Listing 3 auf dem Display aus. Der Code für das Anzeigen von Bitmaps aus den Listings sowie das Skript zum Konvertieren von Bilddateien in passende Bitmaps finden Sie auch online [7].

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 6 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben