#!/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()