First draft of SVG font for emulator

This commit is contained in:
Stefan Bethke 2025-05-31 22:47:03 +02:00
commit e57e07c983
12 changed files with 1342 additions and 118 deletions

24
buba/AppConfig.py Normal file
View file

@ -0,0 +1,24 @@
import json
import logging
from os import getenv, path
from pathlib import Path
class AppConfig:
def __init__(self):
"""
Gets the config from environment variables
"""
self.log = logging.getLogger(__name__)
self.basepath = path.dirname(__file__)
self.debug = getenv("DEBUG", None)
self.staticpath = path.join(self.basepath, "static")
self.templatepath = path.join(self.basepath, "templates")
self.url = getenv('BUBA_URL', 'http://localhost:3000')
(self.listen_host, self.listen_port) = getenv('BUBA_LISTEN', '127.0.0.1:3000').split(':')
if self.debug is not None and self.debug.lower not in ('0', 'f', 'false'):
self.debug = True
else:
self.debug = False

View file

@ -1,125 +1,41 @@
import logging
from time import sleep
from buba.AppConfig import AppConfig
from pyfis.aegmis import MIS1TextDisplay
from pyfis.utils import debug_hex
config = AppConfig()
if config.debug:
logging.basicConfig(level=logging.DEBUG)
def receive(display):
if display.use_rts:
display.port.setRTS(1)
display.port.write([0x04, 0x81, 0x05])
if display.use_rts:
display.port.setRTS(0)
return display.read_response(True)
app = Bottle()
if config.debug:
app.config.update({"logging.level": "DEBUG"})
app.install(LoggingPlugin(app.config))
TEMPLATE_PATH.insert(0, config.templatepath)
app.install(BottleSessions())
auth = BottleOIDC(app, config={
"discovery_url": config.discovery_url,
"client_id": config.client_id,
"client_secret": config.client_secret,
"client_scope": config.oidc_scope,
"user_attr": config.oidc_user_attr,
})
def decode(display):
r = receive(display)
if r[0] != 0x02:
print("Invalid byte {r[0]:02x}, expected EOT")
d = {
'code': r[1],
'subcode': r[2],
}
m = []
esc = False
for i in range(3, len(r)-1):
if esc:
m.append(r[i])
erc = False
elif r[i] == 0x10:
esc = True
else:
if r[i] == 0x03:
# compute checksum
next
m.append(r[i])
m = m[0:-1]
print(f"m({len(m)}): {debug_hex(m)}")
return m
websocket_clients = WebSocketClients()
bottle_helpers = BottleHelpers(auth, group=config.requires_group, allowed=config.allowed)
update_poller = UpdatePoller(websocket_clients, ccujack, 1 if config.debug else 0.1)
def reset_and_get_config(display):
display.send_command(0x31, 0x00, [])
r = decode(display)
return {
'type': r[0],
'control-units': r[1],
'digits-a': r[2] * 256 + r[3],
'lines-a': r[4],
'digits-b': r[5] * 256 + r[6],
'lines-b': r[7],
'timeout': r[8] * 128.0 + r[9] * 0.5,
}
def get_config(display):
display.send_command(0x38, 0x00, [])
r = decode(display)
return r
def text_raw(display, page, row, text):
data = [display.ALIGN_LEFT, page, row, 0] + text
return display.send_command(0x11, 0x00, data, expect_response=False)
@app.route("/static/<filepath>")
def server_static(filepath):
return static_file(filepath, root=config.staticpath)
def charset():
lines = []
for i in range(0, 256, 16):
label = f"{i:03d}: "
b = list(label.encode("CP437"))
for j in range(i, i+16):
if j == 0:
b.append(0x20)
else:
b.append(j)
lines.append(b)
@app.get("/")
@jinja2_view("home.html.j2")
def root():
return {}
display.set_page(1)
while True:
for p in range(1,16):
for l in range(0,4):
text_raw(display, 1, l, lines[(p+l-1) % len(lines)])
sleep(5)
print("Opening serial port")
display = MIS1TextDisplay("/dev/ttyUSB0")
print("Sending text")
display.debug = True
#r = display.send_command(0x31, 0x00, []) # reset
#r = display.send_command(0x32, 0x01, []) # test
#r = display.send_command(0x38, 0x01, []) # read config
#r = display.read_response()
#print(f"Response: {r}")
#r = display.send_command(0x52, 0x01, []) # read config
#display.send_raw_telegram([0xff])
#display.send_raw_data([0x04, 0x81, 0x02, 0x03, 0x00])
#print(f"response: {display.read_response()}")
#r = reset_and_get_config(display)
r = get_config(display)
print(f"reply {len(r)}: {r}")
#display.simple_text(page=1, row=0, col=0, text="MEOW MEOW MEOW MEOW MEOW MEOW MEOW MEOW", align=display.ALIGN_CENTER)
#display.simple_text(page=1, row=1, col=0, text="MEOW MEOW MEOW MEOW MEOW MEOW MEOW MEOW", align=display.ALIGN_CENTER)
#display.simple_text(page=1, row=2, col=0, text="MEOW MEOW MEOW MEOW MEOW MEOW MEOW MEOW", align=display.ALIGN_CENTER)
#display.simple_text(page=1, row=3, col=0, text="MEOW MEOW MEOW MEOW MEOW MEOW MEOW MEOW", align=display.ALIGN_CENTER)
#display.simple_text(page=0, row=3, col=0, text="MEOW MEOW MEOW MEOW MEOW MEOW", align=display.ALIGN_CENTER)
#print("page 1")
#display.set_page(1)
#sleep(10)
#for l in range(0,4):
# display.simple_text(page=0, row=l, col=0, text="")
#print("page 0")
#display.set_page(0)
#sleep(10)
#print("page 1")
#display.set_page(1)
#sleep(10)
charset()
print("Thats all, folks!")
if __name__ == '__main__':
app.run(host=config.listen_host, port=config.listen_port, server=GeventWebSocketServer, debug=config.debug,
quiet=not config.debug)

99
buba/create_font.py Normal file
View file

@ -0,0 +1,99 @@
"""
Create an SVG "font" by using the base segments from geascript-proportional.svg and creating a SVG with 256 symbols in it.
"""
import os
from xml.dom import minidom, Node
from xml.dom.minidom import getDOMImplementation, Element
fontspec = {
'41': [
'.##### ###### ###### ######',
'###... ...### #..... ......',
'#.#### ###### ###### ######',
],
'42': [
'###### ###### ###### ######',
'###... ...### #..... ...###',
'#.#### #####. ###### #####.',
],
}
class Design:
def __init__(self, filename):
self.dom = minidom.parse(filename)
(_, _, self.width, self.height) = [float(x) for x in
self.dom.documentElement.getAttribute("viewBox").split(' ')]
r = {}
for n in self.dom.getElementsByTagName("g")[0].childNodes:
if n.nodeType == Node.ELEMENT_NODE:
self.remove_namespaced_attributes(n)
self.remove_style_attributes(n)
id = n.getAttribute("id")
r[id] = n
self.segments = r
self.symbols = getDOMImplementation().createDocument(None, "svg", None)
self.svg = self.symbols.documentElement
self.svg.setAttribute("xmlns", "http://www.w3.org/2000/svg")
self.svg.setAttribute("style", "height: 0; width: 0; position: absolute;")
def remove_namespaced_attributes(self, node:Element):
if node.nodeType != Node.ELEMENT_NODE:
return
for a in list(node._attrsNS.values()):
if a.prefix is not None:
node.removeAttributeNode(a)
for child in node.childNodes:
self.remove_namespaced_attributes(child)
def remove_style_attributes(self, node:Element):
if node.nodeType != Node.ELEMENT_NODE:
return
if node.hasAttribute("style"):
node.removeAttribute("style")
for child in node.childNodes:
self.remove_namespaced_attributes(child)
def make_symbol(self, codepoint):
"""
Use the spec to copy all segments into a new symbol.
:param codepoint:
:return:
"""
spec = fontspec[f"{codepoint:02x}"]
symbol = self.symbols.createElement("symbol")
self.svg.appendChild(symbol)
symbol.setAttribute("id", f"x{codepoint:02x}")
symbol.setAttribute("viewBox", f"0 0 {self.width * len(spec):.3f} {self.height}")
for strip_index, strip in enumerate(spec):
i = 1
g = self.symbols.createElement("g")
symbol.appendChild(g)
g.setAttribute("id", f"x{codepoint:02x}-{strip_index}")
g.setAttribute("transform", f"translate({self.width * strip_index:.3f} 0)")
for segment in list(strip):
if segment == '#':
clone = self.segments[f"seg{i:02d}"].cloneNode(True)
clone.removeAttribute("id")
g.appendChild(clone)
# clone
pass
elif segment == '.':
# no not clone this one
pass
else:
continue
i += 1
if __name__ == '__main__':
here = os.path.abspath(os.path.dirname(__file__))
design = Design(os.path.join(here, 'design/geascript-proportional.svg'))
design.make_symbol(0x41)
design.make_symbol(0x42)
with open("static/font.svg", "w") as symbolsfile:
design.symbols.writexml(symbolsfile, addindent=' ', newl='\n')

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View file

@ -0,0 +1,395 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="1.7mm"
height="15.7mm"
viewBox="0 0 1.7000001 15.699999"
version="1.1"
id="svg1"
inkscape:version="1.4.2 (ebf0e940, 2025-05-08)"
sodipodi:docname="geascript-proportional-labelled.svg"
xml:space="preserve"
inkscape:export-filename="geascript-proportional-labelled.png"
inkscape:export-xdpi="600"
inkscape:export-ydpi="600"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="13.521948"
inkscape:cx="6.3970075"
inkscape:cy="33.648999"
inkscape:window-width="1728"
inkscape:window-height="1197"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="0"
inkscape:current-layer="layer2"
showguides="true"
showgrid="false" />
<defs
id="defs1" />
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Segments"><rect
style="fill:#ffffff;stroke:none;stroke-width:0.02;stroke-linejoin:round;stroke-opacity:1;fill-opacity:1"
id="rect1"
width="1.7"
height="15.7"
x="0"
y="0" /><rect
style="display:inline;fill:none;fill-opacity:1;stroke:#7f7f7f;stroke-width:0.0396;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="seg22"
width="1.6688769"
height="1.0673051"
x="0.019799877"
y="12.866271" />
<path
style="display:inline;fill:none;fill-opacity:1;stroke:#7f7f7f;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 0.01979999,1.4711941 V 0.0198 h 0.82232429 z"
id="seg01" />
<path
style="display:inline;fill:none;fill-opacity:1;stroke:#7f7f7f;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 1.6757133,1.4711956 V 0.0197877 H 0.85412223 Z"
id="seg02" />
<path
style="display:inline;fill:none;fill-opacity:1;stroke:#7f7f7f;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1.6820624,1.9503833 -1.66855387,0.00131 0.0063,-0.4804985 0.8223243,-1.451396 0.83358937,1.451398 z"
id="seg03" /><text
xml:space="preserve"
style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end;stroke-width:0.264583"
x="1.0315937"
y="1.6200429"
id="text1-2"><tspan
sodipodi:role="line"
id="tspan1-6"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:0.705556px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
x="1.0315937"
y="1.6200429">3</tspan></text>
<path
style="font-variation-settings:normal;opacity:1;fill:none;fill-opacity:1;stroke:#7f7f7f;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
d="M 0.01350853,1.9516941 1.6820626,1.9503873 1.6886758,2.436732 0.87500133,3.9227533 0.01979853,2.436732 Z"
id="seg04" />
<path
style="font-variation-settings:normal;opacity:1;fill:none;fill-opacity:1;stroke:#7f7f7f;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
d="m 0.01979993,3.9227491 v -1.486021 l 0.8552028,1.486021 z"
id="seg05" />
<path
style="font-variation-settings:normal;opacity:1;fill:none;fill-opacity:1;stroke:#7f7f7f;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
d="M 0.87500273,3.9227491 1.688677,2.4367281 v 1.486021 z"
id="seg06" />
<path
style="font-variation-settings:normal;opacity:1;fill:none;fill-opacity:1;stroke:#7f7f7f;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
d="M 0.87500273,3.9227491 H 0.01979993 V 5.0929905 Z"
id="seg07" />
<path
style="fill:none;fill-opacity:1;stroke:#7f7f7f;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="M 1.688677,5.0867989 V 3.9227491 H 0.87500273 Z"
id="seg08" />
<path
style="fill:none;fill-opacity:1;stroke:#7f7f7f;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="m 1.6886766,5.5798543 4e-7,-0.4930554 -0.81367427,-1.1640498 -0.8552028,1.1702414 -2e-7,0.4868638 z"
id="seg09" />
<path
style="fill:none;fill-opacity:1;stroke:#7f7f7f;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="M 1.6886766,5.5798547 0.86881113,6.7461891 0.01979973,5.5798547 Z"
id="seg10" />
<path
style="fill:none;fill-opacity:1;stroke:#7f7f7f;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="m 0.01979973,5.5798543 0.8490114,1.1663348 -0.8490114,1.1663345 z"
id="seg11" />
<path
style="fill:none;fill-opacity:1;stroke:#7f7f7f;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="M 1.6886766,5.5798543 V 7.9125236 L 0.86881113,6.7461891 Z"
id="seg12" />
<path
style="fill:none;fill-opacity:1;stroke:#7f7f7f;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="M 1.6886766,7.9125236 0.86881113,6.7461891 0.01979973,7.9125236 Z"
id="seg13" />
<rect
style="fill:none;fill-opacity:1;stroke:#7f7f7f;stroke-width:0.0396;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="seg14"
width="1.6688768"
height="1.0757513"
x="0.019799877"
y="7.9125233" />
<path
style="fill:none;fill-opacity:1;stroke:#7f7f7f;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 0.01979973,8.9882748 1.6883538,8.9876458 0.85617373,9.9475398 Z"
id="seg15" />
<path
style="fill:none;fill-opacity:1;stroke:#7f7f7f;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 0.01979973,8.9882748 0.836374,0.959268 -0.8363738,0.9866772 z"
id="seg16" />
<path
id="seg17"
style="fill:none;fill-opacity:1;stroke:#7f7f7f;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 1.688354,8.9876498 0.85592763,9.9472508 1.688354,10.935528 Z" />
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke:#7f7f7f;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 0.85617373,9.9475428 1.6883538,10.935527 0.01979993,10.934227 Z"
id="seg18" />
<path
style="fill:none;fill-opacity:1;stroke:#7f7f7f;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1.6883538,10.935528 -1.66855387,-0.0013 0.00629,0.480497 0.8223243,1.451396 0.83358937,-1.451397 z"
id="seg19" />
<path
style="fill:none;fill-opacity:1;stroke:#7f7f7f;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 0.02609143,11.414717 v 1.451396 h 0.8223243 z"
id="seg20" />
<path
style="fill:none;fill-opacity:1;stroke:#7f7f7f;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1.6820047,11.414717 v 1.451408 H 0.86041373 Z"
id="seg21" />
<path
style="fill:none;fill-opacity:1;stroke:#7f7f7f;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 1.688677,14.473684 V 13.933575 H 0.01979993 v 1.728568 h 0.8344386 z"
id="seg23"
sodipodi:nodetypes="cccccc" />
<path
style="fill:none;fill-opacity:1;stroke:#7f7f7f;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1.688677,14.473684 v 1.188457 H 0.85423853 Z"
id="seg24" />
<text
xml:space="preserve"
style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end;stroke-width:0.264583"
x="0.43875414"
y="0.6287452"
id="text1"><tspan
sodipodi:role="line"
id="tspan1"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:0.705556px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
x="0.43875414"
y="0.6287452">1</tspan></text><text
xml:space="preserve"
style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end;stroke-width:0.264583"
x="1.6387556"
y="0.61608648"
id="text1-4"><tspan
sodipodi:role="line"
id="tspan1-8"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:0.705556px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
x="1.6387556"
y="0.61608648">2</tspan></text><text
xml:space="preserve"
style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end;stroke-width:0.264583"
x="1.0240782"
y="2.7251306"
id="text1-8"><tspan
sodipodi:role="line"
id="tspan1-83"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:0.705556px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
x="1.0240782"
y="2.7251306">4</tspan></text><text
xml:space="preserve"
style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end;stroke-width:0.264583"
x="0.46356344"
y="3.7911401"
id="text1-43"><tspan
sodipodi:role="line"
id="tspan1-65"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:0.705556px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
x="0.46356344"
y="3.7911401">5</tspan></text><text
xml:space="preserve"
style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end;stroke-width:0.264583"
x="1.6309185"
y="3.8377872"
id="text1-1"><tspan
sodipodi:role="line"
id="tspan1-7"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:0.705556px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
x="1.6309185"
y="3.8377872">6</tspan></text><text
xml:space="preserve"
style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end;stroke-width:0.264583"
x="0.49459001"
y="4.5073237"
id="text1-3"><tspan
sodipodi:role="line"
id="tspan1-5"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:0.705556px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
x="0.49459001"
y="4.5073237">7</tspan></text><text
xml:space="preserve"
style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end;stroke-width:0.264583"
x="1.646539"
y="4.4914351"
id="text1-7"><tspan
sodipodi:role="line"
id="tspan1-84"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:0.705556px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
x="1.646539"
y="4.4914351">8</tspan></text><text
xml:space="preserve"
style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end;stroke-width:0.264583"
x="1.0625132"
y="5.199728"
id="text1-78"><tspan
sodipodi:role="line"
id="tspan1-77"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:0.705556px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
x="1.0625132"
y="5.199728">9</tspan></text><text
xml:space="preserve"
style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end;stroke-width:0.264583"
x="1.2260189"
y="6.1716928"
id="text1-82"><tspan
sodipodi:role="line"
id="tspan1-9"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:0.705556px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
x="1.2260189"
y="6.1716928">10</tspan></text><text
xml:space="preserve"
style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end;stroke-width:0.264583"
x="0.73115712"
y="7.0206776"
id="text1-82-7"><tspan
sodipodi:role="line"
id="tspan1-9-1"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:0.705556px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
x="0.73115712"
y="7.0206776">11</tspan></text><text
xml:space="preserve"
style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end;stroke-width:0.264583"
x="1.6964643"
y="7.0205169"
id="text1-82-76"><tspan
sodipodi:role="line"
id="tspan1-9-0"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:0.705556px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
x="1.6964643"
y="7.0205169">12</tspan></text><text
xml:space="preserve"
style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end;stroke-width:0.264583"
x="1.2214602"
y="7.8378315"
id="text1-82-2"><tspan
sodipodi:role="line"
id="tspan1-9-8"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:0.705556px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
x="1.2214602"
y="7.8378315">13</tspan></text><text
xml:space="preserve"
style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end;stroke-width:0.264583"
x="1.198217"
y="8.7638998"
id="text1-82-9"><tspan
sodipodi:role="line"
id="tspan1-9-05"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:0.705556px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
x="1.198217"
y="8.7638998">14</tspan></text><text
xml:space="preserve"
style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end;stroke-width:0.264583"
x="1.2217817"
y="9.5650053"
id="text1-82-0"><tspan
sodipodi:role="line"
id="tspan1-9-09"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:0.705556px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
x="1.2217817"
y="9.5650053">15</tspan></text><text
xml:space="preserve"
style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end;stroke-width:0.264583"
x="0.70786035"
y="10.219028"
id="text1-82-29"><tspan
sodipodi:role="line"
id="tspan1-9-7"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:0.705556px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
x="0.70786035"
y="10.219028">16</tspan></text><text
xml:space="preserve"
style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end;stroke-width:0.264583"
x="1.7120311"
y="10.218867"
id="text1-82-04"><tspan
sodipodi:role="line"
id="tspan1-9-85"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:0.705556px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
x="1.7120311"
y="10.218867">17</tspan></text><text
xml:space="preserve"
style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end;stroke-width:0.264583"
x="1.2214602"
y="10.849379"
id="text1-82-1"><tspan
sodipodi:role="line"
id="tspan1-9-9"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:0.705556px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
x="1.2214602"
y="10.849379">18</tspan></text><text
xml:space="preserve"
style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end;stroke-width:0.264583"
x="1.2137839"
y="11.682047"
id="text1-82-6"><tspan
sodipodi:role="line"
id="tspan1-9-2"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:0.705556px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
x="1.2137839"
y="11.682047">19</tspan></text><text
xml:space="preserve"
style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end;stroke-width:0.264583"
x="0.7781257"
y="12.826265"
id="text1-82-5"><tspan
sodipodi:role="line"
id="tspan1-9-5"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:0.705556px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
x="0.7781257"
y="12.826265">20</tspan></text><text
xml:space="preserve"
style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end;stroke-width:0.264583"
x="1.6902983"
y="12.817893"
id="text1-82-5-1"><tspan
sodipodi:role="line"
id="tspan1-9-5-6"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:0.705556px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
x="1.6902983"
y="12.817893">21</tspan></text><text
xml:space="preserve"
style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end;stroke-width:0.264583"
x="1.2932358"
y="13.674232"
id="text1-82-5-4"><tspan
sodipodi:role="line"
id="tspan1-9-5-5"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:0.705556px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
x="1.2932358"
y="13.674232">22</tspan></text><text
xml:space="preserve"
style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end;stroke-width:0.264583"
x="1.1221073"
y="14.849317"
id="text1-82-5-9"><tspan
sodipodi:role="line"
id="tspan1-9-5-0"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:0.705556px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
x="1.1221073"
y="14.849317">23</tspan></text><text
xml:space="preserve"
style="font-size:10.5833px;line-height:1.25;font-family:sans-serif;text-align:end;text-anchor:end;stroke-width:0.264583"
x="1.6202474"
y="15.557396"
id="text1-82-5-2"><tspan
sodipodi:role="line"
id="tspan1-9-5-68"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:0.705556px;font-family:Arial;-inkscape-font-specification:'Arial, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583"
x="1.6202474"
y="15.557396">24</tspan></text></g>
</svg>

After

Width:  |  Height:  |  Size: 23 KiB

View file

@ -0,0 +1,146 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="1.7mm"
height="15.7mm"
viewBox="0 0 1.7000001 15.699999"
version="1.1"
id="svg1"
inkscape:version="1.4.2 (ebf0e940, 2025-05-08)"
sodipodi:docname="geascript-proportional.svg"
xml:space="preserve"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="11.919105"
inkscape:cx="-5.2856318"
inkscape:cy="27.602744"
inkscape:window-width="1728"
inkscape:window-height="1197"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="0"
inkscape:current-layer="layer2"
showguides="true" />
<defs
id="defs1"/>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Segments"><rect
style="display:inline;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="seg22"
width="1.6688769"
height="1.0673051"
x="0.019799877"
y="12.866271" />
<path
style="display:inline;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 0.01979999,1.4711941 V 0.0198 h 0.82232429 z"
id="seg01"/>
<path
style="display:inline;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 1.6757133,1.4711956 V 0.0197877 H 0.85412223 Z"
id="seg02"/>
<path
style="display:inline;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1.6820624,1.9503833 -1.66855387,0.00131 0.0063,-0.4804985 0.8223243,-1.451396 0.83358937,1.451398 z"
id="seg03"/>
<path
style="font-variation-settings:normal;opacity:1;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
d="M 0.01350853,1.9516941 1.6820626,1.9503873 1.6886758,2.436732 0.87500133,3.9227533 0.01979853,2.436732 Z"
id="seg04"/>
<path
style="font-variation-settings:normal;opacity:1;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
d="m 0.01979993,3.9227491 v -1.486021 l 0.8552028,1.486021 z"
id="seg05"/>
<path
style="font-variation-settings:normal;opacity:1;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
d="M 0.87500273,3.9227491 1.688677,2.4367281 v 1.486021 z"
id="seg06"/>
<path
style="font-variation-settings:normal;opacity:1;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000;stop-opacity:1"
d="M 0.87500273,3.9227491 H 0.01979993 V 5.0929905 Z"
id="seg07"/>
<path
style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="M 1.688677,5.0867989 V 3.9227491 H 0.87500273 Z"
id="seg08"/>
<path
style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="m 1.6886766,5.5798543 4e-7,-0.4930554 -0.81367427,-1.1640498 -0.8552028,1.1702414 -2e-7,0.4868638 z"
id="seg09"/>
<path
style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="M 1.6886766,5.5798547 0.86881113,6.7461891 0.01979973,5.5798547 Z"
id="seg10"/>
<path
style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="m 0.01979973,5.5798543 0.8490114,1.1663348 -0.8490114,1.1663345 z"
id="seg11"/>
<path
style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="M 1.6886766,5.5798543 V 7.9125236 L 0.86881113,6.7461891 Z"
id="seg12"/>
<path
style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
d="M 1.6886766,7.9125236 0.86881113,6.7461891 0.01979973,7.9125236 Z"
id="seg13"/>
<rect
style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="seg14"
width="1.6688768"
height="1.0757513"
x="0.019799877"
y="7.9125233"/>
<path
style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 0.01979973,8.9882748 1.6883538,8.9876458 0.85617373,9.9475398 Z"
id="seg15"/>
<path
style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 0.01979973,8.9882748 0.836374,0.959268 -0.8363738,0.9866772 z"
id="seg16"/>
<path
id="seg17"
style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 1.688354,8.9876498 0.85592763,9.9472508 1.688354,10.935528 Z"/>
<path
style="font-variation-settings:normal;opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
d="M 0.85617373,9.9475428 1.6883538,10.935527 0.01979993,10.934227 Z"
id="seg18"/>
<path
style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1.6883538,10.935528 -1.66855387,-0.0013 0.00629,0.480497 0.8223243,1.451396 0.83358937,-1.451397 z"
id="seg19"/>
<path
style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 0.02609143,11.414717 v 1.451396 h 0.8223243 z"
id="seg20"/>
<path
style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1.6820047,11.414717 v 1.451408 H 0.86041373 Z"
id="seg21"/>
<path
style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="M 1.688677,14.473684 V 13.933575 H 0.01979993 v 1.728568 h 0.8344386 z"
id="seg23"
sodipodi:nodetypes="cccccc"/>
<path
style="fill:#000000;fill-opacity:1;stroke:#ffffff;stroke-width:0.0396;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 1.688677,14.473684 v 1.188457 H 0.85423853 Z"
id="seg24"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.2 KiB

124
buba/experiments.py Normal file
View file

@ -0,0 +1,124 @@
from time import sleep
from pyfis.aegmis import MIS1TextDisplay
from pyfis.utils import debug_hex
def receive(display):
if display.use_rts:
display.port.setRTS(1)
display.port.write([0x04, 0x81, 0x05])
if display.use_rts:
display.port.setRTS(0)
return display.read_response(True)
def decode(display):
r = receive(display)
if r[0] != 0x02:
print("Invalid byte {r[0]:02x}, expected EOT")
d = {
'code': r[1],
'subcode': r[2],
}
m = []
esc = False
for i in range(3, len(r)-1):
if esc:
m.append(r[i])
erc = False
elif r[i] == 0x10:
esc = True
else:
if r[i] == 0x03:
# compute checksum
next
m.append(r[i])
m = m[0:-1]
print(f"m({len(m)}): {debug_hex(m)}")
return m
def reset_and_get_config(display):
display.send_command(0x31, 0x00, [])
r = decode(display)
return {
'type': r[0],
'control-units': r[1],
'digits-a': r[2] * 256 + r[3],
'lines-a': r[4],
'digits-b': r[5] * 256 + r[6],
'lines-b': r[7],
'timeout': r[8] * 128.0 + r[9] * 0.5,
}
def get_config(display):
display.send_command(0x38, 0x00, [])
r = decode(display)
return r
def text_raw(display, page, row, text):
data = [display.ALIGN_LEFT, page, row, 0] + text
return display.send_command(0x11, 0x00, data, expect_response=False)
def charset():
lines = []
for i in range(0, 256, 16):
label = f"{i:03d}: "
b = list(label.encode("CP437"))
for j in range(i, i+16):
if j == 0:
b.append(0x20)
else:
b.append(j)
lines.append(b)
display.set_page(1)
while True:
for p in range(1,16):
for l in range(0,4):
text_raw(display, 1, l, lines[(p+l-1) % len(lines)])
sleep(5)
print("Opening serial port")
display = MIS1TextDisplay("/dev/ttyUSB0")
print("Sending text")
display.debug = True
#r = display.send_command(0x31, 0x00, []) # reset
#r = display.send_command(0x32, 0x01, []) # test
#r = display.send_command(0x38, 0x01, []) # read config
#r = display.read_response()
#print(f"Response: {r}")
#r = display.send_command(0x52, 0x01, []) # read config
#display.send_raw_telegram([0xff])
#display.send_raw_data([0x04, 0x81, 0x02, 0x03, 0x00])
#print(f"response: {display.read_response()}")
#r = reset_and_get_config(display)
r = get_config(display)
print(f"reply {len(r)}: {r}")
#display.simple_text(page=1, row=0, col=0, text="MEOW MEOW MEOW MEOW MEOW MEOW MEOW MEOW", align=display.ALIGN_CENTER)
#display.simple_text(page=1, row=1, col=0, text="MEOW MEOW MEOW MEOW MEOW MEOW MEOW MEOW", align=display.ALIGN_CENTER)
#display.simple_text(page=1, row=2, col=0, text="MEOW MEOW MEOW MEOW MEOW MEOW MEOW MEOW", align=display.ALIGN_CENTER)
#display.simple_text(page=1, row=3, col=0, text="MEOW MEOW MEOW MEOW MEOW MEOW MEOW MEOW", align=display.ALIGN_CENTER)
#display.simple_text(page=0, row=3, col=0, text="MEOW MEOW MEOW MEOW MEOW MEOW", align=display.ALIGN_CENTER)
#print("page 1")
#display.set_page(1)
#sleep(10)
#for l in range(0,4):
# display.simple_text(page=0, row=l, col=0, text="")
#print("page 0")
#display.set_page(0)
#sleep(10)
#print("page 1")
#display.set_page(1)
#sleep(10)
charset()
print("Thats all, folks!")

127
buba/static/font.svg Normal file
View file

@ -0,0 +1,127 @@
<?xml version="1.0" ?>
<svg xmlns="http://www.w3.org/2000/svg" style="height: 0; width: 0; position: absolute;">
<symbol id="x41" viewBox="0 0 5.100 15.699999">
<g id="x41-0" transform="translate(0.000 0)">
<path d="M 1.6757133,1.4711956 V 0.0197877 H 0.85412223 Z"/>
<path d="m 1.6820624,1.9503833 -1.66855387,0.00131 0.0063,-0.4804985 0.8223243,-1.451396 0.83358937,1.451398 z"/>
<path d="M 0.01350853,1.9516941 1.6820626,1.9503873 1.6886758,2.436732 0.87500133,3.9227533 0.01979853,2.436732 Z"/>
<path d="m 0.01979993,3.9227491 v -1.486021 l 0.8552028,1.486021 z"/>
<path d="M 0.87500273,3.9227491 1.688677,2.4367281 v 1.486021 z"/>
<path d="M 0.87500273,3.9227491 H 0.01979993 V 5.0929905 Z"/>
<path d="M 1.688677,5.0867989 V 3.9227491 H 0.87500273 Z"/>
<path d="m 1.6886766,5.5798543 4e-7,-0.4930554 -0.81367427,-1.1640498 -0.8552028,1.1702414 -2e-7,0.4868638 z"/>
<path d="M 1.6886766,5.5798547 0.86881113,6.7461891 0.01979973,5.5798547 Z"/>
<path d="m 0.01979973,5.5798543 0.8490114,1.1663348 -0.8490114,1.1663345 z"/>
<path d="M 1.6886766,5.5798543 V 7.9125236 L 0.86881113,6.7461891 Z"/>
<path d="M 1.6886766,7.9125236 0.86881113,6.7461891 0.01979973,7.9125236 Z"/>
<rect width="1.6688768" height="1.0757513" x="0.019799877" y="7.9125233"/>
<path d="M 0.01979973,8.9882748 1.6883538,8.9876458 0.85617373,9.9475398 Z"/>
<path d="m 0.01979973,8.9882748 0.836374,0.959268 -0.8363738,0.9866772 z"/>
<path d="M 1.688354,8.9876498 0.85592763,9.9472508 1.688354,10.935528 Z"/>
<path d="M 0.85617373,9.9475428 1.6883538,10.935527 0.01979993,10.934227 Z"/>
<path d="m 1.6883538,10.935528 -1.66855387,-0.0013 0.00629,0.480497 0.8223243,1.451396 0.83358937,-1.451397 z"/>
<path d="m 0.02609143,11.414717 v 1.451396 h 0.8223243 z"/>
<path d="m 1.6820047,11.414717 v 1.451408 H 0.86041373 Z"/>
<rect width="1.6688769" height="1.0673051" x="0.019799877" y="12.866271"/>
<path d="M 1.688677,14.473684 V 13.933575 H 0.01979993 v 1.728568 h 0.8344386 z"/>
<path d="m 1.688677,14.473684 v 1.188457 H 0.85423853 Z"/>
</g>
<g id="x41-1" transform="translate(1.700 0)">
<path d="M 0.01979999,1.4711941 V 0.0198 h 0.82232429 z"/>
<path d="M 1.6757133,1.4711956 V 0.0197877 H 0.85412223 Z"/>
<path d="m 1.6820624,1.9503833 -1.66855387,0.00131 0.0063,-0.4804985 0.8223243,-1.451396 0.83358937,1.451398 z"/>
<path d="M 1.6886766,5.5798547 0.86881113,6.7461891 0.01979973,5.5798547 Z"/>
<path d="m 0.01979973,5.5798543 0.8490114,1.1663348 -0.8490114,1.1663345 z"/>
<path d="M 1.6886766,5.5798543 V 7.9125236 L 0.86881113,6.7461891 Z"/>
<path d="M 1.6886766,7.9125236 0.86881113,6.7461891 0.01979973,7.9125236 Z"/>
</g>
<g id="x41-2" transform="translate(3.400 0)">
<path d="M 0.01979999,1.4711941 V 0.0198 h 0.82232429 z"/>
<path d="m 1.6820624,1.9503833 -1.66855387,0.00131 0.0063,-0.4804985 0.8223243,-1.451396 0.83358937,1.451398 z"/>
<path d="M 0.01350853,1.9516941 1.6820626,1.9503873 1.6886758,2.436732 0.87500133,3.9227533 0.01979853,2.436732 Z"/>
<path d="m 0.01979993,3.9227491 v -1.486021 l 0.8552028,1.486021 z"/>
<path d="M 0.87500273,3.9227491 1.688677,2.4367281 v 1.486021 z"/>
<path d="M 0.87500273,3.9227491 H 0.01979993 V 5.0929905 Z"/>
<path d="M 1.688677,5.0867989 V 3.9227491 H 0.87500273 Z"/>
<path d="m 1.6886766,5.5798543 4e-7,-0.4930554 -0.81367427,-1.1640498 -0.8552028,1.1702414 -2e-7,0.4868638 z"/>
<path d="M 1.6886766,5.5798547 0.86881113,6.7461891 0.01979973,5.5798547 Z"/>
<path d="m 0.01979973,5.5798543 0.8490114,1.1663348 -0.8490114,1.1663345 z"/>
<path d="M 1.6886766,5.5798543 V 7.9125236 L 0.86881113,6.7461891 Z"/>
<path d="M 1.6886766,7.9125236 0.86881113,6.7461891 0.01979973,7.9125236 Z"/>
<rect width="1.6688768" height="1.0757513" x="0.019799877" y="7.9125233"/>
<path d="M 0.01979973,8.9882748 1.6883538,8.9876458 0.85617373,9.9475398 Z"/>
<path d="m 0.01979973,8.9882748 0.836374,0.959268 -0.8363738,0.9866772 z"/>
<path d="M 1.688354,8.9876498 0.85592763,9.9472508 1.688354,10.935528 Z"/>
<path d="M 0.85617373,9.9475428 1.6883538,10.935527 0.01979993,10.934227 Z"/>
<path d="m 1.6883538,10.935528 -1.66855387,-0.0013 0.00629,0.480497 0.8223243,1.451396 0.83358937,-1.451397 z"/>
<path d="m 0.02609143,11.414717 v 1.451396 h 0.8223243 z"/>
<path d="m 1.6820047,11.414717 v 1.451408 H 0.86041373 Z"/>
<rect width="1.6688769" height="1.0673051" x="0.019799877" y="12.866271"/>
<path d="M 1.688677,14.473684 V 13.933575 H 0.01979993 v 1.728568 h 0.8344386 z"/>
<path d="m 1.688677,14.473684 v 1.188457 H 0.85423853 Z"/>
</g>
</symbol>
<symbol id="x42" viewBox="0 0 5.100 15.699999">
<g id="x42-0" transform="translate(0.000 0)">
<path d="M 0.01979999,1.4711941 V 0.0198 h 0.82232429 z"/>
<path d="M 1.6757133,1.4711956 V 0.0197877 H 0.85412223 Z"/>
<path d="m 1.6820624,1.9503833 -1.66855387,0.00131 0.0063,-0.4804985 0.8223243,-1.451396 0.83358937,1.451398 z"/>
<path d="M 0.01350853,1.9516941 1.6820626,1.9503873 1.6886758,2.436732 0.87500133,3.9227533 0.01979853,2.436732 Z"/>
<path d="m 0.01979993,3.9227491 v -1.486021 l 0.8552028,1.486021 z"/>
<path d="M 0.87500273,3.9227491 1.688677,2.4367281 v 1.486021 z"/>
<path d="M 0.87500273,3.9227491 H 0.01979993 V 5.0929905 Z"/>
<path d="M 1.688677,5.0867989 V 3.9227491 H 0.87500273 Z"/>
<path d="m 1.6886766,5.5798543 4e-7,-0.4930554 -0.81367427,-1.1640498 -0.8552028,1.1702414 -2e-7,0.4868638 z"/>
<path d="M 1.6886766,5.5798547 0.86881113,6.7461891 0.01979973,5.5798547 Z"/>
<path d="m 0.01979973,5.5798543 0.8490114,1.1663348 -0.8490114,1.1663345 z"/>
<path d="M 1.6886766,5.5798543 V 7.9125236 L 0.86881113,6.7461891 Z"/>
<path d="M 1.6886766,7.9125236 0.86881113,6.7461891 0.01979973,7.9125236 Z"/>
<rect width="1.6688768" height="1.0757513" x="0.019799877" y="7.9125233"/>
<path d="M 0.01979973,8.9882748 1.6883538,8.9876458 0.85617373,9.9475398 Z"/>
<path d="m 0.01979973,8.9882748 0.836374,0.959268 -0.8363738,0.9866772 z"/>
<path d="M 1.688354,8.9876498 0.85592763,9.9472508 1.688354,10.935528 Z"/>
<path d="M 0.85617373,9.9475428 1.6883538,10.935527 0.01979993,10.934227 Z"/>
<path d="m 1.6883538,10.935528 -1.66855387,-0.0013 0.00629,0.480497 0.8223243,1.451396 0.83358937,-1.451397 z"/>
<path d="m 0.02609143,11.414717 v 1.451396 h 0.8223243 z"/>
<path d="m 1.6820047,11.414717 v 1.451408 H 0.86041373 Z"/>
<rect width="1.6688769" height="1.0673051" x="0.019799877" y="12.866271"/>
<path d="M 1.688677,14.473684 V 13.933575 H 0.01979993 v 1.728568 h 0.8344386 z"/>
<path d="m 1.688677,14.473684 v 1.188457 H 0.85423853 Z"/>
</g>
<g id="x42-1" transform="translate(1.700 0)">
<path d="M 0.01979999,1.4711941 V 0.0198 h 0.82232429 z"/>
<path d="M 1.6757133,1.4711956 V 0.0197877 H 0.85412223 Z"/>
<path d="m 1.6820624,1.9503833 -1.66855387,0.00131 0.0063,-0.4804985 0.8223243,-1.451396 0.83358937,1.451398 z"/>
<path d="M 1.6886766,5.5798547 0.86881113,6.7461891 0.01979973,5.5798547 Z"/>
<path d="m 0.01979973,5.5798543 0.8490114,1.1663348 -0.8490114,1.1663345 z"/>
<path d="M 1.6886766,5.5798543 V 7.9125236 L 0.86881113,6.7461891 Z"/>
<path d="M 1.6886766,7.9125236 0.86881113,6.7461891 0.01979973,7.9125236 Z"/>
<rect width="1.6688769" height="1.0673051" x="0.019799877" y="12.866271"/>
<path d="M 1.688677,14.473684 V 13.933575 H 0.01979993 v 1.728568 h 0.8344386 z"/>
<path d="m 1.688677,14.473684 v 1.188457 H 0.85423853 Z"/>
</g>
<g id="x42-2" transform="translate(3.400 0)">
<path d="M 0.01979999,1.4711941 V 0.0198 h 0.82232429 z"/>
<path d="m 1.6820624,1.9503833 -1.66855387,0.00131 0.0063,-0.4804985 0.8223243,-1.451396 0.83358937,1.451398 z"/>
<path d="M 0.01350853,1.9516941 1.6820626,1.9503873 1.6886758,2.436732 0.87500133,3.9227533 0.01979853,2.436732 Z"/>
<path d="m 0.01979993,3.9227491 v -1.486021 l 0.8552028,1.486021 z"/>
<path d="M 0.87500273,3.9227491 1.688677,2.4367281 v 1.486021 z"/>
<path d="M 0.87500273,3.9227491 H 0.01979993 V 5.0929905 Z"/>
<path d="M 1.688677,5.0867989 V 3.9227491 H 0.87500273 Z"/>
<path d="m 1.6886766,5.5798543 4e-7,-0.4930554 -0.81367427,-1.1640498 -0.8552028,1.1702414 -2e-7,0.4868638 z"/>
<path d="M 1.6886766,5.5798547 0.86881113,6.7461891 0.01979973,5.5798547 Z"/>
<path d="m 0.01979973,5.5798543 0.8490114,1.1663348 -0.8490114,1.1663345 z"/>
<path d="M 1.6886766,7.9125236 0.86881113,6.7461891 0.01979973,7.9125236 Z"/>
<rect width="1.6688768" height="1.0757513" x="0.019799877" y="7.9125233"/>
<path d="M 0.01979973,8.9882748 1.6883538,8.9876458 0.85617373,9.9475398 Z"/>
<path d="m 0.01979973,8.9882748 0.836374,0.959268 -0.8363738,0.9866772 z"/>
<path d="M 1.688354,8.9876498 0.85592763,9.9472508 1.688354,10.935528 Z"/>
<path d="M 0.85617373,9.9475428 1.6883538,10.935527 0.01979993,10.934227 Z"/>
<path d="m 1.6883538,10.935528 -1.66855387,-0.0013 0.00629,0.480497 0.8223243,1.451396 0.83358937,-1.451397 z"/>
<path d="m 0.02609143,11.414717 v 1.451396 h 0.8223243 z"/>
<path d="m 1.6820047,11.414717 v 1.451408 H 0.86041373 Z"/>
<rect width="1.6688769" height="1.0673051" x="0.019799877" y="12.866271"/>
<path d="M 1.688677,14.473684 V 13.933575 H 0.01979993 v 1.728568 h 0.8344386 z"/>
</g>
</symbol>
</svg>

After

Width:  |  Height:  |  Size: 9.4 KiB

21
buba/static/fonttest.html Normal file
View file

@ -0,0 +1,21 @@
<!DOCTYPE html>
<html>
<head>
<title>Font Test</title>
<link rel=stylesheet type="text/css" href="main.css">
</head>
<body>
<h1>Font Test</h1>
<p>
<svg class="char">
<use href="font.svg#x41"/>
</svg>
<svg class="char">
<use href="font.svg#x42"/>
</svg>
<svg class="char">
<use href="font.svg#x41"/>
</svg>
</p>
</body>
</html>

7
buba/static/main.css Normal file
View file

@ -0,0 +1,7 @@
svg.char {
width: 2em;
/*height: 10em;*/
stroke: #ccc;
stroke-width: .1;
fill: black;
}