Tester le langage Vala / Genie sur Raspberry Pi
Les langages sont nombreux sur le Raspberry Pi. Des anciens comme le C en passant par les modernes (Python ?) ou les poids lourds comme Java, le choix est large ! Petit nouveau soutenu par The Gnome Project, Genie vient s’installer sur notre Raspberry. 
- Mise à jour du système
apt-get update && apt-get -y upgrade
- Installer le compilateur Vala qui supporte le langage Genie. Il vous faudra aussi le compilateur gcc.
apt-get install gcc valac-0.16
- Vous pouvez maintenant créer votre premier programme : Hello World ! (Lui est vraiment universel 😉 )
init print "Hello World" - Vous lancez la compilation avec la commande valac.
- Reste à lancer le programme généré : hello.
Alors tout ça c’est bien joli mais quel est l’intérêt de ce language ?
Je vais vous donner la liste (partielle) de ses avantages :
- Une grande simplicité de programmation. Le code est proche du Python (avec un peu de Boo, Delphi ou encode du D). Donc facile à appréhender !
- Les performances. Là où les langages de haut niveau utilisent un processus pour l’interprétation (via pré compilation ou non), le code généré par Genie est du C donc avec d’excellentes performances à l’exécution.
- La possibilité d’utiliser des objets de type GObject. Il s’agit (dans les grandes lignes) d’un équivalent à l’objective-C d’Apple. Ultra pratique pour monter en quelques lignes une interface graphique portable. Seules libc et Glib sont nécessaires.
- Des exécutables légers. Le Hello World classique fait 2.9Kb et le même en GTK fait moins de 6Kb.
- Liaison avec les librairies systèmes directement depuis Genie. Pas de surcouche comme dans Python par exemple pour le binding.
Bien sur, tout n’est pas rose et il y a des inconvénients :
- C’est compilé. C’est l’inconvénient des avantages 🙂 Un script python peut être facilement envoyé par email, modifié et exécuté. Ici ce n’est pas forcément si simple (surtout si vous envoyé le code C généré ou que la personne n’a pas Vala d’installé).
- Et le dernier : une communauté existante mais assez restreinte. Le support reste donc limité lors de la phase d’apprentissage. Je galère ! 🙂
Voici donc dans les (très) grandes lignes ce que l’on peut dire du langage.
Je vous donne encore quelques exemples :
Afficher un écran rouge avec un texte par dessus en utilisant la librairie curses :
[indent=8]
uses
Curses
init
initscr ()
start_color ()
init_pair (1, Color.YELLOW, Color.RED)
var win = new Window (LINES - 8, COLS - 8, 4, 4)
win.bkgdset (COLOR_PAIR (1) | Attribute.BOLD);
win.addstr ("Raspberry Pi Home Server");
win.refresh();
win.clrtobot ();
win.getch ();
endwin ()
Pour compiler (si votre fichier s’appelle test.gs) :
valac --pkg curses -X -lncurses test.gs
Le résultat :
Avec GTK installé, vous pouvez créer des fenêtres rapidement :
[indent=4]
uses
Gtk
init
Gtk.init (ref args)
var wintest= new win_test()
wintest.show_all ()
Gtk.main ()
class win_test : Window
init
title = "Raspberry Pi Home Server"
default_height = 250
default_width = 250
window_position = WindowPosition.CENTER
var button = new Button.with_label ("Press here")
button.clicked.connect (pushed)
destroy.connect(Gtk.main_quit)
add(button)
def pushed (btn : Button)
title = "You clicked it"
btn.label = "You pressed me !"
La compilation avec GTK 3 installé :
valac --pkg gtk+-3.0 gtk.gs
Simple, rapide et efficace !
Bon et pour notre Raspberry Pi ? C’est presque simple. Mais j’ai bien préparé le terrain ! 🙂
- Installer la librairie C wiringPi. Le tutoriel est sur la page officielle.
- Créer un lien (le binding) entre wiringPi et Vala/Genie. Pour ça vous créez le fichier /usr/share/vala-0.16/vapi/wiringPi.vapi avec le contenu suivant :
[CCode (cheader_filename = "wiringPi.h")] public const int NUM_PINS; [CCode (cheader_filename = "wiringPi.h")] public const int INPUT; [CCode (cheader_filename = "wiringPi.h")] public const int OUTPUT; [CCode (cheader_filename = "wiringPi.h")] public const int PWM_OUTPUT; [CCode (cheader_filename = "wiringPi.h")] public const int GPIO_CLOCK; [CCode (cheader_filename = "wiringPi.h")] public const int LOW; [CCode (cheader_filename = "wiringPi.h")] public const int HIGH; [CCode (cheader_filename = "wiringPi.h")] public const int PUD_OFF; [CCode (cheader_filename = "wiringPi.h")] public const int PUD_DOWN; [CCode (cheader_filename = "wiringPi.h")] public const int PUD_UP; [CCode (cheader_filename = "wiringPi.h")] public const int PWM_MODE_MS; [CCode (cheader_filename = "wiringPi.h")] public const int PWM_MODE_BAL; [CCode (cheader_filename = "wiringPi.h")] public const int INT_EDGE_SETUP; [CCode (cheader_filename = "wiringPi.h")] public const int INT_EDGE_FALLING; [CCode (cheader_filename = "wiringPi.h")] public const int INT_EDGE_RISING; [CCode (cheader_filename = "wiringPi.h")] public const int INT_EDGE_BOTH; [CCode (cname = "int", cprefix = "WPI_", has_type_id = false)] [Flags] public enum Foo { FATAL, ALMOST } [CCode (cname = "wiringPiSetup")] public int wiringPiSetup (); [CCode (cname = "pinMode")] public void pinMode (int pin, int mode); [CCode (cname = "digitalRead")] public int digitalRead (int pin); [CCode (cname = "digitalWrite")] public void digitalWrite (int pin, int value); [CCode (cname = "piBoardRev")] public int piBoardRev (); namespace wiringPi { [CCode (cname = "int", cprefix = "WPI_MODE_", has_type_id = false)] public enum WpiMode { PINS, GPIO, GPIO_SYS, PHYS, PIFACE, UNINITIALISED } }Ce fichier reprend une partie des définitions faites dans la librairie C. Je n’ai pas tout fait mais le principe y est ! Vous pouvez faire le setup et changer la position d’un GPIO.
- Reste le programme qui fait clignoter une LED branchée sur le GPIO 17. Je l’ai nommé genius_test.gs
uses wiringPi init stdout.printf ("Raspberry Pi Board revision : %d\n", piBoardRev()); wiringPiSetup(); pinMode (0, OUTPUT) ; for var i = 0 to 6 digitalWrite (0, HIGH); Thread.usleep (500*1000); digitalWrite (0, LOW); Thread.usleep (500*1000); - Et enfin la compilation !
valac --pkg wiringPi -X -lwiringPi genie_test.gs ; ./genie_test
Vous voilà donc avec une LED qui clignote grâce à un programme qui fait moins de 6kb et sans avoir à passer par le codage plus complexe du C. Vous pouvez l’intégrer facilement dans une interface en GTK par exemple.
A vous de jouer maintenant ! 🙂







