Removed old perl from flake. cleaned up library just a little bit. added some message parsing

This commit is contained in:
Jurn Wubben 2025-08-19 00:48:18 +02:00
parent 4e2aeffa8b
commit b3b19df77c
4 changed files with 84 additions and 91 deletions

1
.gitignore vendored
View file

@ -1 +1,2 @@
.direnv .direnv
__pycache__/

6
flake.lock generated
View file

@ -2,11 +2,11 @@
"nodes": { "nodes": {
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1754381359, "lastModified": 1755553648,
"narHash": "sha256-fXmfK4eoA8hUqmEBWFlndH90Zc7vPjqDct+sjLXtCM8=", "narHash": "sha256-btiu4PUGLjoUgyHO5QoyxtMqd6WEkeLjgnI0XH16ea4=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "98b601302da9859b201bd858a8949aafec80ead1", "rev": "f0ceb982688f1d75c0859ad43009bdb0eb22420d",
"type": "github" "type": "github"
}, },
"original": { "original": {

View file

@ -9,35 +9,12 @@
system = "x86_64-linux"; system = "x86_64-linux";
pkgs = nixpkgs.legacyPackages.${system}; pkgs = nixpkgs.legacyPackages.${system};
in { in {
packages.${system}.default = let
pP = pkgs.perlPackages;
in
pkgs.perlPackages.buildPerlPackage rec {
pname = "SignControl";
version = "0.1";
src = ./.;
propagatedBuildInputs = [pP.DigestCRC pP.ModuleBuild];
nativeBuildInputs = [pkgs.shortenPerlShebang];
postInstall = ''
shortenPerlShebang $out/bin/signcontrol
'';
};
devShells.${system}.default = devShells.${system}.default =
pkgs.mkShell pkgs.mkShell
{ {
nativeBuildInputs = [ nativeBuildInputs = [
(pkgs.perl.withPackages
(x: [
x.DigestCRC
x.ModuleBuild
]))
pkgs.entr pkgs.entr
(pkgs.python3.withPackages (x: [x.crc x.fastapi]))
(pkgs.python3.withPackages (x: [x.crc]))
]; ];
}; };
}; };

View file

@ -55,6 +55,10 @@ def pkt_escape(pkt: bytes) -> bytes:
return bytes(buf) return bytes(buf)
COLORS = [i.name.lower() for i in Colors]
COLORS_PATTERH = rb"\{(" + "|".join(COLORS).encode("ascii") + rb")\}"
class Message: class Message:
activation_delay: int = 0 # Message activation delay activation_delay: int = 0 # Message activation delay
display_delay: int = 0 # Message display delay display_delay: int = 0 # Message display delay
@ -99,27 +103,27 @@ class Message:
(rb"\{erase\}", b"\x10\x03"), (rb"\{erase\}", b"\x10\x03"),
(rb"\{serial\}", b"\x10\x09"), (rb"\{serial\}", b"\x10\x09"),
(rb"\{bell\}", b"\x10\x05"), (rb"\{bell\}", b"\x10\x05"),
(rb"\{red\}", b"\x10\x05" + pack("B", Colors.RED.value)), (rb"\{red\}", b"\x10\x0c" + pack("B", Colors.RED.value)),
(rb"\{green\}", b"\x10\x05" + pack("B", Colors.GREEN.value)), (rb"\{green\}", b"\x10\x0c" + pack("B", Colors.GREEN.value)),
(rb"\{yellow\}", b"\x10\x05" + pack("B", Colors.YELLOW.value)), (rb"\{yellow\}", b"\x10\x0c" + pack("B", Colors.YELLOW.value)),
# ( (
# rb"\{(red|green|yellow)\}", COLORS_PATTERH,
# lambda m: b"\x10\x0c" + pack("B", Colors[m[1].decode("ascii")].value), lambda m: b"\x10\x0c" + pack("B", Colors[m[1].decode("ascii")].value),
# ), ),
# ( (
# rb"\{note\s+(\d+)\s+(\d+)\}", rb"\{note\s+(\d+)\s+(\d+)\}",
# lambda m: b"\x10\x11" + pack("<HH", int(m[1]), int(m[2])), lambda m: b"\x10\x11" + pack("<HH", int(m[1]), int(m[2])),
# ), ),
# ( (
# rb"\{tune\s+([1-9])(\s+repeat)?\}", rb"\{tune\s+([1-9])(\s+repeat)?\}",
# lambda m: bytes([0x10, 0x0A if m[2] else 0x0B, int(m[1])]), lambda m: bytes([0x10, 0x0A if m[2] else 0x0B, int(m[1])]),
# ), ),
# ( (
# rb"\{font\s+(\S+)\}", rb"\{font\s+(\S+)\}",
# lambda m: bytes( lambda m: bytes(
# [0x10, 0x0D, Fonts[m[1].decode("ascii").upper()].value] [0x10, 0x0D, Fonts[m[1].decode("ascii").upper()].value]
# ), ),
# ), ),
] ]
for pat, repl in replacements: for pat, repl in replacements:
@ -179,6 +183,7 @@ class NetBrite:
try: try:
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.settimeout(5000)
self.connect() self.connect()
except OSError as e: except OSError as e:
raise ConnectionError(f"Error while opening network socket. {e}") raise ConnectionError(f"Error while opening network socket. {e}")
@ -245,6 +250,7 @@ class NetBrite:
footer = pack("<HB", checksum(header + body), 0x04) footer = pack("<HB", checksum(header + body), 0x04)
self.tx(pkt_escape(header + body + footer)) self.tx(pkt_escape(header + body + footer))
# print(f"Sent message to zone {zoneName}")
def zones(self, zones: dict[str, Zone] | None = None): def zones(self, zones: dict[str, Zone] | None = None):
if zones != None: if zones != None:
@ -255,10 +261,9 @@ class NetBrite:
self.zones_list[zname].id = zid self.zones_list[zname].id = zid
z = self.zones_list[zname] z = self.zones_list[zname]
ztext = z.initial_text.parse_msg() # FIXME: parse_msg once implemented ztext = z.initial_text.parse_msg()
zlen = len(ztext) zlen = len(ztext)
print(z.scroll_speed.value)
body = pack( body = pack(
f"<4B B4B 3B BH 8B B 4B 4B H5B 10B 3B 20BH3B11B{zlen}s B", f"<4B B4B 3B BH 8B B 4B 4B H5B 10B 3B 20BH3B11B{zlen}s B",
0x0F, # Body start 0x0F, # Body start
@ -380,44 +385,54 @@ class NetBrite:
self.sessno += 1 self.sessno += 1
_ = None # _ = None
netbrt = NetBrite("10.65.37.244") # netbrt = NetBrite("10.65.37.244")
zones = [ # zones = [
# Zone( # Zone(
# 1, # 1,
# 0, # 0,
# 59, # 50,
# 7, # 7,
# initial_text=Message("{erase}{scrolloff}{left}Welcome to:"), # initial_text=Message("{erase}{scrollon}{left}ING R&D"),
# default_color=Colors.RED,
# ),
# Zone(
# 73,
# 1,
# 35,
# 7,
# initial_text=Message("{erase}{scrolloff}ING R&D"),
# default_color=Colors.YELLOW, # default_color=Colors.YELLOW,
# default_font=Fonts.BOLD_7,
# scroll_speed=ScrollSpeeds.SLOW,
# ), # ),
# # Zone(
# # 47,
# # 0,
# # 15,
# # 7,
# # initial_text=Message("{erase}{scrolloff}HQ"),
# # default_color=Colors.GREEN,
# # default_font=Fonts.BOLD_7,
# # ),
# Zone( # Zone(
# 110, # 80,
# 1, # 1,
# 10, # 59,
# 7, # 6,
# initial_text=Message("{erase}{scrolloff}HQ"), # initial_text=Message("{erase}{scrolloff}{left}Loading..."),
# default_color=Colors.GREEN, # default_color=Colors.RED,
# default_font=Fonts.NORMAL_5,
# ), # ),
Zone(0, 0, 150, 7, initial_text=Message("{scrolloff}.")) # ]
] # netbrt.zones({str(k): v for k, v in enumerate(zones)})
netbrt.zones({str(k): v for k, v in enumerate(zones)}) #
# from time import sleep, time
from time import sleep, time # from datetime import datetime
from datetime import datetime #
#
while True: # def z(num: int) -> str:
now = datetime.now() # return str(num).rjust(2, "0")
netbrt.message( #
Message("{scrolloff}" + f"{now.hour}:{now.minute}:{now.second}"), #
"0", # while True:
) # now = datetime.now()
sleep(1) # netbrt.message(
# Message("{scrolloff}{left}" + f"{z(now.hour)}:{z(now.minute)}:{z(now.second)}"),
# "1",
# )
#
# t = time()
# sleep(1 - (t - int(t)))