SameBoy | Accurate GB/GBC emulator |
| download: https://git.y1.nz/archives/sameboy.tar.gz | |
| README | Files | Log | Refs | LICENSE |
JoyKit/JOYButton.m
1 #import "JOYButton.h"
2 #import "JOYElement.h"
3 #import <AppKit/AppKit.h>
4
5 @interface JOYButton ()
6 @property JOYButtonUsage originalUsage;
7 @end
8
9 @implementation JOYButton
10 {
11 JOYElement *_element;
12 bool _state;
13 }
14
15 + (NSString *)usageToString: (JOYButtonUsage) usage
16 {
17 if (usage < JOYButtonUsageNonGenericMax) {
18 return inline_const(NSString *[], {
19 @"None",
20 @"A",
21 @"B",
22 @"C",
23 @"X",
24 @"Y",
25 @"Z",
26 @"Start",
27 @"Select",
28 @"Home",
29 @"Misc",
30 @"Left Stick",
31 @"Right Stick",
32 @"L1",
33 @"L2",
34 @"L3",
35 @"R1",
36 @"R2",
37 @"R3",
38 @"D-Pad Left",
39 @"D-Pad Right",
40 @"D-Pad Up",
41 @"D-Pad Down",
42 })[usage];
43 }
44 if (usage >= JOYButtonUsageGeneric0) {
45 return [NSString stringWithFormat:@"Generic Button %d", usage - JOYButtonUsageGeneric0];
46 }
47
48 return [NSString stringWithFormat:@"Unknown Usage Button %d", usage];
49 }
50
51 - (NSString *)usageString
52 {
53 return [self.class usageToString:_usage];
54 }
55
56 - (uint64_t)uniqueID
57 {
58 return _element.uniqueID | (uint64_t)self.combinedIndex << 32;
59 }
60
61 - (NSString *)description
62 {
63 return [NSString stringWithFormat:@"<%@: %p, %@ (%llx); State: %s>", self.className, self, self.usageString, self.uniqueID, _state? "Presssed" : "Released"];
64 }
65
66 - (instancetype)initWithElement:(JOYElement *)element
67 {
68 self = [super init];
69 if (!self) return self;
70
71 _element = element;
72
73 if (element.usagePage == kHIDPage_Button) {
74 uint16_t usage = element.usage;
75 _usage = JOYButtonUsageGeneric0 + usage;
76 }
77 else if (element.usagePage == kHIDPage_GenericDesktop) {
78 switch (element.usage) {
79 case kHIDUsage_GD_DPadUp: _usage = JOYButtonUsageDPadUp; break;
80 case kHIDUsage_GD_DPadDown: _usage = JOYButtonUsageDPadDown; break;
81 case kHIDUsage_GD_DPadRight: _usage = JOYButtonUsageDPadRight; break;
82 case kHIDUsage_GD_DPadLeft: _usage = JOYButtonUsageDPadLeft; break;
83 case kHIDUsage_GD_Start: _usage = JOYButtonUsageStart; break;
84 case kHIDUsage_GD_Select: _usage = JOYButtonUsageSelect; break;
85 case kHIDUsage_GD_SystemMainMenu: _usage = JOYButtonUsageHome; break;
86 }
87 }
88 else if (element.usagePage == kHIDPage_Consumer) {
89 switch (element.usage) {
90 case kHIDUsage_Csmr_ACHome: _usage = JOYButtonUsageHome; break;
91 case kHIDUsage_Csmr_ACBack: _usage = JOYButtonUsageSelect; break;
92 }
93 }
94
95 _originalUsage = _usage;
96
97 return self;
98 }
99
100 - (bool) isPressed
101 {
102 return _state;
103 }
104
105 - (bool)updateState
106 {
107 bool state = [_element value];
108 if (_state != state) {
109 _state = state;
110 return true;
111 }
112 return false;
113 }
114
115 - (JOYButtonType)type
116 {
117 return JOYButtonTypeNormal;
118 }
119 @end
This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.