3746c1182c2b4b304938a48b4854a34ada3869a9
[enjoyable.git] / Classes / NJInputAnalog.m
1 //
2 // NJInputAnalog.m
3 // Enjoy
4 //
5 // Created by Sam McCall on 5/05/09.
6 //
7
8 #define DEAD_ZONE 0.3
9
10 #import "NJInputAnalog.h"
11
12 static float normalize(CFIndex p, CFIndex min, CFIndex max) {
13 return 2 * (p - min) / (float)(max - min) - 1;
14 }
15
16 @implementation NJInputAnalog {
17 CFIndex _rawMin;
18 CFIndex _rawMax;
19 }
20
21 - (id)initWithElement:(IOHIDElementRef)element
22 index:(int)index
23 parent:(NJInputPathElement *)parent
24 {
25 if ((self = [super initWithName:NJINPUT_NAME(NSLocalizedString(@"axis %d", @"axis name"), index)
26 eid:NJINPUT_DID("Axis", index)
27 element:element
28 parent:nil])) {
29 self.children = @[[[NJInput alloc] initWithName:NSLocalizedString(@"axis low", @"axis low trigger")
30 eid:@"Low"
31 parent:self],
32 [[NJInput alloc] initWithName:NSLocalizedString(@"axis high", @"axis high trigger")
33 eid:@"High"
34 parent:self]];
35 _rawMax = IOHIDElementGetPhysicalMax(element);
36 _rawMin = IOHIDElementGetPhysicalMin(element);
37 }
38 return self;
39 }
40
41 - (id)findSubInputForValue:(IOHIDValueRef)value {
42 float mag = normalize(IOHIDValueGetIntegerValue(value), _rawMin, _rawMax);
43 if (mag < -DEAD_ZONE)
44 return self.children[0];
45 else if (mag > DEAD_ZONE)
46 return self.children[1];
47 else
48 return nil;
49 }
50
51 - (void)notifyEvent:(IOHIDValueRef)value {
52 float magnitude = self.magnitude = normalize(IOHIDValueGetIntegerValue(value), _rawMin, _rawMax);
53 [self.children[0] setMagnitude:fabsf(MIN(magnitude, 0))];
54 [self.children[1] setMagnitude:fabsf(MAX(magnitude, 0))];
55 [self.children[0] setActive:magnitude < -DEAD_ZONE];
56 [self.children[1] setActive:magnitude > DEAD_ZONE];
57 }
58
59 @end