| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "device/generic_sensor/platform_sensor_ambient_light_mac.h" | 5 #include "device/generic_sensor/platform_sensor_ambient_light_mac.h" |
| 6 | 6 |
| 7 #include <IOKit/IOMessage.h> | 7 #include <IOKit/IOMessage.h> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "device/base/synchronization/shared_memory_seqlock_buffer.h" | 10 #include "device/base/synchronization/shared_memory_seqlock_buffer.h" |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 IONotificationPortSetDispatchQueue( | 87 IONotificationPortSetDispatchQueue( |
| 88 light_sensor_port_.get(), | 88 light_sensor_port_.get(), |
| 89 dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)); | 89 dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)); |
| 90 | 90 |
| 91 kern_return_t kr = IOServiceAddInterestNotification( | 91 kern_return_t kr = IOServiceAddInterestNotification( |
| 92 light_sensor_port_.get(), light_sensor_service_, kIOGeneralInterest, | 92 light_sensor_port_.get(), light_sensor_service_, kIOGeneralInterest, |
| 93 IOServiceCallback, this, light_sensor_notification_.InitializeInto()); | 93 IOServiceCallback, this, light_sensor_notification_.InitializeInto()); |
| 94 if (kr != KERN_SUCCESS) | 94 if (kr != KERN_SUCCESS) |
| 95 return false; | 95 return false; |
| 96 | 96 |
| 97 kr = IOServiceAddInterestNotification( |
| 98 light_sensor_port_.get(), light_sensor_service_, kIOBusyInterest, |
| 99 IOServiceCallback, this, |
| 100 light_sensor_busy_notification_.InitializeInto()); |
| 101 if (kr != KERN_SUCCESS) |
| 102 return false; |
| 103 |
| 97 kr = IOServiceOpen(light_sensor_service_, mach_task_self(), 0, | 104 kr = IOServiceOpen(light_sensor_service_, mach_task_self(), 0, |
| 98 light_sensor_object_.InitializeInto()); | 105 light_sensor_object_.InitializeInto()); |
| 99 if (kr != KERN_SUCCESS) | 106 if (kr != KERN_SUCCESS) |
| 100 return false; | 107 return false; |
| 101 | 108 |
| 102 bool success = ReadAndUpdate(); | 109 bool success = ReadAndUpdate(); |
| 103 if (!success) | 110 if (!success) |
| 104 StopSensor(); | 111 StopSensor(); |
| 105 | 112 |
| 106 return success; | 113 return success; |
| 107 } | 114 } |
| 108 | 115 |
| 109 void PlatformSensorAmbientLightMac::StopSensor() { | 116 void PlatformSensorAmbientLightMac::StopSensor() { |
| 110 light_sensor_port_.reset(); | 117 light_sensor_port_.reset(); |
| 111 light_sensor_notification_.reset(); | 118 light_sensor_notification_.reset(); |
| 119 light_sensor_busy_notification_.reset(); |
| 112 light_sensor_object_.reset(); | 120 light_sensor_object_.reset(); |
| 113 light_sensor_service_.reset(); | 121 light_sensor_service_.reset(); |
| 114 current_lux_ = 0.0; | 122 current_lux_ = 0.0; |
| 115 } | 123 } |
| 116 | 124 |
| 117 bool PlatformSensorAmbientLightMac::ReadAndUpdate() { | 125 bool PlatformSensorAmbientLightMac::ReadAndUpdate() { |
| 118 uint32_t scalar_output_count = 2; | 126 uint32_t scalar_output_count = 2; |
| 119 uint64_t lux_values[2]; | 127 uint64_t lux_values[2]; |
| 120 kern_return_t kr = IOConnectCallMethod( | 128 kern_return_t kr = IOConnectCallMethod( |
| 121 light_sensor_object_, LmuFunctionIndex::kGetSensorReadingID, nullptr, 0, | 129 light_sensor_object_, LmuFunctionIndex::kGetSensorReadingID, nullptr, 0, |
| 122 nullptr, 0, lux_values, &scalar_output_count, nullptr, 0); | 130 nullptr, 0, lux_values, &scalar_output_count, nullptr, 0); |
| 123 | 131 |
| 124 if (kr != KERN_SUCCESS) | 132 if (kr != KERN_SUCCESS) |
| 125 return false; | 133 return false; |
| 126 | 134 |
| 127 uint64_t mean = (lux_values[0] + lux_values[1]) / 2; | 135 uint64_t mean = (lux_values[0] + lux_values[1]) / 2; |
| 128 double lux = LMUvalueToLux(mean); | 136 double lux = LMUvalueToLux(mean); |
| 129 if (lux == current_lux_) | 137 if (lux == current_lux_) |
| 130 return true; | 138 return true; |
| 131 current_lux_ = lux; | 139 current_lux_ = lux; |
| 132 | 140 |
| 133 SensorReading reading; | 141 SensorReading reading; |
| 134 reading.timestamp = (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); | 142 reading.timestamp = (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); |
| 135 reading.values[0] = current_lux_; | 143 reading.values[0] = current_lux_; |
| 136 UpdateSensorReading(reading, true); | 144 UpdateSensorReading(reading, true); |
| 137 return true; | 145 return true; |
| 138 } | 146 } |
| 139 | 147 |
| 140 } // namespace device | 148 } // namespace device |
| OLD | NEW |