node.py 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574
  1. import sys
  2. from itertools import product
  3. from PyQt5 import sip
  4. from PyQt5.QtWidgets import QApplication, QSizePolicy, QLabel, QWidget
  5. import json
  6. import threading
  7. import time
  8. from functools import partial
  9. from PyQt5.QtCore import pyqtSignal, Qt
  10. from PyQt5.QtGui import QCursor, QFont
  11. from PyQt5.QtWidgets import QPushButton, QMainWindow, QMenu, QMessageBox
  12. import message.message_pb2 as message
  13. import google.protobuf.text_format as tf
  14. import re
  15. import ui.spaceUi as sui
  16. import spaceManage as spmng
  17. import async_communication as cmt
  18. import mcpu_communication as mcn
  19. from led import Led
  20. # db参数
  21. db_ip = "192.168.1.233"
  22. # db_ip = "127.0.0.1"
  23. db_port = 3306
  24. db_name = "ct_project"
  25. db_user = "zx"
  26. db_password = "zx123456"
  27. # db_user = "root"
  28. # db_password = "123456"
  29. # mq参数
  30. mq_ip = "192.168.1.233"
  31. # mq_ip = "127.0.0.1"
  32. mq_port = 5672
  33. mq_user = "zx"
  34. mq_password = "zx123456"
  35. # mq_user = "wk"
  36. # mq_password = "123456"
  37. statu_ex_keys = [
  38. ["statu_ex", "in_mcpu_1_statu_port"],
  39. ["statu_ex", "in_mcpu_2_statu_port"],
  40. ["statu_ex", "in_mcpu_3_statu_port"],
  41. ["statu_ex", "in_mcpu_4_statu_port"],
  42. ["statu_ex", "in_mcpu_5_statu_port"],
  43. ["statu_ex", "in_mcpu_6_statu_port"],
  44. ["statu_ex", "out_mcpu_1_statu_port"],
  45. ["statu_ex", "out_mcpu_2_statu_port"],
  46. ["statu_ex", "out_mcpu_3_statu_port"],
  47. ["statu_ex", "out_mcpu_4_statu_port"],
  48. ["statu_ex", "out_mcpu_5_statu_port"],
  49. ["statu_ex", "out_mcpu_6_statu_port"]
  50. ]
  51. mcpu_keys = [
  52. ["in", 1, "192.168.1.120", 40005],
  53. ["in", 2, "192.168.1.121", 40005],
  54. ["in", 3, "192.168.1.122", 40005],
  55. ["in", 4, "192.168.1.123", 40005],
  56. ["in", 5, "192.168.1.124", 40005],
  57. ["in", 6, "192.168.1.125", 40005],
  58. ["out", 1, "192.168.1.130", 40005],
  59. ["out", 2, "192.168.1.131", 40005],
  60. ["out", 3, "192.168.1.132", 40005],
  61. ["out", 4, "192.168.1.133", 40005],
  62. ["out", 5, "192.168.1.134", 40005],
  63. ["out", 6, "192.168.1.135", 40005]
  64. ]
  65. class QPBtn(QPushButton):
  66. clickedSignal = pyqtSignal(bool) # 定义带参信号
  67. def __init__(self, parent=None):
  68. super(QPBtn, self).__init__(parent)
  69. def mousePressEvent(self, event): # 重定义该函数,对不同的操作释放不同的信号参数
  70. if event.buttons() == Qt.LeftButton:
  71. self.clickedSignal.emit(True)
  72. elif event.buttons() == Qt.RightButton:
  73. self.clickedSignal.emit(False)
  74. class MainWindow(QMainWindow, threading.Thread):
  75. drawSpaceBtnSignal = pyqtSignal(dict, int)
  76. drawMcpuBtnSignal = pyqtSignal(str)
  77. drawRmqBtnSignal = pyqtSignal(list)
  78. drawLedSignal = pyqtSignal()
  79. drawUnitProcessSignal = pyqtSignal()
  80. def __init__(self):
  81. threading.Thread.__init__(self)
  82. QMainWindow.__init__(self)
  83. self.rmq_statu = {}
  84. self.rmq_timeout = {}
  85. self.command_queue_dict = {}
  86. self.ui = sui.Ui_MainWindow()
  87. self.ui.setupUi(self)
  88. self.isClose = False
  89. self.drawSpaceBtnSignal.connect(self.drawSpaceBtn)
  90. self.drawRmqBtnSignal.connect(self.drawRmqBtn)
  91. self.drawLedSignal.connect(self.drawLed)
  92. self.drawUnitProcessSignal.connect(self.drawUnitProcess)
  93. self.drawMcpuBtnSignal.connect(self.drawMcpuBtn)
  94. self.btn_positions = [(i, j) for i in range(13, -1, -1) for j in range(6)]
  95. # self.ui.in_mcpu_1_statu_btn = QPBtn(self.ui.in_mcpu_1_statu_btn)
  96. self.ui.in_mcpu_1_statu_btn.clicked.connect(self.mcpu_btn_click)
  97. self.ui.in_mcpu_2_statu_btn.clicked.connect(self.mcpu_btn_click)
  98. self.ui.in_mcpu_3_statu_btn.clicked.connect(self.mcpu_btn_click)
  99. self.ui.in_mcpu_4_statu_btn.clicked.connect(self.mcpu_btn_click)
  100. self.ui.in_mcpu_5_statu_btn.clicked.connect(self.mcpu_btn_click)
  101. self.ui.in_mcpu_6_statu_btn.clicked.connect(self.mcpu_btn_click)
  102. self.ui.out_mcpu_1_statu_btn.clicked.connect(self.mcpu_btn_click)
  103. self.ui.out_mcpu_2_statu_btn.clicked.connect(self.mcpu_btn_click)
  104. self.ui.out_mcpu_3_statu_btn.clicked.connect(self.mcpu_btn_click)
  105. self.ui.out_mcpu_4_statu_btn.clicked.connect(self.mcpu_btn_click)
  106. self.ui.out_mcpu_5_statu_btn.clicked.connect(self.mcpu_btn_click)
  107. self.ui.out_mcpu_6_statu_btn.clicked.connect(self.mcpu_btn_click)
  108. def getBackGroundColor(self, color):
  109. if color == "red":
  110. return "background-color:rgb(255,70,70)"
  111. elif color == "gray":
  112. return "background-color:rgb(168,168,168)"
  113. elif color == "green":
  114. return "background-color:rgb(0,180,0)"
  115. elif color == "yellow":
  116. return "background-color:rgb(248,239,71)"
  117. def drawMcpuBtn(self, key):
  118. mouth = key.split(':')[0]
  119. id = key.split(':')[1]
  120. btn_name = mouth + '_' + id + '_statu_btn'
  121. btn = self.findChild(QPushButton, btn_name)
  122. iomsg = g_mcpu.GetMcpuIoMsg(key)
  123. if g_mcpu.GetMcpuConnectStatus(key) is True or iomsg.timeout() is False:
  124. btn.setText(btn.text()[:10] + "正常")
  125. btn.setStyleSheet(self.getBackGroundColor("green"))
  126. btn.setToolTip(str(iomsg.statu))
  127. else:
  128. btn.setText(btn.text()[:10] + "断连")
  129. btn.setToolTip("None")
  130. btn.setStyleSheet(self.getBackGroundColor("gray"))
  131. def drawUnitProcess(self):
  132. return
  133. if g_space.command_queue_dict is not False and g_space.command_queue_dict is not None:
  134. # if self.command_queue_dict != g_space.command_queue_dict
  135. for Aindex in range(self.ui.A_verticalLayout.count()):
  136. item = self.ui.A_verticalLayout.itemAt(Aindex)
  137. if item is not None:
  138. self.ui.A_verticalLayout.removeItem(item)
  139. sip.delete(item.widget())
  140. for Bindex in range(self.ui.B_verticalLayout.count()):
  141. wid = self.ui.B_verticalLayout.itemAt(Bindex).widget()
  142. if item is not None:
  143. self.ui.B_verticalLayout.removeWidget(wid)
  144. sip.delete(wid)
  145. for Cindex in range(self.ui.C_verticalLayout.count()):
  146. wid = self.ui.C_verticalLayout.itemAt(Cindex).widget()
  147. if item is not None:
  148. self.ui.C_verticalLayout.removeWidget(wid)
  149. sip.delete(wid)
  150. for dict in g_space.command_queue_dict:
  151. btn = QPBtn()
  152. measure = message.measure_info()
  153. # tf.Parse(dict["measure_info"],measure)
  154. a = 1.50
  155. str = "%s任务-------车牌号:%s 车高:%f" % (
  156. "存车" if dict["type"] == 1 else "取车", dict["car_number"], a)
  157. color = ""
  158. if dict["statu"] == 1:
  159. color = self.getBackGroundColor("green")
  160. elif dict["statu"] == 0:
  161. color = self.getBackGroundColor("yellow")
  162. elif dict["statu"] == 3:
  163. color = self.getBackGroundColor("red")
  164. btn.setStyleSheet('border:3px groove orange;border-radius:10px;padding:2px 4px;' + color)
  165. tool_tip = '{"car_number":"%s",\n"primary_key":"%s",\n "unit":%d, \n"queue_id":%d, \n"type":%d ,' \
  166. '\n "space_info":"%s", \n"measure_info":"%s", \n"export_id":%d}' % (
  167. dict["car_number"], dict["primary_key"], dict["unit"], dict["queue_id"], dict["type"],
  168. "None" if dict["space_info"] is None else dict["space_info"],
  169. "None" if dict["measure_info"] is None else dict["measure_info"],
  170. -1 if dict["export_id"] is None else dict["export_id"])
  171. # if self.findChild(QPBtn, dict["car_number"]) is not None:
  172. # self.findChild(QPBtn, dict["car_number"]).setText(str)
  173. # self.findChild(QPBtn, dict["car_number"]).setToolTip(tool_tip)
  174. # self.findChild(QPBtn, dict["car_number"]).setStyleSheet('border:3px groove %s;border-radius:10px;padding:2px 4px;' % (
  175. # "orange" if dict["type"] is 1 else "blue") + color)
  176. # continue
  177. btn.setStyleSheet('border:3px groove %s;border-radius:10px;padding:2px 4px;' % (
  178. "orange" if dict["type"] == 1 else "blue") + color)
  179. btn.setObjectName(dict["car_number"])
  180. btn.setMinimumHeight(80)
  181. font = QFont()
  182. font.setFamily('微软雅黑')
  183. font.setBold(True)
  184. font.setPointSize(15)
  185. font.setWeight(50)
  186. btn.setFont(font) # 载入字体设置
  187. # btn.setGeometry(0, 0, 250, 500) # (x坐标,y坐标,宽,高)
  188. btn.setText(str)
  189. btn.setToolTip(tool_tip)
  190. btn.clickedSignal.connect(self.process_btn_click)
  191. if dict["unit"] == 1:
  192. self.ui.A_verticalLayout.addWidget(btn)
  193. elif dict["unit"] == 2:
  194. self.ui.B_verticalLayout.addWidget(btn)
  195. elif dict["unit"] == 3:
  196. self.ui.C_verticalLayout.addWidget(btn)
  197. def drawLed(self):
  198. export_1 = True
  199. export_2 = True
  200. export_3 = True
  201. export_4 = True
  202. export_5 = True
  203. export_6 = True
  204. out_mcpu_1_statu = message.out_mcpu_statu()
  205. out_mcpu_2_statu = message.out_mcpu_statu()
  206. out_mcpu_3_statu = message.out_mcpu_statu()
  207. out_mcpu_4_statu = message.out_mcpu_statu()
  208. out_mcpu_5_statu = message.out_mcpu_statu()
  209. out_mcpu_6_statu = message.out_mcpu_statu()
  210. if self.ui.out_rmq_1_statu_btn.toolTip() != "None":
  211. tf.Parse(self.ui.out_rmq_1_statu_btn.toolTip(), out_mcpu_1_statu)
  212. if out_mcpu_1_statu.outside_safety == 2:
  213. export_1 = False
  214. if self.ui.out_rmq_2_statu_btn.toolTip() != "None":
  215. tf.Parse(self.ui.out_rmq_2_statu_btn.toolTip(), out_mcpu_2_statu)
  216. if out_mcpu_2_statu.outside_safety == 2:
  217. export_2 = False
  218. if self.ui.out_rmq_3_statu_btn.toolTip() != "None":
  219. tf.Parse(self.ui.out_rmq_3_statu_btn.toolTip(), out_mcpu_3_statu)
  220. if out_mcpu_3_statu.outside_safety == 2:
  221. export_3 = False
  222. if self.ui.out_rmq_4_statu_btn.toolTip() != "None":
  223. tf.Parse(self.ui.out_rmq_4_statu_btn.toolTip(), out_mcpu_4_statu)
  224. if out_mcpu_4_statu.outside_safety == 2:
  225. export_4 = False
  226. if self.ui.out_rmq_5_statu_btn.toolTip() != "None":
  227. tf.Parse(self.ui.out_rmq_5_statu_btn.toolTip(), out_mcpu_5_statu)
  228. if out_mcpu_5_statu.outside_safety == 2:
  229. export_5 = False
  230. if self.ui.out_rmq_6_statu_btn.toolTip() != "None":
  231. tf.Parse(self.ui.out_rmq_6_statu_btn.toolTip(), out_mcpu_6_statu)
  232. if out_mcpu_6_statu.outside_safety == 2:
  233. export_6 = False
  234. if g_space.command_queue_dict is not False and g_space.command_queue_dict is not None:
  235. for dict in g_space.command_queue_dict:
  236. if dict["export_id"] == 1:
  237. export_1 = False
  238. if dict["export_id"] == 2:
  239. export_2 = False
  240. if dict["export_id"] == 3:
  241. export_3 = False
  242. if dict["export_id"] == 4:
  243. export_4 = False
  244. if dict["export_id"] == 5:
  245. export_5 = False
  246. if dict["export_id"] == 6:
  247. export_6 = False
  248. led = Led()
  249. led.setEnabled(False) # 设置为不使能状态,如果需要切换可以设置为True。则可以实现点击切换指示灯颜色的效果
  250. led.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
  251. if export_1 == export_2 == False:
  252. led.setChecked(False) # 设置为选中状态
  253. else:
  254. led.setChecked(True) # 设置为选中状态
  255. self.ui.led_process_Layout.addWidget(led, 0, 1)
  256. led = Led()
  257. led.setEnabled(False) # 设置为不使能状态,如果需要切换可以设置为True。则可以实现点击切换指示灯颜色的效果
  258. led.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
  259. if export_3 == export_4 == False:
  260. led.setChecked(False) # 设置为选中状态
  261. else:
  262. led.setChecked(True) # 设置为选中状态
  263. self.ui.led_process_Layout.addWidget(led, 0, 2)
  264. led = Led()
  265. led.setEnabled(False) # 设置为不使能状态,如果需要切换可以设置为True。则可以实现点击切换指示灯颜色的效果
  266. led.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
  267. if export_5 == export_6 == False:
  268. led.setChecked(False) # 设置为选中状态
  269. else:
  270. led.setChecked(True) # 设置为选中状态
  271. self.ui.led_process_Layout.addWidget(led, 0, 3)
  272. def drawRmqBtn(self, list):
  273. ex_name = list[0]
  274. key = list[1]
  275. id = ex_name + ":" + key
  276. btn = self.findChild(QPushButton, (key.replace("port", "btn")).replace("mcpu", "rmq"))
  277. if g_rabbitmq[id].statu is not None and g_rabbitmq[id].timeout() is False:
  278. btn.setToolTip(g_rabbitmq[id].statu)
  279. if key.find("in") >= 0:
  280. in_mcpu_statu = message.in_mcpu_statu()
  281. tf.Parse(g_rabbitmq[id].statu, in_mcpu_statu)
  282. if in_mcpu_statu.is_occupy == 1:
  283. btn.setStyleSheet(self.getBackGroundColor("green"))
  284. btn.setText(btn.text()[:9] + "空闲----" + btn.text()[15:])
  285. else:
  286. btn.setStyleSheet(self.getBackGroundColor("yellow"))
  287. btn.setText(btn.text()[:9] + "占用----" + btn.text()[15:])
  288. # print(btn.text())
  289. if in_mcpu_statu.door_statu == 2:
  290. btn.setText(btn.text()[:-3] + "开到位")
  291. elif in_mcpu_statu.door_statu == 3:
  292. btn.setText(btn.text()[:-3] + "关到位")
  293. elif in_mcpu_statu.door_statu == 4:
  294. btn.setText(btn.text()[:-3] + "开关中")
  295. elif in_mcpu_statu.door_statu == 5:
  296. btn.setText(btn.text()[:-3] + "门故障")
  297. elif btn.text().find("出口") >= 0:
  298. out_mcpu_statu = message.out_mcpu_statu()
  299. tf.Parse(g_rabbitmq[id].statu, out_mcpu_statu)
  300. if out_mcpu_statu.outside_safety == 1:
  301. btn.setStyleSheet(self.getBackGroundColor("green"))
  302. btn.setText(btn.text()[:9] + "空闲----" + btn.text()[15:])
  303. else:
  304. btn.setStyleSheet(self.getBackGroundColor("yellow"))
  305. btn.setText(btn.text()[:9] + "占用----" + btn.text()[15:])
  306. export_id = re.search('\d+', btn.objectName()).group()
  307. if g_space.command_queue_dict is not None:
  308. for dict in g_space.command_queue_dict:
  309. if dict["export_id"] == int(export_id):
  310. btn.setStyleSheet(self.getBackGroundColor("yellow"))
  311. btn.setText(btn.text()[:9] + "占用----" + btn.text()[15:])
  312. if out_mcpu_statu.door_statu == 2:
  313. btn.setText(btn.text()[:-3] + "开到位")
  314. elif out_mcpu_statu.door_statu == 3:
  315. btn.setText(btn.text()[:-3] + "关到位")
  316. elif out_mcpu_statu.door_statu == 4:
  317. btn.setText(btn.text()[:-3] + "开关中")
  318. elif out_mcpu_statu.door_statu == 5:
  319. btn.setText(btn.text()[:-3] + "门故障")
  320. else:
  321. btn.setToolTip("None")
  322. btn.setStyleSheet(self.getBackGroundColor("gray"))
  323. btn.setText(btn.text()[:9] + "断连")
  324. def mcpu_btn_click(self):
  325. sender = self.sender()
  326. mcpu_key_list = sender.objectName().split('_')
  327. menu = QMenu(self)
  328. action = menu.addAction('手动开门')
  329. action.triggered.connect(partial(self.manual_open_door, mcpu_key_list))
  330. action = menu.addAction('手动关门')
  331. action.triggered.connect(partial(self.manual_close_door, mcpu_key_list))
  332. action = menu.addAction('恢复半自动')
  333. action.triggered.connect(partial(self.automatic_door, mcpu_key_list))
  334. action = menu.addAction('恢复全自动')
  335. action.triggered.connect(partial(self.fully_automatic_door, mcpu_key_list))
  336. menu.exec_(QCursor.pos())
  337. def manual_open_door(self,mcpu_key_list):
  338. dispatch_direction = 0
  339. if mcpu_key_list[0] == 'in':
  340. dispatch_direction = 1
  341. elif mcpu_key_list[0] == 'out':
  342. dispatch_direction = 2
  343. msg = b'{ "TerminalID": %d, "DispatchDirection": %d, "ProcessControl": 2, "OutPutDo": { "Do0": 1, "Do1": 0, "Do2": 0, "Do3": 0, "Do4": 0, "Do5": 0, "Do6": 0, "Do7": 0 }}' % (
  344. int(mcpu_key_list[2]) - 1,dispatch_direction)
  345. key = mcpu_key_list[0]+":mcpu_"+mcpu_key_list[2]
  346. g_mcpu.publish(key,msg)
  347. def manual_close_door(self,mcpu_key_list):
  348. dispatch_direction = 0
  349. if mcpu_key_list[0] == 'in':
  350. dispatch_direction = 1
  351. elif mcpu_key_list[0] == 'out':
  352. dispatch_direction = 2
  353. msg = b'{ "TerminalID": %d, "DispatchDirection": %d, "ProcessControl": 2, "OutPutDo": { "Do0": 0, "Do1": 1, "Do2": 0, "Do3": 0, "Do4": 0, "Do5": 0, "Do6": 0, "Do7": 0 }}' % (
  354. int(mcpu_key_list[2]) - 1, dispatch_direction)
  355. key = mcpu_key_list[0] + ":mcpu_" + mcpu_key_list[2]
  356. g_mcpu.publish(key, msg)
  357. def automatic_door(self,mcpu_key_list):
  358. dispatch_direction = 0
  359. ProcessControl = 0
  360. if mcpu_key_list[0] == 'in':
  361. ProcessControl = 3
  362. dispatch_direction = 1
  363. elif mcpu_key_list[0] == 'out':
  364. ProcessControl = 4
  365. dispatch_direction = 2
  366. msg = b'{ "TerminalID": %d, "DispatchDirection": %d, "ProcessControl": %d, "OutPutDo": { "Do0": 0, "Do1": 0, "Do2": 0, "Do3": 0, "Do4": 0, "Do5": 0, "Do6": 0, "Do7": 0 }}' % (
  367. int(mcpu_key_list[2]) - 1, dispatch_direction,ProcessControl)
  368. key = mcpu_key_list[0] + ":mcpu_" + mcpu_key_list[2]
  369. g_mcpu.publish(key, msg)
  370. def fully_automatic_door(self,mcpu_key_list):
  371. dispatch_direction = 0
  372. if mcpu_key_list[0] == 'in':
  373. dispatch_direction = 1
  374. elif mcpu_key_list[0] == 'out':
  375. dispatch_direction = 2
  376. msg = b'{ "TerminalID": %d, "DispatchDirection": %d, "ProcessControl": 1, "OutPutDo": { "Do0": 0, "Do1": 0, "Do2": 0, "Do3": 0, "Do4": 0, "Do5": 0, "Do6": 0, "Do7": 0 }}' % (
  377. int(mcpu_key_list[2]) - 1, dispatch_direction)
  378. key = mcpu_key_list[0] + ":mcpu_" + mcpu_key_list[2]
  379. g_mcpu.publish(key, msg)
  380. def drawSpaceBtn(self, parkspace_dict, unit):
  381. for park, position in zip(parkspace_dict.values(), self.btn_positions):
  382. btn = QPBtn()
  383. str = "车位:%d\n楼层:%d" % ((park["id"] - 1) % 78 + 1, park["floor"])
  384. if park["statu"] == 1:
  385. btn.setStyleSheet("background-color:rgb(255,130,130)")
  386. elif park["statu"] == 0 and park["car_number"] is not None:
  387. btn.setStyleSheet("background-color:rgb(248,239,71)")
  388. btn.setGeometry(0, 0, 50, 50)
  389. btn.setText(str)
  390. tool_tip = '{"id":%d,\n"floor":%d,\n "subID":%d, \n"height":%f, \n"car_number":"%s" ,\n "unit":%d, \n"statu":%d}' % (
  391. park["id"], park["floor"], park["subID"], park["height"], park["car_number"], park["unit"],
  392. park["statu"])
  393. btn.setToolTip(tool_tip)
  394. btn.clickedSignal.connect(self.park_btn_click)
  395. if unit == 1:
  396. self.ui.A_gridLayout.addWidget(btn, *position)
  397. if unit == 2:
  398. self.ui.B_gridLayout.addWidget(btn, *position)
  399. if unit == 3:
  400. self.ui.C_gridLayout.addWidget(btn, *position)
  401. def process_btn_click(self, flag):
  402. if flag is False:
  403. sender = self.sender()
  404. tool_tip = sender.toolTip()
  405. dict = json.loads(tool_tip)
  406. menu = QMenu(self)
  407. action = menu.addAction('清除')
  408. action.triggered.connect(partial(self.process_delete, dict))
  409. menu.exec_(QCursor.pos())
  410. def park_btn_click(self, flag):
  411. if flag is False:
  412. sender = self.sender()
  413. tool_tip = sender.toolTip()
  414. dict = json.loads(tool_tip)
  415. menu = QMenu(self)
  416. action = menu.addAction('启用车位')
  417. action.triggered.connect(partial(self.btn_opeSpace, dict, 0))
  418. action = menu.addAction('停用车位')
  419. action.triggered.connect(partial(self.btn_disableSpace, dict, 1))
  420. action = menu.addAction('清除车位')
  421. action.triggered.connect(partial(self.btn_clearSpace, dict))
  422. action = menu.addAction('取出车辆')
  423. action.triggered.connect(partial(self.btn_pickUp, dict))
  424. menu.exec_(QCursor.pos())
  425. def btn_disableSpace(self, dict, statu):
  426. if g_space.statu is False:
  427. QMessageBox.warning(self, '警告', '数据库连接错误,请检查网络状态!',
  428. QMessageBox.Ok) # "退出"代表的是弹出框的标题,"你确认退出.."表示弹出框的内容
  429. else:
  430. g_space.updatePark(dict, statu)
  431. def btn_opeSpace(self, dict, statu):
  432. if g_space.statu is False:
  433. QMessageBox.warning(self, '错误', '数据库连接错误,请检查网络状态!',
  434. QMessageBox.Ok) # "退出"代表的是弹出框的标题,"你确认退出.."表示弹出框的内容
  435. else:
  436. g_space.updatePark(dict, statu)
  437. def btn_clearSpace(self, dict):
  438. if g_space.statu is False:
  439. QMessageBox.warning(self, '错误', '数据库连接错误,请检查网络状态!',
  440. QMessageBox.Ok) # "退出"代表的是弹出框的标题,"你确认退出.."表示弹出框的内容
  441. else:
  442. g_space.clearPark(dict)
  443. def btn_pickUp(self, dict):
  444. if g_space.statu is False:
  445. QMessageBox.warning(self, '错误', '数据库连接错误,请检查网络状态!',
  446. QMessageBox.Ok) # "退出"代表的是弹出框的标题,"你确认退出.."表示弹出框的内容
  447. else:
  448. g_space.pickUpPark(dict)
  449. def process_delete(self, dict):
  450. if g_space.statu is False:
  451. QMessageBox.warning(self, '错误', '数据库连接错误,请检查网络状态!',
  452. QMessageBox.Ok) # "退出"代表的是弹出框的标题,"你确认退出.."表示弹出框的内容
  453. else:
  454. g_space.processDelete(dict)
  455. def run(self):
  456. while self.isClose is not True:
  457. if g_space.statu is False:
  458. self.setWindowTitle("MainWindow---连接错误!")
  459. self.setEnabled(False)
  460. else:
  461. self.setWindowTitle("MainWindow---连接正常!")
  462. self.setEnabled(True)
  463. if g_space.isUpdate_A is True:
  464. self.drawSpaceBtnSignal.emit(g_space.a_unit_park_dict, 1)
  465. g_space.isUpdate_A = False
  466. if g_space.isUpdate_B is True:
  467. self.drawSpaceBtnSignal.emit(g_space.b_unit_park_dict, 2)
  468. g_space.isUpdate_B = False
  469. if g_space.isUpdate_C is True:
  470. self.drawSpaceBtnSignal.emit(g_space.c_unit_park_dict, 3)
  471. g_space.isUpdate_C = False
  472. for list in statu_ex_keys:
  473. ex_name = list[0]
  474. key = list[1]
  475. id = ex_name + ":" + key
  476. if (id in self.rmq_statu.keys()) is False or self.rmq_statu[id].statu != g_rabbitmq[id].statu or \
  477. self.rmq_timeout[id] != g_rabbitmq[id].timeout():
  478. self.rmq_timeout[id] = g_rabbitmq[id].timeout()
  479. self.rmq_statu[id] = g_rabbitmq[id]
  480. g_space.commandIsUpdate = True
  481. self.drawRmqBtnSignal.emit(list)
  482. time.sleep(0.01)
  483. if g_space.commandIsUpdate is True:
  484. self.drawLedSignal.emit()
  485. self.drawUnitProcessSignal.emit()
  486. g_space.commandIsUpdate = False
  487. for key, statu in g_mcpu.GetAllMcpuConnectStatus().items():
  488. self.drawMcpuBtnSignal.emit(key)
  489. time.sleep(0.01)
  490. time.sleep(0.5)
  491. def closeEvent(self, event):
  492. results = QMessageBox.question(self, '退出', '你确定要退出吗?', QMessageBox.Yes | QMessageBox.No,
  493. QMessageBox.No) # "退出"代表的是弹出框的标题,"你确认退出.."表示弹出框的内容
  494. if results == QMessageBox.Yes:
  495. g_rabbitmq.close()
  496. g_mcpu.McpuCommunicatorUnInit()
  497. g_space.close()
  498. self.isClose = True
  499. event.accept() # 接受关闭事件
  500. else:
  501. event.ignore() # 忽略关闭事件
  502. g_rabbitmq = cmt.RabbitAsyncCommunicator(mq_ip, mq_port, mq_user, mq_password)
  503. g_space = spmng.ParkManage(db_ip, db_port, db_name, db_user, db_password, g_rabbitmq)
  504. g_mcpu = mcn.McpuCommunicator(mcpu_keys)
  505. if __name__ == '__main__':
  506. app = QApplication(sys.argv)
  507. g_space.start()
  508. g_rabbitmq.Init(None, statu_ex_keys)
  509. g_rabbitmq.start()
  510. g_mcpu.McpuCommunicatorInit()
  511. mainWindow = MainWindow()
  512. mainWindow.start()
  513. mainWindow.showMaximized()
  514. time.sleep(0.5)
  515. mainWindow.show()
  516. sys.exit(app.exec_())
  517. # 进入程序的主循环,并通过exit函数确保主循环安全结束(该释放资源的一定要释放)