@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
#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)
}
- (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];
}
} 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;
}