Utilisation de serdisp en Python

Utilisation de serdisp en Python

Comment appeler la lib serdisplib depuis un environnment Python!

Eh oui! Il est possible d’appeler une lib C comme serdisp à partir d’un environnement Python.

Le responsable de cette folie? Le module python ctypes, et plus précisément le sous module CDLL.

La plus-value du module ctypes est de pouvoir charger des objets Dynamic Link Libraries (dll pour les fans de raccourcis) directement dans votre environnement Python, ce qui permet d’accéder à nos lib comme des attributs de ces objets.

Pour ceux qui n’auraient pas tout compris, voici comment on pourrait appeler une lib grâce à ce module


libc = CDLL("libc.so.6")
print libc.getMessage('hello')

Ici ma lib est chargée dans l’objet libc et j’accède à la méthode getMessage comme si c’était un attribut de cet objet.

Passons maintenant aux choses sérieuses…

Le code que nous allons utiliser pour notre exemple est le suivant! Vous avez de la chance car je suis assez sympa pour vous commenter le code pas à pas. Ça vaut bien un ptit verre ça, non? 😛


#!/usr/bin/python
from ctypes import CDLL

if __name__ == "__main__":
        sharedlib = 'libserdisp.so'
        serdisp = CDLL(sharedlib)
        dispname = "ALPHACOOL"
        sdcdev = "USB:060c/04eb"
        sdcd = serdisp.SDCONN_open(sdcdev)

        if sdcd == 0:
                print "no connection"
                quit()

        dd = serdisp.serdisp_init(sdcd, dispname, "")

        if dd == 0:
                print "error opening display"
                quit()

        serdisp.serdisp_clear(dd)
        dd_width = serdisp.serdisp_getwidth(dd)

        for i in xrange(dd_width):
                serdisp.serdisp_cleanbuffer(dd)
                serdisp.serdisp_setpixel(dd,i,0,1)
                serdisp.serdisp_update(dd)

Chargement de la lib serdisplib en Python

Pour charger la lib depuis votre code Python, rien de plus simple.

On charge le module Python


#!/usr/bin/python
from ctypes import CDLL

if __name__ == "__main__":
        sharedlib = 'libserdisp.so'
        serdisp = CDLL(sharedlib)
        dispname = "ALPHACOOL"
        sdcdev = "USB:060c/04eb"
        sdcd = serdisp.SDCONN_open(sdcdev)

        if sdcd == 0:
                print "no connection"
                quit()

        dd = serdisp.serdisp_init(sdcd, dispname, "")

        if dd == 0:
                print "error opening display"
                quit()

        serdisp.serdisp_clear(dd)
        dd_width = serdisp.serdisp_getwidth(dd)

        for i in xrange(dd_width):
                serdisp.serdisp_cleanbuffer(dd)
                serdisp.serdisp_setpixel(dd,i,0,1)
                serdisp.serdisp_update(dd)

Puis on crée un objet pour charger la lib


#!/usr/bin/python
from ctypes import CDLL

if __name__ == "__main__":
        sharedlib = 'libserdisp.so'
        serdisp = CDLL(sharedlib)
        dispname = "ALPHACOOL"
        sdcdev = "USB:060c/04eb"
        sdcd = serdisp.SDCONN_open(sdcdev)
        if sdcd == 0:
                print "no connection"
                quit()

        dd = serdisp.serdisp_init(sdcd, dispname, "")

        if dd == 0:
                print "error opening display"
                quit()

        serdisp.serdisp_clear(dd)
        dd_width = serdisp.serdisp_getwidth(dd)

        for i in xrange(dd_width):
                serdisp.serdisp_cleanbuffer(dd)
                serdisp.serdisp_setpixel(dd,i,0,1)
                serdisp.serdisp_update(dd)

Et oui! Le fichier de la lib s’appelle libserdisp.so.

Connexion avec l’afficheur

Ensuite on déclare l’adresse sur le bus de votre afficheur ainsi que le nom du matériel :


#!/usr/bin/python
from ctypes import CDLL

if __name__ == "__main__":
        sharedlib = 'libserdisp.so'
        serdisp = CDLL(sharedlib)
        dispname = "ALPHACOOL"
        sdcdev = "USB:060c/04eb"
        sdcd = serdisp.SDCONN_open(sdcdev)

        if sdcd == 0:
                print "no connection"
                quit()

        dd = serdisp.serdisp_init(sdcd, dispname, "")

        if dd == 0:
                print "error opening display"
                quit()

        serdisp.serdisp_clear(dd)
        dd_width = serdisp.serdisp_getwidth(dd)

        for i in xrange(dd_width):
                serdisp.serdisp_cleanbuffer(dd)
                serdisp.serdisp_setpixel(dd,i,0,1)
                serdisp.serdisp_update(dd)

Lorsque c’est fait, on peut alors ouvrir une connexion vers l’afficheur :


#!/usr/bin/python
from ctypes import CDLL

if __name__ == "__main__":
        sharedlib = 'libserdisp.so'
        serdisp = CDLL(sharedlib)
        dispname = "ALPHACOOL"
        sdcdev = "USB:060c/04eb"
        sdcd = serdisp.SDCONN_open(sdcdev)

        if sdcd == 0:
                print "no connection"
                quit()

        dd = serdisp.serdisp_init(sdcd, dispname, "")

        if dd == 0:
                print "error opening display"
                quit()

        serdisp.serdisp_clear(dd)
        dd_width = serdisp.serdisp_getwidth(dd)

        for i in xrange(dd_width):
                serdisp.serdisp_cleanbuffer(dd)
                serdisp.serdisp_setpixel(dd,i,0,1)
                serdisp.serdisp_update(dd)

Le test qui suit sert à savoir si un pointeur vers la connexion existe, autrement dit, on veut savoir si la connexion est établie.

Une fois que la connexion est établie, il faut l’initialiser.


#!/usr/bin/python
from ctypes import CDLL

if __name__ == "__main__":
        sharedlib = 'libserdisp.so'
        serdisp = CDLL(sharedlib)
        dispname = "ALPHACOOL"
        sdcdev = "USB:060c/04eb"
        sdcd = serdisp.SDCONN_open(sdcdev)

        if sdcd == 0:
                print "no connection"
                quit()

        dd = serdisp.serdisp_init(sdcd, dispname, "")

        if dd == 0:
                print "error opening display"
                quit()

        serdisp.serdisp_clear(dd)
        dd_width = serdisp.serdisp_getwidth(dd)

        for i in xrange(dd_width):
                serdisp.serdisp_cleanbuffer(dd)
                serdisp.serdisp_setpixel(dd,i,0,1)

Vous noterez la chaîne de caractère vide passée en argument de la méthode serdisp_init, cet argument sert normalement à passer des options propres au câblage avec votre afficheur. Je vous laisse consulter la page de la lib sur le sujet. Pour les options spécifiques à votre écran, vous trouverez tout ce qu’il vous faut dans les liens du tableau des écrans supportés.

Pour travailler à partir d’un écran vierge, il faut effacer tout ce qui est en mémoire.


#!/usr/bin/python
from ctypes import CDLL

if __name__ == "__main__":
        sharedlib = 'libserdisp.so'
        serdisp = CDLL(sharedlib)
        dispname = "ALPHACOOL"
        sdcdev = "USB:060c/04eb"
        sdcd = serdisp.SDCONN_open(sdcdev)

        if sdcd == 0:
                print "no connection"
                quit()

        dd = serdisp.serdisp_init(sdcd, dispname, "")

        if dd == 0:
                print "error opening display"
                quit()

        serdisp.serdisp_clear(dd)
        dd_width = serdisp.serdisp_getwidth(dd)

        for i in xrange(dd_width):
                serdisp.serdisp_cleanbuffer(dd)
                serdisp.serdisp_setpixel(dd,i,0,1)
                serdisp.serdisp_update(dd)

Petite animation sur l’écran

Notre animation consiste à allumer les pixels de la première ligne de l’écran un à un, de la gauche vers la droite.

Pour cela on récupère la largeur de l’écran et on lui fait afficher un pixel aux coordonnées suivantes :

ligne : 0

colonne : i où i varie de 0 à (largeur_de_l_écran -1)

Vous noterez que j’utilise la méthode serdisp_cleanbuffer() avant d’écrire le pixel puis la méthode serdisp_update() pour mettre à jour l’afficheur.

Dans les examples données sur le site de la lib, c’est la méthode serdisp_clear() qui est utilisée avant de mettre à jour l’afficheur, mais le problème avec celle-ci c’est qu’elle vide l’écran avant, ce qui a pour conséquence de provoquer un effet de clignotement à chaque mise à jour.

Imaginons que vous vouliez afficher une horloge réactualisée toutes les secondes, ceci reviendrait à effacer l’écran pour redessiner l’image. Ce qu’on voudrait serait plutôt que seuls les pixels qui ont changer soient modifiés.

Pour éviter un tel problème et obtenir le résulat voulu, je conseille d’utiliser la méthode serdisp_cleanbuffer(). Elle va vider le tampon d’affichage, mais pas l’écran, ainsi lorsque vous mettrez à jour l’afficheur, seuls les pixels modifiés seront actualisés. 😀

  • blié le octobre 24, 2015 - 11:56
  • r lourderadj
  • blié dans

No comments yet

isser un commentaire



Tweets
    Optimization WordPress Plugins & Solutions by W3 EDGE