git.y1.nz

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.