2013-07-12 9 views
13

Sto provando ad accedere a livello di programmazione al sensore di luce ambientale in un'applicazione Mac su OS X 10.5 e versioni successive, ma non riesco a trovare un modo per farlo.Come si accede in modo programmatico al sensore di luce ambientale su Mac OS X 10.5+?

Altre due domande erano state formulate su questo qui, "Accessing mac's sensor data" e "Disable ambient-light sensor screen dimming programmatically on OS X", ma non hanno affrontato questa o le soluzioni presenti che si interrompono dal 10.5 in su.

Quale API privata utilizza Apple per accedere ai dati del sensore di luce ambientale su OS X e/o come lo trovo?

+0

Penso di essere stato in grado di concentrare quello che stai chiedendo qui, che è davvero una buona domanda di programmazione, quindi l'ho riaperto. Potresti verificare di averti letto correttamente nella tua domanda. –

+0

Questo suona fantastico, grazie per aver chiarito tutto quanto sopra: – Indolering

risposta

24

Ho trovato la cosa più vicina che posso - codice di esempio da un bug report di Firefox modificato per l'ultima volta ad aprile 2013. I seguenti lavori, producendo un semplice programma CLI per interrogare il sensore (preso liberamente da https://bugzilla.mozilla.org/show_bug.cgi?id=793728#attach_664102). Il servizio sottoposto a polling è "AppleLMUController", da cui è possibile estrarre le informazioni pertinenti: lo snippet seguente crea uno serviceObject=IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleLMUController")), che viene quindi utilizzato.

// lmutracker.mm 
// 
// clang -o lmutracker lmutracker.mm -framework IOKit -framework CoreFoundation 

#include <mach/mach.h> 
#import <IOKit/IOKitLib.h> 
#import <CoreFoundation/CoreFoundation.h> 

static double updateInterval = 0.1; 
static io_connect_t dataPort = 0; 

void updateTimerCallBack(CFRunLoopTimerRef timer, void *info) { 
    kern_return_t kr; 
    uint32_t outputs = 2; 
    uint64_t values[outputs]; 

    kr = IOConnectCallMethod(dataPort, 0, nil, 0, nil, 0, values, &outputs, nil, 0); 
    if (kr == KERN_SUCCESS) { 
    printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b%8lld %8lld", values[0], values[1]); 
    return; 
    } 

    if (kr == kIOReturnBusy) { 
    return; 
    } 

    mach_error("I/O Kit error:", kr); 
    exit(kr); 
} 

int main(void) { 
    kern_return_t kr; 
    io_service_t serviceObject; 
    CFRunLoopTimerRef updateTimer; 

    serviceObject = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleLMUController")); 
    if (!serviceObject) { 
    fprintf(stderr, "failed to find ambient light sensors\n"); 
    exit(1); 
    } 

    kr = IOServiceOpen(serviceObject, mach_task_self(), 0, &dataPort); 
    IOObjectRelease(serviceObject); 
    if (kr != KERN_SUCCESS) { 
    mach_error("IOServiceOpen:", kr); 
    exit(kr); 
    } 

    setbuf(stdout, NULL); 
    printf("%8ld %8ld", 0L, 0L); 

    updateTimer = CFRunLoopTimerCreate(kCFAllocatorDefault, 
        CFAbsoluteTimeGetCurrent() + updateInterval, updateInterval, 
        0, 0, updateTimerCallBack, NULL); 
    CFRunLoopAddTimer(CFRunLoopGetCurrent(), updateTimer, kCFRunLoopDefaultMode); 
    CFRunLoopRun(); 

    exit(0); 
} 
+3

Non ho avuto il tempo di scavare nel codice, ma sembra che tu l'abbia inchiodato. – Indolering

+0

Funziona anche su El Capitan ... scoperto '512730 512730', coperto:' 30 30' – Barry