MCURSES
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.
Die Bibliothek benötigt ca. 1,9 KB an Flash-Speicher.
Hier ein kleiner Animationsfilm vom Demo-Programm: Mcurses.avi
Konstanten in mcurses.h
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
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
initscr
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
- 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
- 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
- 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
- void addstr (char * str)
- Zeichenkette ausgeben
- Beispiel: addstr ("Hello, World");
addstr_P
- void addstr_P (const char * str)
- Zeichenkette aus Flash ausgeben
- Beispiel: addstr_P (PSTR("Hello, World"));
printw
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
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
- void curs_set (uint_fast8_t visibility)
- Cursor sichtbar/unsichtbar schalten
- Beispiele:
- curs_set (0); // Cursor unsichtbar
- curs_set (1); // Cursor sichtbar
setscrreg
- void setscrreg (uint_fast8_t t, uint_fast8_t b)
- Scrolling-Region setzen: t = top, b = bottom
- Beispiel: setscrreg (1, LINES - 2);
deleteln
- void deleteln (void)
- Eine Zeile an der aktuellen Position löschen, beachte Scrolling-Region!
- Beispiel: deleteln ();
insertln
- void insertln (void)
- Eine Zeile an der aktuellen Position einfügen, beachte Scrolling-Region!
- Beispiel: insertln ();
scroll
- void scroll (void)
- Eine Zeile hochrollen, beachte Scrolling-Region!
- Beispiel: scroll ();
clear
- void clear (void)
- Bildschirm löschen
- Beispiel: clear ();
clrtobot
- void clrtobot (void)
- Bildschirm ab der aktuellen Zeile bis unten löschen
- Beispiel: clrtobot ();
clrtoeol
- void clrtoeol (void)
- Zeile ab der aktuellen Spalte bis zum Zeilenende löschen
- Beispiel: clrtoeol ();
delch
- void delch (void)
- Zeichen an der aktuellen Position löschen
- Beispiel: delch ();
insch
- void insch (uint_fast8_t)
- Zeichen an der aktuellen Position einfügen
- Beispiel: insch ('X');
nodelay
- 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
- 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
- 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
- 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
- void endwin (void)
- mcurses beenden, siehe auch initscr()
- Beispiel: endwin ();
Funktionsähnliche Makros
erase
- void erase (void)
- siehe clear ()
- Beispiel: erase ();
mvaddch
- 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
- 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
- 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
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
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
- 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
- void mvdelch(uint_fast8_t y, uint_fast8_t x)
- Zur Position (y,x), dann Zeichen löschen
- Beispiel: mvdelch(10, 10);
mvgetnstr
- 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
- void getyx(uint_fast8_t, uint_fast8_t)
- Speichern der aktuellen Cursorposition in eigenen Variablen
- Beispiel: getyx(mycursor_y, mycursor_x);
Compilieren
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
Das erste Programm
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
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
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
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.
#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
Kapitel wird kurzfristig ergänzt.
Löschen/Einfügen
Kapitel wird kurzfristig ergänzt.
Tasten
Kapitel wird kurzfristig ergänzt.
Sonstige Funktionen
Kapitel wird kurzfristig ergänzt.
Beispielanwendung
Download: Datei:Hexedit.c Tasten:
Alle weiteren Tasten führen direkt zum Ändern der aktuellen Speicherstelle.
|
Download
- 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
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
- Implementation von halfdelay()
Diskussion
Meinungen, Verbesserungsvorschläge und Kritik können im Thread: MCURSES - Mini Curses Bibliothek für Mikrocontroller geäußert werden.