Commit a6d0c54a authored by rijubrata.bhaumik's avatar rijubrata.bhaumik Committed by Commit bot

Windows: Ambient Light API

TEST= http://jsfiddle.net/73v8rmex/3/ (manual)

BUG=336424

Review URL: https://codereview.chromium.org/754963006

Cr-Commit-Position: refs/heads/master@{#319060}
parent ead8f96b
......@@ -61,6 +61,7 @@ class CONTENT_EXPORT DataFetcherSharedMemory
class SensorEventSink;
class SensorEventSinkMotion;
class SensorEventSinkOrientation;
class SensorEventSinkLight;
virtual FetcherType GetType() const override;
......@@ -72,6 +73,7 @@ class CONTENT_EXPORT DataFetcherSharedMemory
base::win::ScopedComPtr<ISensor> sensor_inclinometer_;
base::win::ScopedComPtr<ISensor> sensor_accelerometer_;
base::win::ScopedComPtr<ISensor> sensor_gyrometer_;
base::win::ScopedComPtr<ISensor> sensor_light_;
#endif
DISALLOW_COPY_AND_ASSIGN(DataFetcherSharedMemory);
......
......@@ -18,6 +18,13 @@ namespace {
const double kMeanGravity = 9.80665;
void SetLightBuffer(content::DeviceLightHardwareBuffer* buffer, double lux) {
DCHECK(buffer);
buffer->seqlock.WriteBegin();
buffer->data.value = lux;
buffer->seqlock.WriteEnd();
}
} // namespace
......@@ -222,8 +229,41 @@ class DataFetcherSharedMemory::SensorEventSinkMotion
DISALLOW_COPY_AND_ASSIGN(SensorEventSinkMotion);
};
class DataFetcherSharedMemory::SensorEventSinkLight
: public DataFetcherSharedMemory::SensorEventSink {
public:
explicit SensorEventSinkLight(DeviceLightHardwareBuffer* const buffer)
: buffer_(buffer) {}
virtual ~SensorEventSinkLight() {}
protected:
virtual bool UpdateSharedMemoryBuffer(ISensor* sensor,
ISensorDataReport* new_data) override {
double lux;
bool has_lux;
GetSensorValue(SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX, new_data, &lux, &has_lux);
if(!has_lux) {
// Could not get lux value.
return false;
}
SetLightBuffer(buffer_, lux);
return true;
}
private:
DeviceLightHardwareBuffer* const buffer_;
DISALLOW_COPY_AND_ASSIGN(SensorEventSinkLight);
};
DataFetcherSharedMemory::DataFetcherSharedMemory()
: motion_buffer_(nullptr), orientation_buffer_(nullptr) {
: motion_buffer_(nullptr),
orientation_buffer_(nullptr),
light_buffer_(nullptr) {
}
DataFetcherSharedMemory::~DataFetcherSharedMemory() {
......@@ -277,6 +317,22 @@ bool DataFetcherSharedMemory::Start(ConsumerType consumer_type, void* buffer) {
SetBufferAvailableState(consumer_type, true);
}
break;
case CONSUMER_TYPE_LIGHT:
{
light_buffer_ = static_cast<DeviceLightHardwareBuffer*>(buffer);
scoped_refptr<SensorEventSink> sink(
new SensorEventSinkLight(light_buffer_));
bool sensor_light_available = RegisterForSensor(
SENSOR_TYPE_AMBIENT_LIGHT, sensor_light_.Receive(), sink);
if (sensor_light_available) {
SetLightBuffer(light_buffer_, -1);
return true;
}
// if no sensors are available, fire an Infinity event.
SetLightBuffer(light_buffer_, std::numeric_limits<double>::infinity());
}
break;
default:
NOTREACHED();
}
......@@ -293,6 +349,10 @@ bool DataFetcherSharedMemory::Stop(ConsumerType consumer_type) {
case CONSUMER_TYPE_MOTION:
motion_buffer_ = nullptr;
return true;
case CONSUMER_TYPE_LIGHT:
SetLightBuffer(light_buffer_, -1);
light_buffer_ = nullptr;
return true;
default:
NOTREACHED();
}
......@@ -368,6 +428,12 @@ void DataFetcherSharedMemory::DisableSensors(ConsumerType consumer_type) {
sensor_gyrometer_.Release();
}
break;
case CONSUMER_TYPE_LIGHT:
if (sensor_light_.get()) {
sensor_light_->SetEventSink(nullptr);
sensor_light_.Release();
}
break;
default:
NOTREACHED();
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment