Skip to content

Commit 2cc18a5

Browse files
authored
Adding toggle method to pedal mock (#52)
* Adding toggle method to pedal mock * Copyright fix * Making pedal mock gracefully fail in non-x-server environments (e.g. CI) * Flow improvments to pedal mock
1 parent c2f0ed4 commit 2cc18a5

File tree

1 file changed

+23
-4
lines changed

1 file changed

+23
-4
lines changed

sr_pedal/src/sr_pedal/sr_triple_pedal_mock.py

+23-4
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
# -*- coding: latin-1 -*-
44

5-
# Copyright 2020 Shadow Robot Company Ltd.
5+
# Copyright 2020-2022 Shadow Robot Company Ltd.
66
#
77
# This program is free software: you can redistribute it and/or modify it
88
# under the terms of the GNU General Public License as published by the Free
@@ -19,11 +19,16 @@
1919
from __future__ import absolute_import
2020
import rospy
2121
import sys
22-
import select
23-
from pynput import keyboard
2422
from sr_pedal.msg import Status
2523
from threading import Lock, Thread
2624

25+
# If we're in a non-X-server (e.g. CI) environment, this import will fail
26+
try:
27+
from pynput import keyboard
28+
except ImportError as err:
29+
print("SrPedalMock could not import pynput module; likely because there is no available X server. "
30+
"Pedal mock keyboard control disabled.")
31+
2732

2833
class SrPedalMock():
2934
def __init__(self, connected=True, left_pressed=False, middle_pressed=False, right_pressed=False, rate=20,
@@ -41,6 +46,8 @@ def __init__(self, connected=True, left_pressed=False, middle_pressed=False, rig
4146
self._ctrl_pressed = False
4247
self._alt_pressed = False
4348
self._kb_listener = None
49+
# If pynput failed to import, disable keyboard control
50+
keyboard_control = keyboard_control and "pynput" in sys.modules
4451
if keyboard_control:
4552
self._kb_listener = keyboard.Listener(on_press=self._on_keyboard_press,
4653
on_release=self._on_keyboard_release)
@@ -104,10 +111,22 @@ def set_status(self, connected=None, left_pressed=None, middle_pressed=None, rig
104111
rospy.loginfo("Mock right pedal now released.")
105112
self._lock.release()
106113

114+
def toggle_status(self, status):
115+
if status == "connected":
116+
self._status.connected = not self._status.connected
117+
elif status == "left":
118+
self._status.left_pressed = not self._status.left_pressed
119+
elif status == "middle":
120+
self._status.middle_pressed = not self._status.middle_pressed
121+
elif status == "right":
122+
self._status.right_pressed = not self._status.right_pressed
123+
else:
124+
rospy.logwarn(f'Cannot toggle status of unknown pedal state "{status}".')
125+
107126
def _on_keyboard_press(self, key):
108127
if key == keyboard.Key.ctrl:
109128
self._ctrl_pressed = True
110-
if key == keyboard.Key.alt:
129+
elif key == keyboard.Key.alt:
111130
self._alt_pressed = True
112131

113132
if self._ctrl_pressed and self._alt_pressed:

0 commit comments

Comments
 (0)