Picotel : editeur de code et mini-shell

Bonjour à tous,

Le projet PicoTel "Raspberry-Pi Pico + Minitel" avance bien vers son autonomie. Le but du projet étant de créer une machine MicroPython complètement autonome.

Il ne me manquera encore d'autres terminaux pour essayer le projet dans d'autres configuration. 

Source: Projet PicoTel


Quoi de neuf...

Bouton RunApp

Le switch ajouté sur la broche  GP16 permet de contrôler le démarrage du Pico afin qu'il active ou pas la réplication du terminal REPL sur l'UART.


Le restant du schéma de câblage est disponible sur GitHub.

Class PicoTelUart

Pour commencer, j'ai relaté un problème concernant un problème d'affichage si le débit d'informations (lignes envoyées) vers le minitel est trop important.

En insérant une pause de 500ms entre chaque print() MicroPython permettait de contourner le problème.

Auto-critique

Insérer des sleep_ms(500) n'est pas une approche très professionnelle.
Elle nécessite aussi la modification de tous les scripts MicroPython à exécuter sur le MiniTel --> pas franchement envisageable. 

En premier recours j'ai envisager utilisé le contrôle de flux présent sur la fiche UART... jusqu'au moment où j'ai appris (et vérifié) qu'il n'est pas fonctionnel en mode terminal!

Pas de contrôle de flux? Que faire?

L'autre option est d'insérer un code qui fait en sorte d'insérer une pause automatiquement entre chaque print().
Gros, entre le dupterm() et l'UART utilisés dans le fichier boot.py ... plus précisément quand dupterm() écrit sur la ligne UART.

Nouveau fichier boot.py & classe PicoTelUart

from machine import Pin
import os, picotel
run_app = Pin( 16, Pin.IN, Pin.PULL_UP )
p = Pin( 25, Pin.OUT )

if run_app.value()==0: # Running PicoTel
	print( "Running PicoTel")
	# 1200 bauds or 4800 bauds or 9600 bauds
	uart = picotel.PicoTelUart( 0, 9600, bits=7, parity=2, stop=1 ) # Minital compatible UART
	os.dupterm( uart ) # Duplicate terminal over IART
	p.value(1)
else:
	print( "PicoTel disabled")
	p.value(0)

D'ailleurs il y a deux petits ajouts:

  1. Un interrupteur (Switch) permet de neutraliser le démarrage du PicoTel
  2. La LED du Pico s'allume lorsque PicoTel est initialisé

Voici le contenu de la classe PicoTelUart où il est possible de voir le délai de cinq millisecondes (valeur pas défaut) inséré après chaque écriture de donnée sur l'UART.

5ms semble suffisant pour l'affichage de messages mais pas encore suffisant pour l'éditeur de texte.
from machine import UART
import io, time

class PicoTelUart(io.IOBase):
	def __init__(self, *args, **kwargs ):
		# open UART
		self.u = UART(*args, **kwargs)
		self.ms = 5 # default sleep in ms when printout buffer to terminal

	def read(self, sz=None):
		return self.u.read( sz )

	def readinto(self, buf):
		return self.u.readinto(buf)

	def ioctl(self, op, arg):
		return 0

	def write(self, buf):
		# write buf to terminal
		self.u.write( buf )
		time.sleep_ms( self.ms )

Mini-Shell

Mini-Shell (mshell) est un script minimaliste permettant d'utiliser des commandes type "Linux" depuis REPL.  C'est très pratique pour lister / déplacer / effacer / créer des fichiers depuis la session REPL / UART (donc depuis le terminal Minitel).

Mini-Shell est maintenant démarré en même temps que le Pico à partir du script main.py détaillé ci-dessous.

run_app = Pin( 16, Pin.IN, Pin.PULL_UP )
if run_app.value()==0: # Running PicoTel
	import mshell

La petite nouveauté c'est l'ajout de la commande "edit" pour éditer le contenu d'un fichier à l'aide de MicroPython-Editor (voir point suivant).

Mini-Shell - list de fichiers (ls) et ouverture de tmp36.py
désolé pour la qualité de l'image un peu médiocre.

L'intérêt de mshell c'est qu'il est possible de le quitter pour revenir à REPL avec exit mais aussi de revenir à mshell en saisissant: import mshell suivit de mshell.run() :-)

Voici l'aide actuel de mshell:

$ help
display this help file.

$ append source texte

Append the texte (can be quoted if containing space) to the source file.

$ cat source
Display the content of source file.

$ cp source destin

Binary copy the source file to destin file. Destin file is overwrites if exists.

$ df
$ df path

Show the filesystem size and usage. By default the command target the "/" path.
It show the following content:
    FileSystem: 1441792 bytes (1408 KB, 352 Blocks)
    Free      : 1429504 bytes (1396 KB, 349 Blocks)
    Block size: 4096 bytes

$ edit filename

Start the pye editor to edit the file content.
If not present on the file system, install it from
https://github.com/robert-hh/Micropython-Editor/blob/master/pye.py

$ uname
Displays the information enclosed within os.uname() .
It shows the following content:
    sysname : rp2
    nodename: rp2
    release : 1.18.0
    version : v1.18 on 2022-01-17 (GNU 11.2.0 MinSizeRel)
    machine : Raspberry Pi Pico with RP2040

$ exit
Exists the mini shell

$ ls

list the files

$ mv source destin

Move/rename the source file to destin file. Destin file is overwrites if exists.

$ rm source

remove the source file from file system.

$ touch source

create an empty file (with source name) into the file system.

MicroPython-Editor (pye)

pye est un éditeur VT100 écrit en MicroPython et développé par robert-hh (lien GitHub), l'un des utilisateurs très actifs sur les Forums de MicroPython.org.

pye a été intégré à mshell (commande edit, version 0.0.3) pour faciliter l'édition de scripts Python dans un éditeur qui ressemble fort à l'utilitaire Nano.
De nombreuses manipulations sont prise en charge à l'aide de raccourcis claviers (eg: Ctrl + Q pour quitter).

La capture ci-dessous reprend l'édition du fichier tmp36.py à l'aide de pye.

Edition d'un script à l'aide de l'éditeur MicroPython "pye"

La suite

Ceci est une version intermédiaire, il y a quelques problèmes à régler et améliorations à apporter (TODO.md list du projet).

  • Pye: tester et documenter les raccourcis claviers
  • Terminal: Ctrl + C n'atteind pas MicroPython
  • Terminal: comment envoyer un "_" vers REPL? (non disponible sur c to repl?
  • mshell -> help : doit aussi ouvrir mshell.txt depuis /lib
  • mshell -> ls : multicolonnes et affichage par page
  • mshell -> ls : afficher la taille des fichiers ?
  • mshell -> more : afficher le contenu d'un fichier avec affichage par page.
  • mshell -> reboot
  • hexview.py -> voir le contenu d'un fichier en HEX
  • accroître PicoTelUart.ms sous pye pour éviter le décrochage du terminal.
  • pye -> devrait se souvenir du nom de fichier ouvert pour la sauvegarde.
  • mshell -> run : (defaut) pour exécuter/re-executer un script Python
  • mshell -> mem : afficher la mémoire disponible (et faire un gc.collect).
  • Afficher un graphique (text base) / clear screen
  • Instruction d'installations dans la doc.

Ressource


Aucun commentaire