Commit Graph

89 Commits

Author SHA1 Message Date
Peter Bochmann ff89643a4f
Run the thermal camera's NUC while the gimbal moves
The camera recalibrated against its shutter every 30 s and sent no frame for
about 0.7 s meanwhile: a picture falling into that had no thermal image (0.8 %
on tower 111, the 30 s rhythm shown by the new gap logging). The program now
switches the camera's timer off and runs the NUC itself (NUC_Perform, which
returns when it is done) when a move starts and nuc_interval_s (30) has passed,
or after twice that with no move. The scheduler tells the cameras of every move
(ICameraSource::moving), and a picture waits up to 1 s for a camera between
frames (frameReady) rather than go without it. The camera's own timer goes
back on exit; nuc_interval_s = 0 leaves it alone.

Measured on tower 111 before writing it: NUC_Interval = 0 gave 70 s without a
gap; NUC_Perform ran three NUCs of 657-677 ms; NUC_INPROGRESS never changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 19:02:20 +02:00
Peter Bochmann 474e3cac8a
Fix what the thermal camera's first run on tower 111 showed
- The thermal frame was numbered camera 0 - label RGB, and the colour file of
  the same time overwritten - because Vimba counts no camera before open().
  The composite now takes each source's configured camera count, and two
  enabled cameras may no longer share a label.
- The SDK switches LC_NUMERIC to de_DE when loaded, which made "hotx":0,4336.
  Its calls now run under a guard that restores the locale, and the JSON's
  numbers no longer go through printf.
- The camera's frame counter is always 0: new frames are told by their time,
  so the stream no longer stops after the first one.
- The LUT is empty for the first frame: it is asked again on later ones.
- The SDK is libirbgrab_x86_64-linux.so in the ld cache.
- The null channel traces the CamEvent payload it would have sent.

Tested on tower 111 with the TarisIR mini, the motors mocked: cap_net_raw is
enough, RGB/TIR pairs with one timestamp, the TIR file decodes to the counts
its CamEvent describes, profile switches 0-1-0. 536/536 in the 22.04 container.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 21:01:33 +02:00
Peter Bochmann 3d90af8490
Take a thermal picture beside the colour one at every waypoint
A TarisIR mini (driver = taris) is a second camera source behind a
CompositeCameraSource: the colour camera is asked first, then the thermal one
for its newest frame, and both frames carry the colour frame's timestamp.
Counts are saved 16-bit lossless under TIR/, and the CamEvent gains cal,
missed, tmax, tmed, hotx and hoty (docs/mqtt-api.md). The SDK is declared in
IrbgrabApi.h and loaded with dlopen, so no SDK file is in the repository; a
missing or unreachable camera stays offline (Health cams_offline) while the
scan goes on. scripts/fgc-setcap gives the binary cap_net_raw after a build.

Built and tested in an Ubuntu 22.04 container (mock, MQTT, Vimba+MQTT,
534/534), plus a mock run with RGB/TIR pairs. Not yet run against the camera.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 20:37:25 +02:00
Peter Bochmann a03da2d8f4
Merge slowing down, then pausing, the scan when the tower computer runs hot or cannot keep up
Built and tested in an Ubuntu 22.04 container (mock and Vimba+MQTT, 494/494)
and running on tower 111 since 2026-10-14.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 19:30:21 +02:00
pgdalmeida 2737811e2e
Stop the gimbal where it is when switching from a scan to manual 2026-10-09 14:25:51 +02:00
pgdalmeida 6fa43f1e08
Slow down, then pause, the scan when the tower computer runs hot or cannot keep up 2026-10-08 17:21:58 +02:00
pgdalmeida 19c5873df6
Merge cancelling homing and shutting down cleanly when the program is stopped during homing 2026-10-06 19:49:15 +02:00
pgdalmeida eb91f470dd
Cancel homing and shut down cleanly when the program is stopped during homing 2026-10-06 19:41:19 +02:00
pgdalmeida ce6ef3f79a
Keep each tower's config, scan grid and camera profiles in ~/.config/fire_gimbal_control, out of a deploy's reach 2026-10-05 22:02:49 +02:00
pgdalmeida 70a30132bf
Merge counting the picture interval from the last picture and waiting for a slow camera's next frame 2026-10-05 13:02:13 +02:00
pgdalmeida cfd8ba9978
Save raw 12-bit camera frames as 12-bit colour images, keep a waypoint's picture once the image has settled, and hold the scan when saving falls behind 2026-10-05 10:14:53 +02:00
pgdalmeida 62131d8083
Wait for a slow camera's next frame instead of restarting the stream, and read integer camera features for the exposure check 2026-10-04 16:12:44 +02:00
pgdalmeida fb0f5117df
Count the picture interval from the last picture, and let a settle wait of 0 wait for the exposure to settle 2026-10-02 18:28:40 +02:00
pgdalmeida 4488a2181d
Set in config.ini whether the tower homes and which mode it starts in, instead of the --init and --start flags 2026-09-30 16:42:48 +02:00
pgdalmeida f2c61e030e
Let a yaw-only tower aim with gimbal move, and stop it publishing a made-up pitch 2026-09-29 19:50:39 +02:00
pgdalmeida 895c2f22fd
Add a command to keep taking pictures where the gimbal points, drop unused camera commands, and fit the help on one page 2026-09-29 15:48:07 +02:00
pgdalmeida a21be0d4e8
Take the scan waypoints only from the CSV file, never generate them 2026-09-29 15:02:19 +02:00
pgdalmeida ab9fa3dbb0
Let a tower set its encoder scale, and send no speed after a failed homing 2026-09-28 18:21:37 +02:00
pgdalmeida da9a9867ed
Add a one-file tower bootstrap and a legacy-tower survey, and use an SDK already installed 2026-09-28 16:14:26 +02:00
pgdalmeida 8d81e03a3f
Support the legacy towers' DHT11 and fan, and fix the installer's reflash and test steps 2026-09-28 14:43:05 +02:00
pgdalmeida 8cf3b3b9e9
Stop every axis on a bare 'gimbal stop' 2026-09-28 12:41:11 +02:00
pgdalmeida 93f47bd142
Send the motor settings before enabling the drivers at startup 2026-09-28 11:33:46 +02:00
pgdalmeida 740eb1bd00
Stop the program cleanly on a service stop, and leave the gimbal at rest before configuring its motors 2026-09-25 23:21:26 +02:00
pgdalmeida 79225bc3cd
Rework the dashboard keys: a/p/m for modes, n for connectivity, page keys to scroll, heading setup in the activity strip 2026-09-25 18:57:25 +02:00
pgdalmeida f4e67666d8
Give the tower three modes, auto, pan and manual, switched by command 2026-09-25 17:50:48 +02:00
pgdalmeida 4a69d65afb
Take any console command over MQTT, and answer it 2026-09-25 16:43:45 +02:00
pgdalmeida 9dc9b90f6d
Call the dashboard's messaging panel COMMS, to match its m key 2026-09-25 15:33:39 +02:00
pgdalmeida d8d2fee8af
Test the camera with forced dark and bright settings, and recover a camera that stops sending frames 2026-09-24 17:35:37 +02:00
pgdalmeida 5a0515ab13
Test that the camera delivers frames and follows its settings to black and white 2026-09-24 15:47:58 +02:00
pgdalmeida 6824a0d580
Migrate tower 111's host, and resume capture after a test instead of leaving it stopped 2026-09-24 09:01:05 +02:00
pgdalmeida 86f930a671
Add a one-shot test command and a tool that edits the config files safely 2026-09-23 18:52:44 +02:00
pgdalmeida 4049a85b9b
Check the firmware was built with the pins hardware.ini lists 2026-09-23 18:26:14 +02:00
pgdalmeida b6308c1eda
Check the tower is running its own settings, not the firmware's fallback 2026-09-23 16:07:07 +02:00
pgdalmeida bd3a568508
Send the whole drivetrain on connect, so a restart is enough to retune 2026-09-23 07:36:23 +02:00
pgdalmeida 00c998301a
Bound the report files too, and only prune what this program generated 2026-09-22 18:27:43 +02:00
pgdalmeida 582047d3a2
Keep a log file, so a tower's record outlives the tmux session 2026-09-22 18:15:09 +02:00
pgdalmeida 57a166c9a4
Warn when the homed travel falls below zero, and say why the centre matters 2026-09-21 23:06:37 +02:00
pgdalmeida e2bdc8debf
Trust the firmware's reset-cause name over a decode that cannot be right for both boards 2026-09-21 19:03:55 +02:00
pgdalmeida 041ad2a18f
Understand the NEEDCFG state instead of reading it as a dead link 2026-09-18 17:15:16 +02:00
pgdalmeida 6f88b00856
Write the drivetrain block at install, since the firmware now demands it 2026-09-18 17:06:34 +02:00
pgdalmeida 842d95eeca
Check every declared value, not just the current 2026-09-18 16:44:08 +02:00
pgdalmeida 522ba072ec
Answer the firmware's NEED lines from hardware.ini 2026-09-18 16:16:04 +02:00
pgdalmeida 579c4ec166
Let a declared sensor enable itself, and retire the duplicate flag 2026-09-18 15:57:10 +02:00
pgdalmeida b5d1fac4cb
Declare axis speed in degrees per second, not VMAX 2026-09-18 15:44:19 +02:00
pgdalmeida 4f57651c9b
Refuse to start when the rig is missing hardware it declares 2026-09-18 14:50:50 +02:00
pgdalmeida f695a4eac6
Give the UTC stamp a buffer GCC can prove is big enough 2026-09-17 18:20:25 +02:00
pgdalmeida 31da8012d7
Stop addressing an axis this tower does not have, and carry the live calibration 2026-09-17 18:14:13 +02:00
pgdalmeida 0c1d0a6df8
Send and verify motor current, and derive counts_per_deg from the homed travel 2026-09-17 17:58:46 +02:00
pgdalmeida 9a61167aa6
Parse the motor current the firmware echoes back in DUMP 2026-09-17 17:58:46 +02:00
pgdalmeida ffaa41ac2f
Read the drivetrain per axis from hardware.ini, and compare INI values numerically 2026-09-17 17:58:45 +02:00