text: #!/usr/bin/env python3
  from flask import Flask
  import time
  import threading
  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">
  // Create JoyStick object into the DIV 'joyDiv'
  var joy = new JoyStick('joyDiv');
  setInterval(function(){
    var x = -joy.GetX()/100;
    var y = joy.GetY()/100;
    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.time()
  @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.time()
    return ""
  
  def handle_timeout():
    while 1:
      this_time = time.time()
      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)
  
  if __name__ == '__main__':
    threading.Thread(target=handle_timeout, daemon=True).start()
    app.run(host="0.0.0.0")
  
  