From ffbf6e3d236b35d5c084deafe5e63e8effb01903 Mon Sep 17 00:00:00 2001 From: Joe Wreschnig Date: Thu, 28 Feb 2013 20:03:47 +0100 Subject: [PATCH] Fix analog axis scaling equation. --- JSActionAnalog.h | 5 +---- JSActionAnalog.m | 22 ++++++++++++---------- Joystick.m | 5 ++--- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/JSActionAnalog.h b/JSActionAnalog.h index cc13d1e..c2660c0 100644 --- a/JSActionAnalog.h +++ b/JSActionAnalog.h @@ -12,9 +12,6 @@ @interface JSActionAnalog : JSAction -@property (assign) float offset; -@property (assign) float scale; - -- (id)initWithIndex:(int)newIndex offset:(float)offset scale:(float)scale; +- (id)initWithIndex:(int)index rawMin:(int)rawMin rawMax:(int)rawMax; @end diff --git a/JSActionAnalog.m b/JSActionAnalog.m index 7348e19..b431bc5 100644 --- a/JSActionAnalog.m +++ b/JSActionAnalog.m @@ -10,26 +10,29 @@ #import "JSActionAnalog.h" +static float normalize(int p, int min, int max) { + return 2 * (p - min) / (float)(max - min) - 1; +} + @implementation JSActionAnalog { float magnitude; + int rawMin; + int rawMax; } -@synthesize offset, scale; - -- (id)initWithIndex:(int)newIndex offset:(float)offset_ scale:(float)scale_ { +- (id)initWithIndex:(int)index rawMin:(int)rawMin_ rawMax:(int)rawMax_ { if ((self = [super init])) { + self.name = [[NSString alloc] initWithFormat: @"Axis %d", index]; self.children = @[[[JSAction alloc] initWithName:@"Low" base:self], [[JSAction alloc] initWithName:@"High" base:self]]; - self.offset = offset_; - self.scale = scale_; - self.name = [[NSString alloc] initWithFormat: @"Axis %d", newIndex]; + rawMax = rawMax_; + rawMin = rawMin_; } return self; } - (id)findSubActionForValue:(IOHIDValueRef)value { - int raw = IOHIDValueGetIntegerValue(value); - float mag = offset + scale * raw; + float mag = normalize(IOHIDValueGetIntegerValue(value), rawMin, rawMax); if (mag < -DEAD_ZONE) return self.children[0]; else if (mag > DEAD_ZONE) @@ -39,8 +42,7 @@ } - (void)notifyEvent:(IOHIDValueRef)value { - int raw = IOHIDValueGetIntegerValue(value); - magnitude = offset + scale * raw; + magnitude = normalize(IOHIDValueGetIntegerValue(value), rawMin, rawMax); [self.children[0] setActive:magnitude < -DEAD_ZONE]; [self.children[1] setActive:magnitude > DEAD_ZONE]; } diff --git a/Joystick.m b/Joystick.m index c86a363..e729edb 100644 --- a/Joystick.m +++ b/Joystick.m @@ -43,10 +43,9 @@ static NSArray *ActionsForElement(IOHIDDeviceRef device, id base) { } else if (usage == kHIDUsage_GD_Hatswitch) { action = [[JSActionHat alloc] initWithIndex:++hats]; } else if (usage >= kHIDUsage_GD_X && usage <= kHIDUsage_GD_Rz) { - // TODO(jfw): Scaling equation doesn't seem right if min != 0. action = [[JSActionAnalog alloc] initWithIndex:++axes - offset:-1.f - scale:2.f / (max - min)]; + rawMin:min + rawMax:max]; } else { continue; } -- 2.20.1