Библиотека джойстиков работает в командной строке, но не как приложение macos - PullRequest
0 голосов
/ 29 апреля 2019

Я не могу заставить класс GameController работать с моим джойстиком.Однако я нашел простую библиотеку https://github.com/suzukiplan/gamepad-osx, использующую IOKit, написанную на C, и сумел заставить ее работать в консольном приложении swift, используя следующий код для main.swift:

import Foundation

func  callback(_  type: Int32, _ page: Int32,  _ usage: Int32, _ value: Int32) -> Void  {
    print("Type: \(type); page: \(page), usage: \(usage), value: \(value)")
}

let ctx = gamepad_init(1, 1, 0)

if ctx == nil {
    print("Init  failed")
    exit(4)
}

gamepad_set_callback(ctx, callback(_:_:_:_:))

CFRunLoopRun()
exit(0)

Консольные сообщения:

attched device: Controller
attched device: 2.4G RX
attched device: VirtualHIDKeyboard
Type: 2; page: 7, usage: 227, value: 1
Type: 2; page: 7, usage: -1, value: 6
....

Поскольку это будет использоваться в приложении MacOS, я создал приложение Cocoa для одного представления со следующим кодом в главном представлении:

import AppKit

class MainView: NSView {

    required init?(coder decoder: NSCoder) {
        super.init(coder: decoder)

        print("Initialising started")

        let ctx = gamepad_init(1, 1, 0)
        if ctx == nil {
           print("Init  failed")
           return
       }

        print("Initialising succeeded")

        gamepad_set_callback(ctx, callback(_:_:_:_:))

        print("Callback attached")

    }
}

func  callback(_  type: Int32, _ page: Int32,  _ usage: Int32, _ value: Int32) -> Void  {
    print("Type: \(type); page: \(page), usage: \(usage), value: \(value)")
}

Появляется окно, но чтоЯ получаю на консоли только что:

Initialising started
Initialising succeeded
Callback attached

Нет сообщений о присоединении устройства вообще!

Также пробовал запуск и дополнительный поток (DispatchQueue) в главном представлении и в AppDelegate (на этот раз сCFRunLoopRun):

func applicationDidFinishLaunching(_ aNotification: Notification) {
   DispatchQueue(label: "Joy").async {
        print("Initialising started")

        let ctx = gamepad_init(1, 1, 0)
        if ctx == nil {
            print("Init  failed")
            return
        }

        print("Initialising succeeded")
        gamepad_set_callback(ctx, callback(_:_:_:_:))

       CFRunLoopRun()
   }
}

Опять нет сообщений вложения

1 Ответ

0 голосов
/ 01 мая 2019

Решение: во вкладке Capabilities для проекта отметьте USB для Песочницы приложения.

Спасибо https://forums.developer.apple.com/message/358820#358820 за идею.

...