94 lines
2.4 KiB
Python
94 lines
2.4 KiB
Python
import threading
|
|
from pynput import keyboard
|
|
|
|
|
|
class BaseRemote:
|
|
def __init__(self):
|
|
pass
|
|
|
|
def startSeq(self):
|
|
return False
|
|
|
|
def standUpDownSeq(self):
|
|
return False
|
|
|
|
def flushStates(self):
|
|
pass
|
|
|
|
|
|
remote = BaseRemote()
|
|
|
|
|
|
class KeyboardRemote(BaseRemote):
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.start_seq_flag = False
|
|
self.stand_up_down_seq_flag = False
|
|
self.listener_thread = threading.Thread(target=self._listen_to_keyboard)
|
|
self.listener_thread.daemon = True
|
|
self.listener_thread.start()
|
|
|
|
def _on_press(self, key):
|
|
try:
|
|
if key.char == 's': # Start sequence
|
|
self.start_seq_flag = True
|
|
elif key.char == 'u': # Stand up/down sequence
|
|
self.stand_up_down_seq_flag = True
|
|
except AttributeError:
|
|
pass # Special keys (like space) will be handled here
|
|
|
|
def _on_release(self, key):
|
|
try:
|
|
if key.char == 's': # Start sequence
|
|
self.start_seq_flag = False
|
|
elif key.char == 'u': # Stand up/down sequence
|
|
self.stand_up_down_seq_flag = False
|
|
except AttributeError:
|
|
pass # Special keys (like space) will be handled here
|
|
|
|
def _listen_to_keyboard(self):
|
|
with keyboard.Listener(on_press=self._on_press, on_release=self._on_release) as listener:
|
|
listener.join()
|
|
|
|
def startSeq(self):
|
|
if self.start_seq_flag:
|
|
self.start_seq_flag = False
|
|
return True
|
|
return False
|
|
|
|
def standUpDownSeq(self):
|
|
if self.stand_up_down_seq_flag:
|
|
self.stand_up_down_seq_flag = False
|
|
return True
|
|
return False
|
|
|
|
def flushStates(self):
|
|
self.stand_up_down_seq_flag = False
|
|
self.start_seq_flag = False
|
|
|
|
|
|
class UnitreeRemote(BaseRemote):
|
|
def __init__(self, robot):
|
|
self.robot = robot
|
|
|
|
def startSeq(self):
|
|
remote = self.robot.getRemoteState()
|
|
if remote.btn.start:
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
def standUpDownSeq(self):
|
|
remote = self.robot.getRemoteState()
|
|
if remote.btn.L2 and remote.btn.A:
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
def getEstop(self):
|
|
remote = self.robot.getRemoteState()
|
|
if remote.btn.L2 and remote.btn.R2:
|
|
return True
|
|
else:
|
|
return False
|