Подтвердить что ты не робот

Как вы программно обращаетесь к датчику окружающего света в Mac OS X 10.5+?

Я пытаюсь программно получить доступ к датчику окружающего света в приложении Mac, работающем на OS X 10.5 и выше, но не могу найти способ сделать это.

Здесь были заданы два других вопроса: "Доступ к данным датчика Mac" и "Отключить датчик окружающего света экранное затемнение программно на OS X" , но они либо не рассматривали эти или существующие решения, которые ломаются на 10,5 и выше.

Какой частный API использует Apple для доступа к данным окружающего светового датчика на OS X и/или как я могу его найти?

4b9b3361

Ответ 1

Я нашел самое близкое, что я могу, - пример кода из отчета об ошибке Firefox, измененного в апреле 2013 года. Ниже приводится работа, создающая простую программу CLI для запроса датчика (свободно взятую из https://bugzilla.mozilla.org/show_bug.cgi?id=793728#attach_664102). Опрос службы - "AppleLMUController", из которого вы можете извлечь соответствующую информацию. Ниже приведенный ниже фрагмент создает serviceObject=IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleLMUController")), который затем используется.

// 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);
}