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:
|
class Buttons:
|
||||||
"""
|
"""
|
||||||
Utility class to set buttons in the input report
|
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):
|
def __init__(self):
|
||||||
self.left = 0
|
# 3 bytes
|
||||||
self.middle = 0
|
self.byte_1 = 0
|
||||||
self.right = 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):
|
def home(self):
|
||||||
self.middle = flip_bit(self.middle, 4)
|
self.byte_2 = flip_bit(self.byte_2, 4)
|
||||||
|
|
||||||
def home_is_set(self):
|
def home_is_set(self):
|
||||||
return get_bit(self.middle, 4)
|
return get_bit(self.byte_2, 4)
|
||||||
|
"""
|
||||||
|
|
||||||
def to_list(self):
|
def to_list(self):
|
||||||
return [self.left, self.middle, self.right]
|
return [self.byte_1, self.byte_2, self.byte_3]
|
||||||
|
|
||||||
def clear(self):
|
def clear(self):
|
||||||
self.left = self.middle = self.right = 0
|
self.byte_1 = self.byte_2 = self.byte_3 = 0
|
||||||
|
|||||||
+22
-7
@@ -1,6 +1,7 @@
|
|||||||
import asyncio
|
import asyncio
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
|
import random
|
||||||
import socket
|
import socket
|
||||||
|
|
||||||
import logging_default as log
|
import logging_default as log
|
||||||
@@ -64,22 +65,36 @@ async def send_empty_input_reports(transport):
|
|||||||
await asyncio.sleep(1)
|
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 = InputReport()
|
||||||
report.set_input_report_id(0x21)
|
report.set_input_report_id(0x21)
|
||||||
report.set_misc()
|
report.set_misc()
|
||||||
|
|
||||||
buttons = Buttons()
|
buttons = Buttons()
|
||||||
|
|
||||||
for _ in range(30):
|
for i in range(10):
|
||||||
buttons.home()
|
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()
|
report.data[4:7] = buttons.to_list()
|
||||||
await transport.write(report)
|
await transport.write(report)
|
||||||
await asyncio.sleep(0.1)
|
await asyncio.sleep(0.1)
|
||||||
buttons.home()
|
|
||||||
|
# release button
|
||||||
|
getattr(buttons, button)()
|
||||||
|
|
||||||
|
# send report
|
||||||
report.data[4:7] = buttons.to_list()
|
report.data[4:7] = buttons.to_list()
|
||||||
await transport.write(report)
|
await transport.write(report)
|
||||||
await asyncio.sleep(.3)
|
await asyncio.sleep(0.3)
|
||||||
|
|
||||||
|
|
||||||
async def main():
|
async def main():
|
||||||
@@ -94,9 +109,9 @@ async def main():
|
|||||||
except asyncio.CancelledError:
|
except asyncio.CancelledError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
await asyncio.sleep(5)
|
await asyncio.sleep(20)
|
||||||
|
|
||||||
await mash_home_button(transport)
|
await mash_buttons(transport)
|
||||||
|
|
||||||
# stop communication after some time
|
# stop communication after some time
|
||||||
await asyncio.sleep(60)
|
await asyncio.sleep(60)
|
||||||
|
|||||||
Reference in New Issue
Block a user