#!/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()
