Ejemplo n.º 1
0
 def __init__( self ):
     # The list of virtual pages of controllers
     # Pages are instances of the NocturnPage class
     self.pages = []
     self.observers = []
     self.activePage = None
     self.hardware = NocturnHardware()
     self.permaBar = PermaBar( self )
Ejemplo n.º 2
0
class NocturnModel( object ):
    """Contains current state of a virtual representation of the Nocturn."""
    
    # The Nocturn doesn't (as far as I know) have an internal representation of
    # the state of its controllers.
    
    def __init__( self ):
        # The list of virtual pages of controllers
        # Pages are instances of the NocturnPage class
        self.pages = []
        self.observers = []
        self.activePage = None
        self.hardware = NocturnHardware()
        self.permaBar = PermaBar( self )
        
    def addPage( self, page ):
        activate = False
        if self.pages == []:
            activate = True
        self.pages.append( page )
        if activate:
            self.setActivePage(0)
            activate = False

    def delPage( self, page ):
        pass
    
    def incPage( self, inc ):
        """Increments the active page by inc"""
        page = self.activePage + inc
        if page < len( self.pages ) and page >= 0:
            self.setActivePage( page )
        return ( self.activePage == len( self.pages ) - 1 )
    
    def getPage( self, page ):
        return self.pages[page]
        
    def getActivePage( self ):
        """Returns pointer to actual active page, not just number"""
        return self.pages[self.activePage]
            
    def setActivePage( self, page ):
        self.activePage = page
        self.getActivePage().setAllChanged()
        self.notifyObservers()
    
    def getNumPages( self ):
        return len(self.pages)
    
    def getValue( self, page, controller ):
        return self.pages[page].getController( controller ).getValue()
    
    def registerObserver( self, observer ):
        self.observers.append( observer )
        # Observers must have notify(), which is called by NocturnModel when
        # its state changes
    
    def notifyObservers( self ):
        self.update()
        for obs in self.observers:
            obs.notify()
            
    def set( self, page, controller, value ):
        theController = self.pages[page].getController(controller)
        theController.set(value)
    
    def setPerma( self, controller, value ):
        theController = self.permaBar.getController( controller )
        theController.set( value )
    
    def getPerma( self ):
        return self.permaBar
    
    def setAction( self, page, controller, action ):
        self.getPage( page ).getControllers()[ controller ].setAction( action )
        
    def setPermaAction( self, perma, action ):
        self.permaBar.getControllers()[ perma ].setAction( action )
    
    def update( self ):
        """Updates the hardware lights with stored values, but only sends
        codes if NocturnController.isChanged()"""
        for cc in self.getActivePage().getEncoders():
            if cc.isChanged():
                val = cc.getValue()
                try:
                    self.hardware.setLEDRingValue( cc.getNumber(), val )
                except Exception as e:
                    sys.exit(e)
                cc.notifyDone()
        for cc in self.getActivePage().getButtons():
            if cc.isChanged():
                val = cc.getValue()
                try:
                    self.hardware.setButton( cc.getNumber(), val )
                except Exception as e:
                    sys.exit(e)
            cc.notifyDone()
        for cc in self.permaBar.getButtons():
            if cc.isChanged():
                val = cc.getValue()
                try:
                    self.hardware.setButton( cc.getNumber() + 8, val )
                except Exception as e:
                    print str(e)
            cc.notifyDone()
        for cc in self.permaBar.getEncoders():
            if cc.isChanged():
                val = cc.getValue()
                try:
                    self.hardware.setLEDRingValue( cc.getNumber(), val )
                except Exception as e:
                    print str(e)
            cc.notifyDone()
    
    def poll( self ):
        """Read from hardware, once. Simply returns if there is no data. Data
        truncated to one message. If messages are piling up, you're doing it
        wrong."""
        data = self.hardware.processedRead()
        if data is None:
            return
        mappedController = self.getActivePage().hwMap.get( data[0] )
        if mappedController:
            pass
        else:
            mappedController = self.permaBar.hwMap.get( data[0] )
        if mappedController:
            mappedController.act( data[1] )
    def disconnect( self ):
        self.hardware.clearAll()