'''
Created on Jun 12, 2012

@author: manuel
'''
import threading
import os
import struct
from Utils import deinterleaveData, UpdateCanvasEvent
import wx
import time
import comedi #@UnresolvedImport

DEBUG=False
SLEEP_TIME=0.75

class ReaderThread(threading.Thread):
    def __init__(self, frame, fd, nbChans, bufferSize=10000):
        if DEBUG: print "in readerThread __init__"
        threading.Thread.__init__(self)
        self.frame = frame
        self.fd = fd
        self.nbChans = nbChans
        self.bufferSize = bufferSize
        self.reading = False
        
    def run(self):
        if DEBUG: print "Reader thread running..."
        self.reading = True
        data = []
        n = 0
        lastPostedEvent = time.time()
        while (self.reading):
            try:
                if DEBUG: print "reading..."
                line = os.read(self.fd,self.bufferSize)
                n = len(line)/2 # 2 bytes per 'H'
                if DEBUG: print "read %s(...) (%d bytes). data is %d items"%(line[:5],len(line),len(data))
                unpack = struct.unpack('%dH'%n,line)
                if DEBUG: print "unpacking... got %d values"%len(unpack)
                data.extend(unpack)
                if DEBUG: print "appending to data. data is now (%d items) %s"%(len(data),str(data))
                if DEBUG: print "de-interleaving..."
                out,data = deinterleaveData(data,self.nbChans)
                if DEBUG: print "returned a (%d,%d) array and kept %d for next round"%(out.shape[0],out.shape[1],len(data))
                self.frame.processNewData(out)
                if time.time()-lastPostedEvent>SLEEP_TIME:
                    evt = UpdateCanvasEvent()
                    wx.PostEvent(self.frame, evt)
                    lastPostedEvent=time.time()
            except IOError:
                raise Exception("Fatal Error: %s" % (comedi.comedi_strerror(comedi.comedi_errno())))
