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

时间:2015-02-22 14:53:26

标签: objective-c macos input hid

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

因此,我开始使用Apple提供的the HID Class Device Interface Guide在线记录自己(即使是处理OS X 10.5的新HID Manager的那个)。我能够实现非常主要的方法,但遗憾的是它们都没有。

经过几天的搜索,我发现了Daij-Djan : DDHidLib开发的一个很棒的图书馆,它在处理直接输入时提供了很多帮助,提供了发现按钮按下和按下切换的好方法,队列还有更多。 即使这个lib有点奇怪(2007),我决定导入它并尝试一下..

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

例如,在DDHidJoystick子类中,我找到了:

- (void)ddhidJoystick:(DDHidJoystick *)joystick buttonDown:(unsigned)buttonNumber

此方法返回已按下的按钮的编号。

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

我编写了这个类的测试实现,但没有成功(至少在我的硬件上)。

如果我按下操纵杆上的一个按钮(第7号),显然没有理由将上面报告的方法称为

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

但最奇怪的是,我只能通过同时按下特定按钮(N.7)来检索所有其他按钮/ povs / stick值。

所以,让我们说我想从按钮8获得输入,我必须按下按钮8,而不是同时按下按钮7.现在我收到两个输入的通知。

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

  1. 移动x-stick
  2. 按下按钮n。 7
  3. 然后我看到按钮n.7和x轴同时移动的一个通知。

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

    - (void)ddhidJoystick:(DDHidJoystick *)joystick
                stick:(unsigned)stick
                xChanged:(int)value
    

    你可以想象,每当我移动X轴杆时都应该触发这种方法,但它并没有。

    相反,只有按下按钮编号7 才会触发,然后同时移动我的手柄!

    我用X-Plane 10测试了操纵杆并且工作得很好,所以我的猜测是应该有一些不同于我的应用程序获取输入并隐藏它。

    我希望移动我的轴杆并选择NSLog,但这种情况并没有发生。

    我没有就如何使用此lib来完成我的任务请求具体响应,我们真的很感激任何其他工作方法。

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

    非常感谢任何回复此帖的人。

    最好奇:

    我正在使用Arduino / Raspberry和许多其他电子设备构建我自己的四轮直升机。我有一个工作频率为2.4GHz的TX / RX模块,可以在2块板之间进行通信:一块在四核板上,另一块在PC上。我开发了一个lib(在C中)读取POSIX文档来读取/写入串行端口,因此我能够通过usb将数据发送到我的电路板,而不是将其发送到四核。最后,我正在开发一个OS X应用程序,使用上述硬件/软件控制直升机,距离完成不远。 但是出于我的目的,我想使用我的操纵杆,这很难。

    最后,我将在屏幕上显示板载(FPV-Like)的实时视频,遥控器全部由我的Logitech 3D Extreme控制。

    编辑 - 我找到了解决方案

    我找到了一个解决方案,它看起来效果很好!

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

    1. 打开DDHidJoystick.m
    2. 找到方法- (BOOL) addElement: (DDHidElement *) element;
    3. 添加案例陈述case kHIDUsage_GD_Slider:
    4. 将操作设置为[mStickElements addObject: element];
    5. 我会在这里发布代码,以防有人在将来需要它:

      -  (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上开发 - Alberto Bellini)


      @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
      

      enter image description here

1 个答案:

答案 0 :(得分:1)

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

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

点击此链接:http://www.circuitsathome.com/mcu/using-logitech-extreme-3d-pro-joystick-with-arduino-hid-library

不幸的是,我无法帮助你,因为我对objetive-c,OSX和HID一无所知。

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