def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) self.ui = Ui_Dialog() self.ui.setupUi(self) self.myConfig = Config() # bufor na tekst do wysłania self.sendTextBuffor = u'' # bufor na wartości odczytane self.bufferRecived = u'' # Opcje wyboru sterowania magistrali self.protocolOptionDict = {'Brak': ' ', 'CTRL-S/CTRL-Q': 'xonxoff', 'DSR/DTR': 'dsrdtr', 'RTS/CTS': 'rtscts'} # Terminatory standardowe + terminator w?asny # ASCII 10 -LF 13 -CR self.treminatorTypes = OrderedDict([('CR', chr(13)), ('LF', chr(10)), \ ('CR, LF', chr(13) + chr(10)), \ ('brak', ''), \ (u'własny', '')]) # Tworzymy lista dostępnych w systemie portów COM self.comPortsList = [portList[0] for portList in list_ports.comports()] #Timmer do odbioru danych/powoduje zap?tlenie programu self.recivedTimer = QtCore.QTimer(self) # # # # Połączenie sygnałów/slotów - wewnętrzne sprawy Qt self.ui.btn_open.clicked.connect(self.openPort) self.ui.btn_close.clicked.connect(self.closePort) self.ui.btn_save.clicked.connect(self.save) self.ui.btn_clear_recived.clicked.connect(self.ui.o_recived_plainTextEdit.clear) self.ui.btn_clear_send.clicked.connect(self.ui.o_send_plainTextEdit.clear) self.ui.btn_send.clicked.connect(self.send) self.ui.btn_pingFunction.clicked.connect(self.ping) # self.ui.i_howMuchChars_spinBox.valueChanged(int).connect(self.changedSizeTerminator) QtCore.QObject.connect(self.ui.i_howMuchChars_spinBox, QtCore.SIGNAL("valueChanged(int)"), self.changedSizeTerminator) QtCore.QObject.connect(self.ui.tabWidget, QtCore.SIGNAL("currentChanged(int)"), self.reDrawKonfigurationTab) self.recivedTimer.timeout.connect(self.recived) self.ui.i_terminator_comboBox.currentIndexChanged[str].connect(self.terminatorChanged) # Tworzenie listy obsługiwanych wartości szybkości transmisji for baudRate in Config.serial.BAUDRATES: self.ui.i_baudRate_comboBox.addItem(repr(baudRate)) # Tworzenie listy dostępnych portów COM - dla intefejsu użytkownika for port in self.comPortsList: self.ui.i_portName_comboBox.addItem(port) # Dodajemy możliwe typy terminatora for terminator in self.treminatorTypes.keys(): self.ui.i_terminator_comboBox.addItem(terminator) # Dodajemy listę typów sterowania transmisją for protocol in self.protocolOptionDict.keys(): self.ui.i_protocol_comboBox.addItem(protocol) # Tworzymy listy obiektów intefejsu użytkownika # reprezentująch parametry transmisji. # W celu ułatwienia zarz?dzania transmisją. # Długś słowa self.byteSizeList = [self.ui.i_word_7bits_radio, \ self.ui.i_word_8bits_radio] # Parzystość self.paritiesList = [self.ui.i_parityNone_radio, \ self.ui.i_parityEven_radio, \ self.ui.i_parityOdd_radio] # Liczba bitiów stopu self.stopBitsList = [self.ui.i_stopBit1_radio, \ self.ui.i_stopBit2_radio] self.readAndSetGui()
class MyDialog(QtGui.QDialog): def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) self.ui = Ui_Dialog() self.ui.setupUi(self) self.myConfig = Config() # bufor na tekst do wysłania self.sendTextBuffor = u'' # bufor na wartości odczytane self.bufferRecived = u'' # Opcje wyboru sterowania magistrali self.protocolOptionDict = {'Brak': ' ', 'CTRL-S/CTRL-Q': 'xonxoff', 'DSR/DTR': 'dsrdtr', 'RTS/CTS': 'rtscts'} # Terminatory standardowe + terminator w?asny # ASCII 10 -LF 13 -CR self.treminatorTypes = OrderedDict([('CR', chr(13)), ('LF', chr(10)), \ ('CR, LF', chr(13) + chr(10)), \ ('brak', ''), \ (u'własny', '')]) # Tworzymy lista dostępnych w systemie portów COM self.comPortsList = [portList[0] for portList in list_ports.comports()] #Timmer do odbioru danych/powoduje zap?tlenie programu self.recivedTimer = QtCore.QTimer(self) # # # # Połączenie sygnałów/slotów - wewnętrzne sprawy Qt self.ui.btn_open.clicked.connect(self.openPort) self.ui.btn_close.clicked.connect(self.closePort) self.ui.btn_save.clicked.connect(self.save) self.ui.btn_clear_recived.clicked.connect(self.ui.o_recived_plainTextEdit.clear) self.ui.btn_clear_send.clicked.connect(self.ui.o_send_plainTextEdit.clear) self.ui.btn_send.clicked.connect(self.send) self.ui.btn_pingFunction.clicked.connect(self.ping) # self.ui.i_howMuchChars_spinBox.valueChanged(int).connect(self.changedSizeTerminator) QtCore.QObject.connect(self.ui.i_howMuchChars_spinBox, QtCore.SIGNAL("valueChanged(int)"), self.changedSizeTerminator) QtCore.QObject.connect(self.ui.tabWidget, QtCore.SIGNAL("currentChanged(int)"), self.reDrawKonfigurationTab) self.recivedTimer.timeout.connect(self.recived) self.ui.i_terminator_comboBox.currentIndexChanged[str].connect(self.terminatorChanged) # Tworzenie listy obsługiwanych wartości szybkości transmisji for baudRate in Config.serial.BAUDRATES: self.ui.i_baudRate_comboBox.addItem(repr(baudRate)) # Tworzenie listy dostępnych portów COM - dla intefejsu użytkownika for port in self.comPortsList: self.ui.i_portName_comboBox.addItem(port) # Dodajemy możliwe typy terminatora for terminator in self.treminatorTypes.keys(): self.ui.i_terminator_comboBox.addItem(terminator) # Dodajemy listę typów sterowania transmisją for protocol in self.protocolOptionDict.keys(): self.ui.i_protocol_comboBox.addItem(protocol) # Tworzymy listy obiektów intefejsu użytkownika # reprezentująch parametry transmisji. # W celu ułatwienia zarz?dzania transmisją. # Długś słowa self.byteSizeList = [self.ui.i_word_7bits_radio, \ self.ui.i_word_8bits_radio] # Parzystość self.paritiesList = [self.ui.i_parityNone_radio, \ self.ui.i_parityEven_radio, \ self.ui.i_parityOdd_radio] # Liczba bitiów stopu self.stopBitsList = [self.ui.i_stopBit1_radio, \ self.ui.i_stopBit2_radio] self.readAndSetGui() def readAndSetGui(self): # Wczytujemy dane z poprzedniej konfiguracji jeśli taka była timeoutConfigValue = self.myConfig.serialDict['timeout'] # Aktualizujemy interfejs użytkownika wczytanymi wartośćiami if timeoutConfigValue: self.ui.i_timeout_spinBox.setValue(timeoutConfigValue) self.ui.i_baudRate_comboBox.setCurrentIndex(self.ui.i_baudRate_comboBox.\ findText(repr(self.myConfig.serialDict['baudrate']))) self.ui.i_terminator_comboBox.setCurrentIndex(self.ui.i_terminator_comboBox.\ findText(self.myConfig.serialDict.get('terminator', 'CR'))) # protocolSet = lambda lista: # self.ui.i_protocol_comboBox.setCurrentIndex(self.ui.i_protocol_comboBox.\ # findText(self.myConfig.serialDict.get('p try: self.ui.i_portName_comboBox.setCurrentIndex(self.comPortsList.index(self.myConfig.serialDict.get('port'))) except ValueError: self.ui.i_portName_comboBox.setCurrentIndex(0) self.ui.i_automaticTerminator_checkBox.setChecked(self.myConfig.serialDict.get('automaticTerminator', True)) if unicode(self.ui.i_terminator_comboBox.currentText()) == u"własny": self.ui.i_itsTerminator_lineEdit.setText(self.myConfig.serialDict.get('itsTerminator', '')) self.ui.i_howMuchChars_spinBox.setValue(len(unicode(self.ui.i_itsTerminator_lineEdit.text()))) # except KeyError: # self.ui.i_portName_comboBox.setCurrentIndex(0) # Odczytanie i ustwienie wybranej wartości długości słowa, parzystości, liczby bitów stopu byteSizeIndex = Config.serial.BYTESIZES[2:].index(self.myConfig.serialDict['bytesize']) paritiesIndex = Config.serial.PARITIES.index(self.myConfig.serialDict['parity']) stopBitsIndex = Config.serial.STOPBITS[::2].index(self.myConfig.serialDict['stopbits']) self.byteSizeList[byteSizeIndex].setChecked(True) self.paritiesList[paritiesIndex].setChecked(True) self.stopBitsList[stopBitsIndex].setChecked(True) # Odczytanie i ustawienie wartości o sposobie zarządzania transmisją if self.myConfig.serialDict['dsrdtr']: protocolIndex = 2 elif self.myConfig.serialDict['rtscts']: protocolIndex = 3 elif self.myConfig.serialDict['xonxoff']: protocolIndex = 1 else: protocolIndex = 0 self.ui.i_protocol_comboBox.setCurrentIndex(protocolIndex) def reDrawKonfigurationTab(self, tab): if tab == 1: self.readAndSetGui() def dtrRts(self): Config.serial.setRTS(False) Config.serial.setDTR(False) if Config.serial.dsrdtr: print "jeden" self.dtrRtsWrite = Config.serial.setDTR elif Config.serial.rtscts: print "dwa" self.dtrRtsWrite = Config.serial.setRTS elif Config.serial.xonxoff: print "trzy" self.dtrRtsWrite = Config.serial.setXON else: self.dtrRtsWrite = lambda tekst: tekst @QtCore.pyqtSlot() def changedSizeTerminator(self, howMuch): self.ui.i_itsTerminator_lineEdit.setMaxLength(howMuch) @QtCore.pyqtSlot() def openPort(self): try: Config.serial.open() self.dtrRts() self.dtrRtsWrite(True) # self.dtrRtsWrite(True) self.recivedTimer.start(1000) print u"Port Opened / Port otwarty" except serial.serialutil.SerialException: print u"Port %s jest juz otwarty!" \ % (self.myConfig.serialDict['port']) @QtCore.pyqtSlot() def closePort(self): self.recivedTimer.stop() Config.serial.close() print u"Port Closed / Prot zamknięty" @QtCore.pyqtSlot() def recived(self): # TODO: ogarnac xonxoff # xonxoff = False recivedText = u'' if Config.serial.inWaiting(): print "\tgetCTS:%s getDSR:%s\n\tgetRtsCts:%s getRtsToggle:%s" \ % (Config.serial.getCTS(), Config.serial.getDSR(), Config.serial.getRtsCts(), Config.serial.getRtsToggle()) if(self.bufferRecived == u''): print u"Odbieranie danych" recivedText = Config.serial.read(Config.serial.inWaiting()) print recivedText # if recivedText.find( self.bufferRecived += recivedText self.bufferRecived, isTerminator = self.searchTerminator(self.bufferRecived) print repr(self.bufferRecived) if isTerminator: print u"Odebrano dane (znaleziono terminator)" self.ui.o_recived_plainTextEdit.appendPlainText(self.bufferRecived) if re.search(r'^ ?p<[0-2][0-9](:[0-5][0-9]){2}>!$', self.bufferRecived): print u"Odebrano ping" sendRecivePing = u"rp<%s>!" % (time.strftime('%X')) print repr(sendRecivePing + self.treminatorTypes[self.myConfig.serialDict.get('terminator', 'CR')]) Config.serial.write(sendRecivePing + self.treminatorTypes[self.myConfig.serialDict.get('terminator', 'CR')]) print u"Wysłano ping zwrotny" self.bufferRecived = u'' print u"Oczyszczono bufor odbioru danych" @QtCore.pyqtSlot(str) def terminatorChanged(self, itemName): shouldShow = False if itemName == u"własny": shouldShow = True self.ui.i_howMuchChars_spinBox.setVisible(shouldShow) self.ui.i_itsTerminator_lineEdit.setVisible(shouldShow) self.ui.customTermator.setVisible(shouldShow) @QtCore.pyqtSlot() def ping(self): sendPing = u"p<%s>!" % (time.strftime('%X')) Config.serial.write(sendPing + self.treminatorTypes[self.myConfig.serialDict.get('terminator', u'CR')]) print u"Wysłano ping" @QtCore.pyqtSlot() def send(self): # if Config.serial.getDSR() or Config.serial.getCTS() or Config.serial.xonxoff: # self.dtrRtsWrite(False) terminator = self.treminatorTypes[self.myConfig.serialDict.get('terminator', 'CR')] sendText = unicode(self.ui.lineEdit.text()) if self.myConfig.serialDict.get('automaticTerminator', True): sendText += terminator Config.serial.write(sendText) sendText, isTerminator = self.searchTerminator(sendText) self.ui.o_send_plainTextEdit.appendPlainText(sendText) print u"Wysłano dane" else: sendText, isTerminator = self.searchTerminator(sendText) self.sendTextBuffor += sendText print u"Wysłano dane do bufora BRAK TERMINATORA" if isTerminator: self.ui.o_send_plainTextEdit.appendPlainText(self.sendTextBuffor) Config.serial.write(self.sendTextBuffor + terminator) self.sendTextBuffor = u'' print u"Terminator znaleziony, dane wysłane, bufor wysyłania oprózniony" self.ui.lineEdit.clear() # self.dtrRtsWrite(True) def searchTerminator(self, text): terminator = self.treminatorTypes[self.myConfig.serialDict.get('terminator', 'CR')] if terminator in text: indexFind = True elif ("%s" % repr(terminator)[1:-1]) in text: terminator = "%s" % repr(terminator)[1:-1] terminator = repr(terminator)[1:-1] indexFind = True else: indexFind = False text = re.split(terminator, text)[0] return (text, indexFind) @QtCore.pyqtSlot() def save(self): if Config.serial.isOpen(): QtGui.QMessageBox.warning(None, u"RS-232", u"Należy zamknąć i otworzyć port, aby zmiany zostały wporawdzone.", \ buttons=QtGui.QMessageBox.Ok, defaultButton=QtGui.QMessageBox.NoButton) for clear in self.protocolOptionDict.values(): self.myConfig.serialDict[clear] = False if self.ui.i_protocol_comboBox.currentIndex() != 0: self.myConfig.serialDict[self.protocolOptionDict[\ unicode(self.ui.i_protocol_comboBox.currentText())]] = True self.myConfig.serialDict['port'] = str(self.ui.i_portName_comboBox.currentText()) self.myConfig.serialDict['baudrate'] = int(self.ui.i_baudRate_comboBox.currentText()) for byteSize in self.byteSizeList: if(byteSize.isChecked()): self.myConfig.serialDict['bytesize'] = int(byteSize.text()) for parity in self.paritiesList: if(parity.isChecked()): self.myConfig.serialDict['parity'] = Config.serial.PARITIES[self.paritiesList.index(parity)] for stopBit in self.stopBitsList: if(stopBit.isChecked()): self.myConfig.serialDict['stopbits'] = int(stopBit.text()) if self.ui.i_timeout_spinBox.value(): self.myConfig.serialDict['timeout'] = self.ui.i_timeout_spinBox.value() else: self.myConfig.serialDict['timeout'] = None self.myConfig.serialDict['automaticTerminator'] = self.ui.i_automaticTerminator_checkBox.isChecked() self.myConfig.serialDict['terminator'] = unicode(self.ui.i_terminator_comboBox.currentText()) if unicode(self.ui.i_terminator_comboBox.currentText()) == u"własny": self.myConfig.serialDict[u'itsTerminator'] = unicode(self.ui.i_itsTerminator_lineEdit.text()) self.treminatorTypes[u'własny'] = self.myConfig.serialDict['itsTerminator'] self.myConfig.save()