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.
		
		
		
		
		
			
		
			
				
					
					
						
							78 lines
						
					
					
						
							2.0 KiB
						
					
					
				
			
		
		
	
	
							78 lines
						
					
					
						
							2.0 KiB
						
					
					
				| #!/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()
 | |
| 
 |