CheckEntrance.py 7.9 KB

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