Inspired by a user's thread who is unhappy with the way their KB backlight works, I decided to play with the Ambient Light Sensor and KB backlight on my MBP.
I was a bit disappointed to see that unlike under W7 there is no official API to access the sensor data. Really?
Anyhow, I quickly found this code: http://osxbook.com/book/bonus/chapter10/light/ and various comments around that it doesn't work anymore. A bit more digging led to this code: http://google-mac-qtz-patches.googlecode.com/svn-history/r5/trunk/AmbientLightSensor which does actually work and allowed me to whip this up.
A few reasons for the post:
I presume since this uses the undocumented (apart from the header files) IOConnectCallMethod it would not be OK to include in an app for the Mac App Store?
Anyhow, here's the code:
B
I was a bit disappointed to see that unlike under W7 there is no official API to access the sensor data. Really?
Anyhow, I quickly found this code: http://osxbook.com/book/bonus/chapter10/light/ and various comments around that it doesn't work anymore. A bit more digging led to this code: http://google-mac-qtz-patches.googlecode.com/svn-history/r5/trunk/AmbientLightSensor which does actually work and allowed me to whip this up.
A few reasons for the post:
- To publish currently working code Google might be able to find in case someone else is looking
- To ask is there really no better way to do this?
I presume since this uses the undocumented (apart from the header files) IOConnectCallMethod it would not be OK to include in an app for the Mac App Store?
Anyhow, here's the code:
Code:
// Inspired by the code found at
// http://google-mac-qtz-patches.googlecode.com/svn-history/r5/trunk/AmbientLightSensor
// and http://osxbook.com/book/bonus/chapter10/light/
#import <Foundation/Foundation.h>
#import <IOKit/IOKitLib.h>
io_connect_t dataPort;
enum {
kGetSensorReadingID = 0, // getSensorReading(int *, int *)
kGetLEDBrightnessID = 1, // getLEDBrightness(int, int *)
kSetLEDBrightnessID = 2, // setLEDBrightness(int, int, int *)
kSetLEDFadeID = 3, // setLEDFade(int, int, int, int *)
};
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
kern_return_t kr = KERN_FAILURE;
io_service_t serviceObject;
// Look up a registered IOService object whose class is AppleLMUController
serviceObject = IOServiceGetMatchingService(kIOMasterPortDefault,
IOServiceMatching("AppleLMUController"));
if (serviceObject) {
NSLog(@"Got device AppleLMUController");
kr = IOServiceOpen(serviceObject, mach_task_self(), 0, &dataPort);
}
IOObjectRelease(serviceObject);
if (kr == KERN_SUCCESS) {
NSLog(@"IOServiceOpen succeeded");
while (1) {
//Get the ALS reading
uint32_t scalarOutputCount = 2;
uint64_t values[scalarOutputCount];
kr = IOConnectCallMethod(dataPort,
kGetSensorReadingID,
nil,
0,
nil,
0,
values,
&scalarOutputCount,
nil,
0);
// Get the LED reading
uint32_t scalarInputCountKB = 1;
uint32_t scalarOutputCountKB = 1;
uint64_t in_unknown = 0, out_brightness;
kr = IOConnectCallMethod(dataPort,
kGetLEDBrightnessID,
&in_unknown,
scalarInputCountKB,
nil,
0,
&out_brightness,
&scalarOutputCountKB,
nil,
0);
// The code at http://google-mac-qtz-patches.googlecode.com/svn-history/r5/trunk/AmbientLightSensor
// suggests that values be calibrated to 0x00FFFFFF for the MacbookPro5 family and 1600 otherwise
// This seems too low.
// Output as high as 67092480 (0x03ffc000) has been observed on my Macbook 5,2
// So I'll report the raw value instead and remove the calibration code.
// Also since for the MBP5,2 the two values agree
// (there is only one ALS sensor) I'll report only the maximum value.
// The LED value however does seem to go 0-4091 though the values do not seem fixed.
// They vary with light level and time such that maxing it out results in slightly
// lower values over time.
// Somewhere between 2500000 and 3000000 the KB light turns off. It's hard to capture it since the light ramps off.
NSLog(@"ALS, LED %d,%d",MAX(values[0],values[1]),out_brightness);
sleep(1); //lame way to slow down the output
}
}
[pool drain];
return 0;
}
B
Last edited: