|
@@ -0,0 +1,67 @@
|
|
|
+#!/usr/bin/python3
|
|
|
+
|
|
|
+import serial
|
|
|
+import serial.tools.list_ports
|
|
|
+import time
|
|
|
+import datetime
|
|
|
+import socket
|
|
|
+import socketserver
|
|
|
+
|
|
|
+def log(msg):
|
|
|
+ print("[" + str(datetime.datetime.now()) + "] " + msg)
|
|
|
+
|
|
|
+class Ardvindo:
|
|
|
+
|
|
|
+ def __init__(self, comPort):
|
|
|
+ self.comPort = comPort
|
|
|
+ self.comConnection = None
|
|
|
+ self.connect()
|
|
|
+
|
|
|
+ def connected(self):
|
|
|
+ return self.comConnection != None and self.ping()
|
|
|
+
|
|
|
+ def reconnect(self):
|
|
|
+ while True:
|
|
|
+ if self.comConnection != None:
|
|
|
+ self.comConnection.close()
|
|
|
+ self.comConnection = serial.Serial(self.comPort, 9600, timeout = 0.5)
|
|
|
+ # establishing an serial connection automatically resets the arduino
|
|
|
+ # wait for arduino to restart
|
|
|
+ time.sleep(4)
|
|
|
+ if self._readline() == "ardvindo started":
|
|
|
+ log("Connection established!")
|
|
|
+ break
|
|
|
+ else:
|
|
|
+ log("Failed to connect!")
|
|
|
+
|
|
|
+ def connect(self):
|
|
|
+ if not self.connected():
|
|
|
+ self.reconnect()
|
|
|
+
|
|
|
+ def ping(self):
|
|
|
+ return self.sendCommand("i") == "ardvindo"
|
|
|
+
|
|
|
+ def _readline(self):
|
|
|
+ line = self.comConnection.readline().decode().strip()
|
|
|
+ log("Received '" + line + "' !")
|
|
|
+ return line
|
|
|
+
|
|
|
+ def sendCommand(self, cmd):
|
|
|
+ log("Sending command '" + cmd + "' ...")
|
|
|
+ self.comConnection.write((cmd + "\n").encode())
|
|
|
+ return self._readline()
|
|
|
+
|
|
|
+ardvindo = Ardvindo(serial.tools.list_ports.comports()[0][0])
|
|
|
+
|
|
|
+class ServerRequestHandler(socketserver.BaseRequestHandler):
|
|
|
+
|
|
|
+ def handle(self):
|
|
|
+ data = self.request[0].decode().strip()
|
|
|
+ ardvindo.sendCommand(data)
|
|
|
+
|
|
|
+server = socketserver.UDPServer(('', 61291), ServerRequestHandler)
|
|
|
+log("Server is started!")
|
|
|
+
|
|
|
+log("Waiting for commands... ")
|
|
|
+server.serve_forever()
|
|
|
+
|