scroll text animations
This commit is contained in:
parent
6ceb400b48
commit
f7d33efd31
|
@ -4,15 +4,31 @@ import time
|
||||||
import board
|
import board
|
||||||
import busio
|
import busio
|
||||||
from adafruit_ht16k33 import segments
|
from adafruit_ht16k33 import segments
|
||||||
|
from enum import Enum
|
||||||
|
|
||||||
__TOPIC_BRIGHTNESS__ = "brightness"
|
__TOPIC_BRIGHTNESS__ = "brightness"
|
||||||
__TOPIC_SCROLL_INTERVAL__ = "scroll_interval"
|
__TOPIC_SCROLL_INTERVAL__ = "scrollinterval"
|
||||||
__TOPIC_TEXT__ = "text"
|
__TOPIC_TEXT_STATIC__ = "textstatic"
|
||||||
|
__TOPIC_TEXT_ONCE__ = "textonce"
|
||||||
|
__TOPIC_TEXT_SCROLL__ = "textscroll"
|
||||||
|
__TOPIC_TEXT_SCROLL_REPEAT__ = "textscrollrepeat"
|
||||||
|
__TOPIC_TEXT_SCROLL_LR__ = "textscrolllr"
|
||||||
|
|
||||||
|
NUMDIGITS = 8
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
class Controller:
|
class Controller:
|
||||||
connected = False
|
connected = False
|
||||||
display = None
|
displayL = None
|
||||||
|
displayR = None
|
||||||
last_scrollupdate = 0
|
last_scrollupdate = 0
|
||||||
|
mode = Mode.STATIC
|
||||||
|
|
||||||
def __init__(self, base_topic, mqtt_host, mqtt_port = 1883):
|
def __init__(self, base_topic, mqtt_host, mqtt_port = 1883):
|
||||||
|
|
||||||
|
@ -25,13 +41,16 @@ class Controller:
|
||||||
|
|
||||||
# Create the LED segment class.
|
# Create the LED segment class.
|
||||||
# This creates a 14 segment 4 character display:
|
# This creates a 14 segment 4 character display:
|
||||||
self.display = segments.Seg14x4(self.i2c, address=0x70) # find address with "sudo i2cdetect -y 1" . you need to install: sudo apt-get install -y python-smbus i2c-tools
|
self.displayL = segments.Seg14x4(self.i2c, address=0x70) # find address with "sudo i2cdetect -y 1" . you need to install: sudo apt-get install -y python-smbus i2c-tools
|
||||||
|
self.displayR = segments.Seg14x4(self.i2c, address=0x71)
|
||||||
|
|
||||||
# Clear the display.
|
# Clear the display.
|
||||||
self.display.fill(0)
|
self.displayL.fill(0)
|
||||||
|
self.displayR.fill(0)
|
||||||
|
|
||||||
# set brightness, range 0-1.0, 1.0 max brightness
|
# set brightness, range 0-1.0, 1.0 max brightness
|
||||||
self.display.brightness = 1.0
|
self.displayL.brightness = 1.0
|
||||||
|
self.displayR.brightness = 1.0
|
||||||
|
|
||||||
self.mqtt = mqtt.Client()
|
self.mqtt = mqtt.Client()
|
||||||
self.mqtt.on_connect = self.on_connect
|
self.mqtt.on_connect = self.on_connect
|
||||||
|
@ -40,7 +59,8 @@ class Controller:
|
||||||
self.mqtt.connect(mqtt_host, mqtt_port)
|
self.mqtt.connect(mqtt_host, mqtt_port)
|
||||||
self.topic = base_topic
|
self.topic = base_topic
|
||||||
|
|
||||||
self.display.print("BOOT")
|
self.displayL.print("LEFT")
|
||||||
|
self.displayR.print("RIGH")
|
||||||
|
|
||||||
|
|
||||||
def on_disconnect(self, client, userdata, rc):
|
def on_disconnect(self, client, userdata, rc):
|
||||||
|
@ -54,9 +74,10 @@ class Controller:
|
||||||
if message.topic.endswith(__TOPIC_BRIGHTNESS__ + "/set"):
|
if message.topic.endswith(__TOPIC_BRIGHTNESS__ + "/set"):
|
||||||
val = float(msg)
|
val = float(msg)
|
||||||
if val >= 0.0 and val <=1.0:
|
if val >= 0.0 and val <=1.0:
|
||||||
self.display.brightness = val
|
self.displayL.brightness = val
|
||||||
print("changed brightness to ", self.display.brightness)
|
self.displayR.brightness = val
|
||||||
self.mqtt.publish(self.topic + "/" + __TOPIC_BRIGHTNESS__, self.display.brightness, 1 )
|
print("changed brightness to ", self.displayL.brightness)
|
||||||
|
self.mqtt.publish(self.topic + "/" + __TOPIC_BRIGHTNESS__, self.displayL.brightness, 1 )
|
||||||
else:
|
else:
|
||||||
print("invalid brightness ", val)
|
print("invalid brightness ", val)
|
||||||
|
|
||||||
|
@ -70,13 +91,23 @@ class Controller:
|
||||||
print("error not >0.0: ", val)
|
print("error not >0.0: ", val)
|
||||||
|
|
||||||
|
|
||||||
if message.topic.endswith(__TOPIC_TEXT__ + "/set"):
|
if message.topic.endswith(__TOPIC_TEXT_SCROLL_REPEAT__ + "/set"):
|
||||||
|
self.mode = Mode.SCROLL_REPEAT
|
||||||
self.poscount = 0 #start at beginning of new text
|
self.poscount = 0 #start at beginning of new text
|
||||||
self.text = msg
|
self.text = msg
|
||||||
if len(self.text)==0:
|
if len(self.text)==0:
|
||||||
self.text=" "
|
self.text=" "
|
||||||
print("changed text to ", self.text)
|
print("changed text to ", self.text)
|
||||||
self.mqtt.publish(self.topic + "/" + __TOPIC_TEXT__, self.text, 1 )
|
self.mqtt.publish(self.topic + "/" + __TOPIC_TEXT_SCROLL_REPEAT__, self.text, 1 )
|
||||||
|
|
||||||
|
if message.topic.endswith(__TOPIC_TEXT_SCROLL_LR__ + "/set"):
|
||||||
|
self.mode = Mode.SCROLL_LR
|
||||||
|
self.poscount = 0 #start at beginning of new text
|
||||||
|
self.text = msg
|
||||||
|
if len(self.text)==0:
|
||||||
|
self.text=" "
|
||||||
|
print("changed text to ", self.text)
|
||||||
|
self.mqtt.publish(self.topic + "/" + __TOPIC_TEXT_SCROLL_LR__, self.text, 1 )
|
||||||
|
|
||||||
|
|
||||||
def on_connect(self, client, userdata, flags, rc):
|
def on_connect(self, client, userdata, flags, rc):
|
||||||
|
@ -84,6 +115,36 @@ class Controller:
|
||||||
self.mqtt.subscribe(self.topic + "/#")
|
self.mqtt.subscribe(self.topic + "/#")
|
||||||
self.connected = True
|
self.connected = True
|
||||||
|
|
||||||
|
def displayTextOffset(self, _text, _offset = 0, _wrap=True):
|
||||||
|
while len(_text)<NUMDIGITS:
|
||||||
|
_text+=" "
|
||||||
|
|
||||||
|
if _wrap:
|
||||||
|
self.displayL[0] = _text[((_offset+0)%len(_text))]
|
||||||
|
self.displayL[1] = _text[((_offset+1)%len(_text))]
|
||||||
|
self.displayL[2] = _text[((_offset+2)%len(_text))]
|
||||||
|
self.displayL[3] = _text[((_offset+3)%len(_text))]
|
||||||
|
self.displayR[0] = _text[((_offset+4)%len(_text))]
|
||||||
|
self.displayR[1] = _text[((_offset+5)%len(_text))]
|
||||||
|
self.displayR[2] = _text[((_offset+6)%len(_text))]
|
||||||
|
self.displayR[3] = _text[((_offset+7)%len(_text))]
|
||||||
|
else:
|
||||||
|
if _offset+0>=0 and _offset+0<len(_text):
|
||||||
|
self.displayL[0] = _text[((_offset+0))]
|
||||||
|
if _offset+1>=0 and _offset+1<len(_text):
|
||||||
|
self.displayL[1] = _text[((_offset+1))]
|
||||||
|
if _offset+2>=0 and _offset+2<len(_text):
|
||||||
|
self.displayL[2] = _text[((_offset+2))]
|
||||||
|
if _offset+3>=0 and _offset+3<len(_text):
|
||||||
|
self.displayL[3] = _text[((_offset+3))]
|
||||||
|
if _offset+4>=0 and _offset+4<len(_text):
|
||||||
|
self.displayR[0] = _text[((_offset+4))]
|
||||||
|
if _offset+5>=0 and _offset+5<len(_text):
|
||||||
|
self.displayR[1] = _text[((_offset+5))]
|
||||||
|
if _offset+6>=0 and _offset+6<len(_text):
|
||||||
|
self.displayR[2] = _text[((_offset+6))]
|
||||||
|
if _offset+7>=0 and _offset+7<len(_text):
|
||||||
|
self.displayR[3] = _text[((_offset+7))]
|
||||||
|
|
||||||
def loop_forever(self):
|
def loop_forever(self):
|
||||||
run = True
|
run = True
|
||||||
|
@ -91,10 +152,29 @@ class Controller:
|
||||||
while run:
|
while run:
|
||||||
self.mqtt.loop(0.1) #with block timeout
|
self.mqtt.loop(0.1) #with block timeout
|
||||||
|
|
||||||
if self.display is not None and time.time() > self.last_scrollupdate+self.scroll_interval:
|
if self.displayL is not None and self.displayR is not None: #displays initialized
|
||||||
self.display.print(self.text[self.poscount])
|
if self.mode == Mode.SCROLL_REPEAT:
|
||||||
self.poscount += 1
|
if time.time() > self.last_scrollupdate+self.scroll_interval: #time to update animation
|
||||||
self.poscount %= len(self.text)
|
self.displayTextOffset(self.text, self.poscount, True)
|
||||||
self.last_scrollupdate = time.time()
|
|
||||||
|
self.poscount += 1
|
||||||
|
self.poscount %= len(self.text)
|
||||||
|
self.last_scrollupdate = time.time()
|
||||||
|
|
||||||
|
if self.mode == Mode.SCROLL_LR:
|
||||||
|
if time.time() > self.last_scrollupdate+self.scroll_interval: #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
|
||||||
|
scrolloffset = max(0,scrolloffset) #cap at zero
|
||||||
|
print("scrolloffset=", scrolloffset)
|
||||||
|
|
||||||
|
self.displayTextOffset(self.text, scrolloffset, False)
|
||||||
|
|
||||||
|
self.poscount += 1
|
||||||
|
self.poscount %= (len(self.text)-NUMDIGITS)*2 #if poscount over scrollable width means scroll backwards
|
||||||
|
self.last_scrollupdate = time.time()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue