Objective c DDHidLib-实现操纵杆(Logitech 3D Extreme PRO)

Objective c DDHidLib-实现操纵杆(Logitech 3D Extreme PRO),objective-c,macos,input,hid,Objective C,Macos,Input,Hid,我最近决定启动一个需要某种直接输入来控制我的应用程序的项目,在我的情况下,我决定使用我的操纵杆 因此,我开始使用Apple提供的在线文档记录自己(即使是处理OSX10.5新HID管理器的文档)。我能够实现非常主要的方法,但不幸的是,它们都不起作用 经过几天的搜索,我发现了一个很棒的库,它开发的库在处理直接输入时非常有用,提供了发现按钮按下和切换、队列等的好方法。 尽管这个库有点奇怪(2007年),我还是决定导入它并尝试一下 我将它导入到我的项目中,并开始实现一些看起来非常简单的方法 例如,在DD

我最近决定启动一个需要某种直接输入来控制我的应用程序的项目,在我的情况下,我决定使用我的操纵杆

因此,我开始使用Apple提供的在线文档记录自己(即使是处理OSX10.5新HID管理器的文档)。我能够实现非常主要的方法,但不幸的是,它们都不起作用

经过几天的搜索,我发现了一个很棒的库,它开发的库在处理直接输入时非常有用,提供了发现按钮按下和切换、队列等的好方法。 尽管这个库有点奇怪(2007年),我还是决定导入它并尝试一下

我将它导入到我的项目中,并开始实现一些看起来非常简单的方法

例如,在DDHIDGOLOGLE子类中,我发现:

- (void)ddhidJoystick:(DDHidJoystick *)joystick buttonDown:(unsigned)buttonNumber
此方法返回已按下按钮的编号

现在,在经过长时间的介绍之后,让我解释一下我的问题:

我编写了这个类的一个经过测试的实现,但没有成功(至少在硬件方面)

显然,如果我按下操纵杆上的一个按钮(数字7),上面报告的方法就会被称为

因此,在这种情况下,我会收到某种通知{
NSLog()
},即使库被设计为从设备检索任何类型的输入

但最奇怪的是,我只能通过同时按下特定的按钮(第7条)来检索所有其他按钮/POV/棒值

假设我想从按钮8获取输入,我必须按下按钮8,而不是同时按下按钮7。现在我收到了两个输入的通知

如果我想获得x轴值,我需要:

  • 移动x杆
  • 按按钮。七,
  • 然后我看到按钮n.7和x轴同时移动的一个通知

    为了澄清,让我介绍一下这种方法:

    - (void)ddhidJoystick:(DDHidJoystick *)joystick
                stick:(unsigned)stick
                xChanged:(int)value
    
    正如您所想象的,每当我移动X轴棒时,都应该触发此方法,但它不会

    相反,只有当我按下7号按钮,然后同时移动我的棍子时,它才会被触发

    我用X-Plane 10测试了操纵杆,效果很好,所以我猜应该有别的东西不同于我的应用程序获取输入并隐藏它

    我希望移动我的轴杆并使用
    NSLog
    ,但这不会发生

    我并不要求对如何使用这个lib来完成我的任务做出具体的回应,任何其他的工作方法都会非常感激

    我真的希望这个问题不要太具体,将来可能会对其他人有所帮助,因为没有人(显然)试图实现这样的输入

    非常感谢任何回复这篇文章的人

    对于最好奇的人:

    我正在用Arduino/Raspberry和许多其他电子设备建造自己的四架直升机。我有一个TX/RX模块,工作频率为2.4GHz,它允许两块板之间进行通信:一块在四块板上,另一块插在pc上。我开发了一个读取POSIX文档的库(C)来读取/写入串行端口,因此我能够通过usb将数据发送到我的板,然后再将数据发送到四块板。最后,我正在开发一个OSX应用程序,用上面提到的硬件/软件来控制直升机,这离完成还不远。 然而,出于我的目的,我想使用我的操纵杆,这是很困难的

    最后,我将在屏幕上看到一段来自车载(类似FPV)的实时视频,所有遥测都由我的Logitech 3D Extreme控制

    编辑-我找到了一个解决方案 我找到了一个解决方案,看起来效果不错

    基本上,我必须编辑一点lib的方法,添加对操纵杆的引擎滑块的支持

  • 打开
    ddhid.m
  • 定位方法
    -(BOOL)addElement:(ddhideelement*)元素
  • 添加case语句
    case kHIDUsage\u GD\u滑块:
  • 将操作设置为
    [mStickElements addObject:element]
  • 我将在这里发布代码,以防将来有人需要它:

    -  (BOOL) addElement: (DDHidElement *) element;
    {
        DDHidUsage * usage = [element usage];
        if ([usage usagePage] != kHIDPage_GenericDesktop)
            return NO;
    
        BOOL elementAdded = YES;
        switch ([usage usageId])
        {
            case kHIDUsage_GD_X:
                if (mXAxisElement == nil)
                    mXAxisElement = [element retain];
                else
                    [mStickElements addObject: element];
                break;
    
            case kHIDUsage_GD_Y:
                if (mYAxisElement == nil)
                    mYAxisElement = [element retain];
                else
                    [mStickElements addObject: element];
                break;
    
            case kHIDUsage_GD_Z:
            case kHIDUsage_GD_Rx:
            case kHIDUsage_GD_Ry:
            case kHIDUsage_GD_Rz:
                [mStickElements addObject: element];
                break;
    
            case kHIDUsage_GD_Hatswitch:
                [mPovElements addObject: element];
                break;
            /* EDIT HERE */
            case kHIDUsage_GD_Slider:
                [mStickElements addObject: element];
    
    
            default:
                elementAdded = NO;
    
        }
    
        return elementAdded;
    }
    
    在这行下面,您可以找到我的整个实现,以及操纵杆的图像。

    (在OS X 10.10上开发——阿尔贝托·贝里尼)



    也许我发现了你的操纵杆有问题

    Logitech Extreme 3D没有用于操纵杆的标准数据包。它有不同的属性,我在DDHidLib中找不到HID报告描述符解析器。我想

    检查此链接:

    不幸的是,我帮不了你更多,因为我对objetive-c、OSX和HID一无所知


    也许您可以修改DDHidLib中的数据包结构,为DDHidLib创建HID报告描述符解析器,或者使用标准数据包获得新的操纵杆。;)

    关于HID管理器的更好的文档可以在以下位置找到:我甚至已经检查了该参考,但我已经报告了问题中的另一个,以综合更多内容,并让大家了解我已经阅读了所有苹果文档。无论如何,谢谢。我不熟悉这个库,也不熟悉操纵杆的开发。但是,
    -(void)dd做什么呢。。。按钮向下
    生成?这似乎是图书馆错误地配置了你的操纵杆,你得到了错误的关键点点击。我将调试它的init函数,如
    initJoystickElements
    ,以查看那里发生了什么。这看起来不像是你的代码问题,比较库非常简单。根据库的说法,只要按下操纵杆按钮,就会触发(比如通知)。你试过了吗?这是对操纵杆装置的测试。如果失败了,那不是你的错。这是图书馆。如果你有一个完整的例子,关于如何使用
    @implementation AppDelegate
    
    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
        // Insert code here to initialize your application
        [self startWatchingJoysticks];
    }
    
    - (void)applicationWillTerminate:(NSNotification *)aNotification {
        // Insert code here to tear down your application
    }
    
    
    - (void)startWatchingJoysticks
    {
        //get an array of all joystick objects
        joySticks = [[DDHidJoystick allJoysticks] retain];
    
        //become the delegate of all available joystick objects
        [joySticks makeObjectsPerformSelector:@selector(setDelegate:) withObject:self];
        [joySticks makeObjectsPerformSelector:@selector(startListening) withObject:nil];
    
    
    
    }
    
    - (void)dealloc
    {
        [joySticks release];
        [super dealloc];
    }
    
    //these are the DDHidLib joystick delegate methods related to buttons
    
    - (void)ddhidJoystick:(DDHidJoystick *)joystick buttonDown:(unsigned)buttonNumber
    {
        NSLog(@"button down: %d", buttonNumber);
        //Works only number 7
    }
    
    - (void)ddhidJoystick:(DDHidJoystick *)joystick
                    stick:(unsigned)stick
                 xChanged:(int)value
    {
        NSLog(@"x axis %d",value);
        //Works ONCE only if presing button number 7 and moving stick
    }
    
    - (void)ddhidJoystick:(DDHidJoystick *)joystick
                    stick:(unsigned)stick
                 yChanged:(int)value
    {
        NSLog(@"y axis %d",value);
         //Works ONCE only if presing button number 7 and moving stick
    }
    
    - (void)ddhidJoystick:(DDHidJoystick *)joystick
                    stick:(unsigned)stick
                otherAxis:(unsigned)otherAxis
             valueChanged:(int)value
    {
        NSLog(@"z axis %d",value);
         //Works ONCE only if presing button number 7 and moving stick
    }
    
    - (void)ddhidJoystick:(DDHidJoystick *)joystick
                    stick:(unsigned)stick
                povNumber:(unsigned)povNumber
             valueChanged:(int)value
    {
    
        NSLog(@"Pov changed");
         //Works ONCE only if presing button number 7 and moving stick
    }
    
    
    @end