mash buttons test

This commit is contained in:
Robert Martin
2020-01-29 21:52:17 +09:00
parent 1fd9e2b655
commit 2bd655cba4
2 changed files with 81 additions and 20 deletions
+54 -8
View File
@@ -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
+22 -7
View File
@@ -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()
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)
buttons.home()
# release button
getattr(buttons, button)()
# send report
report.data[4:7] = buttons.to_list()
await transport.write(report)
await asyncio.sleep(.3)
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)