ardvindo-server.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #!/usr/bin/python3
  2. import serial
  3. import serial.tools.list_ports
  4. import time
  5. import datetime
  6. import socket
  7. import socketserver
  8. def log(msg):
  9. print("[" + str(datetime.datetime.now()) + "] " + msg)
  10. class Ardvindo:
  11. def __init__(self, comPort):
  12. self.comPort = comPort
  13. self.comConnection = None
  14. self.connect()
  15. def connected(self):
  16. return self.comConnection != None and self.ping()
  17. def reconnect(self):
  18. while True:
  19. if self.comConnection != None:
  20. self.comConnection.close()
  21. self.comConnection = serial.Serial(self.comPort, 9600, timeout = 0.5)
  22. # establishing an serial connection automatically resets the arduino
  23. # wait for arduino to restart
  24. time.sleep(4)
  25. if self._readline() == "ardvindo started":
  26. log("Connection established!")
  27. break
  28. else:
  29. log("Failed to connect!")
  30. def connect(self):
  31. if not self.connected():
  32. self.reconnect()
  33. def ping(self):
  34. return self.sendCommand("i") == "ardvindo"
  35. def _readline(self):
  36. line = self.comConnection.readline().decode().strip()
  37. log("Received '" + line + "' !")
  38. return line
  39. def sendCommand(self, cmd):
  40. log("Sending command '" + cmd + "' ...")
  41. self.comConnection.write((cmd + "\n").encode())
  42. return self._readline()
  43. ardvindo = Ardvindo(serial.tools.list_ports.comports()[0][0])
  44. class ServerRequestHandler(socketserver.BaseRequestHandler):
  45. def handle(self):
  46. data = self.request[0].decode().strip()
  47. ardvindo.sendCommand(data)
  48. server = socketserver.UDPServer(('', 61291), ServerRequestHandler)
  49. log("Server is started!")
  50. log("Waiting for commands... ")
  51. server.serve_forever()