X-Git-Url: https://git.yukkurigames.com/?a=blobdiff_plain;f=JSActionAnalog.m;h=e7d6eba8f6b2d08687e8e775f241fc30ffd97db0;hb=e68c19b5923618b763543c74bf8dd6f85d4d323e;hp=a1c57e8533c2668737b265a9cc1902471ed939e5;hpb=530009447c5bbd360ac5023979cffc6d32a28df3;p=enjoyable.git diff --git a/JSActionAnalog.m b/JSActionAnalog.m index a1c57e8..e7d6eba 100644 --- a/JSActionAnalog.m +++ b/JSActionAnalog.m @@ -5,52 +5,49 @@ // 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