1+ import math
2+ import asyncio
3+ import time
4+ import logging
5+
6+ from joycontrol .controller_state import ControllerState
7+ from joycontrol .command_line_interface import ControllerCLI
8+
9+ logger = logging .getLogger (__name__ )
10+
11+ MAX_STICK_POWER = 0xFFF / 2
12+
13+ class JoycontrolCommands :
14+ def __init__ (self , controller_state ):
15+ self .cli = ControllerCLI (controller_state )
16+ self .controller_state = controller_state
17+ self .max_stick_power = MAX_STICK_POWER
18+
19+ def __calc_stick_position (self , angle , power ):
20+ angle = (angle + 180 ) % 360 * - 1
21+
22+ rad = math .radians (angle )
23+ x = power * math .cos (rad )
24+ y = power * math .sin (rad )
25+
26+ # Adjust the position of the circle.
27+ stick_radius = MAX_STICK_POWER
28+ h_val = x + stick_radius
29+ v_val = y + stick_radius
30+ return int (h_val ), int (v_val )
31+
32+ async def stick (self , stick , direction = None , angle = None , power = MAX_STICK_POWER ):
33+ if direction == 'center' :
34+ angle = 0
35+ power = 0
36+ elif direction == 'left' :
37+ angle = 0
38+ elif direction == 'up' :
39+ angle = 90
40+ elif direction == 'right' :
41+ angle = 180
42+ elif direction == 'down' :
43+ angle = 270
44+
45+ if angle is None :
46+ raise ValueError ('Missing angle' )
47+
48+ logger .debug (f'Stick: { stick } , { angle } , { power } ' )
49+ h_val , v_val = self .__calc_stick_position (angle , power )
50+ await self .cli .cmd_stick (stick , 'horizontal' , h_val )
51+ await self .cli .cmd_stick (stick , 'vertical' , v_val )
52+
53+ async def left_stick (self , direction = None , angle = None , power = MAX_STICK_POWER ):
54+ await self .stick ('left' , direction , angle , power )
55+
56+ async def right_stick (self , direction = None , angle = None , power = MAX_STICK_POWER ):
57+ await self .stick ('right' , direction , angle , power )
58+
59+ async def button_press (self , * buttons ):
60+ if not buttons :
61+ raise ValueError ('No Buttons were given.' )
62+
63+ logger .debug ('Press {}' .format (', ' .join (buttons )))
64+ button_state = self .controller_state .button_state
65+ for button in buttons :
66+ button_state .set_button (button )
67+
68+ # send report
69+ await self .controller_state .send ()
70+
71+ async def button_release (self , * buttons ):
72+ if not buttons :
73+ raise ValueError ('No Buttons were given.' )
74+
75+ logger .debug ('Release {}' .format (', ' .join (buttons )))
76+ button_state = self .controller_state .button_state
77+ for button in buttons :
78+ button_state .set_button (button , pushed = False )
79+
80+ # send report
81+ await self .controller_state .send ()
82+
83+ async def button_push (self , * buttons , press_time_sec = 0.1 ):
84+ await self .button_press (* buttons )
85+ await self .wait (press_time_sec )
86+ await self .button_release (* buttons )
87+
88+ async def wait (self , sec ):
89+ logger .debug (f'Wait: { sec } ' )
90+ await asyncio .sleep (sec )
0 commit comments