git.y1.nz

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.