Example #1
0
 def __init__(self):
     self.lcdPanel = Adafruit_CharLCDPlate()
     self.volumeString = "100%"
     self.trackInfo = "No track is currently played"
     self.state = ""
     self.line1 = ""
     self.line2 = ""
     self.backColor = self.lcdPanel.BLUE
     self.disco = False
     self._recalculateLines()
     self._startTickerThread()
Example #2
0
class DisplayRenderer:
    def __init__(self):
        self.lcdPanel = Adafruit_CharLCDPlate()
        self.volumeString = "100%"
        self.trackInfo = "No track is currently played"
        self.state = ""
        self.line1 = ""
        self.line2 = ""
        self.backColor = self.lcdPanel.BLUE
        self.disco = False
        self._recalculateLines()
        self._startTickerThread()

    def _startTickerThread(self):
        self.tickerStarted = True
        start_new_thread(self._tickerLoop, ())

    def _tickerLoop(self):
        while self.tickerStarted:
            time.sleep(0.5)
            self.handleTimerTick()

    def stopRenderer(self):
        self.tickerStarted = False
        self.disco = False

    def setTrackInfo(self, trackinfo):
        self.trackInfo = trackinfo
        self.Invalidate()

    def setVolume(self, volume):
        self.volumeString = str(volume) + "%"
        self.Invalidate()

    def setState(self, state):
        self.state = state
        self.Invalidate()

    def toggleDisco(self):
        if self.disco == False:
            self.disco = True
            start_new_thread(self._discoLoop, ())
        else:
            self.disco = False

    def _discoLoop(self):
        while self.disco:
            time.sleep(0.2)
            self.backColor = random.randint(1, 7)
            self.RenderDisplayTexts()

    def Invalidate(self):
        self._recalculateLines()
        self.RenderDisplayTexts()

    def handleTimerTick(self):
        self.line1position = self._incPos(self.line1position, self.line1)
        self.RenderDisplayTexts()

    def _incPos(self, oldPosition, line):
        if len(line) - oldPosition < 16:
            return 0
        else:
            return oldPosition + 1

    def _recalculateLines(self):
        newline1 = self.trackInfo
        n = 16 - len(self.state) - len(self.volumeString)
        newline2 = self.state + (n * " ") + self.volumeString

        if newline1 != self.line1:
            self.line1position = 0

        if newline2 != self.line2:
            self.line2position = 0

        self.line1 = newline1
        self.line2 = newline2

    def RenderDisplayTexts(self):
        self.lcdPanel.clear()
        logger.debug("Showing on line 1: " + self.line1)
        logger.debug("Showing on line 2: " + self.line2)
        self.lcdPanel.message(
            self.line1[self.line1position:] + "\n" +
            self.line2[self.line2position:])
        self.lcdPanel.backlight(self.backColor)