#!/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 = 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!")
        else:
            log("Failed to connect!")
            raise Exception("Failed to connect!")

    def _writeline(self, line):
        log("Sending '" + line + "'... ")
        self.comConnection.write(line.encode() + b"\n")

    def _readline(self):
        line = self.comConnection.readline().decode().strip()
        log("Received '" + line + "' !")
        return line

    def sendCommand(self, cmd):
        self.comConnection.flushInput()
        self._writeline(cmd)

#ardvindo = Ardvindo(serial.tools.list_ports.comports()[0][0])
ardvindo = Ardvindo("/dev/ardvindo")

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