Fix localization changing mapping logical names.
[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
32 - (id)initWithIndex:(int)index {
33 NSString *name = [NSString stringWithFormat:NSLocalizedString(@"hat switch %d", @"hat switch name"), index];
34 NSString *did = [NSString stringWithFormat:@"Hat Switch %d", index];
35 if ((self = [super initWithName:name did:did base:nil])) {
36 self.children = @[[[NJInput alloc] initWithName:NSLocalizedString(@"hat up", @"hat switch up state")
37 did:@"Up"
38 base:self],
39 [[NJInput alloc] initWithName:NSLocalizedString(@"hat down", @"hat switch down state")
40 did:@"Down"
41 base:self],
42 [[NJInput alloc] initWithName:NSLocalizedString(@"hat left", @"hat switch left state")
43 did:@"Left"
44 base:self],
45 [[NJInput alloc] initWithName:NSLocalizedString(@"hat right", @"hat switch right state")
46 did:@"Right"
47 base:self]];
48 }
49 return self;
50 }
51
52 - (id)findSubInputForValue:(IOHIDValueRef)value {
53 long parsed = IOHIDValueGetIntegerValue(value);
54 switch (IOHIDElementGetLogicalMax(IOHIDValueGetElement(value))) {
55 case 7: // 8-way switch, 0-7.
56 switch (parsed) {
57 case 0: return self.children[0];
58 case 4: return self.children[1];
59 case 6: return self.children[2];
60 case 2: return self.children[3];
61 default: return nil;
62 }
63 case 8: // 8-way switch, 1-8 (neutral 0).
64 switch (parsed) {
65 case 1: return self.children[0];
66 case 5: return self.children[1];
67 case 7: return self.children[2];
68 case 3: return self.children[3];
69 default: return nil;
70 }
71 case 3: // 4-way switch, 0-3.
72 switch (parsed) {
73 case 0: return self.children[0];
74 case 2: return self.children[1];
75 case 3: return self.children[2];
76 case 1: return self.children[3];
77 default: return nil;
78 }
79 case 4: // 4-way switch, 1-4 (neutral 0).
80 switch (parsed) {
81 case 1: return self.children[0];
82 case 3: return self.children[1];
83 case 4: return self.children[2];
84 case 2: return self.children[3];
85 default: return nil;
86 }
87 default:
88 return nil;
89 }
90 }
91
92 - (void)notifyEvent:(IOHIDValueRef)value {
93 long parsed = IOHIDValueGetIntegerValue(value);
94 long size = IOHIDElementGetLogicalMax(IOHIDValueGetElement(value));
95 // Skip first row in table if 0 is not neutral.
96 if (size & 1) {
97 parsed++;
98 size++;
99 }
100 BOOL *activechildren = (size == 8) ? active_eightway : active_fourway;
101 for (unsigned i = 0; i < 4; i++) {
102 BOOL active = activechildren[parsed * 4 + i];
103 [self.children[i] setActive:active];
104 [self.children[i] setMagnitude:active];
105 }
106 }
107
108 @end