周囲光センサーから取得した lux データを解釈して使用する場合、推奨される方法は 2 つあります。
- データに変換を適用して、正規化されたライト レベルをプログラムの動作や相互作用に直接比例して使用できるようにします。 たとえば、プログラム内のボタンのサイズを、正規化されたデータ (たとえば、屋外に対応する正規化されたデータの範囲) に直接比例して変更します。 この方法では、最適な実装が提供されます。
- lux データの範囲を処理し、プログラムの動作と反応を、これらの範囲の lux データの上限と下限のしきい値にマップします。 これは照明条件に対応する簡単な方法であり、最適なユーザー エクスペリエンスが得られない可能性があります。 ただし、スムーズな遷移が実現できない場合は、このアプローチは正常に動作します。
複数の光センサーからのデータの処理
現在の照明条件の最も正確な近似を生成するには、複数の周囲光センサーのデータを使用できます。 周囲光センサーは、センサーを覆う影やオブジェクトによって部分的または完全に隠れる可能性があるため、複数のセンサーを離れた距離に配置すると、1 つのセンサーよりも現在の照明条件の近似が大幅に向上する可能性があります。
複数のセンサーからのデータを追跡するには、次の 2 つの手法を使用します。
- 各環境光センサーの最新のデータ値と、これらの各測定値のセンサー データ レポートからのタイムスタンプを保持できます。 センサーの読み取りごとに受信した最後の ISensorDataReport は保持でき、後で参照できるように両方の値を指定できます。 各センサー データ レポートのタイム スタンプを参照することで、データはその経過時間に基づいて管理できます。 たとえば、データが 2 秒を超える場合は、省略できます。 新しいセンサー データ値に基づいて、対応するセンサーが隠されていないと推定されるため、最高の読み取り値を使用できます。
- 報告された最後の環境光センサー値を使用できます。 この実装は、最も正確な結果を得るために複数のセンサーの値が互いに比較されないため、最適ではありません。 この方法はお勧めしません。
コード例
次のコード例は、OnDataUpdated イベントの実装を示しています。 イベント ハンドラーは、lux 値に基づいてユーザー インターフェイスを変更 UpdateUIという名前のヘルパー関数を呼び出します。 UpdateUI の実装の記述はユーザーが行う必要があります。
// 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;
}