otime/event_mgr.py
2023-11-01 16:50:57 +01:00

143 lines
5.0 KiB
Python

#!/usr/bin/env python
import otime
import datetime
import os
from time import sleep
import serial
import argparse
import json
import cli
from rich import print
from rich import inspect
from rich.console import Console
from rich.columns import Columns
from rich.table import Table
from rich.panel import Panel
from rich.console import Group
from rich.syntax import Syntax
from rich.table import Table
from time import monotonic
from textual.app import App, ComposeResult
from textual.containers import ScrollableContainer, Horizontal, Vertical
from textual.reactive import reactive
from textual.widgets import Button, Footer, Header, Static, RichLog, DataTable, Label
class RunnerTable(Static):
def compose(self) -> ComposeResult:
yield DataTable(id="runnertable")
def RowSelected(self, data_table, cursor_row, row_key) -> None:
name = self.query_one("#inspname")
name.update(renderable='test')
ecard_log = app.query_one("#ecardlog")
ecard_log.write('aaaaaaaaaaaaaaaaa')
class RunnerInsp(Static):
def compose(self) -> ComposeResult:
yield Static("NAVN", id="inspname")
yield Label("RESULTAT", id="inspresult")
yield Label("POSTER", id="inspcontr")
class EcardLog(Static):
def compose(self) -> ComposeResult:
yield RichLog(highlight=True, markup=True, id="ecardlog")
class MTRDash(Static):
def compose(self) -> ComposeResult:
yield Label("MTR")
class TimeApp(App):
CSS_PATH = "event_mgr.tcss"
BINDINGS = [("d", "toggle_dark", "Toggle dark mode"), ("r", "rerun", "Rerun")]
def compose(self) -> ComposeResult:
"""Create child widgets for the app."""
yield Header()
yield Footer()
yield RunnerTable(classes="box")
yield RunnerInsp(classes="box")
yield EcardLog(classes="box")
yield MTRDash(classes="box")
def on_ready(self) -> None:
mtr = serial.Serial(port="/dev/pts/2", baudrate=9600, timeout=40)
ecard_log = self.query_one("#ecardlog")
ecard_log.write("[bold magenta]Write text or any Rich renderable!")
#self.run_worker(self.watch_serial())
self.render_table()
self.read_mtr()
def action_toggle_dark(self) -> None:
"""An action to toggle dark mode."""
self.dark = not self.dark
def action_rerun(self) -> None:
"""Rerun otime"""
self.run_otime()
def read_mtr(app):
mtr = serial.Serial(port="/dev/pts/3", baudrate=9600, timeout=40)
# mtr.write(b'/SA')
global event
if mtr.in_waiting > 0:
mtr.read_until(expected=b'\xFF\xFF\xFF\xFF')
size = mtr.read(size=1)
if size == b'\xe6':
meat = mtr.read(229)
full = b'\xFF\xFF\xFF\xFF' + size + meat
card_r = otime.CardDump.from_mtr_bytes(full)
ecard_log.write(json.dumps(card_r.asdict()))
with open("sc3/mtr.json", "a") as myfile:
myfile.write('\n' + json.dumps(card_r.asdict()))
run_otime()
elif size == b'\x37':
meat = mtr.read(55)
status = mtrreader.MtrStatusMessage(meat)
inspect(status)
ecard_log.write(status.year(),status.month(),status.day(),status.hours(),status.minutes())
def run_otime(app):
ecard_log = app.query_one("#ecardlog")
event = otime.Event.from_toml(open("/home/trygve/Prosjekter/otime-testing/sc3/sc3.toml", "rb"))
event.import_ttime_db(open("/home/trygve/Prosjekter/otime-testing/sc3/db.csv"))
data = (open("/home/trygve/Prosjekter/otime-testing/sc3/mtr.json")).readlines()
for l in data:
d = json.loads(l)
ecard_log.write(l)
event.card_dumps.append(otime.CardDump(d['card'], d['controls'], d['splits'],
datetime.datetime.fromisoformat(d['read_time']),
datetime.datetime.fromisoformat(d['s_time']),
datetime.datetime.fromisoformat(d['f_time'])))
#ecard_log.write('Ecards:'+str(len(event.card_dumps)))
#ecard_log.write('Løpere:'+str(len(event.runners)))
event.match_all()
#cli.print_runners(event.runners)
#for n in event.o_classes:
#cli.print_class_result(event.runners, n)
return event
def render_table(app):
table = app.query_one("#runnertable")
table.cursor_type = "row"
table.add_column("Name")
table.add_column("Status")
table.add_column("club")
table.add_column("card")
table.add_column("class")
table.add_column("start_time")
table.add_column("fork")
for i in app.run_otime().runners:
try:
o_class = i.o_class.name
except:
o_class = ''
table.add_row(i.fullname(), i.status(), i.club ,str(i.card), o_class, i.start_time, str(i.fork))
db_file_u = None
if __name__ == "__main__":
app = TimeApp()
app.run()