def run(self,nexusSerial,port):
     self.despikes=[0,0,0]
 
     self.portBase=port
     # set up senders and data queues
     self.outQueues = []
     self.dataSenders=[]
     self.senderParent=SenderParent(self.portBase,self)
     for c in range(0,10):
         self.dataSenders.append (ChildDataSender(c,self))
         self.outQueues.append(deque())
     for ds in self.dataSenders:
         ds.start()
     self.senderParent.start()
 
 
     NEXUSDATAFUNC = CFUNCTYPE(None,c_int, c_int, POINTER(c_float))
     self.dll=cdll.LoadLibrary('GenericDeviceInterfaceDLL2.dll')
     self.dll.InitGenericDevice.restype=c_int
     self.dll.StartGenericDevice.restype=c_int
     self.callbackFunction=NEXUSDATAFUNC(self.nexusDataFunction)
     retVal=self.dll.InitGenericDevice(self.callbackFunction,1,c_longlong(nexusSerial))    
     if retVal==-6:
         self.dll.ShowAuthenticationWindow()
                 
     print retVal
     sampleRate=c_int(256)
     retVal=self.dll.StartGenericDevice(byref(sampleRate))
     print retVal
     
     while True:
         time.sleep(10)
    def run(self,emotivHost,emotivPort,portBase,userNum):        
        self.senderLock=Lock()
        self.portBase = portBase
        self.channelCount=15
        self.outQueues = {}
        self.dataSenders={}
        self.newSenders={}
        self.headset=Headset(emotivHost,emotivPort,userNum)
        self.senderParent=SenderParent(portBase,self)
        self.senderParent.start()

        lastTime=time.clock()
        while(True):
            # arbitrary polling interval - 128hz
            curTime=time.clock()
            sleepTime=0.0078125-( curTime-lastTime)
            if sleepTime>0:
                time.sleep(0.0078125-( curTime-lastTime))
            
            lastTime=curTime

            self.headset.handleEvents()
# debug code to display all channel values            
#            values=[]
#            for c in range(0,15):
#                values.append(self.getHeadsetChannel(c))
#            print values
            # read the raw data from the headset
            self.headset.readRawData()
            # get the data from the channels we are listening to from the headset
            # and put the data into the out queues
            self.senderLock.acquire()
            for (channel,ds) in self.dataSenders.iteritems():
                if ds.isConnected():
                    if channel<100:
                        # emotion detection etc.
                        value=self.getHeadsetChannel(channel)
                        self.outQueues[channel].append(value)
                    elif channel<200:
                        # raw EEG/accelerometer etc. channels 100-125
                        if self.headset.hasState:
                            values=self.headset.getRawChannel(channel-100)
                            for c in values:
                                self.outQueues[channel].append("%f"%c)
                    elif channel<300:
                        # signal quality / connection quality
                        raise "need to implement signal quality channels"
            # trigger data senders for each out queue - trigger all at once so data comes nicely in sync
            for ds in self.dataSenders.itervalues():
                if ds.isConnected():
                    ds.dataReady()
            self.senderLock.release()
class NexusSDKCollector():
    
    def run(self,nexusSerial,port):
        self.despikes=[0,0,0]
    
        self.portBase=port
        # set up senders and data queues
        self.outQueues = []
        self.dataSenders=[]
        self.senderParent=SenderParent(self.portBase,self)
        for c in range(0,10):
            self.dataSenders.append (ChildDataSender(c,self))
            self.outQueues.append(deque())
        for ds in self.dataSenders:
            ds.start()
        self.senderParent.start()
    
    
        NEXUSDATAFUNC = CFUNCTYPE(None,c_int, c_int, POINTER(c_float))
        self.dll=cdll.LoadLibrary('GenericDeviceInterfaceDLL2.dll')
        self.dll.InitGenericDevice.restype=c_int
        self.dll.StartGenericDevice.restype=c_int
        self.callbackFunction=NEXUSDATAFUNC(self.nexusDataFunction)
        retVal=self.dll.InitGenericDevice(self.callbackFunction,1,c_longlong(nexusSerial))    
        if retVal==-6:
            self.dll.ShowAuthenticationWindow()
                    
        print retVal
        sampleRate=c_int(256)
        retVal=self.dll.StartGenericDevice(byref(sampleRate))
        print retVal
        
        while True:
            time.sleep(10)
    
    def nexusDataFunction(self,nsamples,nchannels,pData):                
        if nchannels>=10:
            data=[0,0,0,0,0,0,0,0,0,0]
            for c in range(10):
                data[c]=pData[c]            
            self.despikeGSR(data)
            for (c,ds) in enumerate(self.dataSenders):
                if ds.isConnected():
                    self.outQueues[c].append("%f"%data[c])
            # trigger the data senders all at once
            for ds in self.dataSenders:
                if ds.isConnected():
                    ds.dataReady()
        #print "[%2.2d,%2.2d] "%(nsamples,nchannels),
         
        #for c in range(nchannels):
            #print "%2.2f"%pData[c],
            #print ",",
        #print ""
        
    
    def despikeGSR(self,data):
        self.despikes.append(data[5])
        if len(self.despikes)>3:
            self.despikes=self.despikes[1:]
        minVal=min(self.despikes)
        maxVal=max(self.despikes)
        curVal=data[5]
        for c in self.despikes:
            if c!=minVal and c!=maxVal:
                data[5]=c
        
        
                    
    def getData(self,port):
        portnum=port
        if len(self.outQueues[portnum])>0:
            return self.outQueues[portnum].popleft()
        else:
            return None
            
    def getMultiStream(self,queryString):
        print "connect multistream %s"%queryString
        try:
            if int(queryString)<len(self.outQueues) and int(queryString)>=0:
                return self.dataSenders[int(queryString)]
        except ValueError,v:
            None
        print "bad query string for nexus collector"
        return None
 def run(self,sensorPort,portBase):
     self.comport=None
     self.portBase = portBase
     self.outQueues = []
     self.dataSenders=[]
     self.portCount=6
     self.senderParent=SenderParent(portBase,self)
     for c in range(0,self.portCount):
         self.dataSenders.append (ChildDataSender(c,self))
         self.outQueues.append(deque([],1000))
     for ds in self.dataSenders:
         ds.start()
     self.senderParent.start()
     
     self.connected=False
     self.comport=None
     
     dataBuffers=[]
     spareData=""
     
     while(True):
         try:
             # connect to vilistus if it isn't
             if not self.connected:                
                 time.sleep(0.25)
                 self.comport=serial.Serial(sensorPort,57600,timeout=5)
                 dataLines=self.comport.readlines(64)
                 if len(dataLines)==0 or len(dataLines[-1])<20:                    
                     print "Can't connect to q sensor %s"%sensorPort
                     self.connected=False
                     self.comport.close()
                     self.comport=None
                 else:
                     self.connected=True
                     print "connected to q sensor %s"%sensorPort
                     self.comport.timeout=1.0
             else:
                 dataLine=self.comport.readline(64)
                 dataLine=dataLine.strip('\r')
                 dataLineSplit=dataLine.split(',')
                 if len(dataLineSplit)>=7:
                     #print "Good data Line",dataLine
                     for c in range(0,self.portCount):
                         try:
                             value=float(dataLineSplit[c+1])                                
                             if self.dataSenders[c].isConnected():
                                 self.outQueues[c].append("%f"%value)
                         except ValueError:
                             print "Bad value:",dataLineSplit[c+1]
                     # trigger the data senders
                     for ds in self.dataSenders:
                         ds.dataReady()
                 else:
                     print "Bad data line",dataLine
                     self.comport.close()
                     self.comport=None
                     self.connected=False
         except serial.SerialException,e:
             print "Serial connection failed",e
             self.comport=None
             self.connected=False
    def run(self,nexusComPort,port):
        self.portBase=port
        self.comport=nexusComPort
        while True:
            try:
                self.port = serial.Serial(self.comport,115200,timeout=10)

                # set up senders and data queues
                self.outQueues = []
                self.dataSenders=[]
                self.senderParent=SenderParent(self.portBase,self)
                for c in range(0,10):
                    self.dataSenders.append (ChildDataSender(c,self))
                    self.outQueues.append(deque())
                for ds in self.dataSenders:
                    ds.start()
                self.senderParent.start()
           
                #    start reading data from nexus
                self.writePort("AA AA 00 05 56 50")
                  
                  
                #port setup
                self.writePort("AA AA 02 22 00 00 80 00 D4 32")
                self.writePort("AA AA 02 22 80 00 53 00 81 32")
                self.writePort("AA AA 02 22 00 10 80 00 D4 22")
                self.writePort("AA AA 02 22 01 10 80 00 D3 22 	")
                self.writePort("AA AA 02 22 00 00 80 00 D4 32 ")
                self.writePort("AA AA 02 22 80 00 53 00 81 32 ")
                self.writePort("AA AA 02 22 00 10 80 00 D4 22 ")
                self.writePort("AA AA 02 22 01 10 80 00 D3 22 	")

                #go
                self.writePort("AA AA 03 02 0E 00 00 00 00 00 45 53")

                #stay alive
                self.writePort("AA AA 00 27 56 2E",False)

                singlePacket=[]
                foundPacket=0
                
                self.despikes=[0,0,0]



                stayalivelast=time.clock()        
                while True:
                    #    stay alive
                    if (time.clock()-stayalivelast)>0.5:
                        self.writePort("AA AA 00 27 56 2E",False)
                        stayalivelast=time.clock()                
                        #    print "Stay alive"
                        
                    data=self.port.read(64)
                    packetBuffer=map(ord,data)
                    for c in packetBuffer:
                        if c==0xaa:
                            foundPacket+=1
                        else:
                            if foundPacket>=2:
                                # dump packet
        #                        for val in singlePacket:
        #                            print "%02x"%val,
        #                        print ""
                                self.sendPacketValues(singlePacket)
                                singlePacket=[]
                            foundPacket=0
                        singlePacket.append(c)
            except serial.SerialException,e:
                print "Couldn't connect Nexus on ",nexusComPort
                time.sleep(5)
class EmotivDirectCollector():

    # userNum is the index of the headset to use
    def run(self,emotivHost,emotivPort,portBase,userNum):        
        self.senderLock=Lock()
        self.portBase = portBase
        self.channelCount=15
        self.outQueues = {}
        self.dataSenders={}
        self.newSenders={}
        self.headset=Headset(emotivHost,emotivPort,userNum)
        self.senderParent=SenderParent(portBase,self)
        self.senderParent.start()

        lastTime=time.clock()
        while(True):
            # arbitrary polling interval - 128hz
            curTime=time.clock()
            sleepTime=0.0078125-( curTime-lastTime)
            if sleepTime>0:
                time.sleep(0.0078125-( curTime-lastTime))
            
            lastTime=curTime

            self.headset.handleEvents()
# debug code to display all channel values            
#            values=[]
#            for c in range(0,15):
#                values.append(self.getHeadsetChannel(c))
#            print values
            # read the raw data from the headset
            self.headset.readRawData()
            # get the data from the channels we are listening to from the headset
            # and put the data into the out queues
            self.senderLock.acquire()
            for (channel,ds) in self.dataSenders.iteritems():
                if ds.isConnected():
                    if channel<100:
                        # emotion detection etc.
                        value=self.getHeadsetChannel(channel)
                        self.outQueues[channel].append(value)
                    elif channel<200:
                        # raw EEG/accelerometer etc. channels 100-125
                        if self.headset.hasState:
                            values=self.headset.getRawChannel(channel-100)
                            for c in values:
                                self.outQueues[channel].append("%f"%c)
                    elif channel<300:
                        # signal quality / connection quality
                        raise "need to implement signal quality channels"
            # trigger data senders for each out queue - trigger all at once so data comes nicely in sync
            for ds in self.dataSenders.itervalues():
                if ds.isConnected():
                    ds.dataReady()
            self.senderLock.release()

    # called by datasenders to get the data to be sent
    def getData(self,port):
        if self.outQueues.has_key(port) and len(self.outQueues[port])>0:
            return self.outQueues[port].popleft()
        else:
            return None
            
    def getMultiStream(self,queryString):
#        print "connect multistream %s"%queryString
        retVal=None
        self.senderLock.acquire()
        try:
            channelNum=int(queryString)
            if channelNum<self.channelCount and channelNum>=0:
                if not self.dataSenders.has_key( channelNum):
                    self.dataSenders[channelNum]=ChildDataSender(channelNum,self)
                    self.outQueues[channelNum]=deque([],1000)
                    self.dataSenders[channelNum].start()
                retVal= self.dataSenders[channelNum]
            elif channelNum>=100 and channelNum<125:
                # raw EEG / accelerometer data
                if not self.dataSenders.has_key( channelNum):
                    self.dataSenders[channelNum]=ChildDataSender(channelNum,self)
                    self.outQueues[channelNum]=deque([],1000)
                    self.dataSenders[channelNum].start()
                retVal= self.dataSenders[channelNum]
            elif channelNum>=200 and channelNum<216:
                # sensor signal quality
                raise "Implement sensor signal quality channels"
                retVal=None
        except ValueError,v:
            retVal=None # drop out
        if retVal==None:
            print "bad query string for Emotiv collector:",queryString
        self.senderLock.release()
        return retVal