Utilisation des données du capteur de lumière
Il existe deux façons recommandées d’interpréter et d’utiliser les données lux provenant de capteurs de lumière ambiante.
- Appliquez une transformation aux données afin que le niveau de lumière normalisé puisse être utilisé en proportion directe des comportements ou des interactions du programme. Par exemple, vous pouvez faire varier la taille d’un bouton dans votre programme en fonction des données normalisées (ou d’une plage de données normalisées, correspondant à l’extérieur, par exemple). Cette approche offre une implémentation optimale.
- Gérer les plages de données lux et mapper les comportements et les réactions des programmes aux seuils supérieurs et inférieurs de ces plages de données lux. Il s’agit d’un moyen simple de répondre aux conditions d’éclairage et peut ne pas fournir une expérience utilisateur optimale. Toutefois, cette approche fonctionne bien si des transitions en douceur ne sont pas possibles.
Gestion des données provenant de plusieurs capteurs de lumière
Pour produire l’approximation la plus précise des conditions d’éclairage actuelles, vous pouvez utiliser les données de plusieurs capteurs de lumière ambiante. Étant donné que les capteurs de lumière ambiante peuvent être partiellement ou totalement masqués par des ombres ou des objets qui couvrent le capteur, plusieurs capteurs placés à une certaine distance peuvent fournir une bien meilleure approximation des conditions d’éclairage actuelles qu’un seul capteur.
Pour suivre les données provenant de plusieurs capteurs, vous pouvez utiliser les deux techniques suivantes :
- La valeur de données la plus récente pour chaque capteur de lumière ambiante peut être conservée, ainsi que l’horodatage du rapport de données du capteur pour chacune de ces lectures. Le dernier ISensorDataReport reçu pour chaque lecture de capteur peut être conservé et peut fournir les deux valeurs pour une référence ultérieure. En faisant référence à l’horodatage de chaque rapport de données de capteur, les données peuvent être gérées en fonction de leur ancienneté. Par exemple, si les données datent de plus de 2 secondes, elles peuvent être omises. En fonction des valeurs de données de capteur les plus récentes, la lecture la plus élevée peut être utilisée, car le capteur correspondant est présumé ne pas être masqué.
- Vous pouvez utiliser la dernière valeur du capteur de lumière ambiante signalée. Cette implémentation ne serait pas optimale, car les valeurs de plusieurs capteurs ne sont pas comparées les unes aux autres pour obtenir le résultat le plus précis. Nous ne recommandons pas cette méthode.
Exemple de code
L’exemple de code suivant montre une implémentation pour l’événement OnDataUpdated . Le gestionnaire d’événements appelle une fonction d’assistance, nommée UpdateUI, qui modifie l’interface utilisateur en fonction de la valeur lux. L’écriture de l’implémentation de UpdateUI vous appartient.
// Override of ISensorEvents::OnDataUpdated
// Part of an event sink implementation for ISensorEvents
STDMETHODIMP CALSEventSink::OnDataUpdated(
ISensor* pSensor,
ISensorDataReport* pNewData)
{
HRESULT hr = S_OK;
if(pSensor == NULL ||
pNewData == NULL)
{
return E_POINTER;
}
// Declare and initialize the PROPVARIANT
PROPVARIANT lightLevel;
PropVariantInit(&lightLevel);
// Get the sensor reading from the ISensorDataReport object
hr = pNewData->GetSensorValue(
SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX,
&lightLevel);
if(SUCCEEDED(hr))
{
if(lightlevel.vt == VT_R4)
{
// Extract the float value from the PROPVARIANT object
float luxValue = lightLevel.fltVal;
// Normalize the light sensor data
double lightNormalized = ::log10(luxValue) / 5.0;
// Handle UI changes based on the normalized LUX data
// which ranges from 0.0 - 1.0 for a lux range of
// 0 lux to 100,000 lux.
UpdateUI(lightNormalized);
}
}
// Release the variant.
PropVariantClear(&lightLevel);
return hr;
}