TinyGo - Les fontes

Utiliser les Neopixels de la Pygamer peut déjà apporter un moyen de communication visuelle mais il faut pouvoir écrire des textes sur l'écran.

Pour cela, TinyGo propose un module appellé TinyFont.
Ce projet fourni même un outil pour générer vos fontes au format utilisable par TinyFont.
Ici, je me contenterai d'utiliser les fontes déjà fournies par le projet afin de ne pas rajouter de complexité supplementaire.

Avant de se lancer, j'ajouterai que nous entrons là dans un domaine manipulant les ressources graphiques de la Pygamer et que rapidement il faudra creuser le fonctionnement du driver. Mais nous y reviendrons ultérieurement.

Sans plus attendre, comme à mon habitude, je vous propose le code utilisé pour cet article :

package main

import (
	"image/color"
	"machine"
	"time"

	"tinygo.org/x/drivers/st7735"
	"tinygo.org/x/tinyfont"
	"tinygo.org/x/tinyfont/freemono"
	"tinygo.org/x/tinyfont/freesans"
)

var black = color.RGBA{0, 0, 0, 0}
var red = color.RGBA{255, 0, 0, 255}
var green = color.RGBA{0, 255, 0, 255}

func main() {
	display := st7735.New(machine.SPI1, machine.TFT_RST, machine.TFT_DC, machine.TFT_CS, machine.TFT_LITE)
	machine.SPI1.Configure(machine.SPIConfig{
		Frequency: 16000000,
		SCK:       machine.SPI1_SCK_PIN,
		SDO:       machine.SPI1_SDO_PIN,
		SDI:       machine.SPI1_SDI_PIN,
	})
	display.Configure(st7735.Config{Rotation: st7735.ROTATION_90})

	for {
		display.FillScreen(black)
		tinyfont.WriteLine(&display, &freesans.Regular9pt7b, 10, 20, "No rotation", red)
		time.Sleep(1 * time.Second)

		display.FillScreen(black)
		tinyfont.WriteLineRotated(&display, &freemono.Bold9pt7b, 10, 10, "HELLO", green, tinyfont.ROTATION_90)
		time.Sleep(1 * time.Second)

		display.FillScreen(black)
		tinyfont.WriteLineRotated(&display, &freemono.Bold9pt7b, 100, 50, "Hello", red, tinyfont.ROTATION_180)
		time.Sleep(1 * time.Second)

		display.FillScreen(black)
		tinyfont.WriteLineRotated(&display, &freemono.Bold9pt7b, 120, 100, "HELLO", green, tinyfont.ROTATION_270)
		time.Sleep(1 * time.Second)
	}
}

Tout le début a été vu dans l'article de base sur la manipulation de l'écran.
J'ai apporté une modification à la configuration de l'écran.

display.Configure(st7735.Config{Rotation: st7735.ROTATION_90})

Par défaut, l'écran de la Pygamer est géré par le chip st7735 comme si vous le teniez avec le joystick en haut. Les librairies pour cette console en C ou en CircuitPython ont fait le choix de fournir un driver qui opère cette rotation d'initialisation, la rendant transparente pour l'utilisateur.
Cela peut être une suggestion de modification pour le driver st7735 dans le cas de la Pygamer, je vous tiendrais au courant si je me lance à proposer une PR dans ce sens.

La partie concernant les fontes commence par les imports des éléments utiles comme TinyFont lui même, mais également 2 fontes pour que vous ayez déjà le choix.

"tinygo.org/x/tinyfont"
"tinygo.org/x/tinyfont/freemono"
"tinygo.org/x/tinyfont/freesans"

L'affichage de texte se fera dans la boucle for où j'ai alterné 3 messages, entrecoupé d'un effacement de l'écran.
Pour effacer l'écran justement, j'ai utilisé la fonction :

display.FillScreen(black)

Je me contente donc de remplir l'écran de pixels noirs pour effacer le texte précédent.
Comme nous allons ensuite tracer les lettres, ce n'est surement pas la méthode que je conseillerai pour un jeu, l'usage d'un buffer mémoire sera à envisager, et nous le ferons surement dans un prochain article.
L'affichage des textes se fera avec les fonctions tinyfont.WriteLine et tinyfont.WriteLineRotated

tinyfont.WriteLine(&display, &freesans.Regular9pt7b, 10, 20, "No rotation", red)

tinyfont.WriteLine permet ici d'afficher le message en respectant l'orientation de l'écran configurée. Vous noterez l'usage de l'appel de fonction avec des références (symbole &)
Si vous souhaitez comprendre ce point précis, je vous conseille un peu de lecture avec un chapitre sur les pointeurs, notament le 2.4 qui montre l'utilisation des pointeurs dans le cadre de paramètres de fonction.

Vous voyez donc que l'on confie à cette fonction la variable display gérant l'écran.
Cela servira en interne pour afficher les pixels des lettres.
Le second paramètre indique la fonte qui sera utilisée. En l'occurence, il s'agit de la famille de fonte freesans dans son format Regular9pt7b qui indique la taille et les détails tels que préparés par l'utilitaire TinyFontGen
Viennent ensuite les paramètres x et y permettant de positionner le texte.
Le paramètre suivant est le texte à afficher, suivi de la couleur souhaitée.

La seconde fonction utilisée est tinyfont.WriteLineRotated :

tinyfont.WriteLineRotated(&display, &freemono.Bold9pt7b, 10, 10, "HELLO", green, tinyfont.ROTATION_90)

Le comportement est identique, avec l'ajout du dernier paramètre permettant d'indiquer l'orientation du texte par rapport à celle de l'écran.

Bien entendu, il ne vous reste plus qu'à flasher la Pygamer :

tinygo flash -target=pygamer

Et voici ce que cela donne :

Sorry, your browser doesn't support embedded videos.

Bien entendu, cet exemple est disponible dans le repository dédié aux exemples TinyGo.
N'hésitez pas  à essayer vos propres paramètres, jouez avec les couleurs, les positions et orientations. Je serai ravi de voir vos essais, partagez les moi.

Merci, n'hésitez pas à me faire parvenir vos remarques par email ou par le biais d'issues sur le repository.