Show an error message if opening input devices fail. Move real vs. configuration...
[enjoyable.git] / JSActionHat.m
1 //
2 // JSActionHat.m
3 // Enjoy
4 //
5 // Created by Sam McCall on 5/05/09.
6 //
7
8 #import "JSActionHat.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 JSActionHat
31
32 - (id)init {
33 if ((self = [super init])) {
34 self.children = @[[[JSAction alloc] initWithName:@"Up" base: self],
35 [[JSAction alloc] initWithName:@"Down" base: self],
36 [[JSAction alloc] initWithName:@"Left" base: self],
37 [[JSAction alloc] initWithName:@"Right" base: self]];
38 // TODO(jfw): Should have an indexed name, like everything else.
39 self.name = @"Hat switch";
40 }
41 return self;
42 }
43
44 - (id)findSubActionForValue:(IOHIDValueRef)value {
45 int parsed = IOHIDValueGetIntegerValue(value);
46 switch (IOHIDElementGetLogicalMax(IOHIDValueGetElement(value))) {
47 case 7: // 8-way switch, 0-7.
48 switch (parsed) {
49 case 0: return self.children[0];
50 case 4: return self.children[1];
51 case 6: return self.children[2];
52 case 2: return self.children[3];
53 default: return nil;
54 }
55 case 8: // 8-way switch, 1-8 (neutral 0).
56 switch (parsed) {
57 case 1: return self.children[0];
58 case 5: return self.children[1];
59 case 7: return self.children[2];
60 case 3: return self.children[3];
61 default: return nil;
62 }
63 case 3: // 4-way switch, 0-3.
64 switch (parsed) {
65 case 0: return self.children[0];
66 case 2: return self.children[1];
67 case 3: return self.children[2];
68 case 1: return self.children[3];
69 default: return nil;
70 }
71 case 4: // 4-way switch, 1-4 (neutral 0).
72 switch (parsed) {
73 case 1: return self.children[0];
74 case 3: return self.children[1];
75 case 4: return self.children[2];
76 case 2: return self.children[3];
77 default: return nil;
78 }
79 default:
80 return nil;
81 }
82 }
83
84 - (void)notifyEvent:(IOHIDValueRef)value {
85 int parsed = IOHIDValueGetIntegerValue(value);
86 int size = IOHIDElementGetLogicalMax(IOHIDValueGetElement(value));
87 // Skip first row in table if 0 is not neutral.
88 if (size & 1) {
89 parsed++;
90 size++;
91 }
92 BOOL *activechildren = (size == 8) ? active_eightway : active_fourway;
93 for (int i = 0; i < 4; i++)
94 [self.children[i] setActive:activechildren[parsed * 4 + i]];
95 }
96
97 @end