#!/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()