'''
Created on Jul 15, 2014

@author: roj-idl71
'''
import time
import threading
import cPickle

# try:
#     from gevent import sleep
# except:
from time import sleep

SERIALIZER = cPickle

# from schainpy.serializer import DynamicSerializer
from schainpy.model.io.jroIO_usrp import USRPReader
from schainpy.model.serializer.data import obj2Serial

class USRPReaderAPI(USRPReader, threading.Thread):
    
#     __isBufferEmpty = True
    
    __DATAKEYLIST = ['data','utctime','flagNoData']
    
    def __init__(self, serializer='msgpack'):
        
        threading.Thread.__init__(self)
        USRPReader.__init__(self)
        
#         self.__serializerObj = DynamicSerializer.DynamicSerializer('msgpack')
        self.__mySerial = None
        self.__isBufferEmpty = True
        
        self.setSerializer(serializer)
    
    def setSerializer(self, serializer):
        
        self.__serializer = serializer
    
    def getSerializer(self):
        
        return self.__serializer
        
    def getProfileIndex(self):
        
        return self.profileIndex
    
    def getSerialMetaData(self):
        
        if self.__isBufferEmpty:
            ini = time.time()
            
            while True:
                
                if not self.__isBufferEmpty:
                    break
                
                if time.time() - ini > 20:
                    break
                
                sleep(1e-12)
                    
            
#             if not self.getData():
#                 self.__isBufferEmpty = False
#                 return None
    
        if self.dataOut.flagNoData:
            return None
        
        myMetadataSerial = obj2Serial(self.dataOut,
                                      serializer = self.__serializer)
        
        return myMetadataSerial
    
    def getSerialData(self):
        
        if self.__isBufferEmpty:
            ini = time.time()
            
            while True:
                
                if not self.__isBufferEmpty:
                    break
                
                if time.time() - ini > 20:
                    break
                
                sleep(1e-12)
                    
            
#             if not self.getData():
#                 self.__isBufferEmpty = False
#                 return None
    
        if self.dataOut.flagNoData:
            return None
        
        self.__isBufferEmpty = True
        
        return self.__mySerial
    
    def run(self):
         
        '''
        This method will be called once when start() is called
        '''
         
        if not self.isConfig:
            raise RuntimeError, 'setup() method has to be called before start()'
        
        print "Running ..."
        
        while True:
             
            if not self.__isBufferEmpty:
                sleep(1e-12)
                continue
             
            if not self.getData():
                break
            
            print ".",
            
            self.__mySerial = obj2Serial(self.dataOut,
                                         keyList = self.__DATAKEYLIST,
                                         serializer = self.__serializer)
            self.__isBufferEmpty = False
             
#             print self.profileIndex
#             print 'wait 1 second'
            
#             sleep(0.1)

        print "Closing thread"
        
        return