#!/usr/bin/env python
# This process publishes joystick events. Such events can be suscribed by
# mocked car controller scripts.
### this process needs pygame and can't run on the EON ###
import pygame # pylint: disable=import-error
import cereal . messaging as messaging
def joystick_thread ( ) :
joystick_sock = messaging . pub_sock ( ' testJoystick ' )
pygame . init ( )
# Used to manage how fast the screen updates
clock = pygame . time . Clock ( )
# Initialize the joysticks
pygame . joystick . init ( )
# Get count of joysticks
joystick_count = pygame . joystick . get_count ( )
if joystick_count > 1 :
raise ValueError ( " More than one joystick attached " )
elif joystick_count < 1 :
raise ValueError ( " No joystick found " )
# -------- Main Program Loop -----------
while True :
# EVENT PROCESSING STEP
for event in pygame . event . get ( ) : # User did something
if event . type == pygame . QUIT : # If user clicked close
pass
# Available joystick events: JOYAXISMOTION JOYBALLMOTION JOYBUTTONDOWN JOYBUTTONUP JOYHATMOTION
if event . type == pygame . JOYBUTTONDOWN :
print ( " Joystick button pressed. " )
if event . type == pygame . JOYBUTTONUP :
print ( " Joystick button released. " )
joystick = pygame . joystick . Joystick ( 0 )
joystick . init ( )
# Usually axis run in pairs, up/down for one, and left/right for
# the other.
axes = [ ]
buttons = [ ]
for a in range ( joystick . get_numaxes ( ) ) :
axes . append ( joystick . get_axis ( a ) )
for b in range ( joystick . get_numbuttons ( ) ) :
buttons . append ( bool ( joystick . get_button ( b ) ) )
dat = messaging . new_message ( ' testJoystick ' )
dat . testJoystick . axes = axes
dat . testJoystick . buttons = buttons
joystick_sock . send ( dat . to_bytes ( ) )
# Limit to 100 frames per second
clock . tick ( 100 )
if __name__ == " __main__ " :
joystick_thread ( )