Устаревший обзор доступа HID

Эта глава обеспечивает поэтапные инструкции, включая списки примера кода, для доступа к устройству класса HID на более старых версиях OS X. При разработке нового кода для OS X v10.5 или позже необходимо использовать APIs, описанный в Доступе к Устройству HID.

Пример кода показывает, как найти все устройства класса HID, как сузить поиск к устройствам определенного типа, и как открыться и связаться с устройством.

Для поиска Реестра I/O в настоящее время доступное устройство класса HID создайте интерфейс устройства для устройства и свяжитесь с ним, Вы выполняете шаги, описанные в следующих разделах:

  1. Обзор доступа HID

  2. Установка Вашей среды программирования

  3. Доступ к Ведущему порту Набора I/O

  4. Нахождение устройства класса HID

Обзор доступа HID

Следующий список шагов кратко описывает, как найти устройство класса HID, создать интерфейс устройства для него, соединяется с ним и связывается с ним. Остаток от этой главы дает подробный пример этого процесса, включая пример кода.

  1. Найдите объект, представляющий устройство в Реестре I/O. Для обзора этого процесса посмотрите обсуждение устройства, соответствующего в chapterDevice Доступе и Наборе I/O Доступа к Аппаратным средствам Из Приложений.

  2. Создайте интерфейс устройства для устройства. Для устройства класса HID Вы создаете интерфейс устройства типа IOHIDDeviceInterface. Этот интерфейс устройства, определенный в IOHIDLib.h, обеспечивает все функции, к которым необходимо получить доступ и передать с устройством.

  3. Откройте соединение с устройством путем вызова open функция интерфейса устройства.

  4. Свяжитесь с устройством с помощью функций, предоставленных менеджером по HID. Например, для получения нового значения элемента используйте getElementValue функция.

    Функции для создания очереди и манипулирования также предоставлены менеджером по HID. Например, для чтения следующего события из очереди используйте getNextEvent функция; для запроса уведомления, когда очередь больше не будет пуста используйте функцию setEventCallout.

  5. Когда Вы закончите с устройством, вызовите close функция интерфейса устройства.

  6. Выпустите интерфейс устройства.

Установка Вашей среды программирования

Пример кода в этом документе из проекта XCode, создающего инструмент командной строки. Этот раздел фокусируется на использовании XCode для разработки тестовой функции для функций интерфейса устройства, которые Вы будете использовать. Можно найти более подробную документацию для XCode в http://developer .apple.com/documentation/DeveloperTools/index.html.

Для установки XCode для создания интерфейса устройства сделайте следующее:

  1. Выберите «CoreFoundation Tool» (в Утилите Командной строки) при создании проекта или добавьте CoreFoundation.framework к Вашим Внешним Платформам и Библиотекам существующего проекта.

  2. Добавить IOKit.framework и System.framework к разделу External Frameworks и Libraries Вашего проекта. (Перетащите от Средства поиска.)

  3. Рекомендуется первоначально разработать проект с отладкой включенного. Чтобы сделать это в XCode, откройте целевой список путем щелчка по треугольнику раскрытия. Дважды щелкните по единственной перечисленной цели. В инспекторе, появляющемся, щелкните по вкладке сборки, затем проверьте, что флажок рядом с ‘Генерирует Отладочные символы’.

Перечисление 3-1 показывает заголовочные файлы, которые необходимо будет включать для примера кода в этот документ. Некоторые из этих заголовков включают других; более короткий список может быть возможным. За исключением CoreFoundation.h, эти заголовки обычно являются частью IOKit.framework или System.framework, оба из которых расположены в /System/Library/Frameworks.

  Заголовочные файлы перечисления 3-1 для включения для примера кода в этот документ

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <ctype.h>
#include <sys/errno.h>
#include <sysexits.h>
#include <mach/mach.h>
#include <mach/mach_error.h>
#include <IOKit/IOKitLib.h>
#include <IOKit/IOCFPlugIn.h>
#include <IOKit/hid/IOHIDLib.h>
#include <IOKit/hid/IOHIDKeys.h>
#include <CoreFoundation/CoreFoundation.h>

Доступ к Ведущему порту Набора I/O

Пример кода для работы с интерфейсами устройства класса HID начинается MyStartHIDDeviceInterfaceTest функция, показанная в Перечислении 3-2. Эта функция устанавливает соединение с Набором I/O и затем вызывает функции, чтобы искать устройства класса HID и выполнить тесты на каждом найденном устройстве класса HID. Это выполняет большую часть своей работы путем вызывания следующих функций:

Перечисление 3-2  функция, находящая устройства класса HID в Реестре I/O и выполняющая тест на каждом устройстве

static void MyStartHIDDeviceInterfaceTest(void)
{
    io_iterator_t hidObjectIterator = NULL;
    IOReturn ioReturnValue = kIOReturnSuccess;
 
    MyFindHIDDevices(kIOMasterPortDefault, &hidObjectIterator);
 
    if (hidObjectIterator != NULL)
    {
        MyTestHIDDevices(hidObjectIterator);
 
        //Release iterator. Don't need to release iterator objects.
        IOObjectRelease(hidObjectIterator);
    }
}

MyStartHIDDeviceInterfaceTest функционируйте выпускает и ведущий порт, который это получило и итератор, возвращенный MyFindHIDDevices функция, но это не выпускает объекты итератора. Они выпущены в MyTestHIDDevices функция после того, как это использует объекты.

Нахождение устройства класса HID

Прежде чем Ваше приложение может создать интерфейс устройства для доступа к устройству, оно должно сначала найти устройство в Реестре I/O. Чтобы сделать это, Вы создаете соответствующий словарь, указывающий тип устройства, которое Вы хотите найти. Тогда Вы получаете итератор для списка устройств, соответствующих Ваши критерии, таким образом, можно исследовать каждого.

Следующие функции демонстрируют этот процесс путем создания соответствующего словаря и поиска Реестра I/O согласующие устройства. Если поиск успешен, функция MyFindHIDDevices (показанный в Перечислении 3-3), возвращает итератор для списка соответствующих устройств.

Поиск Реестра I/O

MyFindHIDDevices функция является начальной точкой для нахождения определенного типа устройства в Реестре I/O. Во-первых, это устанавливает соответствующий словарь путем передачи kIOHIDDeviceKey (определенный в IOHIDLib.h) к функции Набора I/O IOServiceMatching. Это определяет широкий поиск всех объектов в Реестре I/O, представляющих устройства класса HID. Тогда это вызывает функцию Набора I/O IOServiceGetMatchingServices, который выполняет поиск и, в случае успеха, возвращает итератор для набора согласующих устройств.

Параметры к MyFindHIDDevices порт Маха и указатель на объектный итератор. Порт Маха получен в предыдущем вызове к IOMasterPort функция — видит Перечисление 3-2. MyFindHIDDevices функционируйте использует указатель на объектный итератор для возврата итератора, обеспечивающего доступ к соответствию объектов драйвера из Реестра I/O.

Перечисление 3-3  функция, ищущая устройства HID, соответствующие указанные критерии

static void MyFindHIDDevices(mach_port_t masterPort,
                io_iterator_t *hidObjectIterator)
{
    CFMutableDictionaryRef hidMatchDictionary = NULL;
    IOReturn ioReturnValue = kIOReturnSuccess;
    Boolean noMatchingDevices = false;
 
    // Set up a matching dictionary to search the I/O Registry by class
    // name for all HID class devices
    hidMatchDictionary = IOServiceMatching(kIOHIDDeviceKey);
 
    // Now search I/O Registry for matching devices.
    ioReturnValue = IOServiceGetMatchingServices(masterPort,
                            hidMatchDictionary, hidObjectIterator);
 
    noMatchingDevices = ((ioReturnValue != kIOReturnSuccess)
                                | (*hidObjectIterator == NULL));
 
    //If search is unsuccessful, print message and hang.
    if (noMatchingDevices)
        print_errmsg_if_err(ioReturnValue, "No matching HID class devices found.");
 
    // IOServiceGetMatchingServices consumes a reference to the
    //   dictionary, so we don't need to release the dictionary ref.
    hidMatchDictionary = NULL;
}

MyFindHIDDevices функция не выпускает ссылку, которую она получает к соответствующему словарю потому что, когда она вызывает функцию Набора I/O IOServiceGetMatchingServices, та функция использует ссылку на словарь.