import sys, getopt, time, struct, termios, fcntl, sys, os, select
from time import sleep
from RenderManager import RenderManager
from WanemManager import WanemManager
from SceneManager import SceneManager


class TouchManager:
    def __init__(self, pScene):
        self.pScene = pScene
        #self.infile_path = "/dev/input/event" + (sys.argv[1] if len(sys.argv) > 1 else "0")
        self.infile_path = "/dev/input/event0"
        self.FORMAT = 'llHHI'
        self.EVENT_SIZE = struct.calcsize(self.FORMAT)
        self.lastPtX = 0
        self.lastPtY = 0
        self.rateX = float(480) / 3900
        self.rateY = float(320) / 3900
        self.sep = 0
        #print str(rateX)
        #print str(rateY)
        self.in_file = open(self.infile_path, "rb")
        flag = fcntl.fcntl(self.in_file, fcntl.F_GETFL)
        fcntl.fcntl(self.in_file, fcntl.F_SETFL, os.O_NONBLOCK)

    def PollEvent(self):

        try:
            event = self.in_file.read(self.EVENT_SIZE)
        except IOError, e:
            if e.errno == 11:
                return False

        (tv_sec, tv_usec, type, code,
         value) = struct.unpack(self.FORMAT, event)

        if type != 0 or code != 0 or value != 0:
            #print("Event type %u, code %u, value %u at %d.%d" % (type, code, value, tv_sec, tv_usec))
            # Events with code, type and value == 0 are "separator" events
            if code == 0:
                self.lastPtX = int(value * self.rateX)
                #self.sep = 0
            elif code == 1:
                self.lastPtY = int(value * self.rateY)
                if self.sep == 1:
                    self.sep = 0
                    #fDownCallback(pWanem, self.lastPtX, self.lastPtY)
                    self.pScene.TouchDownHandler(self.lastPtX, self.lastPtY)
            elif code == 330:
                self.sep = 1
            elif code == 24:
                if self.sep == 1:
                    self.sep = 0
                    #fUpCallback(pWanem, self.lastPtX, self.lastPtY)
                    self.pScene.TouchUpHandler(self.lastPtX, self.lastPtY)
            else:
                self.sep = 0
        else:
            self.sep = 0

        return True

    #def Update(self, pWanem, fDownCallback, fUpCallback, wait):
    def Update(self, wait):

        if wait <= 0.0:
            return False

        # https://repolinux.wordpress.com/2012/10/09/non-blocking-read-from-stdin-in-python/
        readable = select.select([self.in_file], [], [], wait)[0]
        if not readable:
            return

        recvable = True
        while recvable:
            recvable = self.PollEvent()

    def Finalize(self):
        self.in_file.close()