Il y a trois semaines, on vous a montré comment intégrer sur une page web du code qui gère des actuateurs Yoctopuce tout en utilisant Yocto-Visualization (for web). Mais il y avait une limitation: on ne pouvant pas utiliser les callbacks DeviceArrival et DeviceRemoval parce qu'ils sont déjà utilisés par Yocto-Visualization (for web) d'où un code un peu bancal pour vérifier si les actuateurs concernés sont connectés ou non. Comme ça nous chiffonnait un peu, on a légèrement amélioré Yocto-Visualization (for web)...
Des callbacks Arrival et Removal dans YWebPage
YWebPage est la classe statique qui décrit l'instance de Yocto-Visualization (for web). On a ajouté les fonctions RegisterDeviceArrivalCallback et RegisterDeviceRemovalCallback qui se comportent exactement comme celles de YAPI. Lorsque que les utilisez, Yocto-Visualization (for web) va d'abord faire son petit travail sur les modules concernés puis ensuite appeler votre callback. Du coup, si on reprend notre fonction Init, on peut se débarrasser de l'affreuse fonction testRelay() et enregistrer nos callbacks à la place.
{
if (await YAPI.InitAPI(YAPI.DETECT_NONE,errmsg) == YAPI.SUCCESS)
{
relay = YRelay.FindRelay("ONOFF");
input.disabled = !(await relay.isOnline());
input.addEventListener('change', inputChanged)
relay.registerValueCallback(relayStateChanged)
YWebPage.RegisterDeviceArrivalCallback(arrival);
YWebPage.RegisterDeviceRemovalCallback(removal);
} else document.write(errmsg.msg);
}
Notez que pour que la classe YWebPage soit accessible, il ne faut pas oublier de la rajouter dans la liste des imports
Utilisation
On remplace donc notre fonction testRelay() par le traitement de nos deux callback. Là, il y a une petite astuce dont on ne vous probablement jamais parlé, même si on l'utilise souvent dans nos propres programmes. On cherche à savoir quand notre relais "ONOFF" est connecté, mais le paramètre du callback est de type YModule. Logique puisque ce callback sert à prévenir de l'arrivée d'un module. Par conséquent, comment savoir si notre relais en fait partie? Réponse: en utilisant les fonctions
on peut assez facilement écrire du code qui retrouve une fonction d'un module en se basant sur son type et son nom. Par exemple la fonction ci-dessous nous renvoie le nom matériel complet d'une fonction si elle trouve une fonction de type ftype, nommée fname dans un module. fname peut tout aussi bien être un nom logique qu'un nom matériel.
{
for (var i=0;i<await m.functionCount();i++)
{
if (await m.functionType(i)==ftype)
{
if (await m.functionName(i)==fname) // test logical name
return await m.get_serialNumber()+"."+ await m.functionId(i);
if (await m.functionId(i)==fname) // test hardware name
return await m.get_serialNumber()+"."+ await m.functionId(i);
}
}
return "";
}
On a maintenant toutes les briques pour gérer proprement la connexion et la déconnexion de notre relais à l'aide de callbacks.
{
if (await findFunction(m, "Relay", "ONOFF") != "") input.disabled =false;
}
async function removal(m)
{
if (!await relay.isOnline()) input.disabled =true;
}
Vous trouverez le code complet ici, pour qu'il fonctionne, vous aurez besoin de la version 56436 ou ultérieure de Yocto-Visualization (for web).
Voilà, c'est tout pour cette semaine, si vous voulez en savoir plus sur les petits secrets de Yocto-Visualization (for web), voici une liste de liens qui vous permettra d'approfondir.
- La présentation de Yocto-Visualization (for web)
- Le mode d'emploi de la version native
- Comparaison entre la version web et la version native
- Intégration de votre propre page web dans Yocto-Visualization (for web)
- Intéger Yocto-Visualization (for web) dans votre propre page web
- Ajouter des séries dans Yocto-Visualization (for web)
- Page web, Yocto-Visualization et actuateurs