Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
157 commits
Select commit Hold shift + click to select a range
57e8eee
sqlite layer with versioned migrations
connorgallopo May 30, 2026
ee8a2b8
session and shot repositories
connorgallopo May 31, 2026
d36be2e
persist shots as they come in
connorgallopo Jun 3, 2026
f4fef86
close the session when pitrac stops
connorgallopo Jun 3, 2026
396da61
give each shot its own image folder
connorgallopo Jun 4, 2026
bf4e0d3
handle per shot image paths in the ui
connorgallopo Jun 5, 2026
143c6b6
prune old shot images when storage fills up
connorgallopo Jun 5, 2026
e6ee64e
shot history api
connorgallopo Jun 6, 2026
ad09b1b
shot history page with per shot images
connorgallopo Jun 7, 2026
8b95094
per run log files instead of one giant pitrac.log
connorgallopo Jun 7, 2026
dc83168
stop reading whole log files into memory, add scrollback
connorgallopo Jun 8, 2026
671af16
scrollback on the logs page
connorgallopo Jun 8, 2026
bcfce7f
tighten log caps so the live file stays under the dir cap
connorgallopo Jun 9, 2026
cb2faf1
tidy up the history page theming and tailwind usage
connorgallopo Jun 10, 2026
68b0569
tidy up the logs page tailwind usage and wire handlers properly
connorgallopo Jun 12, 2026
fb5a63f
fix dead daisyui classes, broken theme vars, and stale image fallback…
connorgallopo Jun 13, 2026
f49310e
use real daisyui modal, badge, and buttons on the testing page
connorgallopo Jun 13, 2026
f01e558
swap the update banner and spinner for daisyui alert and loading
connorgallopo Jun 14, 2026
c794766
dedupe dashboard metric cards into a macro, drop the misused stat
connorgallopo Jun 14, 2026
d3e5191
make config use the real menu, badges, table and alert components
connorgallopo Jun 15, 2026
812c8cb
use daisyui steps, progress and alert on the calibration page
connorgallopo Jun 17, 2026
36b2ffd
split out the merged config builder so it can be served, not just wri…
connorgallopo Jun 19, 2026
89ffa69
serve the live merged config at /api/internal/config
connorgallopo Jun 19, 2026
a412b69
single source of truth for the web server port
connorgallopo Jun 19, 2026
91b4549
stop generating the config file, pass the web server port to the binary
connorgallopo Jun 19, 2026
a526d9e
teach the binary the web server port and add a config fetch
connorgallopo Jun 20, 2026
432d194
fetch config over http at startup instead of reading the file
connorgallopo Jun 21, 2026
82401d3
serve every setting in the merged config, not just the json ones
connorgallopo Jun 23, 2026
c574631
stop passing settings as cli args and env vars
connorgallopo Jun 23, 2026
bf0476d
add OGS connection settings under the Simulators config category
connorgallopo Jun 23, 2026
e5b5eeb
add SimInterface base for the python sim layer
connorgallopo Jun 26, 2026
6a54188
add OGSSim with persistent connection, shot mapping, keepalive and re…
connorgallopo Jun 27, 2026
d20f475
make ogs socket tests work without the global pytest-socket plugin
connorgallopo Jun 28, 2026
2045c64
add SimManager for config-driven sim fan-out and lifecycle
connorgallopo Jun 29, 2026
72ce2d0
gate on_shot to connected sims and fix the stub tests to match
connorgallopo Jul 1, 2026
3924382
wire SimManager into the server with /api/sims and /ws/sims
connorgallopo Jul 1, 2026
c7a315b
only forward real shots to sims, not status or fake-hit messages
connorgallopo Jul 1, 2026
f56c2e5
add simulators navbar drawer with live status over /ws/sims
connorgallopo Jul 3, 2026
a75049b
make ogs connect idempotent so a double connect cant leak the socket
connorgallopo Jul 4, 2026
3556cc6
read camera type, lens and orientation from config instead of env
connorgallopo Jul 4, 2026
6b8e6af
populate launch options from config instead of the command line
connorgallopo Jul 4, 2026
404ad33
drop the passVia routing metadata
connorgallopo Jul 4, 2026
194f956
serve testing tool overrides through the config endpoint instead of a…
connorgallopo Jul 5, 2026
5da3df9
post calibration results over the http client and stop rewriting a co…
connorgallopo Jul 5, 2026
5a24e85
config only ever comes from the web server now
connorgallopo Jul 6, 2026
e62ab73
setconstant keeps the default when a key is missing
connorgallopo Jul 6, 2026
b723656
keep settings and calibration in sqlite and import the json files
connorgallopo Jul 7, 2026
03daa25
skip dotted keys on import, keep the first backup, import_config in o…
connorgallopo Jul 8, 2026
227675a
prune the open session too, keeping the newest shot
connorgallopo Jul 8, 2026
e13290e
rebuild sims when their settings change instead of needing a restart
connorgallopo Jul 9, 2026
99b9b68
detect cameras from the web server on first start instead of the inst…
connorgallopo Jul 10, 2026
176eb54
only detect cameras when the database was just created
connorgallopo Jul 12, 2026
77ddfb6
skip camera detection when the first-start import already brought set…
connorgallopo Jul 12, 2026
5a6c831
skip camera detection when an old settings json was found
connorgallopo Jul 13, 2026
47a55a4
skip detected camera settings that aren't valid options
connorgallopo Jul 14, 2026
01819bd
log rejected calibration puts, fix share dir key, name camera setting…
connorgallopo Jul 17, 2026
40d3bb0
name the orientation setting in the orientation error
connorgallopo Jul 17, 2026
d545912
use a lifespan handler and clean up the test warnings
connorgallopo Jul 18, 2026
ca557e2
drop the misspelled and duplicate warning flags from meson
connorgallopo Jul 20, 2026
fcf0778
point camera detect hints at the cameras.slotN.type settings
connorgallopo Jul 20, 2026
a3e491e
run one testing tool at a time and block pitrac start while one runs
connorgallopo Jul 21, 2026
aae576d
notify callbacks on reset and import, harden the legacy json import
connorgallopo Jul 23, 2026
bd4474d
prune whole shot dirs by id instead of trusting stored file paths
connorgallopo Jul 23, 2026
d178fbc
time out ogs connects, clean up a cancelled connect, ignore sim confi…
connorgallopo Jul 23, 2026
ca3db33
keep the web-server venv across build.sh dev syncs
connorgallopo Jul 24, 2026
387fcf6
reserve the testing tool slot before spawning, delete session images …
connorgallopo Jul 24, 2026
47e7fa8
let the stopped run release its own slot, drop unused image_paths_for…
connorgallopo Jul 27, 2026
d7bfc92
drop dead backup files, stale slot env vars, and redundant focal leng…
connorgallopo Jul 29, 2026
a5d9120
remove cli flags that the served config always overrides
connorgallopo Jul 31, 2026
32eedb5
import legacy json once at startup and only into empty tables
connorgallopo Jul 31, 2026
0dedc2a
show pitrac start refusals as errors on every page
connorgallopo Jul 31, 2026
ca01343
test the still starting stop guard
connorgallopo Jul 31, 2026
a22a869
use the real ball location system mode and drop the stale cli wording
connorgallopo Aug 1, 2026
212dc37
color dashboard error messages
connorgallopo Aug 2, 2026
2a27ad3
keep dashboard status messages up until their timeout
connorgallopo Aug 2, 2026
87797d4
treat any non-success pitrac control status as an error
connorgallopo Aug 3, 2026
155fe55
drop the remaining cli parameter wording
connorgallopo Aug 3, 2026
b134054
read the custom lens focal length and image dir from the keys the ser…
connorgallopo Aug 4, 2026
3666077
drop the image dir env vars nothing reads
connorgallopo Aug 7, 2026
8327e51
drop the unused ConfigurationManager and yaml-cpp
connorgallopo Aug 8, 2026
f3929dd
drop the unused pitrac.yaml test fixture and the stale activemq api docs
connorgallopo Aug 8, 2026
0a23b90
define every key the c++ reads in configurations.json and test it
connorgallopo Aug 9, 2026
1099edb
warn when the server omits a config key and drop the schema keys noth…
connorgallopo Aug 9, 2026
2693edd
drop the unused ConfigTestHelper
connorgallopo Aug 9, 2026
fd82aed
drop the config reads whose c++ variables nothing uses
connorgallopo Aug 11, 2026
19cf498
load GolfSimCamera constants once at startup instead of in every cons…
connorgallopo Aug 13, 2026
8c17723
fix the strobe cleanup defaults and test the runtime-built keys
connorgallopo Aug 13, 2026
41166b4
sync c++ initializers to the schema defaults
connorgallopo Aug 13, 2026
f8f76bb
drop the kUsePreImageSubtraction re-reads the startup loader already …
connorgallopo Aug 14, 2026
5761860
note that configurations.json owns the defaults
connorgallopo Aug 14, 2026
e8bb2b9
sync the function-local config fallbacks too and test globals and locals
connorgallopo Aug 15, 2026
15cad84
drop the stale 6mm lens note on the crop offsets
connorgallopo Aug 15, 2026
84e0865
type the int settings as integer and truncate them when serving
connorgallopo Aug 16, 2026
b7573d4
spell out the per-camera config keys so the key test sees every one
connorgallopo Aug 16, 2026
dd80c98
read the BallImageProc settings once in its startup loader
connorgallopo Aug 17, 2026
faa7deb
name the comparison-mode canny keys after the cleanup pass they drive
connorgallopo Aug 18, 2026
509f61c
test that every schema key has a reader
connorgallopo Aug 19, 2026
4725212
drop the duplicate libcamera_jpeg source and the early image dir set …
connorgallopo Aug 21, 2026
822e8be
drop the unread system.camera_role setting
connorgallopo Aug 21, 2026
aa53320
add a python gspro sim on a tcp base shared with ogs
connorgallopo Aug 21, 2026
0990f7a
harden the gspro reader and keep shot numbers across reconnects
connorgallopo Aug 22, 2026
7b07d4d
send ball state, club and armed through the shot-result reply
connorgallopo Aug 22, 2026
109c5f9
read armed and club from the shot-result reply
connorgallopo Aug 22, 2026
dfc67fe
queue a club change from the reply only once
connorgallopo Aug 23, 2026
38af466
wrap the e6 auth object in a shared library python can call
connorgallopo Aug 23, 2026
136d51b
track the latest club from any source for the reply guard
connorgallopo Aug 23, 2026
90d10a1
link the e6 library against the full boost dep
connorgallopo Aug 23, 2026
2d2afb8
only pass auth challenges to the e6 object and strip the installed li…
connorgallopo Aug 25, 2026
427a7c7
add the e6 sim to the python sim layer
connorgallopo Aug 25, 2026
cb4987b
pass e6 auth text through untouched and time out a silent handshake
connorgallopo Aug 28, 2026
39e44de
move stored gspro and e6 settings to the new sim keys on startup
connorgallopo Aug 28, 2026
51d54aa
drop the c++ sim path now that python runs gspro and e6
connorgallopo Aug 29, 2026
4558c87
use the shared ball image processor in lm_main instead of leaking a n…
connorgallopo Sep 1, 2026
5ccd591
drop the send_test_results shot injection mode, nothing can feed it s…
connorgallopo Sep 1, 2026
8890e1d
stop bad legacy or hand-edited sim settings from blocking web server …
connorgallopo Sep 2, 2026
18efe62
send gspro the real ball state on reconnect, stop sims and startup wa…
connorgallopo Sep 3, 2026
d0c7fed
set the club straight from the web server reply and drop the queued c…
connorgallopo Sep 3, 2026
b33a1bc
drop the stale build transcript and an unused import
connorgallopo Sep 4, 2026
65ee1da
close the connect and reload races in the sim layer
connorgallopo Sep 4, 2026
1f4974e
only record the sim club from replies and apply it at startup and rig…
connorgallopo Sep 5, 2026
30a11c7
cap how long a sim disconnect can wait on a stuck peer
connorgallopo Sep 5, 2026
bc00764
apply the sim club only in the fsm so still and dev modes keep their …
connorgallopo Sep 5, 2026
998a96d
merge main
connorgallopo Sep 7, 2026
626bca5
pin opencv for the tests so ci stops picking up opencv 5
connorgallopo Sep 8, 2026
aeac3a4
take the status strip colors from pico
connorgallopo Sep 10, 2026
cc8926b
vendor daisyui and tailwind, version static assets, make eslint pass …
connorgallopo Sep 10, 2026
a991372
shared helpers, one navbar with a real status pill, and a usable sims…
connorgallopo Sep 13, 2026
fac4a19
escape quotes, read fastapi detail, and keep one bad status subscribe…
connorgallopo Sep 13, 2026
0f1effa
track real calibration state, keep lens and ball runs apart, add setu…
connorgallopo Sep 15, 2026
a7b23b7
rename setup status simulator key, clear a failed spawn, share the le…
connorgallopo Sep 17, 2026
577f7dc
calibration page is now a checklist in hardware order
connorgallopo Sep 17, 2026
0e68c2b
keep lens runs alive off-section, catch partial position saves, quiet…
connorgallopo Sep 18, 2026
3a06977
switching sections while the lens feed connects just cancels the start
connorgallopo Sep 19, 2026
6bfb037
dashboard strip shows real state, survives config saves, and shows wh…
connorgallopo Sep 19, 2026
4ae7fe6
dashboard holds the shot until the next ball and keeps the image thro…
connorgallopo Sep 19, 2026
c3464e4
coerce config values by type, validate floats and hosts, hide interna…
connorgallopo Sep 20, 2026
3a6c4fd
simulators are a list you add to, with a test button and one on switch
connorgallopo Sep 21, 2026
3063331
sims survive reloads mid-shot, row menus stay put, no duplicate sims …
connorgallopo Sep 21, 2026
07455a2
slimmer nav and a hideable setup checklist that follows the calibrati…
connorgallopo Sep 23, 2026
61b3644
checklist buttons look like buttons, todo beats redo, one setup fetch…
connorgallopo Sep 25, 2026
d5a8261
config page gets a setup card and stops losing edits
connorgallopo Sep 26, 2026
8d5535b
config page keeps edits made mid-save, locks calibrated rows, tidier …
connorgallopo Sep 26, 2026
9625816
navbar controls match: one pitrac button with state and action, sim b…
connorgallopo Sep 27, 2026
2a72757
logs keep their place and reconnect cleanly, update page confirms bef…
connorgallopo Sep 27, 2026
e3cbc40
update polling survives mid-build blips, paused logs keep order
connorgallopo Sep 30, 2026
c1406dd
testing keeps each tool's last result, sessions page, shot ingest tak…
connorgallopo Oct 3, 2026
5a7a060
testing shows results on each tool, history pages and drops the fake …
connorgallopo Oct 3, 2026
586cd16
tool names in testing messages, quieter history headings and delete i…
connorgallopo Oct 3, 2026
8810db2
timeouts keep their output, redos bump calibration dates, import skip…
connorgallopo Oct 5, 2026
f945a02
config.txt only gets rewritten when it changes, auto detect off, alwa…
connorgallopo Oct 6, 2026
510a806
tell people to reboot at the end of build.sh when it's needed
connorgallopo Oct 6, 2026
7ffabfd
failed focal length samples no longer get averaged in
connorgallopo Oct 6, 2026
af8d655
pitrac_lm exits non-zero when auto calibration fails so recovered ret…
connorgallopo Oct 7, 2026
27c1ce8
failed ball calibration says why it failed
connorgallopo Oct 7, 2026
2a8e4c1
ogs ready light follows the ball, club gets logged from player update…
connorgallopo Oct 7, 2026
20144cd
store what ogs sends back for each shot
connorgallopo Oct 7, 2026
b10d351
gpio fix
connorgallopo Oct 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions .github/workflows/web-server-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,19 @@ jobs:
pip install -r requirements.txt
pip install -r requirements-test.txt

- name: Set up Node
if: matrix.python-version == '3.12'
uses: actions/setup-node@v4
with:
node-version: '20'

- name: Lint JavaScript
if: matrix.python-version == '3.12'
working-directory: Software/web-server
run: |
npm ci
npx eslint 'static/**/*.js'

- name: Run tests with coverage
working-directory: Software/web-server
run: |
Expand Down
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -103,4 +103,5 @@ packaging/pitrac
*.FCBak

# Node.js (root-level tooling)
node_modules/
node_modules/
!Software/web-server/static/vendor/
29 changes: 3 additions & 26 deletions Software/LMSourceCode/ImageProcessing/ImageProcessing.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -131,17 +131,17 @@
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;BOOST_BIND_GLOBAL_PLACEHOLDERS;BOOST_ALL_DYN_LINK;BOOST_USE_WINAPI_VERSION=0x0A00;YAML_CPP_STATIC_DEFINE;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;BOOST_BIND_GLOBAL_PLACEHOLDERS;BOOST_ALL_DYN_LINK;BOOST_USE_WINAPI_VERSION=0x0A00;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>E:\Dev_Libs\opencv\build\include;E:\Dev_Libs\yaml-cpp\include;E:\Dev_Libs\boost_1_90_0\boost;../packages/Microsoft.ML.OnnxRuntime.1.23.2/build/native/include</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>E:\Dev_Libs\opencv\build\include;E:\Dev_Libs\boost_1_90_0\boost;../packages/Microsoft.ML.OnnxRuntime.1.23.2/build/native/include</AdditionalIncludeDirectories>
<LanguageStandard>stdcpp20</LanguageStandard>
<DebugInformationFormat>OldStyle</DebugInformationFormat>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>E:\Dev_Libs\opencv\build\x64\vc16\lib;E:\Dev_Libs\boost_1_90_0\lib64-msvc-14.3</AdditionalLibraryDirectories>
<AdditionalDependencies>E:\Dev_Libs\opencv\build\x64\vc16\lib\opencv_world4120d.lib;E:\dev_libs\yaml-cpp\build\Debug\yaml-cppd.lib;../packages/Microsoft.ML.OnnxRuntime.1.23.2/runtimes/win-x64/native/onnxruntime.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>E:\Dev_Libs\opencv\build\x64\vc16\lib\opencv_world4120d.lib;../packages/Microsoft.ML.OnnxRuntime.1.23.2/runtimes/win-x64/native/onnxruntime.lib;$(CoreLibraryDependencies);%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
Expand Down Expand Up @@ -213,7 +213,6 @@
<ClCompile Include="ball_watcher_image_buffer.cpp" />
<ClCompile Include="camera_hardware.cpp" />
<ClCompile Include="colorsys.cpp" />
<ClCompile Include="configuration_manager.cpp" />
<ClCompile Include="core\dma_heaps.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
</ClCompile>
Expand Down Expand Up @@ -253,22 +252,12 @@
<ClCompile Include="gs_camera.cpp" />
<ClCompile Include="gs_clubs.cpp" />
<ClCompile Include="gs_config.cpp" />
<ClCompile Include="gs_e6_interface.cpp" />
<ClCompile Include="gs_e6_response.cpp" />
<ClCompile Include="gs_e6_results.cpp" />
<ClCompile Include="gs_events.cpp" />
<ClCompile Include="gs_fsm.cpp" />
<ClCompile Include="gs_gspro_interface.cpp" />
<ClCompile Include="gs_gspro_response.cpp" />
<ClCompile Include="gs_gspro_results.cpp" />
<ClCompile Include="gs_gspro_test_server.cpp" />
<ClCompile Include="gs_control_msg.cpp" />
<ClCompile Include="gs_result_types.cpp" />
<ClCompile Include="gs_results.cpp" />
<ClCompile Include="gs_shot_parameters.cpp" />
<ClCompile Include="gs_sim_interface.cpp" />
<ClCompile Include="gs_sim_socket_interface.cpp" />
<ClCompile Include="gs_web_api.cpp" />
<ClCompile Include="lm_main.cpp" />
<ClCompile Include="gs_options.cpp" />
<ClCompile Include="gs_ui_system.cpp" />
Expand Down Expand Up @@ -378,7 +367,6 @@
<ClInclude Include="blocking_queue.h" />
<ClInclude Include="camera_hardware.h" />
<ClInclude Include="colorsys.h" />
<ClInclude Include="configuration_manager.h" />
<ClInclude Include="core\buffer_sync.hpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
</ClInclude>
Expand Down Expand Up @@ -415,23 +403,15 @@
<ClInclude Include="gs_camera.h" />
<ClInclude Include="gs_clubs.h" />
<ClInclude Include="gs_config.h" />
<ClInclude Include="gs_e6_interface.h" />
<ClInclude Include="gs_e6_response.h" />
<ClInclude Include="gs_e6_results.h" />
<ClInclude Include="gs_format_lib.h" />
<ClInclude Include="gs_fsm.h" />
<ClInclude Include="gs_globals.h" />
<ClInclude Include="gs_gspro_interface.h" />
<ClInclude Include="gs_gspro_response.h" />
<ClInclude Include="gs_gspro_results.h" />
<ClInclude Include="gs_gspro_test_server.h" />
<ClInclude Include="gs_control_msg.h" />
<ClInclude Include="gs_result_types.h" />
<ClInclude Include="gs_options.h" />
<ClInclude Include="gs_results.h" />
<ClInclude Include="gs_shot_parameters.h" />
<ClInclude Include="gs_sim_interface.h" />
<ClInclude Include="gs_sim_socket_interface.h" />
<ClInclude Include="gs_ui_system.h" />
<ClInclude Include="image\image.hpp" />
<ClInclude Include="libcamera_interface.h" />
Expand Down Expand Up @@ -477,7 +457,6 @@
<None Include="core\meson.build" />
<None Include="core\version.cmake" />
<None Include="core\version.cpp.in" />
<None Include="create_closed_source_objects.sh" />
<None Include="encoder\meson.build" />
<None Include="golf_sim_config.json" />
<None Include="image\meson.build" />
Expand All @@ -503,8 +482,6 @@
<None Include="RunScripts\runPiTracCommon.sh" />
<None Include="RunScripts\runPulseTest.sh" />
<None Include="RunScripts\runShutdown.sh" />
<None Include="RunScripts\runTestExternalSimMessage.sh" />
<None Include="RunScripts\runTestGsProServer.sh" />
<None Include="RunScripts\runTestResults.sh" />
<None Include="RunScripts\runTestSpin.sh" />
<None Include="RunScripts\shutdown_gs.sh" />
Expand Down
Loading
Loading