class SerialControllerReader(ControllerReader): def __init__(self, portname, packet_parser): self.controllerstate = Event() self.controllerdisconnected = Event() self.onerror = Event() self.packet_parser = packet_parser self.serial = SerialMonitor(serial_port=portname) self.serial.packet_recv += self.serialmonitor_packetrecv self.serial.disconnected += self.serialmonitor_disconnected def serialmonitor_disconnected(self, data, *args, **kwargs): self.finish() self.controllerdisconnected(self) def serialmonitor_packetrecv(self, packet, *args, **kwargs): state = self.packet_parser(packet) if state is not None: self.controllerstate(self, state) def finish(self): self.serial.stop() def update(self, data=None): try: self.serial.serial_read() except SerialException as e: self.onerror(self, e) except TypeError as e: util.logger.error(str(e))
def __init__(self, portname, packet_parser): self.controllerstate = Event() self.controllerdisconnected = Event() self.onerror = Event() self.packet_parser = packet_parser self.serial = SerialMonitor(serial_port=portname) self.serial.packet_recv += self.serialmonitor_packetrecv self.serial.disconnected += self.serialmonitor_disconnected
class App(Frame): def __init__(self, parent): Frame.__init__(self, parent, background="white") self.monitor = SerialMonitor() self.parent = parent self.frame = Frame(parent, relief=RAISED, borderwidth=1) self.scrollbar = Scrollbar(parent) self.receive_box = Text(parent, width=10, height=10, takefocus=0) self.transmit_box = Text(parent, width=10, height=10, takefocus=0) self.send_button = Button(parent, text="Send", command=self.send_message) self.initUI() self.process_serial_input() #self.send_message() def initUI(self): self.parent.title("Serial Monitor") self.frame.pack(fill=BOTH, expand=True) self.pack(fill=BOTH, expand=1) self.scrollbar.pack(side=RIGHT, fill=Y) self.receive_box.pack(side=LEFT) self.receive_box.config(yscrollcommand=self.scrollbar.set, state=DISABLED) self.transmit_box.pack() self.scrollbar.config(command=self.receive_box.yview) self.send_button.pack(side=RIGHT, padx=5, pady=5) def process_serial_input(self): while self.monitor.available(): try: self.receive_box.config(state=NORMAL) self.receive_box.insert('end', self.monitor.queue.get()) self.receive_box.config(state=DISABLED) except Queue.Empty: pass self.after(100, self.process_serial_input) def send_message(self): message = self.transmit_box.get(1.0, 'end') self.monitor.write(message)
def __init__(self, parent): Frame.__init__(self, parent, background="white") self.monitor = SerialMonitor() self.parent = parent self.frame = Frame(parent, relief=RAISED, borderwidth=1) self.scrollbar = Scrollbar(parent) self.receive_box = Text(parent, width=10, height=10, takefocus=0) self.transmit_box = Text(parent, width=10, height=10, takefocus=0) self.send_button = Button(parent, text="Send", command=self.send_message) self.initUI() self.process_serial_input()
def onSerialChange(self, serialDeviceName, force = False): #if self.selectedSerial != serialDeviceName or force: print "Serial port set to " + serialDeviceName print "Starting to monitor device" self.selectedSerial = serialDeviceName if self.selectedSerial == FAKE_SERIAL_NAME: print "Running off the fake serial" self.serialMonitor = FakeSerialMonitor(str(self.selectedSerial)) else: self.serialMonitor = SerialMonitor(str(self.selectedSerial), self.SERIAL_BAUD) self.connect(self.serialMonitor, QtCore.SIGNAL('DATA_RECEIVED'), self.serialDataCallback) self.connect(self.serialMonitor, QtCore.SIGNAL('ERROR_RAISED'), self.serialErrorCallback) self.currentData = [] self.serialMonitor.start()
class Sparkie(QtGui.QWidget): WINDOW_WIDTH = 1000 WINDOW_HEIGHT = 600 MAX_RPM = 15000 DATA_TO_HOLD = 51 SERIAL_BAUD = 115200 selectedSerial = '' availableSerialPorts = [] currentData = [] lastMessage = '' def __init__(self): super(Sparkie, self).__init__() self.lastMessage = "" self.currentData = "" self.selectedSerial = "" self.serialMonitor = "" # Init UI serialLabel = QtGui.QLabel('Serial Port:', self) #################################### self.serialCombo = QtGui.QComboBox() #################################### self.plot = Qwt5.QwtPlot() self.plot.setCanvasBackground(QtCore.Qt.black) self.plot.setAxisTitle(Qwt5.QwtPlot.yLeft, 'RPM') self.plot.setAxisScale(Qwt5.QwtPlot.yLeft, 0, self.MAX_RPM, 1000) self.plot.setAxisTitle(Qwt5.QwtPlot.xBottom, 'Data Points') self.plot.setAxisScale(Qwt5.QwtPlot.xBottom, 0, self.DATA_TO_HOLD - 1, 5) self.plot.replot() self.curve = Qwt5.QwtPlotCurve() self.curve.setRenderHint(Qwt5.QwtPlotItem.RenderAntialiased) pen = QtGui.QPen(QtGui.QColor(0, 255, 0)) pen.setWidth(3) self.curve.setPen(pen) self.curve.attach(self.plot) #################################### grid = QtGui.QGridLayout() grid.setSpacing(10) grid.addWidget(serialLabel, 1, 0) grid.addWidget(self.serialCombo, 1, 1) grid.addWidget(self.plot, 2, 0, 1, 2) self.setLayout(grid) screen = QtGui.QDesktopWidget().screenGeometry() self.setGeometry((screen.width() - self.WINDOW_WIDTH) / 2, (screen.height() - self.WINDOW_HEIGHT) / 2, self.WINDOW_WIDTH, self.WINDOW_HEIGHT) self.setWindowTitle('Arduino CDI GUI') self.show() self.enumerateSerialPorts() def serialErrorCallback(self, error): newMessage = "Error!: " + error.message if newMessage != self.lastMessage: print newMessage self.lastMessage = newMessage self.serialMonitor.terminate() def plotCurrentData(self): xValues = [] currColor = 255 for position in range(len(self.currentData)): xValues.append(position) self.curve.setData(xValues, self.currentData) self.plot.replot() self.plot.show() def serialDataCallback(self, data): data = data.split(':') if data[0] == 'rpm': value = data[1].strip() value = int(value) #print value self.currentData.append(value) if len(self.currentData) > self.DATA_TO_HOLD: self.currentData.pop(0) self.plotCurrentData() def onSerialChange(self, serialDeviceName, force = False): #if self.selectedSerial != serialDeviceName or force: print "Serial port set to " + serialDeviceName print "Starting to monitor device" self.selectedSerial = serialDeviceName if self.selectedSerial == FAKE_SERIAL_NAME: print "Running off the fake serial" self.serialMonitor = FakeSerialMonitor(str(self.selectedSerial)) else: self.serialMonitor = SerialMonitor(str(self.selectedSerial), self.SERIAL_BAUD) self.connect(self.serialMonitor, QtCore.SIGNAL('DATA_RECEIVED'), self.serialDataCallback) self.connect(self.serialMonitor, QtCore.SIGNAL('ERROR_RAISED'), self.serialErrorCallback) self.currentData = [] self.serialMonitor.start() def enumerateSerialPorts(self): availablePorts = [] if platform.system() == "Windows": for i in range(256): try: s = serial.Serial(i) availablePorts.append(i) s.close() except serial.SerialException: pass elif platform.system() == "Darwin": # Mac availablePorts = glob.glob('/dev/tty*') + glob.glob('/dev/cu*') else: # Assume Linux or something else availablePorts = glob.glob('/dev/ttyACM*') + glob.glob('/dev/ttyUSB*') if len(availablePorts) == 0: availablePorts = [FAKE_SERIAL_NAME] self.serialCombo.addItems(availablePorts) self.serialCombo.activated[str].connect(self.onSerialChange) self.onSerialChange(availablePorts[0])