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