CheckEntrance.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. import datetime
  2. import threading
  3. import time
  4. import async_communication as CM
  5. import message_pb2 as message
  6. import google.protobuf.text_format as tf
  7. MeasureStatu={"ok":0,"无数据":1,"噪声":2,"超界":3}
  8. ArrowType={0:"正确图片",0x01:"向后调整",0x02:"向前调整",0x04:"向右调整",0x08:"向左调整"
  9. ,0x10:"左前调整",0x06:"右前调整",0x09:"右后调整",0x05:"左后调整"}
  10. class EntranceChecker(threading.Thread):
  11. def __init__(self):
  12. threading.Thread.__init__(self)
  13. self.icpu_statu = CM.TimeStatu(timeout=0.1)
  14. self.measure_statu = CM.TimeStatu(timeout=0.1)
  15. self.last_door_statu=None
  16. self.last_moving_statu = None
  17. self.last_show = None
  18. self.lock = threading.Lock()
  19. self.error_str=""
  20. self.is_close = False
  21. def receive_icpu(self,statu):
  22. self.icpu_statu=statu
  23. def receive_measureInfo(self,statu):
  24. self.measure_statu=statu
  25. def exit_isOK(self, pick_table):
  26. if pick_table.primary_key is None:
  27. pick_table.statu.execute_statu = message.eError
  28. pick_table.statu.statu_description = " 唯一码不能为空!"
  29. return tf.MessageToString(pick_table, as_utf8=True)
  30. return tf.MessageToString(pick_table, as_utf8=True)
  31. def entrance_isOK(self,park_table):
  32. park = message.park_table()
  33. park.CopyFrom(park_table)
  34. measure_info = message.measure_info()
  35. tf.Parse(self.measure_statu.statu, measure_info)
  36. tm = time.time()
  37. if self.error_str == 'OK':
  38. while time.time() - tm < 0.5:
  39. if measure_info.border_statu == MeasureStatu["ok"] and measure_info.ground_status == 0:
  40. park.statu.execute_statu = message.eNormal
  41. park.statu.statu_description = self.error_str
  42. park.entrance_measure_info.CopyFrom(measure_info)
  43. im_mcpu_statu = message.in_mcpu_statu()
  44. tf.Parse(self.icpu_statu.statu, im_mcpu_statu)
  45. if im_mcpu_statu.heighth == 2:
  46. park.entrance_measure_info.height = 1.50
  47. elif im_mcpu_statu.heighth == 3:
  48. park.entrance_measure_info.height = 1.70
  49. elif im_mcpu_statu.heighth == 4:
  50. park.entrance_measure_info.height = 1.90
  51. return tf.MessageToString(park, as_utf8=True)
  52. time.sleep(0.1)
  53. park.statu.execute_statu = message.eError
  54. park.statu.statu_description = "请检查入口处是否有人员逗留!"
  55. return tf.MessageToString(park, as_utf8=True)
  56. else:
  57. park.statu.execute_statu = message.eError
  58. park.statu.statu_description = self.error_str
  59. return tf.MessageToString(park, as_utf8=True)
  60. def run(self):
  61. while self.is_close is False:
  62. # print(self.error_str)
  63. time.sleep(0.05)
  64. #先判断连接状态
  65. if self.icpu_statu.timeout():
  66. self.error_str="服务器超时,请联系管理员!"
  67. continue
  68. if self.measure_statu.timeout():
  69. self.error_str='服务器超时,请联系管理员!'
  70. continue
  71. #有车才显示
  72. icpu_statu=message.in_mcpu_statu()
  73. try:
  74. tf.Parse(self.icpu_statu.statu,icpu_statu)
  75. except:
  76. print(self.icpu_statu.statu)
  77. continue
  78. if icpu_statu.heighth == 1:
  79. self.error_str = '未知车高!'
  80. continue
  81. if icpu_statu.heighth == 5:
  82. self.error_str = '车辆超高!'
  83. continue
  84. #以下是有车的处理
  85. #1,显示测量数据(实时和静态)
  86. measure_info=message.measure_info()
  87. tf.Parse(self.measure_statu.statu,measure_info)
  88. #2,获取车辆运动状态(静止or动态)
  89. border_statu=measure_info.border_statu
  90. is_moving = ((border_statu >> 11) & 0x01) == 1
  91. lidar_statu=measure_info.ground_status # 测量状态(正常,无数据、噪声、超界)
  92. if is_moving:
  93. self.last_moving_statu=None
  94. else:
  95. #当前静止
  96. if lidar_statu==MeasureStatu["ok"]:
  97. self.last_moving_statu=measure_info
  98. elif lidar_statu==MeasureStatu["超界"]:
  99. if not self.last_moving_statu ==None:
  100. #上一刻静止且数据正确,当前静止,不可能出现超界,将超界清除
  101. new_border=border_statu
  102. new_border = (new_border & (~(0x01 << 0)))
  103. new_border = (new_border & (~(0x01 << 1)))
  104. new_border = (new_border & (~(0x01 << 2)))
  105. new_border = (new_border & (~(0x01 << 3)))
  106. new_border = (new_border & (~(0x01 << 6)))
  107. new_border = (new_border & (~(0x01 << 7)))
  108. new_border = (new_border & (~(0x01 << 8)))
  109. new_border = (new_border & (~(0x01 << 9)))
  110. border_statu=new_border
  111. elif lidar_statu==MeasureStatu["无数据"]:
  112. #当前静止无车,清除上一时刻数据
  113. self.last_moving_statu=None
  114. elif lidar_statu==MeasureStatu["噪声"]:
  115. if not self.last_moving_statu==None:
  116. #上一时刻静止且正确,当前噪声,不显示当前数据,显示上一正确数据
  117. measure_info.CopyFrom(self.last_moving_statu)
  118. #先判断光电
  119. if is_moving:
  120. if icpu_statu.back_io==1:
  121. self.error_str='请按提示调整!'
  122. self.last_show="调整"
  123. continue
  124. #光电正常
  125. if lidar_statu==MeasureStatu["无数据"]and icpu_statu.is_occupy != 2:
  126. self.error_str='无车!'
  127. self.last_show="空闲"
  128. continue
  129. elif lidar_statu==MeasureStatu["噪声"]:
  130. if self.last_show=="超时":
  131. self.error_str='雷达噪声'
  132. self.last_show="空闲"
  133. continue
  134. elif lidar_statu==MeasureStatu["ok"]:
  135. self.error_str='OK'
  136. continue
  137. elif lidar_statu==MeasureStatu["超界"]:
  138. if (border_statu>>7)&0x01==1:
  139. self.error_str='轴距不满足规格,请驶出!'
  140. self.last_show="轴距超差"
  141. continue
  142. if (border_statu>>9)&0x01==1:
  143. self.error_str='请按提示调整!'
  144. self.last_show="请调整"
  145. continue
  146. if (border_statu>>8)&0x01==1:
  147. self.error_str='请按提示调整!'
  148. self.last_show="请调整"
  149. continue
  150. if (border_statu>>10)&0x01==1:
  151. self.error_str='请按提示调整!'
  152. self.last_show="请调整"
  153. continue
  154. if (border_statu>>6)&0x01==1:
  155. self.error_str='车宽不满足规格,请驶出!'
  156. self.last_show="超宽"
  157. continue
  158. border=border_statu&0x0f
  159. if (border in ArrowType.keys()) is False:
  160. self.error_str='服务器超时,请联系管理员!'
  161. self.last_show = "超时"
  162. else:
  163. if ArrowType[border] == "正确图片":
  164. self.error_str="OK"
  165. self.last_show="正确"
  166. else:
  167. self.error_str="请按提示调整"
  168. self.last_show="请调整"