MCURSES

Wechseln zu: Navigation, Suche

Von: Frank M. (ukw)

mcurses ist eine Mini-Curses-Programmbibliothek für Mikrocontroller, die weniger auf Effizienz sondern eher auf möglichst wenig Speicherplatz-Verbrauch getrimmt ist. So ist diese Bibliothek durchaus auf Mikrocontrollern wie z.B. ATmegas lauffähig.

mcurses läuft auf ATmegas, STM32F4xx, STM32F10x und sogar Z80 (SDCC-Compiler).

mcurses ist aber auch unter Unix bzw. Linux nutzbar, also ganz ohne Mikrocontroller. Dies kann ganz hilfreich bei der Entwicklung sein, da dies auf einem "richtigen" Rechner doch einfacher und schneller geht als mit einem µC. Nach der Programm-Entwicklung kann man dann seine eigene mcurses-Anwendung leicht auf den Mikrocontroller portieren - im allgemeinen ohne jegliche Änderungen.

Die mcurses-Funktionen lehnen sich so nah wie möglich an das Original CURSES bzw. NCURSES an, dennoch müssen teilweise Abstriche gemacht werden. Als Terminals werden lediglich VT102, VT200, VT320 oder VT400 unterstützt. Die meisten Terminal-Emulationsprogramme, die nach eigenen Angaben VT100- oder ANSI-kompatibel sind, genügen oft dem VT200-Standard und sind daher ausreichend. Ein optimal passendes Terminal-Emulationsprogramm ist PuTTY. Lokales ECHO sollte abgeschaltet sein. Die Tastatur sollte so eingestellt sein wie rechts gezeigt.

Keyboard-Einstellungen von PuTTY

Die Bibliothek benötigt ca. 1,9 KB an Flash-Speicher.

Hier ein kleiner Animationsfilm vom Demo-Programm: Mcurses.avi

Konstanten in mcurses.h[Bearbeiten]

   Konstante    Wert   Bemerkung
   TRUE           1    Zu verwenden für Funktionen, die TRUE oder FALSE erwarten, z.B. nodelay()
   FALSE          0    s.a. TRUE
   OK             0    Returnwert Okay: Nur aus Kompatibilitätsgründen zu (n)curses enthalten,
                       nicht verwendet (da fast alle Funktionen vom Type void sind)
   ERR          255    Returnwert Error: Siehe getch()
   LINES         24    Ist konfigurierbar über MCURSES_LINES, siehe mcurses-config.h
   COLS          80    Ist konfigurierbar über MCURSES_COLS, siehe mcurses-config.h

Über mcurses-config.h konfigurierbare Konstanten[Bearbeiten]

mcurses nutzt den AVR-UART. Standard-Baudrate ist 19200 Bd. Diese Konstante kann hier an die verwendete Baudrate angepasst werden:

       #define MCURSES_BAUD                19200L      // UART baudrate, use 115200 on STM32Fxx

Für STM32-Mikrocontroller kann zusätzlich noch die UART-Nummer eingestellt werden, nämlich 1-6 auf STM32F4xx, 1-3 auf STM32F10x. Der Wert wird für andere Mikrocontroller - wie z.B. ATmega - ignoriert.

       #define MCURSES_UART_NUMBER         0           // UART number on STM32Fxxx (1-6), else ignored

Die Anzahlen der Zeilen und Spalten sind fest eingestellt, nämlich auf Standard-VT200-Größe:

       #define MCURSES_LINES               24          // 24 lines
       #define MCURSES_COLS                80          // 80 columns

Die Werte können hier an die eingestellte Größe der verwendeten Terminal-Emulation angepasst werden.

Funktionen[Bearbeiten]

initscr[Bearbeiten]

Vor Version 2.2.0:

void initscr (void)
Initialisierung mcurses, siehe auch endwin()
Beispiel: initscr ();

Ab Version 2.2.0:

uint_fast8_t initscr (void)
Initialisierung mcurses, siehe auch endwin()
Beispiel: initscr ();

Der Return-Wert ist 1, wenn der ausgewählte UART erfolgreich initialisiert werden konnte.

move[Bearbeiten]

void move (uint_fast8_t y, uint_fast8_t x)
Cursor auf Zeile y, Spalte x positionieren, beginnend bei 0
Beispiel: move (10, 20);

attrset[Bearbeiten]

void attrset (uint_fast8_t attr)
Attribute setzen, können per '|' kombiniert werden
Beispiel: attrset (A_REVERSE | A_UNDERLINE | F_RED);
Mögliche Attribute:
       A_NORMAL        // normal
       A_UNDERLINE     // underline
       A_REVERSE       // reverse
       A_BLINK         // blink
       A_BOLD          // bold
       A_DIM           // dim
       A_STANDOUT      // standout (same as bold)
       F_BLACK         // foreground black
       F_RED           // foreground red
       F_GREEN         // foreground green
       F_BROWN         // foreground brown
       F_BLUE          // foreground blue
       F_MAGENTA       // foreground magenta
       F_CYAN          // foreground cyan
       F_WHITE         // foreground white
       F_YELLOW        // same as F_BROWN
       B_BLACK         // background black
       B_RED           // background red
       B_GREEN         // background green
       B_BROWN         // background brown
       B_BLUE          // background blue
       B_MAGENTA       // background magenta
       B_CYAN          // background cyan
       B_WHITE         // background white
       B_YELLOW        // same as B_BROWN

addch[Bearbeiten]

void addch (uint_fast8_t ch)
Zeichen ausgeben
Neben den alphanumerischen Zeichen können noch folgende Sonderzeichen ausgegeben werden:
       ACS_LRCORNER            DEC graphic 0x6a: lower right corner    Rechteck: Untere rechte Ecke
       ACS_URCORNER            DEC graphic 0x6b: upper right corner    Rechteck: Obere rechte Ecke
       ACS_ULCORNER            DEC graphic 0x6c: upper left corner     Rechteck: Obere linke Ecke
       ACS_LLCORNER            DEC graphic 0x6d: lower left corner     Rechteck: Untere linke Ecke
       ACS_PLUS                DEC graphic 0x6e: crossing lines            Rechteck: Kreuz
       ACS_HLINE               DEC graphic 0x71: horizontal line       Rechteck: Waagerechte Linie
       ACS_LTEE                DEC graphic 0x74: left tee              Rechteck: Linkes T
       ACS_RTEE                DEC graphic 0x75: right tee             Rechteck: Rechtes T
       ACS_BTEE                DEC graphic 0x76: bottom tee            Rechteck: Unteres T
       ACS_TTEE                DEC graphic 0x77: top tee               Rechteck: Oberes T
       ACS_VLINE               DEC graphic 0x78: vertical line         Rechteck: Senkrechte Linie
       ACS_DIAMOND             DEC graphic 0x60: diamond               Diamond
       ACS_CKBOARD             DEC graphic 0x61: checker board         Schachbrettmuster
       ACS_DEGREE              DEC graphic 0x66: degree symbol         Grad-Symbol: °
       ACS_PLMINUS             DEC graphic 0x66: plus/minus            Plus/Minus
       ACS_S1                  DEC graphic 0x6f: scan line 1           Waagerechte Linie 1
       ACS_S3                  DEC graphic 0x70: scan line 3           Waagerechte Linie 3
       ACS_S5                  DEC graphic 0x71: scan line 5           Waagerechte Linie 5
       ACS_S7                  DEC graphic 0x72: scan line 7           Waagerechte Linie 7
       ACS_S9                  DEC graphic 0x73: scan line 9           Waagerechte Linie 9
       ACS_LEQUAL              DEC graphic 0x79: less/equal            Kleiner/gleich
       ACS_GEQUAL              DEC graphic 0x7a: greater/equal         Größer/gleich
       ACS_PI                  DEC graphic 0x7b: Pi                    Pi
       ACS_NEQUAL              DEC graphic 0x7c: not equal             Ungleich
       ACS_STERLING            DEC graphic 0x7d: uk pound sign         Britisches Pfund
       ACS_BULLET              DEC graphic 0x7e: bullet                Bullet (Punkt auf mittlerer Höhe)
       Beispiele:
           addch ('H');
           addch ('e');
           addch ('l');
           addch ('l');
           addch ('o');
           
           addch (ACS_ULCORNER);
           addch (ACS_HLINE);
           ....
           addch (ACS_HLINE);
           addch (ACS_URCORNER);

addstr[Bearbeiten]

void addstr (char * str)
Zeichenkette ausgeben
Beispiel: addstr ("Hello, World");

addstr_P[Bearbeiten]

void addstr_P (const char * str)
Zeichenkette aus Flash ausgeben
Beispiel: addstr_P (PSTR("Hello, World"));

printw[Bearbeiten]

Nur auf STM32 und Unix/Linux verfügbar:

void printw (const char *fmt, ...)
Formatierte Ausgabe analog zu printf()
Beispiel: printw ("Max. Anzahl Zeilen: %d, Spalten: %d", LINES, COLS);

vprintw[Bearbeiten]

Nur auf STM32 und Unix/Linux verfügbar:

void vprintw (const char *fmt, va_list varglist)
Formatierte Ausgabe analog zu vprintf()
Beispiel:
           va_list ap;
           va_start (ap, fmt);
           vprintw (fmt, ap);
           va_end (ap);

curs_set[Bearbeiten]

void curs_set (uint_fast8_t visibility)
Cursor sichtbar/unsichtbar schalten
Beispiele:
curs_set (0); // Cursor unsichtbar
curs_set (1); // Cursor sichtbar

setscrreg[Bearbeiten]

void setscrreg (uint_fast8_t t, uint_fast8_t b)
Scrolling-Region setzen: t = top, b = bottom
Beispiel: setscrreg (1, LINES - 2);

deleteln[Bearbeiten]

void deleteln (void)
Eine Zeile an der aktuellen Position löschen, beachte Scrolling-Region!
Beispiel: deleteln ();

insertln[Bearbeiten]

void insertln (void)
Eine Zeile an der aktuellen Position einfügen, beachte Scrolling-Region!
Beispiel: insertln ();

scroll[Bearbeiten]

void scroll (void)
Eine Zeile hochrollen, beachte Scrolling-Region!
Beispiel: scroll ();

clear[Bearbeiten]

void clear (void)
Bildschirm löschen
Beispiel: clear ();

clrtobot[Bearbeiten]

void clrtobot (void)
Bildschirm ab der aktuellen Zeile bis unten löschen
Beispiel: clrtobot ();

clrtoeol[Bearbeiten]

void clrtoeol (void)
Zeile ab der aktuellen Spalte bis zum Zeilenende löschen
Beispiel: clrtoeol ();

delch[Bearbeiten]

void delch (void)
Zeichen an der aktuellen Position löschen
Beispiel: delch ();

insch[Bearbeiten]

void insch (uint_fast8_t)
Zeichen an der aktuellen Position einfügen
Beispiel: insch ('X');

nodelay[Bearbeiten]

void nodelay (uint_fast8_t)
Nodelay-Flag setzen/löschen
Ist das Nodelay-Flag gesetzt, liefert getch() bei nicht gedrückter Taste ERR zurück.
Beispiel: nodelay (TRUE);

getch[Bearbeiten]

unsigned char getch ()
Lesen von alphanumerischen Tasten und Funktionstasten
Ist das Nodelay-Flag gesetzt, liefert getch() bei nicht gedrückter Taste ERR zurück.
Ausser den alphanumerischen Zeichen kann getch() folgende Konstanten für Funktionstasten etc. zurückliefern:
           KEY_TAB                Tabulatortaste
           KEY_CR                 RETURN
           KEY_BACKSPACE          Backspace
           KEY_ESCAPE             ESCAPE (muss 2x gedrückt werden)
           KEY_DOWN               Cursor runter
           KEY_UP                 Cursor hoch
           KEY_LEFT               Cursor links
           KEY_RIGHT              Cursor rechts
           KEY_HOME               HOME bzw. Pos1
           KEY_DC                 DEL bzw. Entf.
           KEY_IC                 INS bzw. Einfg.
           KEY_NPAGE              PAGE UP bzw. Bild hoch
           KEY_PPAGE              PAGE DOWN bzw. BILD runter
           KEY_END                END bzw. Ende
           KEY_BTAB               SH+TAB bzw. Umschalttaste + Tabulatortaste
           KEY_F(n)               Funktionstasten, z.B. F(2)
Beispiel:
       unsigned char ch = getch ();

       if (ch == KEY_DOWN)
       {
           do_something ();
       }

getnstr[Bearbeiten]

void getnstr (char * str, uint_fast8_t maxlen)
Einlesen eines Strings mit maximal maxlen Zeichen.
Bemerkung:
Die Funktion hat einen Mini-Editor eingebaut. Die Edit-Tasten sind Einfg, Entf,
Pos1, Ende und die Cursor-Tasten links und rechts.
Beispiel:
       char    buf[80];
       move (10, 10);                            // Cursor positionieren
       getnstr (buf, 80);                        // Einlesen eines String mit 79 Zeichen + '\0'
       mvaddstr (11, 10, buf);                   // Ausgabe des Strings eine Zeile darunter

refresh[Bearbeiten]

void refresh (void)
Aktualisieren des Bildschirminhaltes (Flush von evtl. noch auszugebenden Zeichen)
Bemerkung:
Die Funktion getch() macht implizit einen Aufruf von refresh(), um den
Bildschirminhalt vor der Tastatur-Eingabe zu aktualisieren. Daher ist ein
manueller Aufruf unmittelbar vor getch() nicht notwendig.
Beispiel: refresh ();

endwin[Bearbeiten]

void endwin (void)
mcurses beenden, siehe auch initscr()
Beispiel: endwin ();

Funktionsähnliche Makros[Bearbeiten]

erase[Bearbeiten]

void erase (void)
siehe clear ()
Beispiel: erase ();

mvaddch[Bearbeiten]

void mvaddch (uint_fast8_t y, uint_fast8_t x, uint_fast8_t c)
Zur Position (y,x), dann Zeichen ausgeben
Beispiel: mvaddch (10, 10, 'X');

mvaddstr[Bearbeiten]

void mvaddstr (uint_fast8_t y, uint_fast8_t x, char * s)
Zur Position (y,x), dann Zeichenkette ausgeben
Beispiel: mvaddstr (10, 10, "Hello World");

mvaddstr_P[Bearbeiten]

void mvaddstr_P (uint_fast8_t y, uint_fast8_t x, const char * s)
Zur Position (y,x), dann Zeichenkette aus Flash ausgeben
Beispiel: mvaddstr_P (10, 10, PSTR("Hello World"));

mvprintw[Bearbeiten]

Nur auf STM32 und Unix/Linux verfügbar:

void mvprintw (uint_fast8_t y, uint_fast8_t x, const char *fmt, ...)
Formatierte Ausgabe analog zu printf()
Beispiel: printw (10, 11, "Max. Anzahl Zeilen: %d, Spalten: %d", LINES, COLS);

mvvprintw[Bearbeiten]

Nur auf STM32 und Unix/Linux verfügbar:

void mvvprintw (uint_fast8_t y, uint_fast8_t x, const char *fmt, va_list varglist)
Formatierte Ausgabe analog zu vprintf()
Beispiel:
           va_list ap;
           va_start (ap, fmt);
           mvvprintw (10, 11, fmt, ap);
           va_end (ap);

mvinsch[Bearbeiten]

void mvinsch (uint_fast8_t y, uint_fast8_t x, uint_fast8_t c)
Zur Position (y,x), dann Zeichen einfügen
Beispiel: mvinsch (10, 10, 'X');

mvdelch[Bearbeiten]

void mvdelch(uint_fast8_t y, uint_fast8_t x)
Zur Position (y,x), dann Zeichen löschen
Beispiel: mvdelch(10, 10);

mvgetnstr[Bearbeiten]

void mvgetnstr(uint_fast8_t y, uint_fast8_t x, char * str, uint_fast8_t maxlen)
Zur Position (y,x), dann String einlesen
Beispiel: mvgetnstr (10, 10, buf, 80);

getyx[Bearbeiten]

void getyx(uint_fast8_t, uint_fast8_t)
Speichern der aktuellen Cursorposition in eigenen Variablen
Beispiel: getyx(mycursor_y, mycursor_x);

Compilieren[Bearbeiten]

Für den Mikrocontroller:

Am besten lädt man die Projekt-Datei mcurses.aps in den Win-AVR. Voreingestellt sind 8MHz und ATmega168.

Sources:

  • mcurses.c - mcurses: Bibliothek
  • mcurses.h - mcurses: Include
  • mcurses-config.h: Konfigurationsdatei, siehe oben
  • demo.c: Das eigentliche Demo-Programm inkl. main-Funktion

Möchte man nun seine eigene Anwendung namens myApp mit mcurses erstellen, braucht man dafür analog zu oben: mcurses.c, mcurses.h, mcurses-config.h und myApp.c.

Damit nicht verwendete mcurses Funktionen auch nicht im Binary landen bzw. weitere Optimierungen zwischen der mcurses-Bibliothek und der eigentlichen Applikation vorgenommen werden, sind folgende zusätzlichen Compiler-Optionen für den avr-gcc (ab Version 4.7.2) sehr zu empfehlen:

 -Os
 -flto
 -ffunction-sections
 -fdata-sections

Als zusätzliche Linker-Optionen:

 -Os
 -flto
 -ffunction-sections
 -fdata-sections
 -Wl,--gc-sections

Diese Optionen können mehrere 100 Bytes im Binary einsparen. Dabei muss auch dem Linker das Optimierungs-Flag -Os mitgegeben werden - auch wenn das ungewöhnlich erscheint. Dies liegt daran, dass der Linker bei Verwendung von LTO (-flto) auch nochmal im zweiten Durchgang den Compiler aufruft. Fehlt diesem dann das -Os Flag, wird das Binary größer statt kleiner.

Für Linux:

Man kann mcurses auch unter Unix bzw. Linux nutzen, also ganz ohne Mikrocontroller. Dies kann ganz hilfreich bei der Entwicklung sein, da dies auf einem "richtigen" Rechner doch einfacher und schneller geht als auf einem µC. Ist die eigens geschriebene mcurses-Anwendung dann irgendwann fertig, kann man sie leicht auf den ATmega portieren - im Allgmeinen ohne jegliche Änderungen.

Mit dem Aufruf

 make -f Makefile.unix

wird ein Binary namens demo erzeugt, welches man mit

 ./demo

ausführen kann.

MCURSES Tutorial[Bearbeiten]

Das erste Programm[Bearbeiten]

Das einfachste Programm beginnt mit dem obligatorischen "Hello, World!":

#include "mcurses.h"

int main ()
{
    initscr();                  // mcurses initialisieren
    move (11, 15);              // Cursor auf Zeile 12, Spalte 16 positionieren
    addstr ("Hello, World");    // Text ausgeben
    endwin ();                  // mcurses beenden
    return 0;
}

Nach dem Speichern als test.c lässt sich dieses unter Linux kompilieren mit

 cc -O test.c mcurses.c -o test

Nach dem Start des Programms erscheint in der Zeile 12, Spalte 16 der bekannte Willkommensgruß.

Der Aufruf der Funktionen initscr() und endwin() ist obligatorisch. initscr() wird zu Beginn des Programms, endwin() am Ende (falls es überhaupt ein Ende geben sollte) aufgerufen.

Mit der move-Funktion setzen wir den Cursor, mit addstr() geben wir einen Text-String aus.

Viele der Ausgabefunktionen können - wenn unmittelbar davor move() verwendet wird, direkt mit der Cursor-Positionierung kombiniert werden. Für das obige Beispiel kann man also auch schreiben:

#include "mcurses.h"

int main ()
{
    initscr();                            // mcurses initialisieren
    mvaddstr (11, 15, "Hello, World");    // Cursor positionieren und Text ausgeben
    endwin ();                            // mcurses beenden
    return 0;
}

Merke: MCURSES zählt Zeilen und Spalten beginnend mit 0!

Attribute[Bearbeiten]

Möchten wir Teile des Textes hervorheben, kann man diese mit Attributen versehen. Möglich sind da:

 A_UNDERLINE     Unterstrichen
 A_REVERSE       Invers-Darstellung
 A_BLINK         Blinkender Text
 A_BOLD          Fettdruck
 A_DIM           Graudruck
 A_STANDOUT      Hervorgehoben, hier identisch mit A_BOLD.
 A_NORMAL        Normale Ausgabe

Diese Attribute kann man auch kombinieren. Nicht alle Terminal-Emulationen unterstützen diese Attribute. Zum Beispiel kann es durchaus sein, dass Fettdruck nicht implementiert ist. Relativ wahrscheinlich ist, dass die Invers-Darstellung funktioniert. Diese wollen wir nun einmal anwenden:

#include "mcurses.h"

int main ()
{
    initscr();                            // mcurses initialisieren

    attrset (A_REVERSE);                  // Invers-Darstellung einschalten
    mvaddstr (11, 15, "Hello");           // Cursor positionieren und Text ausgeben
    attrset (A_NORMAL);                   // Invers-Darstellung ausschalten
    addstr (", World");                   // Rest des Textes ausgeben

    endwin ();                            // mcurses beenden
    return 0;
}

Der Text "Hello" wird invers gedruckt, der Rest des Textes dann wieder in Normaldarstellung.

Merke: Attribute können mittels '|'-Operator kombiniert werden, zum Beispiel:

    attrset (A_BOLD | A_UNDERLINE);

Farben[Bearbeiten]

Farben werden von mcurses genauso wie Attribute behandelt. Folgende Farben sind möglich:

 F_BLACK                 Vordergrund Schwarz
 F_RED                   Vordergrund Rot
 F_GREEN                 Vordergrund Grün
 F_BROWN                 Vordergrund Braun
 F_BLUE                  Vordergrund Blau
 F_MAGENTA               Vordergrund Magenta
 F_CYAN                  Vordergrund Türkisblau
 F_WHITE                 Vordergrund Weiß
 F_YELLOW                == (F_BROWN | A_BOLD), einige Terminals zeigen dann "Gelb"
 F_COLOR                 Vordergrund-Maske
 B_BLACK                 Hintergrund Schwarz
 B_RED                   Hintergrund Rot
 B_GREEN                 Hintergrund Grün
 B_BROWN                 Hintergrund Braun
 B_BLUE                  Hintergrund Blau
 B_MAGENTA               Hintergrund Magenta
 B_CYAN                  Hintergrund Türkisblau
 B_WHITE                 Hintergrund Weiß
 B_YELLOW                == (B_BROWN | A_BOLD), einige Terminals zeigen dann "Gelb"
 B_COLOR                 Hintergrund-Maske

Hier ein Beispiel-Programm:

#include "mcurses.h"

int main ()
{
    initscr();                            // mcurses initialisieren

    attrset (F_RED | B_CYAN);             // Vordergrund rot, Hintergrund türkis
    mvaddstr (11, 15, "Hello, World");    // Cursor positionieren und Text ausgeben
    attrset (A_NORMAL);                   // Invers-Darstellung ausschalten

    endwin ();                            // mcurses beenden
    return 0;
}

Merke: Man kann nicht mehrere Vordergrundfarben oder mehrere Hintergrundfarben miteinander mischen. Mit dem '|'-Operator kann nur genau eine Vordergrundfarbe mit genau einer Hintergrundfarbe kombiniert werden.

Sonder- und Graphikzeichen[Bearbeiten]

MCURSES kann auch Graphikzeichen ausgeben, die zum "DEC graphical character set" gehören.

Diese sind:

 ACS_LRCORNER            lower right corner
 ACS_URCORNER            upper right corner
 ACS_ULCORNER            upper left corner
 ACS_LLCORNER            lower left corner
 ACS_PLUS                crossing lines
 ACS_HLINE               horizontal line
 ACS_LTEE                left tee
 ACS_RTEE                right tee
 ACS_BTEE                bottom tee
 ACS_TTEE                top tee
 ACS_VLINE               vertical line
 ACS_DIAMOND             diamond
 ACS_CKBOARD             checker board
 ACS_DEGREE              degree symbol
 ACS_PLMINUS             plus/minus
 ACS_S1                  scan line 1
 ACS_S3                  scan line 3
 ACS_S5                  scan line 5
 ACS_S7                  scan line 7
 ACS_S9                  scan line 9
 ACS_LEQUAL              less/equal
 ACS_GEQUAL              greater/equal
 ACS_PI                  Pi
 ACS_NEQUAL              not equal
 ACS_STERLING            uk pound sign
 ACS_BULLET              bullet

Hier ein kleines Beispielprogramm, welches "Hello World" mit einem Kästchen umrahmt.

Message-Box mit MCURSES
#include "mcurses.h"
#include "string.h"

static void
message_box (uint_fast8_t y, uint_fast8_t x, char * text)
{
    uint_fast8_t yy;
    uint_fast8_t h = 3;                         // height
    uint_fast8_t w = strlen (text) + 4;         // width
    uint_fast8_t ww;

    move (y, x);
    addch (ACS_ULCORNER);

    for (ww = 0; ww < w - 2; ww++)
    {
        addch (ACS_HLINE);
    }

    addch (ACS_URCORNER);

    for (yy = y + 1; yy < y + h - 1; yy++)
    {
        move (yy, x);
        addch (ACS_VLINE);

        for (ww = 0; ww < w - 2; ww++)
        {
            addch (' ');
        }

        addch (ACS_VLINE);
    }

    move (yy, x);
    addch (ACS_LLCORNER);

    for (ww = 0; ww < w - 2; ww++)
    {
        addch (ACS_HLINE);
    }

    addch (ACS_LRCORNER);

    mvaddstr (y + 1, x + 2, text);
}

int main ()
{
    initscr();                              // mcurses initialisieren

    message_box (8, 10, "Hello World");     // message box ausgeben

    endwin ();                              // mcurses beenden
    return 0;
}

Scrolling Regions[Bearbeiten]

Kapitel wird kurzfristig ergänzt.

Löschen/Einfügen[Bearbeiten]

Kapitel wird kurzfristig ergänzt.

Tasten[Bearbeiten]

Kapitel wird kurzfristig ergänzt.

Sonstige Funktionen[Bearbeiten]

Kapitel wird kurzfristig ergänzt.

Beispielanwendung[Bearbeiten]

Hex Editor
  • Full-Screen-Hex-Editor - für Z80-System und SDCC-Compiler. Lässt sich durch Ändern der Macros PEEK und POKE auch auf andere Systeme portieren.

Download: Datei:Hexedit.c

Tasten:

  • Cursor-Tasten Links/Rechts/Rauf/Runter zur freien Navigation
  • TAB-Taste zum Wechseln zwischen HEX- und ASCII-Spalten
  • 2 x ESCAPE zum Beenden

Alle weiteren Tasten führen direkt zum Ändern der aktuellen Speicherstelle.

  • In den HEX-Spalten: Eingabe von 2 gültigen Hex-Ziffern (0-9, A-Z und a-z) notwendig.
  • In den ASCII-Spalten: Eingabe eines druckbaren Zeichens nötig.

Download[Bearbeiten]

mcurses.zip Version 2.2.0, Stand vom 13.03.2015
Im Download-Archiv ist ein Demoprogramm enthalten, welches einige Test-Ausgaben macht. Anschließend wird noch die Tastatur getestet – inkl. Funktionstasten, Cursor-Tasten etc.

Versions-Historie[Bearbeiten]

13.03.2015: Version 2.2.0

  • Portierung auf STM32F10x und STM32F4xx
  • Auswahl der UART-Schnittstelle (nur STM32)
  • Neue Funktionen: printw() und vprintw() (nur STM32)
  • Neue Makros: mvprintw() und mvvprintw() (nur STM32)
  • Variablen-Typen uint8_t auf uint_fast8_t umgestellt
  • Funktionsbeschreibung von curs_set() nachgeholt

10.11.2014: Version 2.1.0

  • Bugfix in interner mcurses-Funktion mcurses_puti()

06.11.2014: Version 2.0.0

  • Portierung von mcurses auf SDCC Z80 compiler (noch im Test)

05.11.2014: Version 1.3.0

  • Neue Funktion getnstr() mit Mini-Editor
  • Kleine Korrekturen in endwin()

20.09.2011: Version 1.2.0

  • Key-Mapping an Linux/Console angepasst, insb. die sog. "Edit keys"
  • KEY_BACKSPACE als Backspace-Key definiert
  • KEY_CR als RETURN-Taste definiert
  • KEY_TAB als Tabulator-Taste definiert

05.08.2011: Version 1.1.1

  • Bug in Demo-Programm (Türme von Hanoi) beseitigt.

05.08.2011: Version 1.1.0

  • Unterstützung von Farben
  • Unterstützung von Graphikzeichen (Zeichnen von Rechtecken etc)
  • Neue Funktionen/Makros: nodelay(), refresh() und getyx()
  • Ringbuffer für effizientere Ein- und Ausgabe (UART)
  • AVR- und Linux-spezifische I/O-Funktionen besser modularisiert
  • Dokumentation ausgebaut
  • Demoprogramm ausgebaut (Farbe, Türme von Hanoi etc)

02.08.2011: Version 1.0.6

  • Kosmetische Änderungen: Linux- und AVR-spezifischer Code besser isoliert.

02.08.2011: Version 1.0.4

  • mcurses-Library + Demo-Programm nun auch unter Linux lauffähig

01.08.2011: Version 1.0.2

  • Demo-Programm ausgebaut
  • addstr_P() und mvaddstr_P() zur Dokumentation hinzugefügt

01.08.2011: Version 1.0.0

  • Erste Version

TODO[Bearbeiten]

  • Implementation von halfdelay()

Diskussion[Bearbeiten]

Meinungen, Verbesserungsvorschläge und Kritik können im Thread: MCURSES - Mini Curses Bibliothek für Mikrocontroller geäußert werden.