|  |  |  | #!/usr/bin/env python
 | 
					
						
							|  |  |  | from common.numpy_fast import clip
 | 
					
						
							|  |  |  | from common.params import Params
 | 
					
						
							|  |  |  | from copy import copy
 | 
					
						
							|  |  |  | from cereal import car, log
 | 
					
						
							|  |  |  | import cereal.messaging as messaging
 | 
					
						
							|  |  |  | from selfdrive.car.car_helpers import get_car, get_one_can
 | 
					
						
							|  |  |  | from selfdrive.boardd.boardd import can_list_to_can_capnp
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | HwType = log.HealthData.HwType
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def steer_thread():
 | 
					
						
							|  |  |  |   poller = messaging.Poller()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   logcan = messaging.sub_sock('can')
 | 
					
						
							|  |  |  |   health = messaging.sub_sock('health')
 | 
					
						
							|  |  |  |   joystick_sock = messaging.sub_sock('testJoystick', conflate=True, poller=poller)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   carstate = messaging.pub_sock('carState')
 | 
					
						
							|  |  |  |   carcontrol = messaging.pub_sock('carControl')
 | 
					
						
							|  |  |  |   sendcan = messaging.pub_sock('sendcan')
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   button_1_last = 0
 | 
					
						
							|  |  |  |   enabled = False
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # wait for health and CAN packets
 | 
					
						
							|  |  |  |   hw_type = messaging.recv_one(health).health.hwType
 | 
					
						
							|  |  |  |   has_relay = hw_type in [HwType.blackPanda, HwType.uno, HwType.dos]
 | 
					
						
							|  |  |  |   print("Waiting for CAN messages...")
 | 
					
						
							|  |  |  |   get_one_can(logcan)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   CI, CP = get_car(logcan, sendcan, has_relay)
 | 
					
						
							|  |  |  |   Params().put("CarParams", CP.to_bytes())
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   CC = car.CarControl.new_message()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   while True:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # send
 | 
					
						
							|  |  |  |     joystick = messaging.recv_one(joystick_sock)
 | 
					
						
							|  |  |  |     can_strs = messaging.drain_sock_raw(logcan, wait_for_one=True)
 | 
					
						
							|  |  |  |     CS = CI.update(CC, can_strs)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Usually axis run in pairs, up/down for one, and left/right for
 | 
					
						
							|  |  |  |     # the other.
 | 
					
						
							|  |  |  |     actuators = car.CarControl.Actuators.new_message()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if joystick is not None:
 | 
					
						
							|  |  |  |       axis_3 = clip(-joystick.testJoystick.axes[3] * 1.05, -1., 1.)          # -1 to 1
 | 
					
						
							|  |  |  |       actuators.steer = axis_3
 | 
					
						
							|  |  |  |       actuators.steerAngle = axis_3 * 43.   # deg
 | 
					
						
							|  |  |  |       axis_1 = clip(-joystick.testJoystick.axes[1] * 1.05, -1., 1.)          # -1 to 1
 | 
					
						
							|  |  |  |       actuators.gas = max(axis_1, 0.)
 | 
					
						
							|  |  |  |       actuators.brake = max(-axis_1, 0.)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       pcm_cancel_cmd = joystick.testJoystick.buttons[0]
 | 
					
						
							|  |  |  |       button_1 = joystick.testJoystick.buttons[1]
 | 
					
						
							|  |  |  |       if button_1 and not button_1_last:
 | 
					
						
							|  |  |  |         enabled = not enabled
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       button_1_last = button_1
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       #print "enable", enabled, "steer", actuators.steer, "accel", actuators.gas - actuators.brake
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       hud_alert = 0
 | 
					
						
							|  |  |  |       if joystick.testJoystick.buttons[3]:
 | 
					
						
							|  |  |  |         hud_alert = "steerRequired"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     CC.actuators.gas = actuators.gas
 | 
					
						
							|  |  |  |     CC.actuators.brake = actuators.brake
 | 
					
						
							|  |  |  |     CC.actuators.steer = actuators.steer
 | 
					
						
							|  |  |  |     CC.actuators.steerAngle = actuators.steerAngle
 | 
					
						
							|  |  |  |     CC.hudControl.visualAlert = hud_alert
 | 
					
						
							|  |  |  |     CC.hudControl.setSpeed = 20
 | 
					
						
							|  |  |  |     CC.cruiseControl.cancel = pcm_cancel_cmd
 | 
					
						
							|  |  |  |     CC.enabled = enabled
 | 
					
						
							|  |  |  |     can_sends = CI.apply(CC)
 | 
					
						
							|  |  |  |     sendcan.send(can_list_to_can_capnp(can_sends, msgtype='sendcan'))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # broadcast carState
 | 
					
						
							|  |  |  |     cs_send = messaging.new_message('carState')
 | 
					
						
							|  |  |  |     cs_send.carState = copy(CS)
 | 
					
						
							|  |  |  |     carstate.send(cs_send.to_bytes())
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # broadcast carControl
 | 
					
						
							|  |  |  |     cc_send = messaging.new_message('carControl')
 | 
					
						
							|  |  |  |     cc_send.carControl = copy(CC)
 | 
					
						
							|  |  |  |     carcontrol.send(cc_send.to_bytes())
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__":
 | 
					
						
							|  |  |  |   steer_thread()
 |