Skip to content

Instantly share code, notes, and snippets.

@bluebat
Created February 10, 2014 05:55
Show Gist options
  • Save bluebat/8910986 to your computer and use it in GitHub Desktop.
Save bluebat/8910986 to your computer and use it in GitHub Desktop.
GUI for manipulating TopBox
#!/usr/bin/python
#coding:utf-8
import sys, string, telnetlib, gettext
from qt import *
gettext.install("topbox")
chrBegin = "*"
chrEnd = chr(252)
chrBroadcast = chr(32)
class MainWindow(QMainWindow):
def __init__(self, *args):
QMainWindow.__init__(self, *args)
self.host = "192.168.168.62"
self.port = "100"
self.password = ""
self.itemcount = 7
self.itemno = 1
self.degree = u"℃"
self.socket = Socket()
self.node = []
for i in range(self.itemcount+1):
self.node.append(Node())
self.startTimer(1000)
self.mainBox = QVBox(self)
self.mainBox.setMargin(5)
self.mainBox.setSpacing(5)
self.topBox = QHBox(self.mainBox)
self.topBox.setMargin(3)
self.topBox.setSpacing(5)
# self.topBox.setFrameStyle(QFrame.Panel|QFrame.Raised)
self.topBox.setLineWidth(2)
self.middleBox = QHBox(self.mainBox)
self.middleBox.setMargin(3)
self.middleBox.setSpacing(5)
# self.middleBox.setFrameStyle(QFrame.Panel|QFrame.Plain)
self.middleBox.setLineWidth(0)
self.bottomBox = QHBox(self.mainBox)
self.bottomBox.setMargin(3)
self.bottomBox.setSpacing(5)
# self.bottomBox.setFrameStyle(QFrame.Panel|QFrame.Raised)
self.bottomBox.setLineWidth(2)
self.hostLabel = QLabel(_(u"IP 位址:"), self.topBox)
self.hostLineEdit = QLineEdit(self.host, "000.000.000.000", self.topBox)
self.portLabel = QLabel(_(u"Port:"), self.topBox)
self.portLineEdit = QLineEdit(self.port, "000", self.topBox)
self.portLineEdit.setMaximumWidth(50)
self.passwordLabel = QLabel(_(u"密碼:"), self.topBox)
self.passwordLineEdit = QLineEdit(self.topBox)
self.passwordLineEdit.setEchoMode(QLineEdit.Password)
self.connectPushButton = QPushButton(_(u"連線(&L)"), self.topBox)
self.connect(self.connectPushButton, SIGNAL("clicked()"), self.connectSlot)
self.nodeListView = QListView(self.middleBox)
self.nodeListView.setMultiSelection(False)
self.nodeListView.setMaximumWidth(100)
self.nodeListView.addColumn("#", 20)
self.nodeListView.addColumn(_(u"結點名稱"), 75)
self.nodeListView.setAllColumnsShowFocus(True)
self.nodeListViewItem = []
for i in range(self.itemcount):
self.nodeListViewItem.append(QListViewItem(self.nodeListView))
self.nodeListViewItem[i].setText(0, str(i+1))
self.nodeListViewItem[i].setText(1, str(i+1)+_(u"號機"))
self.connect(self.nodeListView, SIGNAL("clicked(QListViewItem*)"), self.selectSlot)
self.nodeListViewItem[0].setSelected(True)
self.nodeListView.setEnabled(False)
self.nodeTabWidget = QTabWidget(self.middleBox)
self.sensorBox = QVBox(self.nodeTabWidget)
self.sensorBox.setMargin(6)
self.sensorBox.setSpacing(5)
self.valueGrid = QGrid(4, self.sensorBox)
self.valueGrid.setMargin(3)
self.valueGrid.setSpacing(5)
self.cpu1Label = QLabel(_(u"CPU(1)溫度:"), self.valueGrid)
self.cpu1LineEdit = QLineEdit(self.valueGrid)
self.cpu1LineEdit.setMaximumWidth(60)
self.cpu2Label = QLabel(_(u"CPU(2)溫度:"), self.valueGrid)
self.cpu2LineEdit = QLineEdit(self.valueGrid)
self.cpu2LineEdit.setMaximumWidth(60)
self.fan1Label = QLabel(_(u"FAN(1)溫度:"), self.valueGrid)
self.fan1LineEdit = QLineEdit(self.valueGrid)
self.fan1LineEdit.setMaximumWidth(60)
self.fan2Label = QLabel(_(u"FAN(2)溫度:"), self.valueGrid)
self.fan2LineEdit = QLineEdit(self.valueGrid)
self.fan2LineEdit.setMaximumWidth(60)
self.actionGroup = QVButtonGroup(u"動作", self.sensorBox)
self.resetCheckBox = QCheckBox(_(u"電腦重新啟動"), self.actionGroup)
self.computerCheckBox = QCheckBox(_(u"電腦硬體停止"), self.actionGroup)
self.powerCheckBox = QCheckBox(_(u"電源強制開關"), self.actionGroup)
self.otherCheckBox = QCheckBox(_(u"動作未定義"), self.actionGroup)
self.connect(self.actionGroup, SIGNAL("clicked(int)"), self.actionSlot)
self.nodeTabWidget.addTab(self.sensorBox, _(u"感測開關(&S)"))
self.comTextEdit = QTextEdit(self.nodeTabWidget)
self.comTextEdit.setTextFormat(QTextEdit.LogText)
self.comTextEdit.setFont(QFont("AR PL Mingti2L Big5", 9))
self.comTextEdit.setPaletteBackgroundColor(QColor("Black"))
self.comTextEdit.setPaletteForegroundColor(QColor("White"))
self.comTextEdit.setWordWrap(QTextEdit.FixedColumnWidth)
self.comTextEdit.setWrapColumnOrWidth(80)
self.comTextEdit.setWrapPolicy(QTextEdit.Anywhere)
self.nodeTabWidget.addTab(self.comTextEdit, _(u"序列輸出(&O)"))
self.nodeTabWidget.setEnabled(False)
self.aboutPushButton = QPushButton(_(u"關於(&A)"), self.bottomBox)
self.setupPushButton = QPushButton(_(u"設定(&C)"), self.bottomBox)
self.quitPushButton = QPushButton(_(u"離開(&Q)"), self.bottomBox)
self.connect(self.aboutPushButton, SIGNAL("clicked()"), self.aboutSlot)
self.connect(self.setupPushButton, SIGNAL("clicked()"), self.setupSlot)
self.connect(self.quitPushButton, SIGNAL("clicked()"), self, SLOT("close()"))
self.setCaption("TopBox")
self.setFont(QFont("Sans", 12))
self.setCentralWidget(self.mainBox)
self.resize(620, 460)
def connectSlot(self):
if self.socket.connected:
self.socket.close()
self.socket.connected = False
else:
try:
self.socket.connect(self.host, int(self.port))
except:
QMessageBox.warning(self, _(u"警告訊息"), _(u"<h3>無法連線!請查明原因後再試。</h3>"), _(u"關閉(&C)"), "", "", 0, 0)
self.socket.connected = False
else:
self.socket.connected = True
self.socket.send(self.password)
self.socket.send(chrBegin+chrBroadcast+chrEnd)
self.passwordLineEdit.clear()
if self.socket.connected:
self.connectPushButton.setText(_(u"斷線(&D)"))
self.hostLineEdit.setEnabled(False)
self.portLineEdit.setEnabled(False)
self.passwordLineEdit.setEnabled(False)
self.setupPushButton.setEnabled(False)
self.quitPushButton.setEnabled(False)
self.nodeListView.setEnabled(True)
self.nodeTabWidget.setEnabled(True)
else:
self.connectPushButton.setText(_(u"連線(&L)"))
self.hostLineEdit.setEnabled(True)
self.portLineEdit.setEnabled(True)
self.passwordLineEdit.setEnabled(True)
self.setupPushButton.setEnabled(True)
self.quitPushButton.setEnabled(True)
self.nodeListView.setEnabled(False)
self.nodeTabWidget.setEnabled(False)
def selectSlot(self, listitem):
if listitem:
self.itemno = listitem.text(0).toInt()[0]
self.socket.send(chrBegin+chrBroadcast+chrEnd)
def timerEvent(self, ev):
if self.socket.connected:
msg = self.socket.text + self.socket.recv()
if len(msg) > 0 and msg[-1] == chrEnd:
self.socket.text = ""
msg = msg[1:-1]
elif len(msg) > 0:
self.socket.text = msg
msg = ""
else:
msg = ""
if msg != "":
for m in string.split(msg,chrEnd+chrBegin):
n = ord(m[0])
print n,m
if m[1] == "@" and len(m) == 13:
self.node[n].temperature = string.split(m[2:])
elif m[1:3] == "@R" and len(m) == 7:
self.node[n].relay = m[3:]
else:
# self.node[1].text = self.node[1].text + msg
self.node[n].text = self.node[n].text + m[1:]
self.comTextEdit.setText(self.node[self.itemno].text)
self.cpu1LineEdit.setText(self.node[self.itemno].temperature[0] + self.degree)
self.cpu2LineEdit.setText(self.node[self.itemno].temperature[1] + self.degree)
self.fan1LineEdit.setText(self.node[self.itemno].temperature[2] + self.degree)
self.fan2LineEdit.setText(self.node[self.itemno].temperature[3] + self.degree)
self.resetCheckBox.setChecked(self.node[self.itemno].relay[0]=="1")
self.computerCheckBox.setChecked(self.node[self.itemno].relay[1]=="1")
self.powerCheckBox.setChecked(self.node[self.itemno].relay[2]=="1")
self.otherCheckBox.setChecked(self.node[self.itemno].relay[3]=="1")
def actionSlot(self, act):
relay = self.node[self.itemno].relay
if act == 0:
relay = str(int(self.resetCheckBox.isChecked()))+relay[1:]
elif act == 1:
relay = relay[0:1]+str(int(self.computerCheckBox.isChecked()))+relay[2:]
elif act == 2:
relay = relay[0:2]+str(int(self.powerCheckBox.isChecked()))+relay[3:]
elif act == 3:
relay = relay[0:3]+str(int(self.otherCheckBox.isChecked()))
self.node[self.itemno].relay = relay
self.socket.send(chrBegin+chr(self.itemno)+"@"+relay+chrEnd)
def aboutSlot(self):
QMessageBox.information(self, _(u"關於 TopBox"), _(u"<h3><tt><b>TopBox 0.1</b></tt><hr>操控 TopBox 硬體的圖形介面<br><tt>Copyright © 2004</tt></h3>"), _(u"關閉(&C)"))
def setupSlot(self):
setupDialog = QTabDialog(self)
setupDialog.setCaption(_(u"設定"))
setupDialog.setOkButton(_(u"確定"))
setupDialog.setCancelButton(_(u"取消"))
setupDialog.generalBox = QVBox()
setupDialog.generalBox.setMargin(5)
setupDialog.generalBox.setSpacing(5)
setupDialog.addTab(setupDialog.generalBox, _(u"一般"))
setupDialog.nodeBox = QHBox(setupDialog.generalBox)
setupDialog.nodeLabel = QLabel(_(u"結點上限:"), setupDialog.nodeBox)
setupDialog.nodeLineEdit = QLineEdit(str(self.itemcount), "00", setupDialog.nodeBox)
if setupDialog.exec_loop() == QDialog.Accepted:
self.itemcount = setupDialog.nodeLineEdit.text().toInt()
def quitSlot(self):
self.close()
class Socket:
def __init__(self):
self.connected = False
self.text = ""
def connect(self, host, port):
self.sock = telnetlib.Telnet()
self.sock.open(host, port)
def send(self, msg):
if self.connected:
self.sock.write(msg)
def recv(self):
msg = self.sock.read_eager()
return msg
def close(self):
self.sock.close()
class TestSocket:
def __init__(self):
self.connected = False
self.text = ""
def connect(self, host, port):
pass
def send(self, msg):
if self.connected:
pass
def recv(self):
msg = chrBegin+chr(1)+"@30 40 50 60"+chrEnd+chrBegin+chr(1)+"123"+chrEnd+chrBegin+chr(1)+"abc\n"+chrEnd+chrBegin+chr(1)+"@R1010"+chrEnd+""
return msg
def close(self):
pass
class Node:
def __init__(self):
self.temperature = ["00", "00", "00", "00"]
self.relay = "0000"
self.text = ""
if __name__ == "__main__":
application = QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
application.setStyle(QPlatinumStyle())
application.setMainWidget(mainWindow)
application.connect(application, SIGNAL("lastWindowClosed()"), application, SLOT("quit()"))
application.exec_loop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment