Couplage des événements

Retour à la partie 2

Cette partie va montrer comment sont déroulés les appels des évènements, ce qu’on appelle plus couramment des « couplages » de l’anglais link.

En fait, le script utilisateur est lancé avant tout le code maître (celui qui contrôle votre programme). Cela permet entre autre d’initialiser des valeurs. Seulement on ne peut ni évaluer d’expressions ni utiliser l’API fournie par la TI-Nspire (comme platform, var …) avant que le code maître soit lancé. Voici un résumé des appels :

  • Lancement de la bibliothèque string
  • Lancement de la bibliothèque math
  • Lancement du framework de la TI-Nspire (toolpalette, image, … )
  • Ouverture et lancement du script Lua utilisateur
  • Lancement de l’API var (store, recall, …)
  • Lancement de l’API platform (window, gc, …)
  • Liaison des évènements (pseudo code)
while(Exit)
	------- Some OS routines here
 
 	---- Begin of Event link
	buffer:captureDataFromKeyPad() 	--  (N) some underground routines to catch events
	if buffer.charInput ~= "" then 	 	--  (N)
		on.charIn(buffer.charInput)
		buffer.charInput= "" 	 	 	--  (N)
	end
	if buffer.arrowKey ~= "" then 	 	--  (N)
		on.arrowKey(buffer.arrowKey)
		buffer.arrowKey = "" 	 	 	--  (N)
	end
	----- etc ... 	
	if platform.window.isInvalidate then 
	 	local gc = platform.gc()	 	  	--  Create a new graphical context
	 	gc:begin()	 		 	   		-- initialize the graphical context
		on.paint(gc) 	  	 	  		-- save all the things we have to draw
	 	gc:finish()  	  	  	    		--  (N) draw all those things	
		platform.window.isInvalidate = false 	-- say that the window has been drawn
	end
	----- End of Event link
end

Note : Tous les commentaires préfixés par (N) sont là uniquement pour permettre de comprendre le sens de la routine. Ces fonctions n’existent pas vraiment.

Maintenant, nous pouvons comprendre comment tout cela est lié, uniquement par une boucle principale. Ceci peut vous aider à comprendre que ça ne sert à rien de faire une boucle vous-même, car de toute manière l’écran ne sera pas actualisé. Cela peut également vous permettre de voir quand est-ce que l’écran est dessiné. Dit plus clairement, nous ne pouvons pas utiliser ni gc ni platform.gc(), pour dessiner quelque chose à l’écran, si l’on se trouve en dehors de on.paint() (fonctions auxiliaires appelées depuis on.paint() exceptées bien sûr).

Voici un exemple simple de programme Lua qui affiche un message seulement lorsqu’une touche est active (et laisse donc l’écran blanc lorsqu’aucune touche n’est active) :

function on.paint(gc)
	if message then
	 	gc:setFont("sansserif", "r", 10)	-- initialize font drawing
	 	gc:drawString(message, 0, 0, "top")	-- display the message at (0, 0) coordinates
	 	message = nil 				-- erase the message
	 	timer.start(1) 	 	 	-- start a timer to exit on.paint() but keep in mind that we have to redraw the screen
	end
end
 
function on.timer()
	timer.stop()
	platform.window:invalidate()
end
 
function on.charIn(ch)
	message = "Hello World !"		-- store a message
	platform.window:invalidate()		-- force display
end

Lorsque l’on ouvre le document, le script est lu une première fois. Il initialise et écrase toutes les fonctions et variables globales avec celles que vous avez défini. Donc message vaut nil (valeur nulle). Lorsque l’évènement on.paint() est appelé, message vaut nil, donc rien ne se passe. Seulement, lorsque l’on appuie sur une touche, on.charIn() est appelé, message vaut maintenant « Hello world » et nous indiquons à platform que l’écran doit être rafraîchi. Donc au tour de boucle suivant, on.paint() est appelé encore une fois. message n’est pas nul, donc nous l’affichons tout en l’effaçant puis nous lançons un timer. Pourquoi ? Parce que si nous appelons platform.window:invalidate() juste ici, l’écran ne sera pas actualisé. Pourquoi (encore une fois) ? Regardez le pseudo-code juste de tout à l’heure. A la fin de la boucle l’OS considère l’écran comme actualisé. Donc l’utilisation d’un timer est nécessaire pour appeler manuellement on.paint() tout en étant sorti de ce dernier. Lorsque le timer a fini le décompte, on.timer() est appelé et nous forçons donc l’écran à s’actualiser. L’écran est donc actualisé mais il n’y a rien à dessiner car message est nul. Ainsi l’environnement graphique laisse l’écran blanc.

>> Partie 4

Laisser un commentaire