Archive of articles classified as' "Le Blog"

Back home

Mise à jour en v1.3 de l’application ‘Mirror By LCProd’ pour la gestion du lecteur RFID de Violet (Nabaztag et Cie)

5/03/2013

Création d’un interface pour l’administration des Tags du lecteur RFID,
Correction d’un bug sur l’encodage de la base sous Mountain Lion.
-> Télécharger la version 1.3

La dernière mise à jour en v.1.3 pour Mountain Lion…

– 4 mars 2013 – à télécharger depuis mon site Web.

Un Bug de mauvais gout est venu polluer mon projet lors d’une installation sous Mountain Lion (10.8). La base de données SQLite est mal encodée lors de sa création par l’application.

-> J’ai corrigé le problème en plaçant une base vierge dans le projet avec le bon encodage.


Une jolie interface dans l’esprit de Mac…

C’est en fait un panneau de préférence qui viens s’ajouter à ceux déjà présent dans ‘Préférences Système…’

Comment ça marche ?

L’application s’appuie maintenant sur une base SQLite stockée dans le panneau lui même. Cette base est lue aussi bien par le panneau de préférences pour la gestion des Tags et des actions que par l’application elle même qui va l’utiliser pour gérer les actions demandées.

Les actions sont maintenant des scripts Applescripts (au format .applescript) stockés dans le dossier Library/Application Support/Mirror By LCProd/ de l’utilisateur.

Attention : avec Lion et Mountain Lion, pour faire apparaître le dossier ‘Bibliothèque’ de l’utilisateur : il faut maintenir la touche alt appuyée et sélectionner le menu « Aller ». L’élément « bibliothèque » est alors visible.

 

2 Comments

Application Mac OS X : Gestion du ‘Mir:ror’ de Violet, le lecteur RFID associé au Nabaztags.

27/02/2013

Création d’un package pour le déploiement de l’application de gestion du périphérique ‘Mir:ror’ de la société Violet.
Le tout est disponible dans une belle image disque… à télécharger depuis mon site Web.

A. Le principe de l’application…

Le ‘Mir:ror’ est un périphérique HID (Human Interface Device) qui ne demande pas de pilote. L’interface s’utilise en envoyant ou récupérant des chaines en Héxadécimal.

Je me base sur le projet de hidapi de signal11 pour générer la bibliothèque ‘libhidapi.0.dylib’ pour Mac ainsi que l’exécutable ‘hidtest’ modifié par mes soins.

L’exécutable génère un appel vers un script Bash (mirror_tags.sh) avec comme paramètres : l’action (show/hide) suivi de l’identifiant du tag.

Cas de la transformation en C++ de la variable int vers char :

Je suis (enfin!) arrivé à transformer en C++ la variable integer (qui contient les données héxadécimal du Mir:ror) en char de manière à générer une chaine de texte utilisable… (voir le fichier hidtest.cpp)

char response[1];
char url[256];

response[0]=buf[0];
response[1]=buf[1];

sprintf(url,"%02hhx",response[0], response[1], ...);

Le tout est lancé sur le Mac par le biais d’un service de lancement (launchd).

B. Le package Mac OS X…

Je génère deux versions du projet :

  • Une version 32bits (j’ai un vieux MacBook Pro Core Duo qui ne travaille pas en 64bits)
  • Une version 64bits.

Chaque package copie les différents composant du projet à leur place définitive :

  • Installation de la librairie ‘libhidapi’ dans /usr/local/lib/
  • Installation de l’exécutable ‘Mirror’ dans /usr/local/bin/
  • Installation du fichier de configuration ‘mirror_tags.sh’ dans « ~/Library/Application Support/Mirror By LCProd/ »
  • Installation du service de lancement ‘fr.lcprod.mirror.plist’ dans « ~/Library/LaunchAgents/ »

L’installateur exécute ensuite un le service de lancement pour démarrer l’application.

Cas de l’installateur Mac (PackageMaker) :

L’installateur ne permet pas d’installer en une fois des fichiers pour le système et pour l’utilisateur… je décide de le lancer root en vue d’une installation vers le système.

J’organise le déploiement en trois temps :

  1. Les fichiers soit copiés vers un répertoire temporaire par l’installateur.
  2. Un script Bash de post traitement Bash copie les fichiers vers leurs emplacements définitif : La commande ‘cp -aR’ permet de garder les droits originaux des fichiers 🙂
    cp -aR dossier_depart dossier_destination
  3. Le lancement du service doit être fait par l’utilisateur, j’utilise la commande ‘su’ pour activer ‘launchctl load …’
su $USER -c 'launchctl load -F $HOME/Library/LaunchAgents/fr.lcprod.mirror.plist'

Le tout est disponible dans une belle image disque… à télécharger depuis mon site Web.

C. Vos remarques, vos questions, vos améliorations… : Commentez ici ou envoyez des Tweets (@lcprod)

Un merci pour les ressources du Web :

 

No Comments

Utilisation d’un Mir:ror pour piloter un Mac. (LinuX / Mac)

24/02/2013

Comment faire revivre ce périphérique de l’âge des Nabaztag pour piloter un Mac :
Une histoire avec du C/C++, une dose de Bash et un peu d’AppleScript (osascript) et une bidouille
avec VLC

A. On commence à penser le truc sur le linuX…

L’idée : c’est de piloter le périphérique depuis un Linux mais exécuter des commandes sur d’autres machines. Pour piloter les Macs, j’utilise des scripts AppleScript lancés au travers d’un tunnel SSH.

1. Je me base sur le projet reflektor que je compile sur le linuX…
2. Ce projet écrit en C fabrique un fichier caché (.reflektor_do) dans le répertoire de l’utilisateur avec l’ID des Tags et la commande à exécuter :

     show d0021a053b453906:/home/user/mirror/actions_do.sh show d0021a053b368906 hide
     d0021a053b453906:/home/user/mirror/actions_do.sh hide d0021a053b368906 hide

3. Je monte un script Bash qui récupère les appels et obtient les actions ainsi que les ID des Tags :

     #!/bin/bash
     action=$1
     tagid=$2

     # Tag Blue
     if [ "$action" == "show" ] && [ "$tagid" == "d0021a053b368906" ]; then
          ssh user@mac "osascript -e 'tell application \"iTunes\" to play'"
     fi

Cela fonctionne parfaitement ! les appels SSH sont rapides.
Un problème tout de même : le Mir:ror reste allumé !! Je peux le désactiver dans le code C du software mais c’est fixe 🙁 et le retourner tous les soirs… c’est pas gagné…
A faire par la suite :
• Soit : Apprendre à éteindre un port USB sur le LinuX,
• Soit : Utiliser node.js pour envoyer des commandes au Mir:ror avec la bibliothèque node-hid.

B. On repense le truc mais cette fois sur le Mac…

En plaçant le système dans le mac, je pilote mieux les actions et peux couper le Mir:ror en éteignant le Mac.

1. J’utilise cette fois ci le projet hdiapi ainsi qu’une partie des modifications trouvés sur ce site .
2. Cette fois ci, le projet en C++ permet de fabriquer l’exécutable hidtest.
3. J’apporte quelques modification au fichier hidtest avant de compiler :

# buf[1] Permet d'avoir l'action
# buf[8] Permet de récupérer une une partie de l'ID du TAG pour l'identifier

if (buf[1] == 1 && buf[8] == 5) {
     printf(" IN 5");
     system("~/Library/\"Application Support\"/Mirror/actions_do.sh show blue");
}
...

4. Je garde presque le script précédent pour récupérer les appels et obtientir les actions ainsi que les ID des Tags :

#!/bin/bash
action=$1
tagname=$2

# Lancer une radio dans un VLC sans interface, récupérer le PID pour
#      pouvoir détruire l'instance lorsque le Tag est caché.
# VLC -I http  => Pas d'interface graphique, juste l'interface http.
# VLC --http-host 127.0.0.1:8085   => Permet de router le port de ce VLC du 8080 par
#      défaut vers le 8085 de manière à ne pas la voir dans l'appli Mobile.

if [ "$action" == "show" ] && [ "$tagname" == "blue" ]; then
     PROGRAM="/Application/VLC.app/Contents/MacOS/VLC -I http --http-host 127.0.0.1:8085 http://...mp3"
     $PROGRAM &
     echo $! > /tmp/vlc.pid
fi

if [ "$action" == "hide" ] && [ "$tagname" == "blue" ]; then
     PID=$(cat /tmp/vlc.pid)
     kill -15 $PID
fi

5. Je fabrique un service de lancement pour le mac avec Lingon. A placer dans Library/LaunchAgents de l’utilisateur :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
     <key>KeepAlive</key>
     <true/>
     <key>Label</key>
     <string>fr.lcprod.mirror</string>
     <key>ProgramArguments</key>
          <array>
               <string>__chemin_vers_hidtest</string>
          </array>
     <key>QueueDirectories</key>
          <array/>
     <key>RunAtLoad</key>
          <true/>
     <key>StartOnMount</key>
          <false/>
     <key>WatchPaths</key>
          <array/>
</dict>
</plist>

Cela fonctionne aussi très bien !
J’aurais tout de même aimé pouvoir récupérer à partir de hditest l’ID complet du Tag !
(Je me base sur une extraction d’un bit de la chaîne.)
Problème en C++ : Impossible de récupérer dynamiquement d’ID pour le transmettre au script Shell : Comment convertir un int en char en C++ ……….

No Comments