X-Git-Url: https://git.yukkurigames.com/?p=enjoyable.git;a=blobdiff_plain;f=JSActionAnalog.m;h=9c98f21593c20c0bde263ff9148def7c2aff8a89;hp=5aded63d3ad01e51dc8da6d926d2e4f8c26cd655;hb=f563321aec9e13b8479ab3b890a9179f095a8b17;hpb=20ccd38576bb48caf8e4129a8c86fe04819d83bc diff --git a/JSActionAnalog.m b/JSActionAnalog.m index 5aded63..9c98f21 100644 --- a/JSActionAnalog.m +++ b/JSActionAnalog.m @@ -5,49 +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 +static float normalize(long p, long min, long max) { + return 2 * (p - min) / (float)(max - min) - 1; +} -@synthesize offset, scale; +@implementation JSActionAnalog { + float magnitude; + long rawMin; + long rawMax; +} -- (id)initWithIndex:(int)newIndex offset:(float)offset_ scale:(float)scale_ { +- (id)initWithIndex:(int)index rawMin:(long)rawMin_ rawMax:(long)rawMax_ { if ((self = [super init])) { - self.children = @[[[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]; + self.name = [[NSString alloc] initWithFormat: @"Axis %d", index]; + self.children = @[[[JSAction alloc] initWithName:@"Low" base:self], + [[JSAction alloc] initWithName:@"High" base:self]]; + rawMax = rawMax_; + rawMin = rawMin_; } return self; } - (id)findSubActionForValue:(IOHIDValueRef)value { - int raw = IOHIDValueGetIntegerValue(value); - float parsed = [self getRealValue:raw]; - - if (parsed < -DEAD_ZONE) + float mag = normalize(IOHIDValueGetIntegerValue(value), rawMin, rawMax); + if (mag < -DEAD_ZONE) return self.children[0]; - else if (parsed > DEAD_ZONE) + else if (mag > DEAD_ZONE) return self.children[1]; else return nil; } - (void)notifyEvent:(IOHIDValueRef)value { - int raw = IOHIDValueGetIntegerValue(value); - float parsed = [self getRealValue:raw]; - [self.children[0] setActive:parsed < -DEAD_ZONE]; - [self.children[1] setActive:parsed > DEAD_ZONE]; + magnitude = normalize(IOHIDValueGetIntegerValue(value), rawMin, rawMax); + [self.children[0] setActive:magnitude < -DEAD_ZONE]; + [self.children[1] setActive:magnitude > DEAD_ZONE]; } -- (float)getRealValue:(int)value { - return offset + scale * value; +- (float)magnitude { + return magnitude; } - @end