1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 // This file is based on http://osxbook.com/book/bonus/chapter10/light/
7 #include "content/browser/device_sensors/ambient_light_mac.h"
9 #include "base/mac/scoped_cftyperef.h"
10 #include "base/mac/scoped_ioobject.h"
15 enum LmuFunctionIndex
{
16 kGetSensorReadingID
= 0, // getSensorReading(int *, int *)
17 kGetLEDBrightnessID
= 1, // getLEDBrightness(int, int *)
18 kSetLEDBrightnessID
= 2, // setLEDBrightness(int, int, int *)
19 kSetLEDFadeID
= 3, // setLEDFade(int, int, int, int *)
24 scoped_ptr
<AmbientLightSensor
> AmbientLightSensor::Create() {
25 scoped_ptr
<AmbientLightSensor
> light_sensor(new AmbientLightSensor
);
26 return light_sensor
->Init() ? light_sensor
.Pass() : nullptr;
29 AmbientLightSensor::~AmbientLightSensor() {
31 IOServiceClose(io_connection_
);
34 AmbientLightSensor::AmbientLightSensor() : io_connection_(IO_OBJECT_NULL
) {
37 bool AmbientLightSensor::Init() {
38 // Tested and verified by riju that the following call works on -
39 // MacBookPro9,1 : Macbook Pro 15" (Mid 2012 model).
40 // MacBookPro10,2 : Macbook Pro 13" (Retina Display, Early 2013 model).
41 // MacBookPro10,1 : Macbook Pro 15" (Retina Display, Early 2013 model).
42 // MacBookAir6,2 : Macbook Air 13" (Mid 2013 model).
43 // Testing plans : Please download the code and follow the comments :-
44 // https://gist.github.com/riju/74af8c81a665e412d122/
45 // and add an entry here about the model and the status returned by the code.
47 // Look up a registered IOService object whose class is AppleLMUController.
48 base::mac::ScopedIOObject
<io_service_t
> service_object(
49 IOServiceGetMatchingService(kIOMasterPortDefault
,
50 IOServiceMatching("AppleLMUController")));
52 // Return early if the ambient light sensor is not present.
56 // Create a connection to the IOService object.
58 IOServiceOpen(service_object
, mach_task_self(), 0, &io_connection_
);
60 // IOServiceOpen error.
61 if (kr
!= KERN_SUCCESS
|| io_connection_
== IO_OBJECT_NULL
)
64 uint64_t lux_values
[2];
65 return ReadSensorValue(lux_values
);
68 bool AmbientLightSensor::ReadSensorValue(uint64_t lux_values
[2]) {
69 uint32_t scalar_output_count
= 2;
70 kern_return_t kr
= IOConnectCallMethod(
71 io_connection_
, LmuFunctionIndex::kGetSensorReadingID
, nullptr, 0,
72 nullptr, 0, lux_values
, &scalar_output_count
, nullptr, 0);
74 return kr
== KERN_SUCCESS
;
77 } // namespace content