143 lines
5.0 KiB
Python
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()
|