SameBoy | Accurate GB/GBC emulator |
| download: https://git.y1.nz/archives/sameboy.tar.gz | |
| README | Files | Log | Refs | LICENSE |
JoyKit/JOYAxis.m
1 #import "JOYAxis.h"
2 #import "JOYElement.h"
3
4 @implementation JOYAxis
5 {
6 JOYElement *_element;
7 double _state;
8 double _min;
9 }
10
11 + (NSString *)usageToString: (JOYAxisUsage) usage
12 {
13 if (usage < JOYAxisUsageNonGenericMax) {
14 return inline_const(NSString *[], {
15 @"None",
16 @"Analog L1",
17 @"Analog L2",
18 @"Analog L3",
19 @"Analog R1",
20 @"Analog R2",
21 @"Analog R3",
22 @"Slider",
23 @"Dial",
24 @"Wheel",
25 @"Rudder",
26 @"Throttle",
27 @"Accelerator",
28 @"Brake",
29 })[usage];
30 }
31 if (usage >= JOYAxisUsageGeneric0) {
32 return [NSString stringWithFormat:@"Generic Analog Control %d", usage - JOYAxisUsageGeneric0];
33 }
34
35 return [NSString stringWithFormat:@"Unknown Usage Axis %d", usage];
36 }
37
38 - (NSString *)usageString
39 {
40 return [self.class usageToString:_usage];
41 }
42
43 - (uint64_t)uniqueID
44 {
45 return _element.uniqueID | (uint64_t)self.combinedIndex << 32;
46 }
47
48 - (NSString *)description
49 {
50 return [NSString stringWithFormat:@"<%@: %p, %@ (%llx); State: %f%%>", self.className, self, self.usageString, self.uniqueID, _state * 100];
51 }
52
53 - (instancetype)initWithElement:(JOYElement *)element
54 {
55 self = [super init];
56 if (!self) return self;
57
58 _element = element;
59
60
61 if (element.usagePage == kHIDPage_GenericDesktop) {
62 switch (element.usage) {
63 case kHIDUsage_GD_Slider: _usage = JOYAxisUsageSlider; break;
64 case kHIDUsage_GD_Dial: _usage = JOYAxisUsageDial; break;
65 case kHIDUsage_GD_Wheel: _usage = JOYAxisUsageWheel; break;
66 default:
67 _usage = JOYAxisUsageGeneric0 + element.usage - kHIDUsage_GD_X + 1;
68 break;
69 }
70 }
71 else if (element.usagePage == kHIDPage_Simulation) {
72 switch (element.usage) {
73 case kHIDUsage_Sim_Accelerator: _usage = JOYAxisUsageAccelerator; break;
74 case kHIDUsage_Sim_Brake: _usage = JOYAxisUsageBrake; break;
75 case kHIDUsage_Sim_Rudder: _usage = JOYAxisUsageRudder; break;
76 case kHIDUsage_Sim_Throttle: _usage = JOYAxisUsageThrottle; break;
77 }
78 }
79 _min = 1.0;
80
81 return self;
82 }
83
84 - (double) value
85 {
86 return _state;
87 }
88
89 - (bool)updateState
90 {
91 double min = _element.min;
92 double max = _element.max;
93 if (min == max) return false;
94 double old = _state;
95 double unnormalized = ([_element value] - min) / (max - min);
96 if (unnormalized < _min) {
97 _min = unnormalized;
98 }
99 if (_min != 1) {
100 _state = (unnormalized - _min) / (1 - _min);
101 }
102 return old != _state;
103 }
104
105 - (JOYButtonUsage)equivalentButtonUsage
106 {
107 if (self.usage >= JOYAxisUsageGeneric0) {
108 return self.usage - JOYAxisUsageGeneric0 + JOYButtonUsageGeneric0;
109 }
110 switch (self.usage) {
111 case JOYAxisUsageL1: return JOYButtonUsageL1;
112 case JOYAxisUsageL2: return JOYButtonUsageL2;
113 case JOYAxisUsageL3: return JOYButtonUsageL3;
114 case JOYAxisUsageR1: return JOYButtonUsageR1;
115 case JOYAxisUsageR2: return JOYButtonUsageR2;
116 case JOYAxisUsageR3: return JOYButtonUsageR3;
117 case JOYAxisUsageSlider: return JOYButtonUsageSlider;
118 case JOYAxisUsageDial: return JOYButtonUsageDial;
119 case JOYAxisUsageWheel: return JOYButtonUsageWheel;
120 case JOYAxisUsageRudder: return JOYButtonUsageRudder;
121 case JOYAxisUsageThrottle: return JOYButtonUsageThrottle;
122 case JOYAxisUsageAccelerator: return JOYButtonUsageAccelerator;
123 case JOYAxisUsageBrake: return JOYButtonUsageBrake;
124 default: return JOYButtonUsageNone;
125 }
126 }
127
128
129 @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.