#!/usr/bin/env python3 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  time 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  threading 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  flask  import  Flask 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  cereal . messaging  as  messaging 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								app  =  Flask ( __name__ ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								pm  =  messaging . PubMaster ( [ ' testJoystick ' ] ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								index  =  """ 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< html > 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< head > 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< script  src = " https://github.com/bobboteck/JoyStick/releases/download/v1.1.6/joy.min.js " > < / script > 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< / head > 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< body > 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< div  id = " joyDiv "  style = " width:100 % ;height:100 % " > < / div > 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< script  type = " text/javascript " > 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								/ /  Set  up  gamepad  handlers 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								let  gamepad  =  null ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								window . addEventListener ( " gamepadconnected " ,  function ( e )  { 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  gamepad  =  e . gamepad ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ) ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								window . addEventListener ( " gamepaddisconnected " ,  function ( e )  { 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  gamepad  =  null ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ) ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/ /  Create  JoyStick  object  into  the  DIV  ' joyDiv ' 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								var  joy  =  new  JoyStick ( ' joyDiv ' ) ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								setInterval ( function ( ) { 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  var  x  =  - joy . GetX ( ) / 100 ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  var  y  =  joy . GetY ( ) / 100 ; 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  if  ( x  == =  0  & &  y  == =  0  & &  gamepad  != =  null )  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    let  gamepadstate  =  navigator . getGamepads ( ) [ gamepad . index ] ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    x  =  - gamepadstate . axes [ 0 ] ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    y  =  - gamepadstate . axes [ 1 ] ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  let  xhr  =  new  XMLHttpRequest ( ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  xhr . open ( " GET " ,  " /control/ " + x + " / " + y ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  xhr . send ( ) ; 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ,  50 ) ; 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< / script > 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								""" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								@app . route ( " / " ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  hello_world ( ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  return  index 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								last_send_time  =  time . monotonic ( ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								@app . route ( " /control/<x>/<y> " ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  control ( x ,  y ) : 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  global  last_send_time 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  x , y  =  float ( x ) ,  float ( y ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  x  =  max ( - 1 ,  min ( 1 ,  x ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  y  =  max ( - 1 ,  min ( 1 ,  y ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  dat  =  messaging . new_message ( ' testJoystick ' ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  dat . testJoystick . axes  =  [ y , x ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  dat . testJoystick . buttons  =  [ False ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  pm . send ( ' testJoystick ' ,  dat ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  last_send_time  =  time . monotonic ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  return  " " 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								def  handle_timeout ( ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  while  1 : 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    this_time  =  time . monotonic ( ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( last_send_time + 0.5 )  <  this_time : 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      #print("timeout, no web in %.2f s" % (this_time-last_send_time)) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      dat  =  messaging . new_message ( ' testJoystick ' ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      dat . testJoystick . axes  =  [ 0 , 0 ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      dat . testJoystick . buttons  =  [ False ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      pm . send ( ' testJoystick ' ,  dat ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    time . sleep ( 0.1 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								def  main ( ) : 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  threading . Thread ( target = handle_timeout ,  daemon = True ) . start ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  app . run ( host = " 0.0.0.0 " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								if  __name__  ==  ' __main__ ' : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  main ( )