Пример #1
0
    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)
Пример #2
0
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