class DeviceManagerBase(): def __init__(self, name=None, shouldSetup=False): self.connection_status = 'not connected' self.ser = serial.Serial(timeout=1, write_timeout=1) self.sent_command_event = Event() self.emulator_mode = False if not name: self.name = 'Mysterial Serial Device' else: self.name = name if shouldSetup: self.Setup() def ConnectToDevice(self, defPort=None, baud=9600, qrymsg=b'ping', retmsg='pong', trycount=1, ports=sc.serial_ports(), readsequence='\n'): if self.emulator_mode: print('starting in emulator mode') elif self.ser.is_open: print('already connected') else: print('attempting to connect to Device: %s' % self.name) s = sc.ping_controller(defPort, ports, baud, qrymsg, retmsg, trycount, readsequence) self.ser.port = s self.ser.baudrate = baud self.ser.open() self.connection_status = 'connected' return s def WaitForResponse(self, response='ok'): DeviceNotBusy = False while (DeviceNotBusy != True): ret = self.ser.readline().decode().rstrip() print('WaitForResponse: ', ret) if (response in ret): DeviceNotBusy = True print("got the response: " + response) def SendCommand(self, com, waitMsg=None, term="\n"): if not self.emulator_mode: print('Device %s sending command: %s' % (self.name, com)) self.sent_command_event.notify(com) command = str(com) + term self.ser.write(command.encode()) if waitMsg: print('waitMsg: ', waitMsg) self.WaitForResponse() #workaround to trigger busy:processing response from Marlin if waitMsg == 'M84\n': self.ser.write(waitMsg.encode()) self.WaitForResponse() else: print('Emulator %s sending command: %s' % (self.name, com)) self.sent_command_event.notify(com) def SetInitialState(self): raise NotImplementedError() def Setup(self): raise NotImplementedError()
class Xbox_Interface: def __init__(self,delay=1.1): self.current_pos = SystemPosition(0,0,0,0,0,0,0,0) self.msg = None self.isActive = False self.axis_threshold = 0.1 #self.HandleInput() self.delay = delay self.axis_moved_event = Event() self.button_press_event = Event() self.button_release_event = Event() th = threading.Thread(target=self.HandleInput) th.start() def get_pos(self): return self.current_pos def get_msg(self): return self.msg def HandleInput(self): try: self.isActive = True with Xbox360Controller(0, axis_threshold=0.0) as controller: # Button A events controller.button_a.when_pressed = self.on_button_pressed controller.button_a.when_released = self.on_button_released # Button B events controller.button_b.when_pressed = self.on_button_pressed controller.button_b.when_released = self.on_button_released # Button Y events controller.button_y.when_pressed = self.on_button_pressed controller.button_y.when_released = self.on_button_released # Button X events controller.button_x.when_pressed = self.on_button_pressed controller.button_x.when_released = self.on_button_released # Button Trigger L events controller.button_trigger_l.when_pressed = self.on_button_pressed # Button Trigger R events controller.button_trigger_r.when_pressed = self.on_button_pressed # Button Thumb L events controller.button_thumb_l.when_pressed = self.on_button_pressed # Button Thumb R events controller.button_thumb_r.when_pressed = self.on_button_pressed # Start Button events controller.button_start.when_pressed = self.on_button_pressed # Left and right axis move event controller.axis_l.when_moved = self.on_axis_moved controller.axis_r.when_moved = self.on_axis_moved signal.pause() except KeyboardInterrupt: self.isActive = False pass #button Y:pump0, B:pump1, A:pump2 def on_button_pressed(self, button): print('Button {0} was pressed'.format(button.name)) self.button_press_event.notify(button) def on_button_released(self, button): print('Button {0} was released'.format(button.name)) self.button_release_event.notify(button) def on_axis_moved(self, axis): #print('Axis {0} moved to {1} {2}'.format(axis.name, axis.x, axis.y)) if(abs(axis.x)>self.axis_threshold): self.axis_moved_event.notify(axis) elif(abs(axis.y)>self.axis_threshold): self.axis_moved_event.notify(axis)