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