5 // Created by Sam McCall on 5/05/09.
8 static BOOL active_eightway[36] = {
9 NO, NO, NO, NO , // center
10 YES, NO, NO, NO , // N
11 YES, NO, NO, YES, // NE
13 NO, YES, NO, YES, // SE
14 NO, YES, NO, NO , // S
15 NO, YES, YES, NO , // SW
16 NO, NO, YES, NO , // W
17 YES, NO, YES, NO , // NW
20 static BOOL active_fourway[20] = {
21 NO, NO, NO, NO , // center
22 YES, NO, NO, NO , // N
24 NO, YES, NO, NO , // S
25 NO, NO, YES, NO , // W
28 @implementation JSActionHat
31 if ((self = [super init])) {
32 self.children = @[[[JSAction alloc] initWithName:@"Up" base: self],
33 [[JSAction alloc] initWithName:@"Down" base: self],
34 [[JSAction alloc] initWithName:@"Left" base: self],
35 [[JSAction alloc] initWithName:@"Right" base: self]];
36 // TODO(jfw): Should have an indexed name, like everything else.
37 self.name = @"Hat switch";
42 - (id)findSubActionForValue:(IOHIDValueRef)value {
43 int parsed = IOHIDValueGetIntegerValue(value);
44 switch (IOHIDElementGetLogicalMax(IOHIDValueGetElement(value))) {
45 case 7: // 8-way switch, 0-7.
47 case 0: return self.children[0];
48 case 4: return self.children[1];
49 case 6: return self.children[2];
50 case 2: return self.children[3];
53 case 8: // 8-way switch, 1-8 (neutral 0).
55 case 1: return self.children[0];
56 case 5: return self.children[1];
57 case 7: return self.children[2];
58 case 3: return self.children[3];
61 case 3: // 4-way switch, 0-3.
63 case 0: return self.children[0];
64 case 2: return self.children[1];
65 case 3: return self.children[2];
66 case 1: return self.children[3];
69 case 4: // 4-way switch, 1-4 (neutral 0).
71 case 1: return self.children[0];
72 case 3: return self.children[1];
73 case 4: return self.children[2];
74 case 2: return self.children[3];
82 - (void)notifyEvent:(IOHIDValueRef)value {
83 int parsed = IOHIDValueGetIntegerValue(value);
84 int size = IOHIDElementGetLogicalMax(IOHIDValueGetElement(value));
85 // Skip first row in table if 0 is not neutral.
90 BOOL *activechildren = (size == 8) ? active_eightway : active_fourway;
91 for (int i = 0; i < 4; i++)
92 [self.children[i] setActive:activechildren[parsed * 4 + i]];