Adaptació de les pràctiques --------------------------- Simulació de dispositius ........................ Suposem que heu d'utilitzar un sensor de distància via ultrasons. Per exemple, el HCSR04. Explorant per internet podeu trobar exemples d'ús, com per exemple `aquest enllaç `_, o `aquest altre enllaç `_. El codi present en aquests portals per gestionar el dispositiu HCSR04 es pot reestructurar dissenyant una classe com la que segueix: .. literalinclude:: hcsr04.py :language: python .. :emphasize-lines: .. :linenos: El podeu descarregar a :download:`hcsr04.py`. En `raspberrypi.org `_ trobareu informació sobre el mòdul *GPIO* i el connector d'entrades/sortides de la *raspberrypi*. Bàsicament tots els sensors o dispositius tenen el següent esquema d'interacció: .. literalinclude:: dispositiu.py :language: python .. py:module:: dispositiu L'especificació genèrica és: .. py:class:: Dispositiu(dadesInicials) Torna un objecte que a partir de *dadesInicials*, inicialitza i configura el dispositiu que representa, i estarà apunt per gestionar-lo amb els seus mètodes, .. rubric:: Mètodes .. py:method:: fixa(paràmetres) A partir dels paràmetres condiciona el comportament futur del sensor .. py:method:: llegeix() Retorna la dada obtinguda pel dispositiu .. py:method:: escriu(dades) Envia dades al dispositiu per que aquest ho projecti cap a fora. .. py:method:: tanca() Desactiva el dispositiu A més, la classe suporta la funció :class:`iter` que retorna un iterador que lliura les dades que el dispositiu va obtenint. A partir d'aquest esquema, aconseguim encapsular i concentrar tota la gestió i interacció del dispositiu o sensor en un objecte de la classe. D'aquesta manera, les particularitats del dispositiu no es dispersen en el codi del programa general que gestioni el dispositiu. Si més endavant canviem de dispositiu, només caldrà canviar la implementació de la classe, i no caldrà canviar pas la resta del programa. Donades les circumstàncies, molts no tindreu el hardware necessari, i probablement no teniu ni una *raspberry* al vostre abast. Ho podem fer virtualment instal·lant *raspbian* en una *VirtualBox*. Per completar el projecte el que cal es substituir el codi de les classes de sensors per un codi que ho simula sense canviar la resta del programa. Per exemple, en el cas de l'exemple, generem dades de distància i les guardem en un fitxer per després llegir-les com si el sensor les obtingués. El codi que substituiria l'original quedaria: .. literalinclude:: hcsr04s.py :language: python .. :start-after: .. :end-before: def programa(): I un programa de prova que serviria pels dos dissenys del sensor HCSR04, .. literalinclude:: programa2.py :language: python Us ho podeu descarregar a :download:`hcsr04s.py` i :download:`programa2.py`. Si ho voleu provar, editeu un fitxer :file:`hcsr04.dat` amb dades de distància, una per línia. Un exemple d'ús el teniu aquí (:download:`test-hcsr04.txt`): .. literalinclude:: test-hcsr04.txt :language: python No cal que sigui un fitxer de dades les dades a adquirir, També les podem generar de forma aleatòria com per exemple (:download:`hcsr04s2.py`) , .. literalinclude:: hcsr04s2.py :language: python O usant una funció (:download:`hcsr04s3.py`) , .. literalinclude:: hcsr04s3.py :language: python Actualitzant la importació en el programa de prova, podreu veure com funciona aquestes darreres adaptacions. Recordeu d'aturar el flux prement les tecles control i C simultàniament. L'adaptació exposada és extensiva per la resta de dispositius. Pel cas d'una càmera és el mateix (En `picamera, `_ *capture* correspon al mètode *llegeix*, *start_preview* és el mètode *fixa*, etc). Ho podem simular fent una gravació de vídeo, i després fer veure que aquesta gravació és el que veu la càmera. Pel cas de leds (per exemple, veure `aquí `_) el mètode *escriu* tindria un paràmetre que seria *ON* o *OFF* depenent de si volem encendre'l o apagar-lo. Podríem posar en classe un atribut que controli si està encès o apagat. Pel cas de motors, *llegeix* seria per obtenir posició del motor, i *escriu* seria per fixar la posició del motor. Els leds i els motors es podrien simular usant el paquet `pygame `_. Teniu una introducció de pygame a aquesta `pàgina `_. La documentació completa la trobareu al lloc oficial de `pygame `_. Cada dispositiu hauria de ser un *sprite* (i per tant, la classe haurà de heretar de la classe :class:`Sprite`. Cada cop que modifiquem l'estat del dispositiu, actualitzem la pantalla. Ús del control de versions .......................... Recordeu que tots esteu donats d'alta al portal `http://jocs.lsi.upc.edu:5000/ `_. Amb les circumstàncies actuals de confinament, que res millor que fer-ne un ús intensiu del gestor de dipòsits per provar si és una eina adequada per seguir treballant en equip. En aquesta `altra pàgina `_ trobareu indicacions de com treballar en la plataforma *kalithea* de gestió de dipòsits. En `aquesta pàgina `_ trobareu un exemple de com treballar amb Mercurial. En la documentació final dels projectes us demanaré que dediqueu mitja pàgina dedicada a descriure com ha estat la vostra experiència de col·laboració amb *mercurial/kallithea* (avantatges, crítica, dificultats, etc).