forked from mirror/joycontrol
77 lines
2.9 KiB
Python
77 lines
2.9 KiB
Python
|
|
def get_bit(value, n):
|
|
return (value >> n & 1) != 0
|
|
|
|
|
|
def flip_bit(value, n):
|
|
return value ^ (1 << n)
|
|
|
|
|
|
class Buttons:
|
|
"""
|
|
Utility class to set buttons in the input report
|
|
https://github.com/dekuNukem/Nintendo_Switch_Reverse_Engineering/blob/master/bluetooth_hid_notes.md
|
|
Byte 0 1 2 3 4 5 6 7
|
|
1 Y X B A SR SL R ZR
|
|
2 Minus Plus R Stick L Stick Home Capture
|
|
3 Down Up Right Left SR SL L ZL
|
|
"""
|
|
def __init__(self):
|
|
# 3 bytes
|
|
self.byte_1 = 0
|
|
self.byte_2 = 0
|
|
self.byte_3 = 0
|
|
|
|
# generating methods for each button
|
|
def button_method_factory(byte, bit):
|
|
def flip():
|
|
setattr(self, byte, flip_bit(getattr(self, byte), bit))
|
|
|
|
def getter():
|
|
return get_bit(getattr(self, byte), bit)
|
|
return flip, getter
|
|
|
|
# byte 1
|
|
self.y, self.y_is_set = button_method_factory('byte_1', 0)
|
|
self.x, self.x_is_set = button_method_factory('byte_1', 1)
|
|
self.b, self.b_is_set = button_method_factory('byte_1', 2)
|
|
self.a, self.a_is_set = button_method_factory('byte_1', 3)
|
|
self.right_sr, self.right_sr_is_set = button_method_factory('byte_1', 4)
|
|
self.right_sl, self.right_sl_is_set = button_method_factory('byte_1', 5)
|
|
self.r, self.r_is_set = button_method_factory('byte_1', 6)
|
|
self.zr, self.zr_is_set = button_method_factory('byte_1', 7)
|
|
|
|
# byte 2
|
|
self.minus, self.minus_is_set = button_method_factory('byte_2', 0)
|
|
self.plus, self.plus_is_set = button_method_factory('byte_2', 1)
|
|
self.r_stick, self.r_stick_is_set = button_method_factory('byte_2', 2)
|
|
self.l_stick, self.l_stick_is_set = button_method_factory('byte_2', 3)
|
|
self.home, self.home_is_set = button_method_factory('byte_2', 4)
|
|
self.capture, self.capture_is_set = button_method_factory('byte_2', 5)
|
|
|
|
# byte 3
|
|
self.down, self.down_is_set = button_method_factory('byte_3', 0)
|
|
self.up, self.up_is_set = button_method_factory('byte_3', 1)
|
|
self.right, self.right_is_set = button_method_factory('byte_3', 2)
|
|
self.left, self.left_is_set = button_method_factory('byte_3', 3)
|
|
self.left_sr, self.left_sr_is_set = button_method_factory('byte_3', 4)
|
|
self.left_sl, self.left_sl_is_set = button_method_factory('byte_3', 5)
|
|
self.l, self.l_is_set = button_method_factory('byte_3', 6)
|
|
self.zl, self.zl_is_set = button_method_factory('byte_3', 7)
|
|
|
|
"""
|
|
Example for generated methods: home button (byte_2, 4)
|
|
|
|
def home(self):
|
|
self.byte_2 = flip_bit(self.byte_2, 4)
|
|
|
|
def home_is_set(self):
|
|
return get_bit(self.byte_2, 4)
|
|
"""
|
|
|
|
def to_list(self):
|
|
return [self.byte_1, self.byte_2, self.byte_3]
|
|
|
|
def clear(self):
|
|
self.byte_1 = self.byte_2 = self.byte_3 = 0
|