No Description
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.

CatToy.py 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. from wifi import Wifi
  2. from config import Config
  3. from toy import Toy
  4. max_laser_power = 0.25
  5. html = """<!DOCTYPE html>
  6. <html>
  7. <head>
  8. <title>Cat Toy</title>
  9. </head>
  10. <body>
  11. <h1>Cat Toy</h1>
  12. %s
  13. <h2>Laser Pointer</h2>
  14. <form action="/laser" method="get">
  15. Turn power:
  16. <input type="range" name="s" min="0" max="100" step="1" value="%d">
  17. <input type="submit" value="Set"><br>
  18. </form>
  19. <form action="/laser" method="get">
  20. Or just turn it:
  21. <input type="submit" name="s" value="Off">
  22. </form>
  23. <h2>Pan and Tilt Servos</h2>
  24. <form action="/servos" method="get">
  25. Pan: <input type="text" name="s1"><br>
  26. Tilt: <input type="text" name="s2"><br>
  27. <input type="submit" value="Move">
  28. </form>
  29. %s
  30. </body>
  31. </html>
  32. """
  33. t = Toy()
  34. def rootCallback(request):
  35. return html % (
  36. '<p>Welcome to the Cat Toy interface by <a href="https://www.xythobuz.de">xythobuz</a>.</p>',
  37. round(max_laser_power * 100.0),
  38. ''
  39. )
  40. def servoCallback(request):
  41. q = request.find("/servos?")
  42. p1 = request.find("s1=")
  43. p2 = request.find("s2=")
  44. if (q < 0) or (p1 < 0) or (p2 < 0):
  45. return html % (
  46. '<p>Error: no servo arguments found in URL query string.</p>',
  47. round(max_laser_power * 100.0),
  48. '<p><a href="/">Back to main page</a></p>'
  49. )
  50. servos = [p1, p2]
  51. result = []
  52. for p in servos:
  53. pe = request.find("&s", p)
  54. if (pe < 0) or (p + 3 >= pe) or (pe - (p + 3) > 3):
  55. pe = request.find(" HTTP", p)
  56. if (pe < 0) or (p + 3 >= pe) or (pe - (p + 3) > 3):
  57. return html % (
  58. '<p>Error parsing query string.</p>',
  59. round(max_laser_power * 100.0),
  60. '<p><a href="/">Back to main page</a></p>'
  61. )
  62. r = request[p + 3 : pe]
  63. s = int(r)
  64. result.append(s)
  65. if result[0] < t.pan_min:
  66. result[0] = t.pan_min
  67. if result[0] > t.pan_max:
  68. result[0] = t.pan_max
  69. t.angle(t.pan, result[0])
  70. if result[1] < t.tilt_min:
  71. result[1] = t.tilt_min
  72. if result[1] > t.tilt_max:
  73. result[1] = t.tilt_max
  74. t.angle(t.tilt, result[1])
  75. return html % (
  76. '<p>Servos move to s1=' + str(result[0]) + ' s2=' + str(result[1]) + '.</p>',
  77. round(max_laser_power * 100.0),
  78. '<p><a href="/">Back to main page</a></p>'
  79. )
  80. def laserCallback(request):
  81. value = 0.0
  82. text = "off"
  83. if request.find("?s=") == 10:
  84. pe = request.find(" HTTP", 10)
  85. r = request[13 : pe]
  86. if r != "Off":
  87. value = int(r)
  88. text = "to " + str(r) + '%'
  89. t.laser(value / 100.0)
  90. return html % (
  91. '<p>Laser turned ' + text + '!</p>',
  92. round(max_laser_power * 100.0),
  93. '<p><a href="/">Back to main page</a></p>'
  94. )
  95. w = Wifi(Config.ssid, Config.password)
  96. w.add_handler("/", rootCallback)
  97. w.add_handler("/servos", servoCallback)
  98. w.add_handler("/laser", laserCallback)
  99. w.listen()