Git Product home page Git Product logo

wahoo-results's Introduction

Wahoo! Results

Wahoo! Results is a scoreboard for displaying swimming meet race results.

If you are looking for a way to have a scoreboard to display race results and you use either Meet Manager or Meet Maestro plus a CTS Dolphin system to run your meets, this may be for you!

➡️ Download the latest version here ⬅️

Example scoreboard

Requirements

  • Meet management software - Used to generate the scoreboard "start list" files
    • Hy-Tek Meet Manager
    • SwimTopia Meet Maestro
  • Colorado Dolphin timing - Used to gather the timing information
  • A Windows PC to run Wahoo! Results

Features

  • Configurable number of lanes: 6 - 10
  • Customizable text fonts, sizes, and colors
  • Custom background images, or just use a solid color
  • Calculates final time based on multiple Dolphin watches
  • Broadcasts the scoreboard to 1 or more Chromecast devices

Installation

Download the latest version of wahoo-results.exe from the releases page.

The program a single executable w/ no installation necessary. Configuration preferences are saved into a wahoo-results.ini file in the same directory.

Once you've downloaded the application, make sure to read the documentation.

How it works

  1. Once the meet has been seeded in your meet management software, export "CTS start list" files as you would for a normal scoreboard.
  2. Use Wahoo! Results to generate the event file for the Dolphin software based on the start list files.
  3. Configure Wahoo! Results to watch for the Dolphin *.do4 race result files.
  4. When new race result files are created by the Dolphin, Wahoo Results will display race results including both names (from the start list files) and times (from the Dolphin result files) onto one or more Chromecast devices on the local network.

License

This software is licensed under the GNU Affero General Public License version 3. See the LICENSE file for full details.
The documentation © 2020 – 2024 by John Strunk is licensed under Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)

wahoo-results's People

Contributors

dependabot[bot] avatar johnstrunk avatar mergify[bot] avatar renovate-bot avatar snyk-bot avatar web-flow avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

wahoo-results's Issues

Display initial when name doesn't fit

Currently, names that are too long to display are truncated, commonly resulting in partial first names being displayed.

We should detect when truncation will occur, and instead, just print the 1st letter of the name.

Method for re-ordering events

When generating the dolphin.csv from the start list files, the events are currently sorted in numeric order. The events aren't always run in that order. Provide an interface to allow manually re-ordering the events so that they will appear in the intended order in the Dolphin software.

Display timeout on latest Chromecast

The current generation of "Chromecast with Google TV" seems to have a shorter timeout, so it returns to the screensaver if there is too much delay between races.

Workaround: disable then re-enable the Chromecast Enable "developer options" and set "Stay awake"

Collect statistics on lane timer accuracy

Since we get the individual times from the do4, we could track the consistency of the individual lane timers. For example:

  • Number of races w/o a time
  • Whether they are consistently fast/slow relative to the final time (Need to come up w/ a measure of significance here)

Investigate other Python ==> exe packaging utilities

Currently, wahoo-results is built as a standalone executable via pyinstaller. Unfortunately, this method tends to generate a lot of false positive virus warnings--- it's a known problem w/ pyinstaller.

There are several other utilities for packaging python programs as windows executables, and we should investigate whether there is any advantage to using one of them.

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

Awaiting Schedule

These updates are awaiting their schedule. Click on a checkbox to get an update now.

  • Update pre-commit hook psf/black to v24.4.2
  • Update pre-commit hook renovatebot/pre-commit-hooks to v37.326.0

Open

These updates have all been created already. Click a checkbox below to force a retry/rebase of any.

Detected dependencies

github-actions
.github/workflows/dependencies.yml
  • actions/checkout v4.1.4@0ad4b8fadaa221de15dcec353f45205ec38ea70b
  • actions/setup-python v5.1.0@82c7e631bb3cdc910f68e0081d67478d79c6982d
  • peter-evans/create-pull-request v6.0.5@6d6857d36972b65feb161a90e484f2984215f83e
.github/workflows/publish-receiver.yml
  • actions/checkout v4.1.4@0ad4b8fadaa221de15dcec353f45205ec38ea70b
  • actions/configure-pages v5.0.0@983d7736d9b0ae728b81ab479565c72886d7745b
  • actions/upload-pages-artifact v3.0.1@56afc609e74202658d3ffba0e8f6dda462b719fa
  • actions/deploy-pages v4.0.5@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e
.github/workflows/test.yml
  • actions/checkout v4.1.4@0ad4b8fadaa221de15dcec353f45205ec38ea70b
  • actions/setup-python v5.1.0@82c7e631bb3cdc910f68e0081d67478d79c6982d
  • actions/checkout v4.1.4@0ad4b8fadaa221de15dcec353f45205ec38ea70b
  • actions/setup-python v5.1.0@82c7e631bb3cdc910f68e0081d67478d79c6982d
  • actions/cache v4.0.2@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9
  • actions/checkout v4.1.4@0ad4b8fadaa221de15dcec353f45205ec38ea70b
  • actions/setup-python v5.1.0@82c7e631bb3cdc910f68e0081d67478d79c6982d
  • actions/upload-artifact v4.3.1@5d5d22a31266ced268874388b861e4b58bb5c2f3
  • actions/checkout v4.1.4@0ad4b8fadaa221de15dcec353f45205ec38ea70b
  • actions/download-artifact v4.1.7@65a9edc5881444af0b9093a5e628f2fe47ea3b2e
  • actions/checkout v4.1.4@0ad4b8fadaa221de15dcec353f45205ec38ea70b
  • actions/setup-python v5.1.0@82c7e631bb3cdc910f68e0081d67478d79c6982d
  • actions/download-artifact v4.1.7@65a9edc5881444af0b9093a5e628f2fe47ea3b2e
  • softprops/action-gh-release v2.0.4@9d7c94cfd0a1f3ed45544c887983e9fa900f0564
pipenv
Pipfile
  • PyChromecast >=13.0.5
  • segment-analytics-python <3.0
pre-commit
.pre-commit-config.yaml
  • pre-commit/pre-commit-hooks v4.6.0
  • adrienverge/yamllint v1.35.1
  • igorshubovych/markdownlint-cli v0.39.0
  • psf/black 24.4.1
  • PyCQA/isort 5.13.2
  • renovatebot/pre-commit-hooks 37.322.2
regex
.github/workflows/dependencies.yml
  • pipenv 2023.12.1
.github/workflows/test.yml
  • pipenv 2023.12.1
Contributing.md
  • pipenv 2023.12.1
.github/workflows/test.yml
  • upx/upx 4.2.3
Contributing.md
  • upx/upx 4.2.3

  • Check this box to trigger a request for Renovate to run again on this repository

Decrease reserved whitespace between name and time

Currently, names look like they are truncated a bit too much, leaving an excessive gap between the end of the name and the start of the time.

Reduce the multiplier here to decrease the gap:

time_width = int(draw.textsize("00:00.00", self._timefont)[0] * 1.2)

Alternatively, don't use a multiplier and just calculate the field based on an extra character "000:00.00"--- Equivalent to 1.13 multiplier in a fixed-width font.

Scoreboard stops displaying results

The scoreboard stopped displaying results once the event list was exhausted from the Dolphin. Restarting the scoreboard after loading the proper event list into the Dolphin software fixed the problem.

I suspect WR improperly handles the default event names that are used by the Dolphin once an imported list is exhausted.

Error reporting

Integrate w/ bugout.dev Sentry.io to get error/crash reports.

Scoreboard stops working after several hours

After it's been running for several hours, the scoreboard stops transmitting results to the enabled Chromecast devices.

Disabling/re-enabling doesn't fix the problem. The program must be restarted.

Affected version: v0.6.1

Display OOF

Starters like to check their work. Add an option to display the calculated order of finish on the scoreboard inconspicuously.

Chromecast support

Currently, the scoreboard needs to be displayed from a PC, either via an HDMI output or some sort of (wireless) screen mirroring setup (e.g., AnyCast).

It looks like it would be feasible to implement wireless display using a Google Chromecast.

Notes:

  • Chromecast supports PNG images and it shouldn't be too difficult to render the scoreboard into a local *.png for display
  • We'd need to run a simple web server on the local machine for the Chromecast to fetch from. This could be added to W!R fairly easily.
  • There are python libraries to discover/control the Chromecast devices such as PyChromecast

Handle IP address changes

When the scoreboard computer's address changes, automatically detect the change and update the active Chromecasts.

SCB files for events <100 not loading

Discussed in #138

When the event number is <100, the start list filename is not properly generated, resulting in names not being displayed.
Ex, for event 21, the filename is being generated as E21.scb instead of E021.scb, resulting in the start list file not being found for the race.

Tutorial on theming

Add a tutorial to the docs on how to theme the scoreboard:

Tasks

  • Tutorial: Adding a simple background image
  • Tutorial: Creating a background w/ regions for the text

Events are incorrectly sorted

When writing the CSV for the Dolphin, events are incorrectly sorted as strings: 1, 10, 11, 12, ..., 2, 20, 21
They should be sorted as numbers: 1, 2, 3..., 10, 11, ...

Consider using network instead of files

The scoreboard currently just reads the .do4 result files.
This issue tracks investigating the Dolphin network protocol as a source of data.

Would this allow live race information such as elapsed time during the race or the current heat in the water as opposed to the one that just finished?

Odd/even lane text color

Add the ability to provide a separate foreground text color for the even lanes and the odd lanes

Better documentation

Provide proper documentation, either via gh pages or readthedocs. The current repo readme is unwelcoming for those unfamiliar with GitHub or software development.

Include:

  • Configuration screen and explanation of options
  • Recommendations on how to show the scoreboard at meets

Also change the in-app URL to point to the docs instead of the GitHub repo.

RuntimeError: main thread is not in main loop

This probably affects all versions <= 0.8.0

Traceback from v0.8.0:

RuntimeError: main thread is not in main loop
  File "zeroconf\_services\browser.py", line 533, in run
  File "zeroconf\_services\browser.py", line 416, in _fire_service_state_changed_event
  File "zeroconf\_services\__init__.py", line 55, in fire
  File "zeroconf\_services\browser.py", line 177, in on_change
  File "pychromecast\discovery.py", line 132, in remove_service
  File "imagecast.py", line 225, in update_cast
  File "wahoo_results.py", line 178, in cast_discovery_cb
  File "settings.py", line 498, in set_items
  File "settings.py", line 327, in set_items
  File "tkinter\ttk.py", line 1220, in get_children

This appears to be triggered by a Chromecast disappearing the network, and the app is trying to update the list of available devices shown to the user.

Sentry: WAHOO-RESULTS-C

Make suppression of final time configurable

Currently, the final time is suppressed (--:--.--) if there is > 0.30 delta between the fastest and slowest time reported for a lane.
Whether or not to do this should be configurable.

pychromecast.error.PyChromecastStopped: Socket client's thread is stopped.

Exception in thread Thread-828:
Traceback (most recent call last):
  File "C:\Python311\Lib\threading.py", line 1038, in _bootstrap_inner
    self.run()
  File "C:\Users\johns\Desktop\wahoo-results\.venv\Lib\site-packages\sentry_sdk\integrations\threading.py", line 72, in run
    reraise(*_capture_exception())
  File "C:\Users\johns\Desktop\wahoo-results\.venv\Lib\site-packages\sentry_sdk\_compat.py", line 60, in reraise
    raise value
  File "C:\Users\johns\Desktop\wahoo-results\.venv\Lib\site-packages\sentry_sdk\integrations\threading.py", line 70, in run
    return old_run_func(self, *a, **kw)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\johns\Desktop\wahoo-results\.venv\Lib\site-packages\pychromecast\socket_client.py", line 527, in run
    self.initialize_connection()
  File "C:\Users\johns\Desktop\wahoo-results\.venv\Lib\site-packages\pychromecast\socket_client.py", line 355, in initialize_connection
    self.receiver_controller.update_status()
  File "C:\Users\johns\Desktop\wahoo-results\.venv\Lib\site-packages\pychromecast\controllers\receiver.py", line 130, in update_status
    self.send_message(
  File "C:\Users\johns\Desktop\wahoo-results\.venv\Lib\site-packages\pychromecast\controllers\__init__.py", line 121, in send_message
    self.send_message_nocheck(
  File "C:\Users\johns\Desktop\wahoo-results\.venv\Lib\site-packages\pychromecast\controllers\__init__.py", line 133, in send_message_nocheck
    self._message_func(
  File "C:\Users\johns\Desktop\wahoo-results\.venv\Lib\site-packages\pychromecast\socket_client.py", line 939, in send_platform_message
    return self.send_message(
           ^^^^^^^^^^^^^^^^^^
  File "C:\Users\johns\Desktop\wahoo-results\.venv\Lib\site-packages\pychromecast\socket_client.py", line 874, in send_message
    self._ensure_channel_connected(destination_id)
  File "C:\Users\johns\Desktop\wahoo-results\.venv\Lib\site-packages\pychromecast\socket_client.py", line 983, in _ensure_channel_connected
    self.send_message(
  File "C:\Users\johns\Desktop\wahoo-results\.venv\Lib\site-packages\pychromecast\socket_client.py", line 909, in send_message
    raise PyChromecastStopped("Socket client's thread is stopped.")
pychromecast.error.PyChromecastStopped: Socket client's thread is stopped.

debug.log

Full screen mode

Add the ability to run the scoreboard in full screen mode in addition to having a maximized window

Manual triggering of results

Provide an interface to browse to a .do4 file and have the scoreboard display the results as if the race just happened.

Fullscreen mode only displays on primary

Version: 0.3.1

When using fullscreen mode, the scoreboard only displays on the primary screen, even if the application is moved to a secondary screen before starting the scoreboard.

Initial waiting screen

When the scoreboard is first started, display a "waiting for race results" message instead of E1/H1 and a blank scoreboard.

Track size of scoreboard image data

The scoreboard image is currently sent as a PNG to the CC, but if the user has a detailed background (i.e., a picture), the resulting PNG may be quite large, causing a delay while the CC loads it.

  • Add monitoring of the image size
  • Investigate the use of webp for the image format (lossy or lossless)
  • Investigate dynamically switching to JPG if necessary

Auto update of event file

Since we're now detecting new start list files automatically, it should automatically generate and/or update the dolphin_events.csv file.

Unhandled exeception: PyChromecastError via quick_play

2023-06-25 22:25:19,124 media WARNING Quick Play failed for http://192.168.1.240:9998/image-1687746289.png:image/png({'metadata': {'metadataType': 0, 'title': ''}})
Exception in thread Thread-10 (_refresh_run):
Traceback (most recent call last):
  File "C:\Python311\Lib\threading.py", line 1038, in _bootstrap_inner
    self.run()
  File "C:\Users\johns\Desktop\wahoo-results\.venv\Lib\site-packages\sentry_sdk\integrations\threading.py", line 72, in run
    reraise(*_capture_exception())
  File "C:\Users\johns\Desktop\wahoo-results\.venv\Lib\site-packages\sentry_sdk\_compat.py", line 60, in reraise
    raise value
  File "C:\Users\johns\Desktop\wahoo-results\.venv\Lib\site-packages\sentry_sdk\integrations\threading.py", line 70, in run
    return old_run_func(self, *a, **kw)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python311\Lib\threading.py", line 975, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\johns\Desktop\wahoo-results\imagecast.py", line 259, in _refresh_run
    self.publish(self.image)
  File "C:\Users\johns\Desktop\wahoo-results\imagecast.py", line 198, in publish
    self._publish_one(state["cast"])
  File "C:\Users\johns\Desktop\wahoo-results\imagecast.py", line 221, in _publish_one
    controller.quick_play(url, "image/png")
  File "C:\Users\johns\Desktop\wahoo-results\imagecast.py", line 71, in quick_play
    super().quick_play(
  File "C:\Users\johns\Desktop\wahoo-results\.venv\Lib\site-packages\pychromecast\controllers\media.py", line 547, in quick_play
    raise PyChromecastError()  # pylint: disable=broad-exception-raised
    ^^^^^^^^^^^^^^^^^^^^^^^^^
pychromecast.error.PyChromecastError

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.