• Aucun résultat trouvé

Mise en œuvre dans un Bâtiment Haute Technologie

Nous allons présenter les scénarios que nous avons développés au CSTB. Un aspect est utilisé pour décrire un scénario d’application particulier. L’architecture des composants peut évoluer de manière indépendante.

Nous présentons, dans cette section, quatre sous-systèmes adaptatifs : le câblage par profil, le système d’alarme, le système d’éclairage et l’intégration du volet.

pointcut pcMsgTxt:

vMessage := /fieldMessage∗/

vText := /fieldMessage∗/ { print ’fieldText’ substr($1,12) } recogMessage := /recogMessage/

recogText := /recogText/

adviceRecogMesTxt(vMessage,vText,recogMessage,recogText):

sttMessage : ’WComp.Services.SpeechToText’ ; ttsMessage : ’WComp.Services.TextToSpeech’ ; recogMessage.^EmitErase →( vMessage.Clear ) ; recogMessage.^DisplayReport →( ttsMessage.Speak ) recogMessage.^EmitBool →( sttMessage.set_listenFlag ) ; recogMessage.^EmitText →

( sttMessage.ListenToText )

sttText : ’WComp.Services.SpeechToText’ ; ttsText : ’WComp.Services.TextToSpeech’ ; recogText.^EmitErase →( vText.Clear ) ; recogText.^DisplayReport →( ttsText.Speak )

recogText.^EmitBool →( sttText.set_listenFlag ) ; recogText.^EmitText →( sttText.ListenToText )

Figure 6.23 – AA de contrôle vocal (message et sujet de l’email)

Dans l’implémentation des scénarios, nous voyons d’une part que les greffons expriment les relations structurelles entre les composants logiciels. D’autre part, les points de coupe permettent d’exprimer d’autres caractéristiques de ces scénarios comme ce qu’est, de manière générique (sous la forme d’une expression régulière), un système d’éclairage dans une maison. Un système d’éclairage ne peut pas être décrit et caractérisé (uniquement) par un schéma d’interconnexion.

6.6.1 Contexte expérimental

6.6.1.1 Architecture matérielle cible

Le but principal de cette plate-forme est de programmer des dispositifs pour une utilisation dans un studio équipé, en guise de laboratoire expérimental. En particulier, nous voulons offrir un ensemble de dispositifs matériels que les utilisateurs peuvent choisir et assembler pour construire son propre espace informatique ambiant. Nous ne disposons cependant pas de la plate-forme .NET sur le rou-teur. Nous avons utilisé des microcontrôleurs (AVR) et un routeur (WL500g Premium) constituant le système informatique. Le routeur contient l’implémentation complète de l’unité de conception AA Dans cette section, nous présentons les différents scénarios que nous avons mis en place dans le laboratoire GERHOME.

6.6.1.2 Infrastructure logicielle

Ne pouvant pas utiliser le container C# pour contenir l’assemblage de composants, nous avons donc porté et construit deux containers supplémentaires : Container Java (supposant l’installation d’un environnement Java) et Container C++ (sans pré-requis).

Ces deux implémentations existent pour les raisons (1) de portabilité de l’environnement Java et (2) des performances que l’on pourrait obtenir en ayant un code compilé en langage C++. Les containers que nous avons construits utilisent la libUPnP pour implémenter les services composites. Nous présentons dans cette section les exemples, les AAs et quelques composants pour illustrer leur utilisation.

6.6.2 Scénarios et mise en œuvre de WComp

Couplage Système d’alarme et Système d’alarme : Dans cette section, nous présentons un

exemple d’utilisation des aspects d’assemblage qui est utilisé dans une situation réelle d’observation et de déclenchement d’alarme. Cet exemple permet de déclencher une alarme lorsqu’une entité (qui peut être une personne, un appareil, etc.) n’a pas été active pendant une durée de 25 secondes.

Le greffon suivant (Figure 6.24) implémente la fonctionnalité de système d’alarme. C’est un système d’alarme basique qui comprend un capteur de présence et une sirène d’alarme. Le greffon

connecte les deux sorties du capteur de présence ˆSomebody et ˆNobody aux entrées respectives

Onet Off de la sirène d’alarme. Nous indiquons, dans ce greffon, que d’autres connexions peuvent

être faites avant le déclenchement de la sirène d’alarme.

advicepresalarm (pres, siren) : pres.^Somebody →( call ; siren.On ) pres.^Nobody →( call ; siren.Off )

Figure 6.24 – Système d’alarme

advices0l0(genswitch, genlight):

genswitch.^On →( call + genlight.LOn ) genswitch.^Off →( call + genlight.LOff )

Figure 6.25 – Système d’éclairage – Greffon

Système d’éclairage : Le système d’éclairage est exprimé à la fois à travers un greffon et

également par un point de coupe. D’abord, le greffon permet d’exprimer la relation structurelle basique qu’il existe entre une lampe et un interrupteur. Nous retrouvons cette relation dans la Figure 6.25. Elle dit que les événements ˆOn et ˆOff sont connectés aux entrées respectives LOn et

LOff d’une lampe et que ces signaux peuvent être connectés à d’autres composants sans problème

d’ordonnancement.

pointcutpc1: genlight=/light∗/

genswitch=/light∗/ { a=substr(\$1,6); print "switch" a; }

Figure 6.26 – Système d’éclairage – Point de coupe

Nous exprimons maintenant le caractère générique d’un système d’éclairage. Dans cet exemple, nous faisons correspondre chaque interrupteur portant le numéro i (comme switch97 portant le numéro 97) à la lampe ayant le même numéro i. Nous remarquerons que le programme AWK de la seconde ligne effectue un remplacement du préfixe “light” du nom de composant par le préfixe “switch”.

L’exemple fig. 6.27 peut impliquer deux greffons dupliqués Ex1 et Ex2, les paramètres ne sont pas associés aux paramètres ayant le même nom : user2 est associé à err1 et user1 à err2.

La décision d’intégrer le greffon d’adaptation à un point de coupe spécifié suit les règles sui-vantes : (1) uniquement les premières colonnes complètes du tableau deviennent des paramètres des greffons dupliqués (dans cet exemple, seulement les deux premières colonnes deviennent des pa-ramètres). (2) L’ordre des noms dans la première ligne user2, user1 peut changer. C’est pourquoi, pour appliquer un greffon de manière déterministe, les lignes doivent être triées.

Cet exemple de système d’alarme nous permet d’illustrer la manière dont les aspects d’assemblage peuvent être utilisés pour répartir des modifications à travers tout un as-semblage de composants. Cette duplication est spécifiée au niveau des points de coupe.

Câblage par profil Nous spécifions d’abord trois greffons ISL. Le premier greffon contient la

spécification du schéma d’assemblage des capteurs et actionneurs de l’appartement correspondant à un certain profile de personne dite rouge (fig. 6.28).

Au niveau du langage intermédiaire ISL4WComp, nous distinguons quatre règles d’adaptation et

adviceEx1 (user2, err1):

user2.^Out →( if (err1.Check) call ) err1.Check →( err1.Start ; call ) adviceEx2 (user1, err2):

user1.^Out →( if (err2.Check) call ) err2.Check →( err2.Start ; call )

Figure 6.27 – Duplication et système d’alarme

règle (ligne 2) concerne la sortie ˆOn que l’on reconnaît grâce au préfixe ‘^’ du composant s0.

Elle indique que la diffusion de l’événement On au niveau des connexions de cette sortie qui sont

déjà établies vont être mis en concurrence avec l’activation de l’entrée LOn du composant l0. Les

trois lignes suivantes (lignes 3 à 5) reflètent la même adaptation mais pour des composants et des entrées-sorties différentes.

advicepersoRouge (s0, l0, s1, l1) : s0.^On →( call + l0.LOn ) s0.^Off →( call + l0.LOff ) s1.^On →( call + l1.LOn ) s1.^Off →( call + l1.LOff )

Figure 6.28 – Greffon d’adaptation pour le profile rouge

Un deuxième AA (fig. 6.29) contient la spécification du schéma de câblage des capteurs et actionneurs de l’appartement correspondant un certain profile de personne que nous avons qualifié de bleu.

Comme pour le greffon ci-dessus, au niveau du langage intermédiaire ISL4WComp, nous dis-tinguons quatre règles d’adaptation et spécifions que l’adaptation se fait sur quatre composants

identifiés par s0, l0, s1 et l1. La première règle (ligne 2) concerne la sortie ˆOn du composant s0.

Elle indique que la diffusion de l’événement On au niveau des connexions de cette sortie qui sont

déjà établies vont être mis en concurrence avec l’activation des entrées LOn du composant l0 et

l1. La ligne suivante reflètent la même adaptation mais pour des composants et des entrées-sorties

différentes. Les deux dernières lignes (4-5) sont les mêmes que celles du greffon précédent. Cette

différence a pour effet d’actionner au même moment les composants l0 et l1en fonction de s0.

advicepersoBlue (s0, l0, s1, l1, h) : s0.^On →( call + l0.LOn + l1.LOn ) s0.^Off →( call + l0.LOff + l1.LOff ) s1.^On →( call + l1.LOn )

s1.^Off →( call + l1.LOff )

Figure 6.29 – Profile bleu

Enfin, le dernier greffon contient l’assemblage de composants nécessaire à l’ajout d’un composant

Human à l’assemblage de composants. En effet, il ajoute à l’assemblage lorsqu’il est sélectionné, le

composant creator (ligne 2). Il connecte ce composant de manière conditionnelle à l’entrée Create de creator ou à Destroy (ligne 5 et 7). Le composant creator est également connecté au conteneur pour l’ajout effectif et le retrait de composants.

Nous sélectionnons trois aspects d’assemblage. Le premier est l’assemblage virtuel pour l’utili-sateur, le second pour l’utilil’utili-sateur, le troisième assemblage est un assemblage permettant d’intégrer au firmware du contrôleur le logiciel permettant de reconnaître un utilisateur particulier représenté par l’aimant.

Cela peut servir dans le cadre effectif de l’aide des personnes âgées en modifiant dynamiquement l’infrastructure des capteurs/actionneurs pour cibler certaines déficiences.

advicecreator (id, container) : creator : Creator ; id.^Change →( if(id.Someone) { creator.Create } else { creator.Destroy } ) creator.^AddComponent →(container.AddComponent) creator.^RemoveComponent →(container.RemoveComponent) Figure 6.30 – Créateur

Cet exemple permet de montrer que les aspects d’assemblage peuvent être déclenchés par la présente d’individus dans l’environnement. Pour que cela soit possible, chaque individu est représenté par un service de l’infrastructure.

Intégration d’un nouveau dispositif : Le nouveau dispositif est accompagné de son aspect

d’assemblage d’intégration.

Dans le greffon de la Figure 6.31, nous substituons la connexion à l’entrée On de la lampe light par le comportement suivant. Nous effectuons un test de la luminosité renvoyée par un capteur équipant le volet shutter. Si celui-ci renvoie vrai (sous-entendu que la luminosité est suffisante), alors nous ouvrons le volet électrique. Dans le cas contraire, nous exécutons un call c’est-à-dire l’action déroutée, à savoir l’allumage de la lampe. Nous remarquerons à la ligne 9 que l’extinction de la lampe s’accompagne également de l’ordre de fermeture des volets électriques.

advicevolet (light, shutter) : light.LOn →( if(shutter.Bright) { shutter.Open } else { call } )

light.LOff →( call + shutter.Close )

Figure 6.31 – Intégration du volet

Écriture des points de coupe : L’écriture des points de coupe permet de raccrocher les greffons

que nous avons définis précédemment aux composants logiciels de l’application.

Le premier point de coupe concerne le système de câblage par profil. Ce point de coupe est très simple. C’est le point de coupe tautologique. Cela signifie que les variables utilisées dans les greffons correspondent aux identifiants des composants logiciels. Aucun traitement n’est donc effectués au préalable sur celles-ci.

pointcutpc0: tautologie

Figure 6.32 – Câblage par profil

Ensuite, au niveau du point de coupe pour le système d’alarme, les identifiants des composants logiciels ne correspondent pas aux variables utilisées dans les greffons. Nous définissons donc une correspondance ici 1-1 entre les variables et les identifiants des composants. Notamment, la variable

pointcutpc10: pres←/p0/ siren←/a/

Figure 6.33 – Système d’alarme

Puis, nous voyons dans l’exemple qui suit un exemple d’enchaînement de deux points de coupe

pc1 et pc2. Ce dernier point de coupe permet de traduire les variables fournies par le greffon et

le calcul du premier point de coupe afin de les faire correspondre aux dénominations utilisées dans l’assemblage de composants de l’application.

pointcutpc2 after pc1:

genlight←/light∗/ { a=substr($1,6); print "l" a; } genswitch←/switch∗/ { a=substr($1,7); print "s" a; }

Figure 6.34 – Système d’éclairage

Enfin, nous retrouvons dans ce dernier exemple une correspondance 1-1 au niveau du point de coupe.

pointcutpc3: light←/l0/ shutter←/v0/

Figure 6.35 – Intégration du volet

Deux sous-systèmes alarme et éclairage ont été mis en place. On greffe un assemblage de com-posants pour partager l’information de présence du sous-système d’alarme pour en faire bénéficier le sous-système d’éclairage. On fait une transition sur la manière de greffer aux endroits précis les assemblages de composants.

Cet exemple nous montre l’intégration d’un volet électrique qui est un dispositif de l’infrastructure apportant avec lui son propre AA d’intégration.