Устаревший обзор доступа HID
Эта глава обеспечивает поэтапные инструкции, включая списки примера кода, для доступа к устройству класса HID на более старых версиях OS X. При разработке нового кода для OS X v10.5 или позже необходимо использовать APIs, описанный в Доступе к Устройству HID.
Пример кода показывает, как найти все устройства класса HID, как сузить поиск к устройствам определенного типа, и как открыться и связаться с устройством.
Для поиска Реестра I/O в настоящее время доступное устройство класса HID создайте интерфейс устройства для устройства и свяжитесь с ним, Вы выполняете шаги, описанные в следующих разделах:
Обзор доступа HID
Следующий список шагов кратко описывает, как найти устройство класса HID, создать интерфейс устройства для него, соединяется с ним и связывается с ним. Остаток от этой главы дает подробный пример этого процесса, включая пример кода.
Найдите объект, представляющий устройство в Реестре I/O. Для обзора этого процесса посмотрите обсуждение устройства, соответствующего в chapterDevice Доступе и Наборе I/O Доступа к Аппаратным средствам Из Приложений.
Создайте интерфейс устройства для устройства. Для устройства класса HID Вы создаете интерфейс устройства типа
IOHIDDeviceInterface
. Этот интерфейс устройства, определенный вIOHIDLib.h
, обеспечивает все функции, к которым необходимо получить доступ и передать с устройством.Откройте соединение с устройством путем вызова
open
функция интерфейса устройства.Свяжитесь с устройством с помощью функций, предоставленных менеджером по HID. Например, для получения нового значения элемента используйте
getElementValue
функция.Функции для создания очереди и манипулирования также предоставлены менеджером по HID. Например, для чтения следующего события из очереди используйте
getNextEvent
функция; для запроса уведомления, когда очередь больше не будет пуста используйте функциюsetEventCallout
.Когда Вы закончите с устройством, вызовите
close
функция интерфейса устройства.Выпустите интерфейс устройства.
Установка Вашей среды программирования
Пример кода в этом документе из проекта XCode, создающего инструмент командной строки. Этот раздел фокусируется на использовании XCode для разработки тестовой функции для функций интерфейса устройства, которые Вы будете использовать. Можно найти более подробную документацию для XCode в http://developer .apple.com/documentation/DeveloperTools/index.html.
Для установки XCode для создания интерфейса устройства сделайте следующее:
Выберите «CoreFoundation Tool» (в Утилите Командной строки) при создании проекта или добавьте
CoreFoundation.framework
к Вашим Внешним Платформам и Библиотекам существующего проекта.Добавить
IOKit.framework
иSystem.framework
к разделу External Frameworks и Libraries Вашего проекта. (Перетащите от Средства поиска.)Рекомендуется первоначально разработать проект с отладкой включенного. Чтобы сделать это в 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. Это выполняет большую часть своей работы путем вызывания следующих функций:
MyFindHIDDevices
, показанный в Перечислении 3-3, устанавливает соответствующий словарь и затем ищет соответствие устройств класса HIDMyTestHIDDevices
, доступный в загружаемом исходном пакете, выполняет итерации по набору согласующих устройств и вызывает многие функции в этой выборке, чтобы распечатать информацию о свойстве и создать и протестировать интерфейс устройства на каждое устройство.
Перечисление 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
, та функция использует ссылку на словарь.