diff --git a/src/controller.py b/src/controller.py index c5fbbfb..03f5fb0 100644 --- a/src/controller.py +++ b/src/controller.py @@ -11,8 +11,8 @@ __TOPIC_SCROLL_INTERVAL__ = "scrollinterval" __TOPIC_TEXT_STATIC__ = "textstatic" __TOPIC_TEXT_ONCE__ = "textonce" __TOPIC_TEXT_SCROLL__ = "textscroll" -__TOPIC_TEXT_SCROLL_REPEAT__ = "textscrollrepeat" -__TOPIC_TEXT_SCROLL_LR__ = "textscrolllr" +__TOPIC_TEXT_MARQUEE__ = "textmarquee" +__TOPIC_TEXT_PAN__ = "textpan" NUMDIGITS = 8 @@ -20,21 +20,25 @@ class Mode(Enum): STATIC = 1 #show text constantly. may cut digits ONCE = 3 #show once for some time SCROLL = 2 #scroll thorugh once - SCROLL_LR = 4 #scroll back and forth - SCROLL_REPEAT = 5 + PAN = 4 #scroll back and forth + MARQUEE = 5 class Controller: connected = False displayL = None displayR = None - last_scrollupdate = 0 - mode = Mode.STATIC + + def __init__(self, base_topic, mqtt_host, mqtt_port = 1883): self.scroll_interval = 0.25 - self.text = " " + self.text = " " + self.text_last = "" self.poscount = 0 + self.last_scrollupdate = 0 + self.mode = Mode.STATIC + # Create the I2C interface. self.i2c = busio.I2C(board.SCL, board.SDA) @@ -90,61 +94,98 @@ class Controller: else: print("error not >0.0: ", val) + if message.topic.endswith(__TOPIC_TEXT_STATIC__ + "/set"): + self.mode = Mode.STATIC + self.text = msg.ljust(NUMDIGITS) + print("changed text to ", self.text) + self.mqtt.publish(self.topic + "/" + __TOPIC_TEXT_STATIC__, self.text, 1 ) - if message.topic.endswith(__TOPIC_TEXT_SCROLL_REPEAT__ + "/set"): - self.mode = Mode.SCROLL_REPEAT + if message.topic.endswith(__TOPIC_TEXT_MARQUEE__ + "/set"): + self.mode = Mode.MARQUEE self.poscount = 0 #start at beginning of new text self.text = msg - if len(self.text)==0: - self.text=" " + for i in range(NUMDIGITS): + self.text = " "+self.text+" " #add spaces left and right for marquee to enter and leave the full frame print("changed text to ", self.text) - self.mqtt.publish(self.topic + "/" + __TOPIC_TEXT_SCROLL_REPEAT__, self.text, 1 ) + self.mqtt.publish(self.topic + "/" + __TOPIC_TEXT_MARQUEE__, self.text, 1 ) - if message.topic.endswith(__TOPIC_TEXT_SCROLL_LR__ + "/set"): - self.mode = Mode.SCROLL_LR + if message.topic.endswith(__TOPIC_TEXT_PAN__ + "/set"): + self.mode = Mode.PAN self.poscount = 0 #start at beginning of new text self.text = msg - if len(self.text)==0: - self.text=" " + for i in range(int(NUMDIGITS/4)): + self.text = " "+self.text+" " #add spaces left and right for marquee to enter and leave the full frame print("changed text to ", self.text) - self.mqtt.publish(self.topic + "/" + __TOPIC_TEXT_SCROLL_LR__, self.text, 1 ) + self.mqtt.publish(self.topic + "/" + __TOPIC_TEXT_PAN__, self.text, 1 ) def on_connect(self, client, userdata, flags, rc): print("Connected to MQTT Broker") self.mqtt.subscribe(self.topic + "/#") self.connected = True + + def writeSegment(self, _digit, _char, clear=False): + if _digit>=0 and _digit<4: + if clear: + self.displayL[_digit]=' ' + self.displayL[_digit] = _char + elif _digit<8: + if clear: + self.displayR[_digit-4]=' ' + self.displayR[_digit-4] = _char - def displayTextOffset(self, _text, _offset = 0, _wrap=True): - while len(_text)=0 and _offset+0=0 and _offset+1=0 and _offset+2=0 and _offset+3=0 and _offset+4=0 and _offset+5=0 and _offset+6=0 and _offset+7 self.last_scrollupdate+self.scroll_interval: #time to update animation - self.displayTextOffset(self.text, self.poscount, True) + + if self.mode == Mode.STATIC: + if self.text != self.text_last: #time to update animation + self.displayTextOffset(self.text, 0) + + if self.mode == Mode.MARQUEE: + if time.time() > self.last_scrollupdate+self.scroll_interval or self.text != self.text_last: #time to update animation + self.displayTextOffset(self.text, self.poscount) self.poscount += 1 - self.poscount %= len(self.text) + self.poscount %= max(1,int(self.seglen(self.text)-NUMDIGITS+1)) self.last_scrollupdate = time.time() - if self.mode == Mode.SCROLL_LR: - if time.time() > self.last_scrollupdate+self.scroll_interval: #time to update animation + if self.mode == Mode.PAN: + if time.time() > self.last_scrollupdate+self.scroll_interval or self.text != self.text_last: #time to update animation print("pos=", self.poscount) scrolloffset = self.poscount - if scrolloffset >= (len(self.text)-NUMDIGITS): - scrolloffset = (len(self.text)-NUMDIGITS) - (scrolloffset-(len(self.text)-NUMDIGITS)) #reverse + if scrolloffset >= (self.seglen(self.text)-NUMDIGITS): + scrolloffset = (self.seglen(self.text)-NUMDIGITS) - (scrolloffset-(self.seglen(self.text)-NUMDIGITS)) #reverse scrolloffset = max(0,scrolloffset) #cap at zero print("scrolloffset=", scrolloffset) - self.displayTextOffset(self.text, scrolloffset, False) + self.displayTextOffset(self.text, scrolloffset) self.poscount += 1 - self.poscount %= (len(self.text)-NUMDIGITS)*2 #if poscount over scrollable width means scroll backwards + self.poscount %= (self.seglen(self.text)-NUMDIGITS)*2 #if poscount over scrollable width means scroll backwards self.last_scrollupdate = time.time() - - + self.text_last = self.text + \ No newline at end of file