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()
 | 
						|
 |