// Created by Sam McCall on 5/05/09.
//
-@implementation JSActionAnalog
-
-- (id) initWithIndex: (int)newIndex {
- if(self = [super init]) {
- subActions = [NSArray arrayWithObjects:
- [[SubAction alloc] initWithIndex: 0 name: @"Low" base: self],
- [[SubAction alloc] initWithIndex: 1 name: @"High" base: self],
- [[SubAction alloc] initWithIndex: 2 name: @"Analog" base: self],
- nil
- ];
- [subActions retain];
- index = newIndex;
- name = [[NSString alloc] initWithFormat: @"Axis %d", (index+1)];
- }
- return self;
+// TODO: Dead zone should be configurable per-device.
+#define DEAD_ZONE 0.3
+
+#import "JSActionAnalog.h"
+
+@implementation JSActionAnalog {
+ float magnitude;
}
--(id) findSubActionForValue: (IOHIDValueRef) value {
- if ([[subActions objectAtIndex: 2] active]) {
- return [subActions objectAtIndex: 2]; // TODO?
+@synthesize offset, scale;
+
+- (id)initWithIndex:(int)newIndex offset:(float)offset_ scale:(float)scale_ {
+ if ((self = [super init])) {
+ self.children = @[[[JSAction alloc] initWithName:@"Low" base:self],
+ [[JSAction alloc] initWithName:@"High" base:self]];
+ self.index = newIndex;
+ self.offset = offset_;
+ self.scale = scale_;
+ self.name = [[NSString alloc] initWithFormat: @"Axis %d", self.index];
}
-
- //Target* target = [[base->configsController currentConfig] getTargetForAction: [subActions objectAtIndex: 0]];
-
- int raw = IOHIDValueGetIntegerValue(value);
- double parsed = [self getRealValue: raw];
-
- if(parsed < -0.3) // fixed?!
- return [subActions objectAtIndex: 0];
- else if(parsed > 0.3)
- return [subActions objectAtIndex: 1];
- return NULL;
+ return self;
}
--(void) notifyEvent: (IOHIDValueRef) value {
- // Analog action is always active
- [[subActions objectAtIndex: 2] setActive: true];
-
- int raw = IOHIDValueGetIntegerValue(value);
- double parsed = [self getRealValue: raw];
-
- [[subActions objectAtIndex: 0] setActive: (parsed < -0.3)];
- [[subActions objectAtIndex: 1] setActive: (parsed > 0.3)];
+- (id)findSubActionForValue:(IOHIDValueRef)value {
+ int raw = IOHIDValueGetIntegerValue(value);
+ float mag = offset + scale * raw;
+ if (mag < -DEAD_ZONE)
+ return self.children[0];
+ else if (mag > DEAD_ZONE)
+ return self.children[1];
+ else
+ return nil;
}
--(double) getRealValue: (int)value {
- double parsed = offset + scale * value;
- return parsed;
+- (void)notifyEvent:(IOHIDValueRef)value {
+ int raw = IOHIDValueGetIntegerValue(value);
+ magnitude = offset + scale * raw;
+ [self.children[0] setActive:magnitude < -DEAD_ZONE];
+ [self.children[1] setActive:magnitude > DEAD_ZONE];
}
-@synthesize offset, scale;
-
+- (float)magnitude {
+ return magnitude;
+}
@end