def __init__(self, app, settings): Plugin.__init__(self, app, settings) self.appStack = [] self.lcd = RaspiLCD() self.lcd.backlight = True self.menuApp = MenuApp(self) self.statusApp = AudioStatusApp(self) self.rootApp = self.statusApp self.lcd.event['btn:up'].addListener( self._btnUp ) self.lcd.event['btn:down'].addListener( self._btnDown ) self.lcd.event['btn:left'].addListener( self._btnLeft ) self.lcd.event['btn:right'].addListener( self._btnRight ) self.lcd.event['btn:center'].addListener( self._btnCenter ) self.app.add_listener("initialized", self._run_lcd)
class RaspiLCDPlugin(Plugin): def __init__(self, app, settings): Plugin.__init__(self, app, settings) self.appStack = [] self.lcd = RaspiLCD() self.lcd.backlight = True self.menuApp = MenuApp(self) self.statusApp = AudioStatusApp(self) self.rootApp = self.statusApp self.lcd.event['btn:up'].addListener( self._btnUp ) self.lcd.event['btn:down'].addListener( self._btnDown ) self.lcd.event['btn:left'].addListener( self._btnLeft ) self.lcd.event['btn:right'].addListener( self._btnRight ) self.lcd.event['btn:center'].addListener( self._btnCenter ) self.app.add_listener("initialized", self._run_lcd) def _run_lcd(self): self.app.start_thread(self.lcd.run) self.app.start_thread(self._apploop) def _apploop(self): self.runApp(self.rootApp) tick = 0.1 # seconds while True: time.sleep(tick) if len(self.appStack) == 0: continue try: self.appStack[-1].tick(tick) except: print "exception occurred." traceback.print_exc() def _btnUp(self): if len(self.appStack) > 0: try: self.appStack[-1].btnUp() except: traceback.print_exc() def _btnDown(self): if len(self.appStack) > 0: try: self.appStack[-1].btnDown() except: traceback.print_exc() def _btnLeft(self): if len(self.appStack) > 0: try: self.appStack[-1].btnLeft() except: traceback.print_exc() def _btnRight(self): if len(self.appStack) > 0: try: self.appStack[-1].btnRight() except: traceback.print_exc() def _btnCenter(self): if len(self.appStack) > 0: try: self.appStack[-1].btnCenter() except: traceback.print_exc() def shutdown(self): for app in self.appStack: app.stop() self.appStack = [] self.lcd.backlight = False self.lcd.shutdown() #noinspection PyUnusedLocal def onAppStopped(self, app): # FIXME we're expecting a clean stop. what if there's an exception? self.lcd.clear_display() self.appStack.pop() if len(self.appStack) > 0: self.appStack[-1].resume() # api def runApp(self, app): if len(self.appStack) > 0: self.appStack[-1].pause() self.lcd.clear_display() self.appStack.append(app) app.onStop = self.onAppStopped app.run() # def render(self): # if len(self.appStack) > 0: # self.appStack[-1].render() def add_menu_item(self, item): self.menuApp.root_item.add_child(item) def remove_menu_item(self, item): self.menuApp.root_item.remove_child(item) def toggleBacklight(self): self.lcd.backlight = not self.lcd.backlight @property def backlightOn(self): return self.lcd.backlight