diff --git a/buttons.py b/buttons.py index de83b82..a974081 100644 --- a/buttons.py +++ b/buttons.py @@ -10,21 +10,67 @@ def flip_bit(value, n): class Buttons: """ Utility class to set buttons in the input report - TODO: More Buttons + 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): - self.left = 0 - self.middle = 0 - self.right = 0 + # 3 bytes + self.byte_1 = 0 + self.byte_2 = 0 + self.byte_3 = 0 + + # generating methods for each button + def gen_methods(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 = gen_methods('byte_1', 0) + self.x, self.x_is_set = gen_methods('byte_1', 1) + self.b, self.b_is_set = gen_methods('byte_1', 2) + self.a, self.a_is_set = gen_methods('byte_1', 3) + self.right_sr, self.right_sr_is_set = gen_methods('byte_1', 4) + self.right_sl, self.right_sl_is_set = gen_methods('byte_1', 5) + self.r, self.r_is_set = gen_methods('byte_1', 6) + self.zr, self.zr_is_set = gen_methods('byte_1', 7) + + # byte 2 + self.minus, self.minus_is_set = gen_methods('byte_2', 0) + self.plus, self.plus_is_set = gen_methods('byte_2', 1) + self.r_stick, self.r_stick_is_set = gen_methods('byte_2', 2) + self.l_stick, self.l_stick_is_set = gen_methods('byte_2', 3) + self.home, self.home_is_set = gen_methods('byte_2', 4) + self.capture, self.capture_is_set = gen_methods('byte_2', 5) + + # byte 3 + self.down, self.down_is_set = gen_methods('byte_3', 0) + self.up, self.up_is_set = gen_methods('byte_3', 1) + self.right, self.right_is_set = gen_methods('byte_3', 2) + self.left, self.left_is_set = gen_methods('byte_3', 3) + self.left_sr, self.left_sr_is_set = gen_methods('byte_3', 4) + self.left_sl, self.left_sl_is_set = gen_methods('byte_3', 5) + self.l, self.l_is_set = gen_methods('byte_3', 6) + self.zl, self.zl_is_set = gen_methods('byte_3', 7) + + """ + Example for generated methods: home button (byte_2, 4) def home(self): - self.middle = flip_bit(self.middle, 4) + self.byte_2 = flip_bit(self.byte_2, 4) def home_is_set(self): - return get_bit(self.middle, 4) + return get_bit(self.byte_2, 4) + """ def to_list(self): - return [self.left, self.middle, self.right] + return [self.byte_1, self.byte_2, self.byte_3] def clear(self): - self.left = self.middle = self.right = 0 + self.byte_1 = self.byte_2 = self.byte_3 = 0 diff --git a/run_and_pair_switch.py b/run_and_pair_switch.py index ef5f3c7..9f44eab 100644 --- a/run_and_pair_switch.py +++ b/run_and_pair_switch.py @@ -1,6 +1,7 @@ import asyncio import logging import os +import random import socket import logging_default as log @@ -64,22 +65,36 @@ async def send_empty_input_reports(transport): await asyncio.sleep(1) -async def mash_home_button(transport): +async def mash_buttons(transport): + button_list = ['y', 'x', 'b', 'a', 'r', 'zr', + 'minus', 'plus', 'r_stick', 'l_stick', + 'down', 'up', 'right', 'left', 'l', 'zl'] + report = InputReport() report.set_input_report_id(0x21) report.set_misc() buttons = Buttons() - for _ in range(30): - buttons.home() - report.data[4:7] = buttons.to_list() - await transport.write(report) - await asyncio.sleep(0.1) - buttons.home() - report.data[4:7] = buttons.to_list() - await transport.write(report) - await asyncio.sleep(.3) + for i in range(10): + for button in button_list: + logger.info(f'Pressing Button {button}...') + + # push button + getattr(buttons, button)() + + # send report + report.data[4:7] = buttons.to_list() + await transport.write(report) + await asyncio.sleep(0.1) + + # release button + getattr(buttons, button)() + + # send report + report.data[4:7] = buttons.to_list() + await transport.write(report) + await asyncio.sleep(0.3) async def main(): @@ -94,9 +109,9 @@ async def main(): except asyncio.CancelledError: pass - await asyncio.sleep(5) + await asyncio.sleep(20) - await mash_home_button(transport) + await mash_buttons(transport) # stop communication after some time await asyncio.sleep(60)