Uso dei dati del sensore di luce
Esistono due modi consigliati per interpretare e usare i dati lux provenienti da sensori di luce ambientale.
- Applicare una trasformazione ai dati in modo che il livello di luce normalizzato possa essere utilizzato in proporzione diretta ai comportamenti o alle interazioni del programma. Un esempio potrebbe essere quello di variare le dimensioni di un pulsante nel programma in proporzione diretta ai dati normalizzati (o a un intervallo di dati normalizzati, corrispondenti ad esempio all'esterno). Questo approccio offre l'implementazione ottimale.
- Gestire intervalli di dati lux e mappare comportamenti e reazioni del programma alle soglie superiori e inferiori di questi intervalli di dati lux. Si tratta di un modo semplice per rispondere alle condizioni di illuminazione e potrebbe non produrre l'esperienza utente ottimale. Tuttavia, questo approccio funziona correttamente se le transizioni uniformi non sono fattibili.
Gestione dei dati da più sensori di luce
Per produrre l'approssimazione più accurata delle condizioni di illuminazione correnti, è possibile usare i dati di più sensori di luce ambientale. Poiché i sensori di luce ambientale possono essere parzialmente o completamente nascosti da ombre o oggetti che coprono il sensore, più sensori posizionati a distanza possono fornire un'approssimazione molto migliore delle condizioni di illuminazione correnti rispetto a un singolo sensore.
Per tenere traccia dei dati provenienti da più sensori, è possibile usare le due tecniche seguenti:
- È possibile conservare il valore dei dati più recente per ogni sensore di luce ambientale, insieme al timestamp del report dei dati del sensore per ognuna di queste letture. L'ultimo ISensorDataReport ricevuto per ogni lettura del sensore può essere conservato e potrebbe fornire entrambi i valori per riferimento successivo. Facendo riferimento al timestamp per ogni report dati del sensore, i dati possono essere gestiti in base alla sua età. Ad esempio, se i dati hanno più di 2 secondi, potrebbe essere omesso. In base ai valori dei dati del sensore più recenti, è possibile usare la lettura più elevata perché si presuppone che il sensore corrispondente non sia nascosto.
- È possibile usare l'ultimo valore del sensore di luce ambientale segnalato. Questa implementazione non sarebbe ottimale perché i valori di più sensori non vengono confrontati tra loro per ottenere il risultato più accurato. Questo metodo non è consigliato.
Codice di esempio
Il codice di esempio seguente mostra un'implementazione per l'evento OnDataUpdated . Il gestore eventi chiama una funzione helper denominata UpdateUI, che modifica l'interfaccia utente in base al valore lux. La scrittura dell'implementazione di UpdateUI spetta all'utente.
// 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;
}