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 )
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()