Nous avions annoncé la librairie Objective-C il y a quelques semaines, elle est maintenant disponible sur la page de chargement des librairies de programmation. Vous pouvez dès maintenant créer vos application Mac OS X en Cocoa, qui vont nativement pouvoir communiquer avec tous vos modules Yoctopuces (directement en USB, ou via TCP).
Pour pouvoir utiliser la libraire Objective-C vous aurez impérativement besoin de XCode 4.2, qui est disponible gratuitement sous Lion. Si vous êtes encore sous Snow Leopard il vous faudra être enregistré comme développeur auprès d’Apple pour pourvoir télécharger XCode 4.2. La librairie est compatible ARC. Il vous sera donc possible de coder vos projet soit en utilisant la traditionnelle méthode de retain/release, soit en activant l'Automatic Reference Counting.
Voici un petit guide pour compiler un application Cocoa très basique, qui va simplement afficher la température mesurée par un Yocto-Temperature connecté directement en USB.
Créez votre projet comme vous avez l'habitude. Dans cet exemple nous allons créer un application Cocoa "test" pour Lion en utilisant l'Automatic Reference Counting. Une fois le projet créé, la première chose à faire est de rajouter le Framework IOKit qui est nécessaire pour communiquer avec les modules USB.
Ensuite il faut rajouter tous les fichiers sources de la librairie Yoctopuce (ils se trouvent dans le répertoire "Source" de la libraire). Le plus simple est de sélectionner les fichier dans Finder et de les glisser/déplacer directement dans XCode. A partir de là vous devriez avoir un projet qui compile sans erreur. Si ce n'est pas le cas, vérifiez bien que vous utilisez la version 4.2 de XCode et que vous avez bien rajouté le Framework IOKit. Si vous avez toujours des erreurs vous pouvez envoyer un email a support@yoctopuce.com
Dans cet exemple nous allons créer une application très limitée qui va lire la température et contrôler la led de localisation du module, le but étant juste de montrer à quel point il est facile d'utiliser la librairie. Tout d'abord il nous faut créer l'interface graphique, en utilisant deux NSLabel et une NSCheckbox comme suit:
On va modifier le header pour inclure “yocto_api.h” qui est nécessaire pour utiliser l'API Yoctopuce. Pour pouvoir utiliser un capteur de température on va inclure aussi “yocto_temperature.h”, qui déclare en plus la classe YTemperature. Nous allons déclarer un variable d'instance _tempSensor de type YTemperature* et un _timer de type NSTimer*.
On va aussi profiter de réaliser les connections nécessaires depuis Interface Builder.
Maintenant votre header devrait ressembler à ceci:
#import "yocto_api.h"
#import "yocto_anbutton.h"
@interface BTAppDelegate : NSObject <NSApplicationDelegate>
{
YAnButton *_tempSensor;
NSTimer *_timer;
__weak NSTextFieldCell *_tempDisplay;
__weak NSButton *_beacon;
}
@property (assign) IBOutlet NSWindow *window;
@property (weak) IBOutlet NSTextFieldCell *_tempDisplay;
@property (weak) IBOutlet NSButton *_beacon;
@end
Nous allons avoir trois méthode à implémenter :
- (void) update;
- (IBAction)_SetBeacon:(id)sender;
- (void) applicationDidFinishLaunching:(NSNotification *)aNotification;
Cette méthode est appelée une fois que l'OS a chargé l'application, c'est l'endroit idéal pour initialiser la librairie. Le code est très similaire à tout les autres langages, on enregistre le hub USB local et on initialise un objet qui référence la première sonde de température présente. On va aussi profiter d'initialiser notre NSTimer qui aura pour mission d'appeler la méthode "update" chaque secondes.
{
// Insert code here to initialize your application
NSString *errmsg;
yRegisterHub(@"usb", &errmsg);
_tempSensor = yFirstTemperature();
_timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(update) userInfo:nil repeats:YES];
}
- (void) update;
La méthode "update" est appelée automatiquement chaque seconde par le NSTimer. Son rôle est de vérifier que le Yocto-Temperature est toujours connecté et d'afficher la temperature ainsi que l'état du beacon (la led bleu de localisation). Pour récupérer la température, il suffit de d'appeler la methode get_currentValue sur l'objet _tempSensor. Cette methode renvoie un nombre flottant que l'on peu passer directement au NSLabel _tempDisplay. Pour le beacon c'est un tout petit peu plus compliqué: il faut d'abord recuperer le pointeur sur le module, auquel on peu demander l'état du beacon.
{
if([_tempSensor isOnline]){
[_tempDisplay setFloatValue:[_tempSensor get_rawValue]];
YModule *moduleOfTempSensor=[_tempSensor module];
[_beacon setState:[moduleOfTempSensor get_beacon]];
}else{
[_tempDisplay setStringValue:@"disconnected"];
}
}
- (IBAction)_SetBeacon:(id)sender;
La dernière methode est déclenché par l'utilisateur (lors d’un clic sur la checkbox). Le code est assez simple: on vérifie que le module est toujours connecté; si c'est le cas on va mettre à jour l'etat de la led de localistion avec la nouvelle valeur de la checkbox.
{
if(![_tempSensor isOnline])
return;
if([sender state])
[[_tempSensor module] set_beacon:Y_BEACON_ON];
else
[[_tempSensor module] set_beacon:Y_BEACON_OFF];
}
Et voilà la démo:
Le code final ainsi que le projet sont inclus dans le répertoire Examples/Yocto-FirstExample de la librairie Objective-C. Vous trouvez aussi la documentations complète de l'API ainsi que d'autre exemples dans le fichier zip de la librairie. Notez que cette version n'a été testée que sous Mac OS et pas sous IOS, mais d'ici peu nous allons fournir une librairie compatible IOS.
Liens:
- page de chargement des librairies Yoctopuce
- référence de la librairie pour Objective-C
- référence au format PDF