Go2Py_SIM/Go2Py/robot/remote.py

89 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