5 // Created by Sam McCall on 5/05/09.
10 static BOOL active_eightway[36] = {
11 NO, NO, NO, NO , // center
12 YES, NO, NO, NO , // N
13 YES, NO, NO, YES, // NE
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
22 static BOOL active_fourway[20] = {
23 NO, NO, NO, NO , // center
24 YES, NO, NO, NO , // N
26 NO, YES, NO, NO , // S
27 NO, NO, YES, NO , // W
30 @implementation NJInputHat {
34 - (id)initWithElement:(IOHIDElementRef)element
36 parent:(NJInputPathElement *)parent
38 if ((self = [super initWithName:NJINPUT_NAME(NSLocalizedString(@"hat switch %d", @"hat switch name"), index)
39 eid:NJINPUT_EID("Hat Switch", index)
42 self.children = @[[[NJInput alloc] initWithName:NSLocalizedString(@"hat up", @"hat switch up state")
45 [[NJInput alloc] initWithName:NSLocalizedString(@"hat down", @"hat switch down state")
48 [[NJInput alloc] initWithName:NSLocalizedString(@"hat left", @"hat switch left state")
51 [[NJInput alloc] initWithName:NSLocalizedString(@"hat right", @"hat switch right state")
54 _max = IOHIDElementGetLogicalMax(element);
59 - (id)findSubInputForValue:(IOHIDValueRef)value {
60 long parsed = IOHIDValueGetIntegerValue(value);
62 case 7: // 8-way switch, 0-7.
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];
70 case 8: // 8-way switch, 1-8 (neutral 0).
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];
78 case 3: // 4-way switch, 0-3.
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];
86 case 4: // 4-way switch, 1-4 (neutral 0).
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];
99 - (void)notifyEvent:(IOHIDValueRef)value {
100 long parsed = IOHIDValueGetIntegerValue(value);
102 // Skip first row in table if 0 is not neutral.
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];