#!/usr/bin/env python import time import numpy as np import zmq from evdev import InputDevice from select import select from cereal import car from common.realtime import Ratekeeper import selfdrive.messaging as messaging from selfdrive.services import service_list from selfdrive.car import get_car 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) CI, CP = get_car(logcan, sendcan) CC = car.CarControl.new_message() 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(CC) #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()