Mac 터치패드 원시 데이터 가져오기

10064 단어 MacOSXSwift

프로젝트 준비


  • File -> New -> Project -> macOS -> Cocoa App로 프로젝트 만들기
  • /System/Library/PrivateFrameworks/MultitouchSupport.framework 를 Embedded Binaries 에 Copy items if needed 로 추가한다 (동시에 Linked Frameworks and Libraries 에 추가된다)

  • M5MultitouchSupport

  • TARGETS -> Capabilities -> App SandBox를 OFF로 설정~.entitlements 에 Key com.apple.security.temporary-exception.sbpl 를 추가하고 Value 에 (allow iokit-open) 를 기입한다

  • 코딩(최소한)



    ViewController.swift
    import Cocoa
    import M5MultitouchSupport
    
    class ViewController: NSViewController {
    
        var manager: M5MultitouchManager! = nil
        var listener: M5MultitouchListener! = nil
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            manager = M5MultitouchManager.shared()
            listener = manager.addListener(callback: { [weak self] (event) in
                if let e = event, let touches = e.touches as NSArray as? [M5MultitouchTouch] {
                    DispatchQueue.main.async {
                        self?.process(touches)
                    }
                }
            })
        }
    
        override func viewWillDisappear() {
            super.viewWillDisappear()
            listener.listening = false
        }
    
        override var representedObject: Any? {
            didSet {
            }
        }
    
        func process(_ touches: [M5MultitouchTouch]) {
            var currentInfo: String = "["
            currentInfo += touches.map({ (touch) -> String in
                return String(format: "ID: %d, state: %@, Position(x, y) = (%0.4f, %0.4f), Velocity(x, y) = (%+0.4f, %+0.4f), Size: %0.4f, Axis(major, minor) = (%0.4f, %0.4f), Angle: %0.4f",
                              touch.identifier,
                              stateString(touch.state),
                              touch.posX,
                              touch.posY,
                              touch.velX,
                              touch.velY,
                              touch.size,
                              touch.majorAxis,
                              touch.minorAxis,
                              touch.angle)
            }).joined(separator: "\n ")
            currentInfo += "]"
            Swift.print(currentInfo)
        }
    
        func stateString(_ state: M5MultitouchTouchState) -> String {
            switch state {
            case .notTouching: return "notTouching"
            case .starting: return "starting"
            case .hovering: return "hovering"
            case .making: return "making"
            case .touching: return "touching"
            case .breaking: return "breaking"
            case .lingering: return "lingering"
            case .leaving: return "leaving"
            default: return "unknown"
            }
        }
    
    }
    

    취득 가능한 데이터



    11점까지 터치점 획득 가능
    또한 각 터치 포인트에 대해,
    - ID
    - 접촉 상태
    - 절대 좌표(범위는 터치패드 영역의 상하·좌우 각각에 대해 0~1)
    - 이동 속도
    - 긴 직경과 짧은 직경 (터치 포인트를 타원으로 간주)
    - 장축 기울기
    취득 가능

    샘플 프로젝트(GitHub)



    TouchpadRawDataGetter

    좋은 웹페이지 즐겨찾기