Oui notamment pour le DEL je pense, ou l'insertion, c'est ce que tu mentionnait plus haut.
ESC[s : save cursor position (SCO)
ESC[u : restores the cursor to the last saved position (SCO)
Il y a pas mal de possibilités.
Oui il y a beaucoup de commande, j'ai fait comme une librairie dans un include pour simplifier
...
void _moveCursor(Cursor curs, int col);
void _moveCursorCol(int col);
void _saveCursor();
void _restoreCursor();
En fait, j'ai commencé au début il y a longtemps avec un module vga pour microcontroleur (MicroVGA) avec une carte a base d'atmega128, comme c'est du C (AVR), c'est facile à porter sur un Mega2560, ou ESP32 etc ...
Tu peux même essayer tes ESC sequences dans l'interpréteur PYTHON :
https://www.lihaoyi.com/post/BuildyourownCommandLinewithANSIescapecodes.html
Oui d'ailleurs j'ai créé une commande color et j'ai repris sur cette page a peu près le même code qui affiche des couleurs avec des chiffres dessus, un peu plus loin sur cette page que tu indique, ils ont un exemple de commande line mais assez simple en python.
L'écran que tu as mis est pas mal en couleur, ca me rappelle les écran CGA dans le temps.
Je vois que tu as bien exploré la chose.
En tous cas l'auteur se fait un beau délire. Je suis impressionné.
Bonne suite.
PS : un peu d'ANSI ART pour terminer :
Du coup si tu écris une lettre par dessus l'autre sans l'effacer, cela écrit uniquement les pixels du caractère, l'absence de pixel est pris comme du transparent et pas comme la couleur de fond ?
Joli l'ANSI ART.
@terwal
Je ne comprend pas trop bien ce que tu veux dire, en fait il n'y a pas de notion de pixel dans mon cas, ni de graphisme, je veux dire, pas d'API comme sur win32 en C++, c'est du pure texte 80 colonne sur 25, un peu comme il existait dans les années 80 sur les terminaux DEC, on affiche juste du caractère (octet) à l'écran, c'est comme un terminal RS232.
Si tu te connecte sur un terminal linux avec putty par exemple ou en telnet, c'est du pur texte, il n'y a pas de graphisme ou notion de pixel, c'est juste du texte.
C'est le terminal qui gère le texte, la saisie etc.. à l'aide du standard ansi.
Sur lien que j'ai mis plus haut sur les code escape ansi, on peu gérer la couleur de fond, la couleur d'écriture, l'italique, le gras etc .. mais ca reste du texte.
Les applications sur gros system IBM avant pour gérer les stocks, c'est du mode texte sur un terminal.
Je ne sais pas si ca répond à ta question.
Oui, je comprends bien, j'ai travailler sur ma manipulation d'écran 5250.
Mais comme tu parlais d'effacer la ligne avant d'écrire ou de devoir gérer ce que tu voulais réécrire.
J'ai cru qu'il y avait une sorte de mode graphique.
Dans ce cas tu as juste à réécrire ta ligne ou ta portion de ligne quitte à envoyer des espace pour effacer les caractère qui n'existe plus ?
Oui c'est ca, sauf que je n'écris pas d'espace, comme c'est un terminal gérer par la carte et la bibliothèque, je supprime soit la ligne ou ce qu'il y a droite de ce que je ne veux pas à l'aide d'escape code ANSI ("\e[2K" ou "\e[0K").
Comme la plupart des terminaux sont compatible ANSI, si avec un arduino uno ou autre tu te connecte avec par exemple TeraTerm qui est un terminal série ou autre, tu verra que si tu fait un bout de code et que tu envoi avec Serial.print des codes escape, tu pourra afficher une ligne de texte avec un fond de couleur et une couleur de texte par exemple.
L'exemple de hbachetti des memove fonctionne très bien pour Backspace et Insert.
touche flèche gauche et droite fonctionne bien pour le déplacement
CTRL-A pour HOME et CTRL-B pour END fonctionne bien,
J'en ai profité avec la touche flèche haut de rappeler la dernière commande.
Possibilité d'éxecuter un script de commande au démarrage, un genre d'autoexec.bat simplifié
Cool, ca avance bien
Merci du retour.
Dans ton code en #10, quand tu ajoutes un caractère au buffer, tu ne vérifies pas s'il reste de la place. Il serait bien de le faire, car si tu dépasses la longueur de la ligne, tu risques un débordement aux conséquences imprévisibles.
D'autre part tu gagnerais à utiliser if else :
switch conviendrait bien aussi.
Pour le dépassement je le fait plus loin, au départ l'index est à zero et plus bas je met
if (ndx >= numChars) {
ndx = numChars - 1;
numChars est égal à 80.
Je testerai quand même les bornes
Pour les else pourquoi pas, mais comme il ya des else dans des else j'ai peur qu'on s'y retrouve pas.
[EDIT]
J'ai testé les bornes et il n'y a pas de dépassement, au maximum l'index est = 79 et la longueur de la string 80, comme l'écran fait 80x25.
J'aimerais faire une commande du style ESC
par exemple
ESC \e[J ou
ESC \e[106mHCYAN\e[40m => écrit CYAN en couleur CYAN)
quand je lance la commande ca me marque \e[2J au lieu d'éxecuter la commande escape.
Comment je peux faire ?
Je doit récupérer la chaine de caractères et la convertir en hexa ? ou en byte ? et utiliser un write ?
Par exemple Serial.write pour envoyer sur le port série ou Terminal.write ou un print ?
Une commande du style ESC qui correspondrait à quelle touche du clavier ?
En fait ce n'est pas une touche de clavier, c'est une commande, je l'ai nomé esc, mais si je la nome write, ce serait par exemple.
le > est l'invite de commande.
>write \e[J
(que je tape sur le terminal, au final ca éxecute la commande ANSI correspondante)
On change de niveau. C'est une commande shell.
Il te suffit de récupérer l'argument "\e[J" et de l'envoyer au terminal.
C'est exactement ce que je fait, c'est ca que je ne comprends pas.
Dans toutes les commandes Terminal ANSI j'utilise
Terminal.write("\e[2K"); par exemple.
Le code de la commande:
Récupération du premier paramètre:
char * getParamCmd()
{
auto inputLine = tempChars;
char *p = strchr(inputLine, ' ') + 1;
return p;
}
void exe_write()
{
char *s = getParamCmd();
if (s != nullptr)
{
Terminal.write(s);
Terminal.printf("\r\n");
}
state = State::Prompt;
}
Je pense que ce n'est pas un problème de code, ce doit être le fonctionnement de la bibliothèque FABGL qui gère le terminal, car je récupère une chaine tapée sur le Terminal, ce n'est pas un code ANSI envoyé directement au terminal.
C'est comme si j'envoyait directement la commande ANSI, ca fonctionne mais dès que c'est une commande ANSI récupérée d'une variable, ca ne fonctionne pas.
Terminal.write("\e[J"); fonctionne mais
Terminal.write(s); ne fonctionne pas car s est une variable.
Si tu tapes "\e[J" que récupères-tu ?
Peut-être que la chaîne comprend 4 caractères BACKSLASH + e + [ + J. En C : "\e[J".
Dans ce cas, il faut que la commande remplace "\e" par "\e".
Essaie d'afficher les codes hexa un à un.