forked from mirror/joycontrol
mash buttons test
This commit is contained in:
+54
-8
@@ -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
|
||||
|
||||
+27
-12
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user