Skip to content

Commit 2a97532

Browse files
authored
Merge pull request #10 from brentru/fix-cursor-centering-issue
Fix cursor centering issue
2 parents ceb286f + eb8c286 commit 2a97532

File tree

1 file changed

+47
-37
lines changed

1 file changed

+47
-37
lines changed

adafruit_cursorcontrol/cursorcontrol_cursormanager.py

Lines changed: 47 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -41,18 +41,18 @@
4141
# PyBadge & PyGamer
4242
PYBADGE_BUTTON_A = const(2)
4343

44-
JOY_X_CTR = 32767.5
45-
JOY_Y_CTR = 32767.5
46-
4744
class CursorManager(object):
4845
"""Simple interaction user interface interaction for Adafruit_CursorControl.
4946
5047
:param adafruit_cursorcontrol cursor: The cursor object we are using.
5148
"""
49+
5250
def __init__(self, cursor):
5351
self._cursor = cursor
5452
self._is_clicked = False
5553
self._init_hardware()
54+
self._center_x = self._joystick_x.value
55+
self._center_y = self._joystick_y.value
5656

5757
def __enter__(self):
5858
return self
@@ -70,27 +70,34 @@ def deinit(self):
7070
def _is_deinited(self):
7171
"""Checks if CursorManager object has been deinitd."""
7272
if self._cursor is None:
73-
raise ValueError("CursorManager object has been deinitialized and can no longer "
74-
"be used. Create a new CursorManager object.")
73+
raise ValueError(
74+
"CursorManager object has been deinitialized and can no longer "
75+
"be used. Create a new CursorManager object."
76+
)
7577

7678
def _init_hardware(self):
7779
"""Initializes PyBadge or PyGamer hardware."""
78-
if hasattr(board, 'BUTTON_CLOCK') and not hasattr(board, 'JOYSTICK_X'):
79-
self._pad_btns = {'btn_left' : PYBADGE_BUTTON_LEFT,
80-
'btn_right' : PYBADGE_BUTTON_RIGHT,
81-
'btn_up' : PYBADGE_BUTTON_UP,
82-
'btn_down' : PYBADGE_BUTTON_DOWN,
83-
'btn_a' : PYBADGE_BUTTON_A}
84-
elif hasattr(board, 'JOYSTICK_X'):
80+
if hasattr(board, "BUTTON_CLOCK") and not hasattr(board, "JOYSTICK_X"):
81+
self._pad_btns = {
82+
"btn_left": PYBADGE_BUTTON_LEFT,
83+
"btn_right": PYBADGE_BUTTON_RIGHT,
84+
"btn_up": PYBADGE_BUTTON_UP,
85+
"btn_down": PYBADGE_BUTTON_DOWN,
86+
"btn_a": PYBADGE_BUTTON_A,
87+
}
88+
elif hasattr(board, "JOYSTICK_X"):
8589
self._joystick_x = analogio.AnalogIn(board.JOYSTICK_X)
8690
self._joystick_y = analogio.AnalogIn(board.JOYSTICK_Y)
87-
self._pad_btns = {'btn_a' : PYBADGE_BUTTON_A}
91+
self._pad_btns = {"btn_a": PYBADGE_BUTTON_A}
8892
else:
89-
raise AttributeError('Board must have a D-Pad or Joystick for use with CursorManager!')
90-
self._pad = GamePadShift(digitalio.DigitalInOut(board.BUTTON_CLOCK),
91-
digitalio.DigitalInOut(board.BUTTON_OUT),
92-
digitalio.DigitalInOut(board.BUTTON_LATCH))
93-
93+
raise AttributeError(
94+
"Board must have a D-Pad or Joystick for use with CursorManager!"
95+
)
96+
self._pad = GamePadShift(
97+
digitalio.DigitalInOut(board.BUTTON_CLOCK),
98+
digitalio.DigitalInOut(board.BUTTON_OUT),
99+
digitalio.DigitalInOut(board.BUTTON_LATCH),
100+
)
94101

95102
@property
96103
def is_clicked(self):
@@ -105,7 +112,7 @@ def update(self):
105112
self._check_cursor_movement(pressed)
106113
if self._is_clicked:
107114
self._is_clicked = False
108-
elif pressed & self._pad_btns['btn_a']:
115+
elif pressed & self._pad_btns["btn_a"]:
109116
self._is_clicked = True
110117

111118
def _read_joystick_x(self, samples=3):
@@ -114,11 +121,10 @@ def _read_joystick_x(self, samples=3):
114121
"""
115122
reading = 0
116123
# pylint: disable=unused-variable
117-
if hasattr(board, 'JOYSTICK_X'):
124+
if hasattr(board, "JOYSTICK_X"):
118125
for sample in range(0, samples):
119126
reading += self._joystick_x.value
120127
reading /= samples
121-
reading -= JOY_X_CTR
122128
return reading
123129

124130
def _read_joystick_y(self, samples=3):
@@ -127,40 +133,41 @@ def _read_joystick_y(self, samples=3):
127133
"""
128134
reading = 0
129135
# pylint: disable=unused-variable
130-
if hasattr(board, 'JOYSTICK_Y'):
136+
if hasattr(board, "JOYSTICK_Y"):
131137
for sample in range(0, samples):
132138
reading += self._joystick_y.value
133139
reading /= samples
134-
reading -= JOY_Y_CTR
135140
return reading
136141

137142
def _check_cursor_movement(self, pressed=None):
138143
"""Checks the PyBadge D-Pad or the PyGamer's Joystick for movement.
139144
:param int pressed: 8-bit number with bits that correspond to buttons
140145
which have been pressed down since the last call to get_pressed().
141146
"""
142-
if hasattr(board, 'BUTTON_CLOCK') and not hasattr(board, 'JOYSTICK_X'):
143-
if pressed & self._pad_btns['btn_right']:
147+
if hasattr(board, "BUTTON_CLOCK") and not hasattr(board, "JOYSTICK_X"):
148+
if pressed & self._pad_btns["btn_right"]:
144149
self._cursor.x += self._cursor.speed
145-
elif pressed & self._pad_btns['btn_left']:
150+
elif pressed & self._pad_btns["btn_left"]:
146151
self._cursor.x -= self._cursor.speed
147-
if pressed & self._pad_btns['btn_up']:
152+
if pressed & self._pad_btns["btn_up"]:
148153
self._cursor.y -= self._cursor.speed
149-
elif pressed & self._pad_btns['btn_down']:
154+
elif pressed & self._pad_btns["btn_down"]:
150155
self._cursor.y += self._cursor.speed
151-
elif hasattr(board, 'JOYSTICK_X'):
156+
elif hasattr(board, "JOYSTICK_X"):
152157
joy_x = self._read_joystick_x()
153158
joy_y = self._read_joystick_y()
154-
if joy_x > 700:
159+
if joy_x > self._center_x + 1000:
155160
self._cursor.x += self._cursor.speed
156-
elif joy_x < -700:
161+
elif joy_x < self._center_x - 1000:
157162
self._cursor.x -= self._cursor.speed
158-
if joy_y > 700:
163+
if joy_y > self._center_y + 1000:
159164
self._cursor.y += self._cursor.speed
160-
elif joy_y < -700:
165+
elif joy_y < self._center_y - 1000:
161166
self._cursor.y -= self._cursor.speed
162167
else:
163-
raise AttributeError('Board must have a D-Pad or Joystick for use with CursorManager!')
168+
raise AttributeError(
169+
"Board must have a D-Pad or Joystick for use with CursorManager!"
170+
)
164171

165172

166173
class DebouncedCursorManager(CursorManager):
@@ -171,18 +178,22 @@ class DebouncedCursorManager(CursorManager):
171178
172179
:param adafruit_cursorcontrol cursor: The cursor object we are using.
173180
"""
181+
174182
def __init__(self, cursor, debounce_interval=0.01):
175183
CursorManager.__init__(self, cursor)
176184
self._pressed = 0
177-
self._debouncer = Debouncer(lambda: bool(self._pressed & self._pad_btns['btn_a']),
178-
interval=debounce_interval)
185+
self._debouncer = Debouncer(
186+
lambda: bool(self._pressed & self._pad_btns["btn_a"]),
187+
interval=debounce_interval,
188+
)
179189

180190
@property
181191
def is_clicked(self):
182192
"""Returns True if the cursor button was pressed
183193
during previous call to update()
184194
"""
185195
return self._debouncer.rose
196+
186197
pressed = is_clicked
187198

188199
@property
@@ -198,7 +209,6 @@ def held(self):
198209
"""
199210
return self._debouncer.value
200211

201-
202212
def update(self):
203213
"""Updates the cursor object."""
204214
self._pressed = self._pad.get_pressed()

0 commit comments

Comments
 (0)