Objective c DDHidLib-实现操纵杆(Logitech 3D Extreme PRO)
我最近决定启动一个需要某种直接输入来控制我的应用程序的项目,在我的情况下,我决定使用我的操纵杆 因此,我开始使用Apple提供的在线文档记录自己(即使是处理OSX10.5新HID管理器的文档)。我能够实现非常主要的方法,但不幸的是,它们都不起作用 经过几天的搜索,我发现了一个很棒的库,它开发的库在处理直接输入时非常有用,提供了发现按钮按下和切换、队列等的好方法。 尽管这个库有点奇怪(2007年),我还是决定导入它并尝试一下 我将它导入到我的项目中,并开始实现一些看起来非常简单的方法 例如,在DDHIDGOLOGLE子类中,我发现:Objective c DDHidLib-实现操纵杆(Logitech 3D Extreme PRO),objective-c,macos,input,hid,Objective C,Macos,Input,Hid,我最近决定启动一个需要某种直接输入来控制我的应用程序的项目,在我的情况下,我决定使用我的操纵杆 因此,我开始使用Apple提供的在线文档记录自己(即使是处理OSX10.5新HID管理器的文档)。我能够实现非常主要的方法,但不幸的是,它们都不起作用 经过几天的搜索,我发现了一个很棒的库,它开发的库在处理直接输入时非常有用,提供了发现按钮按下和切换、队列等的好方法。 尽管这个库有点奇怪(2007年),我还是决定导入它并尝试一下 我将它导入到我的项目中,并开始实现一些看起来非常简单的方法 例如,在DD
- (void)ddhidJoystick:(DDHidJoystick *)joystick buttonDown:(unsigned)buttonNumber
此方法返回已按下按钮的编号
现在,在经过长时间的介绍之后,让我解释一下我的问题:
我编写了这个类的一个经过测试的实现,但没有成功(至少在硬件方面)
显然,如果我按下操纵杆上的一个按钮(数字7),上面报告的方法就会被称为
因此,在这种情况下,我会收到某种通知{NSLog()
},即使库被设计为从设备检索任何类型的输入
但最奇怪的是,我只能通过同时按下特定的按钮(第7条)来检索所有其他按钮/POV/棒值
假设我想从按钮8获取输入,我必须按下按钮8,而不是同时按下按钮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 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