Clean up JoystickController. Modernize more Objective-C syntax. Remove direct public...
[enjoyable.git] / JSActionHat.m
1 //
2 // JSActionHat.m
3 // Enjoy
4 //
5 // Created by Sam McCall on 5/05/09.
6 //
7
8 static BOOL active_eightway[36] = {
9 NO, NO, NO, NO , // center
10 YES, NO, NO, NO , // N
11 YES, NO, NO, YES, // NE
12 NO, NO, NO, YES, // E
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
18 };
19
20 static BOOL active_fourway[20] = {
21 NO, NO, NO, NO , // center
22 YES, NO, NO, NO , // N
23 NO, NO, NO, YES, // E
24 NO, YES, NO, NO , // S
25 NO, NO, YES, NO , // W
26 };
27
28 @implementation JSActionHat
29
30 - (id)init {
31 if ((self = [super init])) {
32 self.children = @[[[SubAction alloc] initWithIndex: 0 name: @"Up" base: self],
33 [[SubAction alloc] initWithIndex: 1 name: @"Down" base: self],
34 [[SubAction alloc] initWithIndex: 2 name: @"Left" base: self],
35 [[SubAction alloc] initWithIndex: 3 name: @"Right" base: self]];
36 // TODO(jfw): Should have an indexed name, like everything else.
37 self.name = @"Hat switch";
38 }
39 return self;
40 }
41
42 - (id)findSubActionForValue:(IOHIDValueRef)value {
43 int parsed = IOHIDValueGetIntegerValue(value);
44 switch (IOHIDElementGetLogicalMax(IOHIDValueGetElement(value))) {
45 case 7: // 8-way switch, 0-7.
46 switch (parsed) {
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];
51 default: return nil;
52 }
53 case 8: // 8-way switch, 1-8 (neutral 0).
54 switch (parsed) {
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];
59 default: return nil;
60 }
61 case 3: // 4-way switch, 0-3.
62 switch (parsed) {
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];
67 default: return nil;
68 }
69 case 4: // 4-way switch, 1-4 (neutral 0).
70 switch (parsed) {
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];
75 default: return nil;
76 }
77 default:
78 return nil;
79 }
80 }
81
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.
86 if (size & 1) {
87 parsed++;
88 size++;
89 }
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]];
93 }
94
95 @end