Использование данных датчика света
Существует два рекомендуемых способа интерпретации и использования данных lux, поступающих от датчиков внешнего освещения.
- Примените преобразование к данным, чтобы нормализованный уровень света можно было использовать прямо пропорционально поведению или взаимодействию программы. Например, можно изменить размер кнопки в программе напрямую пропорционально нормализованным данным (например, диапазон нормализованных данных, соответствующий внешней среде). Такой подход обеспечивает оптимальную реализацию.
- Работать с диапазонами данных о люксах и сопоставлять поведение программы и реакции на верхние и нижние пороговые значения этих диапазонов данных о люксах. Это простой способ реагирования на условия освещения и может не обеспечить оптимальное взаимодействие с пользователем. Однако этот подход хорошо работает, если плавные переходы нецелесообразны.
Обработка данных с нескольких датчиков освещения
Чтобы получить наиболее точное приближение текущих условий освещения, можно использовать данные из нескольких датчиков внешнего освещения. Так как датчики внешнего освещения могут быть частично или полностью скрыты тенями или объектами, охватывающими датчик, несколько датчиков, расположенных на некотором расстоянии друг от друга, могут обеспечить гораздо более точное приближение текущих условий освещения, чем один датчик.
Чтобы отслеживать данные, поступающие с нескольких датчиков, можно использовать следующие два метода:
- Можно сохранить последнее значение данных для каждого датчика внешнего освещения, а также метку времени из отчета о данных датчика для каждого из этих показаний. Последнее значение ISensorDataReport , полученное для каждого показания датчика, можно сохранить и предоставить оба значения для последующей ссылки. Ссылаясь на метку времени для каждого отчета о данных датчика, можно управлять данными в зависимости от их возраста. Например, если данные старше 2 секунд, их можно опустить. На основе новых значений данных датчика можно использовать наибольшее значение, так как предполагается, что соответствующий датчик не будет скрыт.
- Можно использовать последнее указанное значение датчика внешнего освещения. Эта реализация не является оптимальной, так как значения нескольких датчиков не сравниваются друг с другом для получения наиболее точного результата. Этот метод не рекомендуется.
Пример кода
В следующем примере кода показана реализация события OnDataUpdated . Обработчик событий вызывает вспомогающую функцию с именем UpdateUI, которая изменяет пользовательский интерфейс на основе значения lux. Вы можете написать реализацию 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;
}