Split view management out of NJDeviceController. Right now this probably just makes...
[enjoyable.git] / Classes / NJInputHat.m
1 //
2 // NJInputHat.m
3 // Enjoy
4 //
5 // Created by Sam McCall on 5/05/09.
6 //
7
8 #import "NJInputHat.h"
9
10 static BOOL active_eightway[36] = {
11 NO, NO, NO, NO , // center
12 YES, NO, NO, NO , // N
13 YES, NO, NO, YES, // NE
14 NO, NO, NO, YES, // E
15 NO, YES, NO, YES, // SE
16 NO, YES, NO, NO , // S
17 NO, YES, YES, NO , // SW
18 NO, NO, YES, NO , // W
19 YES, NO, YES, NO , // NW
20 };
21
22 static BOOL active_fourway[20] = {
23 NO, NO, NO, NO , // center
24 YES, NO, NO, NO , // N
25 NO, NO, NO, YES, // E
26 NO, YES, NO, NO , // S
27 NO, NO, YES, NO , // W
28 };
29
30 @implementation NJInputHat {
31 CFIndex _max;
32 }
33
34 - (id)initWithElement:(IOHIDElementRef)element
35 index:(int)index
36 parent:(NJInputPathElement *)parent
37 {
38 if ((self = [super initWithName:NJINPUT_NAME(NSLocalizedString(@"hat switch %d", @"hat switch name"), index)
39 eid:NJINPUT_DID("Hat Switch", index)
40 element:element
41 parent:parent])) {
42 self.children = @[[[NJInput alloc] initWithName:NSLocalizedString(@"hat up", @"hat switch up state")
43 eid:@"Up"
44 parent:self],
45 [[NJInput alloc] initWithName:NSLocalizedString(@"hat down", @"hat switch down state")
46 eid:@"Down"
47 parent:self],
48 [[NJInput alloc] initWithName:NSLocalizedString(@"hat left", @"hat switch left state")
49 eid:@"Left"
50 parent:self],
51 [[NJInput alloc] initWithName:NSLocalizedString(@"hat right", @"hat switch right state")
52 eid:@"Right"
53 parent:self]];
54 _max = IOHIDElementGetLogicalMax(element);
55 }
56 return self;
57 }
58
59 - (id)findSubInputForValue:(IOHIDValueRef)value {
60 long parsed = IOHIDValueGetIntegerValue(value);
61 switch (_max) {
62 case 7: // 8-way switch, 0-7.
63 switch (parsed) {
64 case 0: return self.children[0];
65 case 4: return self.children[1];
66 case 6: return self.children[2];
67 case 2: return self.children[3];
68 default: return nil;
69 }
70 case 8: // 8-way switch, 1-8 (neutral 0).
71 switch (parsed) {
72 case 1: return self.children[0];
73 case 5: return self.children[1];
74 case 7: return self.children[2];
75 case 3: return self.children[3];
76 default: return nil;
77 }
78 case 3: // 4-way switch, 0-3.
79 switch (parsed) {
80 case 0: return self.children[0];
81 case 2: return self.children[1];
82 case 3: return self.children[2];
83 case 1: return self.children[3];
84 default: return nil;
85 }
86 case 4: // 4-way switch, 1-4 (neutral 0).
87 switch (parsed) {
88 case 1: return self.children[0];
89 case 3: return self.children[1];
90 case 4: return self.children[2];
91 case 2: return self.children[3];
92 default: return nil;
93 }
94 default:
95 return nil;
96 }
97 }
98
99 - (void)notifyEvent:(IOHIDValueRef)value {
100 long parsed = IOHIDValueGetIntegerValue(value);
101 long size = _max;
102 // Skip first row in table if 0 is not neutral.
103 if (size & 1) {
104 parsed++;
105 size++;
106 }
107 BOOL *activechildren = (size == 8) ? active_eightway : active_fourway;
108 for (unsigned i = 0; i < 4; i++) {
109 BOOL active = activechildren[parsed * 4 + i];
110 [self.children[i] setActive:active];
111 [self.children[i] setMagnitude:active];
112 }
113 }
114
115 @end