// // HIDExample_CoreHID.swift // HIDExample_CoreHID // // Modified by Kevin Elliott on 3/7/25. import Foundation import CoreHID let DeviceVendorId: UInt32 = 0x046D // Logitech //let DeviceProductId: UInt32 = 0xC24A // Gaming Mouse G600 let DeviceProductId: UInt32 = 0xC08B // Gaming Mouse G502 var deviceClient: HIDDeviceClient? = nil @main struct HIDExample_CoreHID { static func main() async throws { let deviceManager = HIDDeviceManager() let matchingCriteria : HIDDeviceManager.DeviceMatchingCriteria = .init(primaryUsage: HIDUsage(page: 0x01, usage: 0x06) , deviceUsages: nil, vendorID: DeviceVendorId, productID: DeviceProductId) let reportId = HIDReportID(rawValue: 0x80) var deviceRef: HIDDeviceClient.DeviceReference? = nil for try await notification in await deviceManager.monitorNotifications(matchingCriteria: [matchingCriteria]) { switch notification { case .deviceMatched(let dr): if deviceRef != nil {continue} deviceRef = dr deviceClient = HIDDeviceClient(deviceReference: deviceRef!) let deviceName = await deviceClient!.product! print("DeviceName: \(deviceName)") #if true let allElements = await deviceClient?.elements let count = allElements!.count print ("Report \(count) <\(String(describing: allElements))>") #endif let elemToMon = await deviceClient?.elements.filter({ ele in return ele.usage.page == 7 && ele.usage.usage == 225 }) assert(!(elemToMon!.isEmpty)) // make sure that this is the correct device. do { let report = try await deviceClient!.dispatchGetReportRequest(type: .input, id: HIDReportID(rawValue: 1), timeout: Duration.seconds(4)) assert(!report.isEmpty) NSLog("dispatchGetReportRequest succeeded: %@\n", String(describing: report)) } catch { NSLog("dispatchGetReportRequest failed: %@\n", String(describing: error)) } do { let request = HIDDeviceClient.RequestElementUpdate(elements: elemToMon!) let results = await deviceClient!.updateElements([request]) let rval = try results[request]?.get() // <----- error is thrown here print ("Report \(String(describing: rval))") } catch { NSLog("RequestElementUpdate failed: %@\n", String(describing: error)) } default: continue } } print("Finished") } }