mirror of
https://github.com/brmlab/ledbar.git
synced 2025-06-09 13:24:01 +02:00
627 lines
8.9 KiB
Python
627 lines
8.9 KiB
Python
import sys, time, socket, string, threading, httplib
|
|
|
|
from ledbar import Ledbar
|
|
|
|
WIDTH = 4
|
|
HEIGHT = 5
|
|
PIXELS = 20
|
|
LETTER_WIDTH = 4
|
|
HOST = "irc.freenode.net"
|
|
PORT = 6667
|
|
NICK = "Ledbar"
|
|
IDENT = "Ledbar"
|
|
REALNAME = "Brmlab Led display"
|
|
|
|
chars = {
|
|
' ': [
|
|
[0, 0],
|
|
[0, 0],
|
|
[0, 0],
|
|
[0, 0],
|
|
[0, 0]
|
|
],
|
|
'A': [
|
|
[0, 1, 0],
|
|
[1, 0, 1],
|
|
[1, 1, 1],
|
|
[1, 0, 1],
|
|
[1, 0, 1]
|
|
],
|
|
'B': [
|
|
[1, 1, 0],
|
|
[1, 0, 1],
|
|
[1, 1, 0],
|
|
[1, 0, 1],
|
|
[1, 1, 0]
|
|
],
|
|
'C': [
|
|
[0, 1, 0],
|
|
[1, 0, 1],
|
|
[1, 0, 0],
|
|
[1, 0, 1],
|
|
[0, 1, 0]
|
|
],
|
|
'D': [
|
|
[1, 1, 0],
|
|
[1, 0, 1],
|
|
[1, 0, 1],
|
|
[1, 0, 1],
|
|
[1, 1, 0]
|
|
],
|
|
'E': [
|
|
[1, 1, 1],
|
|
[1, 0, 0],
|
|
[1, 1, 0],
|
|
[1, 0, 0],
|
|
[1, 1, 1]
|
|
],
|
|
'F': [
|
|
[1, 1, 1],
|
|
[1, 0, 0],
|
|
[1, 1, 0],
|
|
[1, 0, 0],
|
|
[1, 0, 0]
|
|
],
|
|
'G': [
|
|
[0, 1, 1, 0],
|
|
[1, 0, 0, 0],
|
|
[1, 0, 1, 1],
|
|
[1, 0, 0, 1],
|
|
[0, 1, 1, 0]
|
|
],
|
|
'H': [
|
|
[1, 0, 1],
|
|
[1, 0, 1],
|
|
[1, 1, 1],
|
|
[1, 0, 1],
|
|
[1, 0, 1]
|
|
],
|
|
'I': [
|
|
[1, 1, 1],
|
|
[0, 1, 0],
|
|
[0, 1, 0],
|
|
[0, 1, 0],
|
|
[1, 1, 1]
|
|
],
|
|
'J': [
|
|
[0, 1, 1],
|
|
[0, 0, 1],
|
|
[0, 0, 1],
|
|
[1, 0, 1],
|
|
[0, 1, 0]
|
|
],
|
|
'K': [
|
|
[1, 0, 1],
|
|
[1, 0, 1],
|
|
[1, 1, 0],
|
|
[1, 0, 1],
|
|
[1, 0, 1]
|
|
],
|
|
'L': [
|
|
[1, 0, 0],
|
|
[1, 0, 0],
|
|
[1, 0, 0],
|
|
[1, 0, 0],
|
|
[1, 1, 1]
|
|
],
|
|
'M': [
|
|
[1, 0, 0, 0, 1],
|
|
[1, 1, 0, 1, 1],
|
|
[1, 0, 1, 0, 1],
|
|
[1, 0, 0, 0, 1],
|
|
[1, 0, 0, 0, 1]
|
|
],
|
|
'N': [
|
|
[1, 0, 0, 1],
|
|
[1, 1, 0, 1],
|
|
[1, 0, 1, 1],
|
|
[1, 0, 0, 1],
|
|
[1, 0, 0, 1]
|
|
],
|
|
'O': [
|
|
[0, 1, 0],
|
|
[1, 0, 1],
|
|
[1, 0, 1],
|
|
[1, 0, 1],
|
|
[0, 1, 0]
|
|
],
|
|
'P': [
|
|
[1, 1, 0],
|
|
[1, 0, 1],
|
|
[1, 1, 0],
|
|
[1, 0, 0],
|
|
[1, 0, 0]
|
|
],
|
|
'Q': [
|
|
[0, 1, 1, 0],
|
|
[1, 0, 0, 1],
|
|
[1, 0, 0, 1],
|
|
[1, 0, 1, 0],
|
|
[0, 1, 0, 1]
|
|
],
|
|
'R': [
|
|
[1, 1, 0],
|
|
[1, 0, 1],
|
|
[1, 1, 0],
|
|
[1, 0, 1],
|
|
[1, 0, 1]
|
|
],
|
|
'S': [
|
|
[0, 1, 1],
|
|
[1, 0, 0],
|
|
[0, 1, 0],
|
|
[0, 0, 1],
|
|
[1, 1, 0]
|
|
],
|
|
'T': [
|
|
[1, 1, 1],
|
|
[0, 1, 0],
|
|
[0, 1, 0],
|
|
[0, 1, 0],
|
|
[0, 1, 0]
|
|
],
|
|
'U': [
|
|
[1, 0, 1],
|
|
[1, 0, 1],
|
|
[1, 0, 1],
|
|
[1, 0, 1],
|
|
[1, 1, 1]
|
|
],
|
|
'V': [
|
|
[1, 0, 1],
|
|
[1, 0, 1],
|
|
[1, 0, 1],
|
|
[1, 0, 1],
|
|
[0, 1, 0]
|
|
],
|
|
'W': [
|
|
[1, 0, 0, 0, 1],
|
|
[1, 0, 1, 0, 1],
|
|
[1, 0, 1, 0, 1],
|
|
[1, 0, 1, 0, 1],
|
|
[1, 1, 0, 1, 0]
|
|
],
|
|
'X': [
|
|
[1, 0, 1],
|
|
[1, 0, 1],
|
|
[0, 1, 0],
|
|
[1, 0, 1],
|
|
[1, 0, 1]
|
|
],
|
|
'Y': [
|
|
[1, 0, 1],
|
|
[1, 0, 1],
|
|
[0, 1, 0],
|
|
[0, 1, 0],
|
|
[0, 1, 0]
|
|
],
|
|
'Z': [
|
|
[1, 1, 1],
|
|
[0, 0, 1],
|
|
[0, 1, 0],
|
|
[1, 0, 0],
|
|
[1, 1, 1]
|
|
],
|
|
'!': [
|
|
[1],
|
|
[1],
|
|
[1],
|
|
[0],
|
|
[1]
|
|
],
|
|
'a': [
|
|
[1, 1, 0],
|
|
[0, 0, 1],
|
|
[0, 1, 1],
|
|
[1, 0, 1],
|
|
[0, 1, 0]
|
|
],
|
|
'b': [
|
|
[1, 0, 0],
|
|
[1, 0, 0],
|
|
[1, 1, 0],
|
|
[1, 0, 1],
|
|
[1, 1, 0]
|
|
],
|
|
'c': [
|
|
[0, 0, 0],
|
|
[0, 1, 1],
|
|
[1, 0, 0],
|
|
[1, 0, 0],
|
|
[0, 1, 1]
|
|
],
|
|
'd': [
|
|
[0, 0, 1],
|
|
[0, 0, 1],
|
|
[0, 1, 1],
|
|
[1, 0, 1],
|
|
[0, 1, 1]
|
|
],
|
|
'e': [
|
|
[0, 1, 0],
|
|
[1, 0, 1],
|
|
[1, 1, 1],
|
|
[1, 0, 0],
|
|
[0, 1, 0]
|
|
],
|
|
'f': [
|
|
[0, 1, 1],
|
|
[1, 0, 0],
|
|
[1, 1, 0],
|
|
[1, 0, 0],
|
|
[1, 0, 0]
|
|
],
|
|
'g': [
|
|
[0, 1, 1],
|
|
[1, 0, 1],
|
|
[0, 1, 1],
|
|
[0, 0, 1],
|
|
[1, 1, 0]
|
|
],
|
|
'h': [
|
|
[1, 0, 0],
|
|
[1, 0, 0],
|
|
[1, 1, 0],
|
|
[1, 0, 1],
|
|
[1, 0, 1]
|
|
],
|
|
'i': [
|
|
[0],
|
|
[1],
|
|
[0],
|
|
[1],
|
|
[1]
|
|
],
|
|
'j': [
|
|
[0, 0, 1],
|
|
[0, 0, 0],
|
|
[0, 0, 1],
|
|
[1, 0, 1],
|
|
[0, 1, 0]
|
|
],
|
|
'k': [
|
|
[1, 0, 0],
|
|
[1, 0, 0],
|
|
[1, 0, 1],
|
|
[1, 1, 0],
|
|
[1, 0, 1]
|
|
],
|
|
'l': [
|
|
[1, 1],
|
|
[0, 1],
|
|
[0, 1],
|
|
[0, 1],
|
|
[0, 1]
|
|
],
|
|
'm': [
|
|
[0, 0, 0, 0, 0],
|
|
[0, 1, 0, 1, 1],
|
|
[1, 0, 1, 0, 1],
|
|
[1, 0, 1, 0, 1],
|
|
[1, 0, 1, 0, 1]
|
|
],
|
|
'n': [
|
|
[0, 0, 0],
|
|
[1, 1, 0],
|
|
[1, 0, 1],
|
|
[1, 0, 1],
|
|
[1, 0, 1]
|
|
],
|
|
'o': [
|
|
[0, 0, 0],
|
|
[0, 1, 0],
|
|
[1, 0, 1],
|
|
[1, 0, 1],
|
|
[0, 1, 0]
|
|
],
|
|
'p': [
|
|
[0, 0, 0],
|
|
[1, 1, 0],
|
|
[1, 0, 1],
|
|
[1, 1, 0],
|
|
[1, 0, 0]
|
|
],
|
|
'q': [
|
|
[0, 0, 0],
|
|
[0, 1, 1],
|
|
[1, 0, 1],
|
|
[0, 1, 1],
|
|
[0, 0, 1]
|
|
],
|
|
'r': [
|
|
[0, 0],
|
|
[0, 1],
|
|
[1, 0],
|
|
[1, 0],
|
|
[1, 0]
|
|
],
|
|
's': [
|
|
[0, 0, 0],
|
|
[0, 1, 1],
|
|
[1, 1, 0],
|
|
[0, 0, 1],
|
|
[1, 1, 0]
|
|
],
|
|
't': [
|
|
[1, 0],
|
|
[1, 1],
|
|
[1, 0],
|
|
[1, 0],
|
|
[0, 1]
|
|
],
|
|
'u': [
|
|
[0, 0, 0],
|
|
[1, 0, 1],
|
|
[1, 0, 1],
|
|
[1, 0, 1],
|
|
[1, 1, 1]
|
|
],
|
|
'v': [
|
|
[0, 0, 0],
|
|
[1, 0, 1],
|
|
[1, 0, 1],
|
|
[1, 0, 1],
|
|
[0, 1, 0]
|
|
],
|
|
'w': [
|
|
[0, 0, 0, 0, 0],
|
|
[1, 0, 0, 0, 1],
|
|
[1, 0, 1, 0, 1],
|
|
[1, 0, 1, 0, 1],
|
|
[0, 1, 0, 1, 0]
|
|
],
|
|
'x': [
|
|
[0, 0, 0],
|
|
[1, 0, 1],
|
|
[0, 1, 0],
|
|
[1, 0, 1],
|
|
[1, 0, 1]
|
|
],
|
|
'y': [
|
|
[0, 0, 0],
|
|
[1, 0, 1],
|
|
[0, 1, 1],
|
|
[0, 0, 1],
|
|
[0, 0, 1]
|
|
],
|
|
'z': [
|
|
[0, 0, 0],
|
|
[1, 1, 1],
|
|
[0, 1, 0],
|
|
[1, 0, 0],
|
|
[1, 1, 1]
|
|
],
|
|
'0': [
|
|
[1, 1, 1],
|
|
[1, 0, 1],
|
|
[1, 0, 1],
|
|
[1, 0, 1],
|
|
[1, 1, 1]
|
|
],
|
|
'1': [
|
|
[0, 0, 1],
|
|
[0, 1, 1],
|
|
[1, 0, 1],
|
|
[0, 0, 1],
|
|
[0, 0, 1]
|
|
],
|
|
'2': [
|
|
[1, 1, 0],
|
|
[0, 0, 1],
|
|
[0, 1, 0],
|
|
[1, 0, 0],
|
|
[1, 1, 1]
|
|
],
|
|
'3': [
|
|
[1, 1, 0],
|
|
[0, 0, 1],
|
|
[0, 1, 0],
|
|
[0, 0, 1],
|
|
[1, 1, 0]
|
|
],
|
|
'4': [
|
|
[1, 0, 1],
|
|
[1, 0, 1],
|
|
[1, 1, 1],
|
|
[0, 0, 1],
|
|
[0, 0, 1]
|
|
],
|
|
'5': [
|
|
[1, 1, 1],
|
|
[1, 0, 0],
|
|
[1, 1, 0],
|
|
[0, 0, 1],
|
|
[1, 1, 0]
|
|
],
|
|
'6': [
|
|
[0, 1, 1],
|
|
[1, 0, 0],
|
|
[1, 1, 0],
|
|
[1, 0, 1],
|
|
[0, 1, 0]
|
|
],
|
|
'7': [
|
|
[1, 1, 1],
|
|
[0, 0, 1],
|
|
[0, 1, 1],
|
|
[0, 0, 1],
|
|
[0, 0, 1]
|
|
],
|
|
'8': [
|
|
[0, 1, 0],
|
|
[1, 0, 1],
|
|
[0, 1, 0],
|
|
[1, 0, 1],
|
|
[0, 1, 0]
|
|
],
|
|
'9': [
|
|
[0, 1, 0],
|
|
[1, 0, 1],
|
|
[0, 1, 1],
|
|
[0, 0, 1],
|
|
[1, 1, 0]
|
|
],
|
|
',': [
|
|
[0],
|
|
[0],
|
|
[0],
|
|
[1],
|
|
[1]
|
|
],
|
|
'.': [
|
|
[0],
|
|
[0],
|
|
[0],
|
|
[0],
|
|
[1]
|
|
],
|
|
':': [
|
|
[0],
|
|
[1],
|
|
[0],
|
|
[1],
|
|
[0]
|
|
],
|
|
'=': [
|
|
[0, 0, 0],
|
|
[1, 1, 1],
|
|
[0, 0, 0],
|
|
[1, 1, 1],
|
|
[0, 0, 0]
|
|
],
|
|
'|': [
|
|
[1],
|
|
[1],
|
|
[1],
|
|
[1],
|
|
[1]
|
|
]
|
|
}
|
|
|
|
def set_pixel_2d(bar, x, y, r, g, b):
|
|
bar.set_pixel(WIDTH - x - 1 + y*WIDTH, r, g, b)
|
|
|
|
class TextScroller:
|
|
def __init__(self):
|
|
self.dt = 0.12
|
|
self.reset("Hello, world!");
|
|
|
|
def reset(self, text):
|
|
self.text = text
|
|
self.idx = 0
|
|
self.col = 0
|
|
self.kern = 1
|
|
self.gap = 1
|
|
self.r = 1
|
|
self.g = 1
|
|
self.b = 1
|
|
self.scroll_len = len(self.text) + self.gap
|
|
|
|
def letter_dx(self, ltr_idx):
|
|
return self.letter_width(ltr_idx) + self.kern
|
|
|
|
def letter_width(self, ltr_idx):
|
|
if ltr_idx >= len(self.text):
|
|
return 4
|
|
if self.text[ltr_idx] in chars:
|
|
return len(chars[self.text[ltr_idx]][0])
|
|
else:
|
|
return 4
|
|
|
|
def update(self, ledbar):
|
|
time.sleep(self.dt)
|
|
idx = self.idx
|
|
col = self.col
|
|
for x in range(WIDTH):
|
|
char = None
|
|
if idx < len(self.text) and self.text[idx] in chars:
|
|
char = chars[self.text[idx]]
|
|
|
|
display = False
|
|
if char != None and col < self.letter_width(idx):
|
|
display = True
|
|
|
|
for y in range(HEIGHT):
|
|
if display and char[y][col] == 1:
|
|
set_pixel_2d(ledbar, x, y, self.r, self.g, self.b)
|
|
else:
|
|
set_pixel_2d(ledbar, x, y, 0, 0, 0)
|
|
|
|
col = col + 1
|
|
if col == self.letter_dx(idx):
|
|
idx += 1
|
|
if idx >= self.scroll_len:
|
|
idx = 0
|
|
col = 0
|
|
|
|
self.col += 1
|
|
if self.col >= self.letter_dx(self.idx):
|
|
self.idx = (self.idx + 1) % self.scroll_len
|
|
self.col = 0
|
|
|
|
return ledbar.update()
|
|
|
|
l = Ledbar(PIXELS)
|
|
work = True
|
|
scroll = TextScroller()
|
|
|
|
class WebThread(threading.Thread):
|
|
def __init__(self):
|
|
self.lineNum = -1
|
|
self.line = ""
|
|
self.mutex = threading.Lock()
|
|
threading.Thread.__init__(self)
|
|
|
|
def run(self):
|
|
while(True):
|
|
self.loop()
|
|
|
|
def loop(self):
|
|
http = httplib.HTTPConnection("www.cnb.cz")
|
|
http.request("GET", "http://www.cnb.cz/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/denni_kurz.txt")
|
|
resp = http.getresponse()
|
|
data = resp.read()
|
|
http.close()
|
|
|
|
linenum = 0
|
|
self.text = "Data z CNB.cz:"
|
|
for line in data.split("\n"):
|
|
linenum += 1
|
|
if linenum < 3:
|
|
continue
|
|
|
|
linedata = line.split("|")
|
|
if len(linedata) < 5:
|
|
continue
|
|
self.text = self.text + " " + linedata[2] + " " + linedata[3] + " = " + linedata[4] + " CZK |"
|
|
|
|
self.lock()
|
|
self.line = self.text
|
|
self.lineNum += 1
|
|
self.unlock()
|
|
time.sleep(600)
|
|
|
|
def lock(self):
|
|
self.mutex.acquire()
|
|
|
|
def unlock(self):
|
|
self.mutex.release()
|
|
|
|
def getLine(self):
|
|
return self.line
|
|
|
|
def getLineNum(self):
|
|
return self.lineNum
|
|
|
|
web = WebThread()
|
|
web.start()
|
|
prevnum = -1
|
|
while work:
|
|
web.lock()
|
|
if web.getLineNum() != prevnum:
|
|
prevnum = web.getLineNum()
|
|
scroll.reset(web.getLine())
|
|
web.unlock()
|
|
|
|
work = scroll.update(l)
|
|
|