You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							94 lines
						
					
					
						
							2.4 KiB
						
					
					
				
			
		
		
	
	
							94 lines
						
					
					
						
							2.4 KiB
						
					
					
				#!/usr/bin/env python
 | 
						|
from evdev import InputDevice
 | 
						|
from select import select
 | 
						|
import time
 | 
						|
import numpy as np
 | 
						|
import zmq
 | 
						|
 | 
						|
from cereal import car
 | 
						|
 | 
						|
import selfdrive.messaging as messaging
 | 
						|
from selfdrive.services import service_list
 | 
						|
from common.realtime import Ratekeeper
 | 
						|
 | 
						|
from common.fingerprints import fingerprint
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
  # ***** connect to joystick *****
 | 
						|
  # we use a Mad Catz V.1
 | 
						|
  dev = InputDevice("/dev/input/event8")
 | 
						|
  print dev
 | 
						|
 | 
						|
  button_values = [0]*7
 | 
						|
  axis_values = [0.0, 0.0, 0.0]
 | 
						|
 | 
						|
  # ***** connect to car *****
 | 
						|
  context = zmq.Context()
 | 
						|
  logcan = messaging.sub_sock(context, service_list['can'].port)
 | 
						|
  sendcan = messaging.pub_sock(context, service_list['sendcan'].port)
 | 
						|
 | 
						|
  CP = fingerprint(logcan)
 | 
						|
  exec('from selfdrive.car.'+CP.carName+'.interface import CarInterface')
 | 
						|
 | 
						|
  CI = CarInterface(CP, logcan, sendcan)
 | 
						|
 | 
						|
  rk = Ratekeeper(100)
 | 
						|
 | 
						|
  while 1:
 | 
						|
    # **** handle joystick ****
 | 
						|
    r, w, x = select([dev], [], [], 0.0)
 | 
						|
    if dev in r:
 | 
						|
      for event in dev.read():
 | 
						|
        # button event
 | 
						|
        if event.type == 1:
 | 
						|
          btn = event.code - 288 
 | 
						|
          if btn >= 0 and btn < 7:
 | 
						|
            button_values[btn] = int(event.value)
 | 
						|
 | 
						|
        # axis move event
 | 
						|
        if event.type == 3:
 | 
						|
          if event.code < 3:
 | 
						|
            if event.code == 2:
 | 
						|
              axis_values[event.code] = np.clip((255-int(event.value))/250.0, 0.0, 1.0)
 | 
						|
            else:
 | 
						|
              DEADZONE = 5 
 | 
						|
              if event.value-DEADZONE < 128 and event.value+DEADZONE > 128:
 | 
						|
                event.value = 128 
 | 
						|
              axis_values[event.code] = np.clip((int(event.value)-128)/120.0, -1.0, 1.0)
 | 
						|
 | 
						|
    print axis_values, button_values
 | 
						|
    # **** handle car ****
 | 
						|
 | 
						|
    CS = CI.update()
 | 
						|
    print CS
 | 
						|
 | 
						|
    CC = car.CarControl.new_message()
 | 
						|
 | 
						|
    CC.enabled = True
 | 
						|
 | 
						|
    CC.gas = float(np.clip(-axis_values[1], 0, 1.0))
 | 
						|
    CC.brake = float(np.clip(axis_values[1], 0, 1.0))
 | 
						|
    CC.steeringTorque = float(axis_values[0])
 | 
						|
 | 
						|
    CC.hudControl.speedVisible = bool(button_values[1])
 | 
						|
    CC.hudControl.lanesVisible = bool(button_values[2])
 | 
						|
    CC.hudControl.leadVisible = bool(button_values[3])
 | 
						|
 | 
						|
    CC.cruiseControl.override = bool(button_values[0])
 | 
						|
    CC.cruiseControl.cancel = bool(button_values[-1])
 | 
						|
 | 
						|
    CC.hudControl.setSpeed = float(axis_values[2] * 100.0)
 | 
						|
 | 
						|
    # TODO: test alerts
 | 
						|
    CC.hudControl.visualAlert = "none"
 | 
						|
    CC.hudControl.audibleAlert = "none"
 | 
						|
 | 
						|
    print CC
 | 
						|
 | 
						|
    if not CI.apply(CC):
 | 
						|
      print "CONTROLS FAILED"
 | 
						|
 | 
						|
    rk.keep_time()
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 |