| 
					
				 | 
			
			
				@@ -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() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 |