Pour réaliser l'inventaire des modules Yoctopuce connectés à un ordinateur, la première idée qui vient à l'esprit c'est simplement de les lister explicitement à l'aide des fonctions idoines de l'API. Mais ce n'est pas forcement la méthode la plus pratique si on veut tenir compte des modules qui sont connectés ou déconnectés durant la vie de l'application.
Comment maintenir en permanence une liste des modules connectés?
La méthode la plus simple consiste en effet à utiliser les fonctions FirstModule et nextModule. L'exemple suivant en C# construit la liste des modules connectés sous la forme d'un dictionnaire.
Dictionary<string, YModule> modules = new Dictionary<string, YModule>();
YAPI.RegisterHub("usb", ref errmsg); // API init
YModule m = YModule.FirstModule();
while (m != null)
{ modules.Add(m.get_serialNumber(), m);
m = m.nextModule();
}
Si l'exemple précédent est extrêmement simple, il peut rapidement devenir ingérable si on veut tenir compte du fait qu'un module Yoctopuce peut être débranché ou rebranché n'importe quand durant la vie d'une application. Ainsi il faudrait à intervalles réguliers refaire un inventaire, déterminer les modules qui sont partis et ceux qui sont arrivés, puis mettre à jour la liste en conséquence.
Il se trouve que l'API Yoctopuce est capable d'appeler un callback à chaque fois qu'un module est connecté ou déconnecté. Ce callback prend en paramètre le module concerné. Il suffit donc d'ajouter ou d'enlever ce module de la liste à chaque fois que ce callback est appelé pour avoir une liste à jour. Ces callbacks peuvent être mis en place à l'aide des fonctions RegisterDeviceArrivalCallback et RegisterDeviceRemovalCallback.
La programmation par callbacks a cependant un petit inconvénient. Les callbacks peuvent être appelés n'importe quand, en particulier quand le programme n'est pas en état de les recevoir, qui peuvent rapidement mener à des dead-lock, toujours difficiles reproduire et à corriger. Pour éviter ça, les callbacks arrivals/remvoval ne sont appellés que lorsque que la fonction UpdateDeviceList est appelée. Il suffit donc d'appeler cette fonction depuis un timer ou un thread séparé, pour pouvoir un contrôle complet sur le déclenchement de ces callbacks.
Voici un exemple tout simple en C# qui utilise les callbacks arrival/removal pour compter en permanence le nombre de modules connectés.
static void deviceArrival(YModule m)
{
modules.Add(m.get_serialNumber(), m);
}
static void deviceRemoval(YModule m)
{
modules.Remove(m.get_serialNumber());
}
static void Main(string[] args)
{
string errmsg = "";
YAPI.RegisterHub("usb", ref errmsg); // init API
YAPI.RegisterDeviceArrivalCallback(deviceArrival); // init callbacks
YAPI.RegisterDeviceRemovalCallback(deviceRemoval);
while (true)
{
YAPI.UpdateDeviceList(ref errmsg);
Console.WriteLine(modules.Count.ToString()+ " modules connectés");
YAPI.Sleep(1000,ref errmsg); // attend 1 seconde
}
}
Une précision importante: lors du premier appel à UpdateDeviceList le callback deviceArrival sera appelé pour tous les modules déjà connectés, ce qui vous dispense de faire un inventaire classique au début du programme.
Les deux bouts de codes présentés ici ne font aucun traitement d'erreur, ne les copiez pas tel quels dans une application de production.