Ce projet concerne un logiciel de téléchargement des données d'un tensiomètre BP A200 de Microlife sous Linux afin de les exploiter et les transmettre aux personnes concernées sans avoir besoin de s'équiper d'un OS alternatif.
Notez qu'un logiciel existe pour Windows et OSX. Ne pas fournir de logiciel pour Linux peut donc apparaitre comme de la mauvaise volonté commerciale. Et ce projet essaie d'y remédier.
Cet appareil est destiné à mesurer la tension artérielle chez soi, donc, en principe, dans des conditions meilleures qu'une fois de temps en temps chez le medecin. Cependant ces mesures sont à transmettre à son médecin traitant pour analyse et prise de décision. L'appareil mesure donc la tension et peut stocker jusqu'à 200 résultats dans sa mémoire interne.
L'appareil peut communiquer avec un PC par l'intermédiaire d'une connexion USB. Sous Linux, l'appareil est détecté comme une liaison série /dev/ttyUSB0 établie par le driver cypress_m8 qui est un module chargé automatiquement, lors du branchement du cable usb. Ce module fait partie du paquet kernel de votre distribution (au moins, sous Fedora. Mais à vérifier sur les autres). Le listing dmesg suivant montre comment l'appareil est détecté. Le programme aura donc à ouvrir cette liaison, envoyer des commandes, recevoir les résultats et les stocker dans un fichier au format CSV par exemple.
[ 815.412318] usb 6-1: new low-speed USB device number 3 using uhci_hcd [ 815.586297] usb 6-1: New USB device found, idVendor=04b4, idProduct=5500 [ 815.586302] usb 6-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [ 815.586305] usb 6-1: Product: USB to Serial [ 815.586309] usb 6-1: Manufacturer: Cypress Semiconductor [ 815.598354] cypress_m8 6-1:1.0: HID->COM RS232 Adapter converter detected [ 815.602459] usb 6-1: HID->COM RS232 Adapter converter now attached to ttyUSB0
L'observation de la liaison montre que les transferts se font par paquets de 8 octets sans doute imposé par la taille du buffer de l'USB endpoint avec un premier octet indiquant la longueur utile dans le paquet. Le transfert peut être composé de plusieurs paquets consécutifs. La longueur est préfixée par 0 dans le sens PC-appareil et par f dans l'autre sens. Et voici un exemple de commande réponse:
04 12 16 18 24 00 00 00 f7 06 33 31 33 30 33 30 f7 33 31 30 30 30 30 30 f7 30 30 30 30 30 30 30 f7 30 30 2c 30 35 2e 30 f5 30 0d 0a 36 34 2e 30
Un exemple de commande avec envoi de données vers l'appareil.
04 12 16 18 23 00 00 00 f1 06 34 39 30 37 37 31 07 30 30 30 30 30 30 30 07 31 30 30 30 30 30 30 07 30 30 30 30 30 30 30 07 30 30 30 30 30 30 30 06 30 30 30 30 31 36 00 f1 06 34 39 30 37 37 31
Une commande est acquittée par le code ACK 0x06, c'est le premier octet après la longueur. Une somme de controle termine le bloc de donnée.
Il faut noter que le découpage observé sur la ligne est effectué par le driver cypress_m8. Le programme se contente d'envoyer une commande sans le découpage et reçoit un paquet de données assemblées de longueur dépendant de la commande. Les longueurs sont du niveau du driver. Les codes ACK et checksum sont du niveau de l'application.
Voici la liste des commandes que l'application peut envoyer vers l'appareil:
Le code, envoyé au niveau de l'application, pour une commande est donc celui-ci en remplaçant xx par une des valeurs ci dessus:
12 16 18 xx
La réponse à la commande lecture des données de mesures est de longueur variable dépendant du nombre d'enregistrement.
00 02 # number of record, here 2 00 01 31 30 30 31 00 00 00 00 00 00 00 00 # userid # record 1 15 09 23 20 53 # date 23/09/2015 20:53 20 00 00 # params here 20 looks to # indicated mam 052 # pulse 82 13C # 4 * dia 70 # sys 112 052 # Repeated values 13C 70 ... # repeated records 02 # checksum
Après l'envoi de la commande, les données suivantes sont envoyées sous 2 formats, l'un avec un userid, l'autre sans. Les enregistrements sont effacés dans l'appareil.
0000 # code without userid 0001 # ?? 00 00 00 00 00 00 00 00 00 00 00 00 # data 16 # checksum
0001 # code with userid 0001 # ?? 31 30 30 31 00 00 00 00 00 00 00 00 # userid 00 00 00 00 # data 00 00 00 00 00 00 00 00 00 00 00 00 # data 18 # checksum
La réponse à la commande 0x24 indique le userid enregistré dans l'appareil.
31 30 30 31 00 00 00 00 00 00 00 # userid ,05 # len of userid .00\r\n 64 # checksum
La réponse à la commande 0x26 indique les paramètres enregistrés dans l'appareil.
09 24 15 20 11 08 12 # date in monitor 00 0' # ident string 011803010007000000000000FF3296F01496FA0A0101010101000400000000 0000 9B # checksum
Après l'envoi de la commande, les données suivantes sont envoyées à l'appareil. L'heure et la date sont changés dans l'appareil.
09 24 15 20 11 09 01 # date to monitor 0000 # ident string 011803010007000000000000FF3296F01496FA0A0101010101000400000000 F7 # checksum
La réponse à la commande 0x3e indique un code de série ou version de l'appareil.
3035304331 # serial code F9 # checksum
Le driver cypress_m8 gère l'interface USB. En conséquence, le programme ne nécessite aucune dépendance particulière.
Après le téléchargement du paquet bpddl , exécutez les commandes suivantes. Le binaire bpddl est installé dans /usr/local/bin
tar zxvf bpddl-yyyymmdd.tar.gz cd bpddl-yyyymmdd make make install
Lorsqu'on utilise une liaison série, on a coutume de locker le tty correspondant, pour éviter que 2 process utilisent en même temps le tty. Certaines distributions créent automatiquement le répertoire /run/lock/lockdev. Pour d'autres, il faut le créer au démarrage par exemple dans un fichier rc.local. Ne pas oubler de se mettre dans le groupe lock.
mkdir -m 0770 /run/lock/lockdev ; chown root.lock /run/lock/lockdev
sudo usermod -aG lock
Afin d'éviter de longues lignes de commande, le programme commence par lire un fichier de configuration bpddl.conf. Ce fichier peut être dans le répertoire courant, peut être défini par la variable d'environnement BPDDL_CONF_FILE ou tout simplement le fichier /etc/bpddl.conf. Un modèle de ce fichier est présent dans le paquet, il peut être nécessaire de l'ajuster à vos convenances.
Le programme bpddl fournit 4 commandes à l'utilisateur:
Quelques exemples de commande:
$ bpddl # lecture des données enregistrées $ bpddl -id 1001 # changement ID $ bpddl -time # mise à jour de l'horloge $ bpddl -del # effacement des données enregistrées
Les informations données précédemment sont issues uniquement de l'observation, elles peuvent donc comporter des erreurs. En conséquence il est préférable de les utiliser avec précaution et éviter de les prendre comme référence.
Le programme est testé uniquement sous Fedora, mais il devrait bien se comporter sur les autres distributions Linux et les unix-like.
Toute information complémentaire ou modification pour améliorer le fonctionnement est, bien sur, bienvenue.
The bpddl software is licensed under the terms of the GNU General Public License as published by the Free Software Foundation. See file COPYING in the package.