led_control_GyBhhy.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import sys
  2. from concurrent.futures import ThreadPoolExecutor
  3. sys.path.append("..")
  4. # 导入pymysql
  5. import socket
  6. import threading
  7. import time
  8. from datetime import datetime
  9. import google.protobuf.text_format as tf
  10. import message_pb2 as message
  11. from led_protocol import LedProtocol
  12. from led_protocol import font_library
  13. class led_control(threading.Thread):
  14. def __init__(self, unit, channel,communication, area_list,db):
  15. threading.Thread.__init__(self)
  16. self._dispatch_statu = {}
  17. self.led_communication = communication
  18. self.area_list = area_list
  19. self.wait_command_dict = {}
  20. self.pick_command_dict = {}
  21. self.db = db
  22. self.unit = unit
  23. self.channel = channel
  24. self.led_protocol = LedProtocol(area_list)
  25. self._pool = ThreadPoolExecutor(max_workers=11)
  26. def led_control_init(self):
  27. unit_char = ""
  28. if self.unit == 1:
  29. unit_char = 'A'
  30. elif self.unit == 2:
  31. unit_char = 'B'
  32. elif self.unit == 11:
  33. unit_char = 'A1'
  34. elif self.unit == 12:
  35. unit_char = 'A2'
  36. elif self.unit == 13:
  37. unit_char = 'A3'
  38. elif self.unit == 14:
  39. unit_char = 'A4'
  40. elif self.unit == 21:
  41. unit_char = 'BA1'
  42. elif self.unit == 22:
  43. unit_char = 'B2'
  44. elif self.unit == 23:
  45. unit_char = 'B3'
  46. elif self.unit == 24:
  47. unit_char = 'B4'
  48. elif self.unit == 25:
  49. unit_char = 'B5'
  50. elif self.unit == 31:
  51. unit_char = 'C1'
  52. elif self.unit == 32:
  53. unit_char = 'C2'
  54. self.send_led_msg(0, unit_char,en_font=font_library["EN32"])
  55. def receive_dispatch_statu(self, statu, ex, key):
  56. self._dispatch_statu[key] = statu
  57. def get_wait_led_string(self,cmd_queue):
  58. if len(cmd_queue) == 0:
  59. return ""
  60. led_show_string = ""
  61. for num, cmd in zip(range(0, len(cmd_queue)), cmd_queue):
  62. led_show_string = led_show_string + "%d#%s " % (num + 1, cmd['car_number'])
  63. led_show_string = "候车:"+led_show_string
  64. return led_show_string
  65. def get_pick_led_string(self, cmd_queue):
  66. if len(cmd_queue) == 0:
  67. return "等待分配!"
  68. led_show_string = cmd_queue[0]['car_number']+" 取车中,请稍候!"
  69. return led_show_string
  70. def send_led_msg(self, area_index, input, en_font=font_library["EN16"], cn_font=font_library["CN16"]):
  71. t_time = datetime.now()
  72. while (datetime.now() - t_time).microseconds < 30000:
  73. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  74. sock.settimeout(1)
  75. try:
  76. sock.connect((self.led_communication['ip'], self.led_communication['port']))
  77. sock.send(self.led_protocol.string2bytes(area_index, input, en_font, cn_font))
  78. print("connected led \033[0:32mSUCCEND\033[m ip:%s port:%d\nsend msg area_index:%d msg:%s" % (
  79. self.led_communication['ip'], self.led_communication['port'], area_index, input))
  80. break
  81. except Exception as e:
  82. print("connected led \033[0:31mERROR\033[m: %s time:%s msg=%s" % (str(e.args),datetime.now(),input))
  83. time.sleep(0.01)
  84. sock.close()
  85. time.sleep(0.1)
  86. def run(self):
  87. self.led_control_init()
  88. while True:
  89. wait_cmd_dict = self.db.query_pick_command_in_unit_and_statu(self.unit, 0)
  90. pick_cmd_dict = self.db.query_pick_command_in_unit_and_statu(self.unit, 1)
  91. if self.wait_command_dict != wait_cmd_dict:
  92. self.wait_command_dict = wait_cmd_dict
  93. led_show_string = self.get_wait_led_string(wait_cmd_dict)
  94. self._pool.submit(self.send_led_msg,1, led_show_string)
  95. key = "dispatch_%d_statu_port" % self.unit
  96. if (key in self._dispatch_statu) is False or self._dispatch_statu[key].timeout():
  97. print('ERROR --- 调度节点未连接----key:%s---------time:%s'%(key,datetime.now()))
  98. else:
  99. dispatch_node_statu = message.dispatch_node_statu()
  100. try:
  101. tf.Parse(self._dispatch_statu[key].statu, dispatch_node_statu)
  102. if dispatch_node_statu.plc_carrier_status == 0:
  103. self.send_led_msg(2, "故障!!!")
  104. elif dispatch_node_statu.plc_carrier_status == 4:
  105. self.send_led_msg(2, "维护中!")
  106. break
  107. except Exception:
  108. print('ERROR --- 调度状态消息解析错误 key:%s time:%s message:\n%s'% (key,datetime.now(),self._dispatch_statu[key].statu))
  109. if self.pick_command_dict != pick_cmd_dict:
  110. self.pick_command_dict = pick_cmd_dict
  111. led_show_string = self.get_pick_led_string(pick_cmd_dict)
  112. self._pool.submit(self.send_led_msg,2, led_show_string)
  113. time.sleep(1)