Идея многих фреймворков в стиле Objective-C или C заключается в том, что вы передаете указатели на объекты, которые, как вы ожидаете, будут созданы функцией, а функции возвращают коды, чтобы вы знали, была ли операция успешной или нет.
Вы можете использовать IOHIDDeviceGetService(device)
, чтобы получить io_service_t
. Затем вы можете создать необязательный объект типа FFDeviceObjectReference
и передать его ссылку на FFCreateDevice
. Вот (непроверенный) пример, который, кажется, должен работать:
import IOKit.hid
import ForceFeedback
class ForceFeedback {
public func listen() {
let hidManager = IOHIDManagerCreate(kCFAllocatorDefault, IOOptionBits(kIOHIDOptionsTypeNone))
let hidDevices = [
kIOHIDDeviceUsagePageKey: kHIDPage_GenericDesktop,
kIOHIDDeviceUsageKey: kHIDUsage_GD_Mouse
]
IOHIDManagerSetDeviceMatching(hidManager, hidDevices as CFDictionary)
let deviceMatchingCallback: IOHIDDeviceCallback = {context, result, sender, device in
var ffDevice: FFDeviceObjectReference? = nil
let result = FFCreateDevice(IOHIDDeviceGetService(device), &ffDevice)
if result != FF_OK {
print("could not create force feedback device")
}
var ffEffect: FFEffectObjectReference? = nil
var effectDefinition = FFEFFECT() // You'd create your effect here
// Pick your UUID and build it here. For example, this is the constant force effect type
// E559C460-C5CD-11D6-8A1C-00039353BD00
let constantForce: CFUUID = CFUUIDCreateWithBytes(kCFAllocatorDefault,
0xE5, 0x59, 0xC4, 0x60, 0xC5, 0xCD, 0x11, 0xD6,
0x8A, 0x1C, 0x00, 0x03, 0x93, 0x53, 0xBD, 0x00)
let effectResult = FFDeviceCreateEffect(ffDevice, constantForce, &effectDefinition, &ffEffect)
if effectResult != FF_OK {
print("could not create effect")
}
// Start and stop your effect
// Don't forget to clean up your ffDevice and ffEffect when done.
}
// bridge your context and send it as a parameter instead of nil if needed
IOHIDManagerRegisterDeviceMatchingCallback(hidManager, deviceMatchingCallback, nil)
IOHIDManagerScheduleWithRunLoop(hidManager, CFRunLoopGetCurrent(), CFRunLoopMode.defaultMode.rawValue)
CFRunLoopRun()
}
}
Обратите внимание, что я регистрирую обратный вызов HID, чтобы код запускался при добавлении устройства.
person
Ryan H
schedule
28.05.2018