Windows 7 : une API spécialisée pour les capteurs

29 juin 2009 09:40 par Nicolas Clerc

Depuis l’annonce de Windows 7 lors de la PDC 2008, nous avons surtout entendu parler des caractéristiques "multitouch" et de la nouvelle barre des tâches de Windows 7.

Néanmoins, le multitouch n’est pas la seule nouveauté permettant à Windows 7 de mieux appréhender son contexte environnemental. Une autre nouveauté importante (mais relativement passée inaperçue) vient simplifier et fédérer l’utilisation de capteurs au sein de Windows : la « Sensor Api ».

Fidèle à notre positionnement d’expert technologique, et à notre maîtrise des technologies présentes sur le poste client, nous vous proposons un exemple de mise en œuvre de cette API par la réalisation d’une couche d’intégration à WPF et de sa mise en œuvre dans la démo « Tron » que Mitsu nous avait concocté pour les TechDays 2007.

La « Sensor Api » a été conçue de manière générique et offre une grande souplesse quant aux types de capteurs supportés (biométrique, mécanique, électrique, environnemental, lumière, positionnement, mouvement, orientation et scanner) et à leurs caractéristiques (précision, seuil, taux de rafraîchissement, valeur…). Ces capteurs peuvent être physiques (accéléromètre…) ou bien virtuel (pas de périphérique physique associé).

Un exemple concret est plus parlant. Actuellement, pour effectuer une géo-localisation, 2 techniques sont réellement opérationnelles : via un GPS ou via les antennes relais des téléphones cellulaires.

Cela implique que l’application soit capable de parler le protocole NMEA  et d’accéder aux ports série ou Bluetooth pour dialoguer avec le GPS, et de communiquer avec la carte 3G/HSDPA (ou le service de l’opérateur) pour utiliser la position cellulaire. Au final, on arrive pourtant aux mêmes informations : une localisation et une notion de précision.

La « Sensor API » permet de fédérer différentes sources d’informations pour obtenir un même jeu de données : les capteurs de type « Location » renvoient une position, cette famille regroupe donc les deux moyens de localisation évoqués ci-avant. En utilisant la « Sensor Api », l’application devient indépendante de la source d’information et donc plus évolutive (basculement d’une source à l’autre si besoin, support automatique de nouveaux capteurs : géo localisation via l’adresse IP ou la borne wifi par exemple).

Parmi ceux qui ont participé à la PDC 2008, certains ont été chanceux et ont pu récupérer (si ce n’est pas le cas, vous pouvez la commander sur le site du fabricant) un exemplaire d’une platine électronique de test comportant 3 capteurs : luminosité, accéléromètre 3D, clavier sensitif 8 touches : la « Windows Sensor Development Platform » de Freescale.


© Freescale
(
http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=JMBADGE2008-B)

Je ne rentrerai pas dans le détail électronique de cette carte car ce n’est pas le sujet de ce billet, mais sachez qu’elle est basée sur un microcontrôleur Coldfiretm, et qu’elle possède deux modes de fonctionnement :

  • Autonome (sur batterie intégrée) : Un ensemble de démo et de jeux utilisant les capteurs
    et l’afficheur multi-led intégré.
  • Connecté avec Windows 7 en USB : son firmware (logiciel interne embarqué) lui
    permet d’être détecté et utilisé comme un ensemble de « capteurs » reconnu par
    Windows 7 et utilisable via la « Sensor Api »

C’est bien entendu cette 2e possibilité qui nous intéresse dans la suite de ce billet.

Pour utiliser cette platine de test et compiler le code source, il est nécessaire d’avoir un Windows 7 RC (http://technet.microsoft.com/fr-fr/evalcenter/dd353205.aspx) avec Visual Studio 2008 (http://msdn.microsoft.com/fr-fr/evalcenter/bb655861.aspx), et d’avoir effectué la mise à jour du firmware de la carte en version RC pour cause d’évolution des APIs entre la version Beta et la RC (http://code.msdn.microsoft.com/SensorsAndLocation).

Il ne reste plus qu’à relier la platine électronique à un port USB. Lors de cette première connexion de la carte à un PC sous Windows 7, il faut activer et autoriser l’accès aux capteurs. Cela se fait via un panneau de contrôle spécifique :

 

 

L’accès natif à la « SensorApi » se fait via des interfaces COM qui permettent :

  • d’accéder à la liste des capteurs disponibles ;
  • de récupérer les métadonnées et les données des différents capteurs ;
  • de s’abonner aux événements déclenchés par les capteurs, ou par leur changement
    de statut.

Microsoft fournit un exemple d’utilisation de ces interfaces COM en C# .Net : la « Windows 7 Sensor and Location .Net Interop Sample Library » (http://code.msdn.microsoft.com/SensorsAndLocation). Nous utiliserons cette librairie comme socle de base pour notre développement. Bien qu’utilisable dans les applications WPF, cette librairie n’est qu’une encapsulation .Net de l’api native de Windows 7, et n’apporte aucun support des caractéristiques de haut niveau de WPF.

La première étape consiste donc à créer une surcouche afin de fournir une accessibilité aisée aux capteurs et une intégration plus fine avec WPF : la librairie « SensorWpf ».

Ce code est à considérer comme un ‘exemple’ et n’a été testé qu’avec la carte de test fournie lors de la PDC 2008. Son code source étant disponible sur codeplex (http://sensorwpf.codeplex.com/) n’hésitez pas à ajouter le support de nouveaux capteurs ou de nouvelles fonctionnalités.

La classe singleton « WpfSensorManager » est le point d’entrée. Elle permet d’initialiser l’API et de créer les instances qui encapsuleront l’accès aux données des différents capteurs. Elle expose une collection pour chaque famille de capteur supportée.

if (WpfSensorManager.Current.Accelerometers3D.Count < 1)
     Debug.WriteLine("No accelerometer sensor on your system");

if (WpfSensorManager.Current.LightSensors.Count < 1)
     Debug.WriteLine("No light sensor sensor on your system");
else
    
grdAmbientLight.DataContext = WpfSensorManager.Current.LightSensors[0];

Chaque famille de capteur possède une classe qui encapsule l’accès aux données spécifiques du capteur et qui implémente les fonctionnalités d’intégration à WPF :

  • Support du ‘binding’ : implémentation de INotifyPropertyChanged et utilisation d’ObservableCollection<>.
  • Encapsulation des données des capteurs sous forme de Property.
  • Accessibilité aisée aux données des capteurs (pour les SwitchArray par exemple).
  • Evénement typé associé aux changements de valeurs des données.
  • Calibration simpliste permettant d’extraire les valeurs minimum/maximum fournies par un capteur pendant un intervalle de temps.

Ces classes héritent d’une classe abstraite « WpfSensor » encapsulant l’accès aux informations communes à toutes les familles de capteurs (nom, identification, version…).

Le projet contient un UserControl qui permet de tester très facilement la librairie et d’afficher les valeurs des trois capteurs de la platine de test (accéléromètre 3D, luminosité et 2 rangées de 4 touches sensitives).

Et pour le fun, le jeu « Tron » de Mitsu (http://www.benjamingauthey.com/post/Tron-Version-WPF.aspx) a été modifié pour supporter la carte de test via la librairie WpfSensor :

  • Bascule de la carte :  
    • à gauche : tourner à gauche ;
    • à droite : tourner à droite ;
    • en avant : on accélère ;
    • en arrière : on ralentit.
  • Touche sensitive « E8 » : équivalent au menu « New game ».

La petite subtilité concerne le support du changement de direction : il a fallu implémenter un seuil déclenchant le changement de direction (il faut incliner suffisamment la carte), mais aussi un palier de retour à l’horizontal (approximatif J) avant d’accepter de prendre en compte un nouveau changement de direction.

 

Voilà pour un petit tour d’horizon rapide de cette nouvelle « Sensor Api ». Il reste maintenant à espérer que les fabricants de matériel et les fournisseurs de services joueront le jeu et nous fournirons des drivers ou du matériel intégrant nativement des capteurs. D’autant plus qu’il ne leur manque que quelques lignes de code pour rendre exploitable les capteurs de tout genre qui équipent déjà nos machines : température (processeur, carte graphique, boîtier), vitesse de rotation (ventilateur), luminosité (certains portables), accéléromètre (certains portables : pour gérer le parcage des têtes de lecture des disques en cas de chute)…