Changes in this release:
- 2c3eca5 wpa_supplicant: re-disable P2P and MATCH_IFACE after configure buildroot's WPA_SUPPLICANT_CONFIGURE_CMDS ends with a loop that re-adds any CONFIG_ENABLE symbol whose uncommented line is missing. CONFIG_P2P (via AP_SUPPORT) and CONFIG_MATCH_IFACE (base list) are in buildroot's ENABLE list, so the DISABLE sed comments them out and the loop appends them back as =y, defeating the override and bloating the binary (~52%). Disable the two again in a post-configure hook, after buildroot's loop. Signed-off-by: Paul Philippov paul@themactep.com
- 7c9cf8f isp-inspector: make live badge health absolute ranges Derive every live badge color from the current absolute value only, never from the previous sample, and align thresholds with the issue log. - add healthAbove/healthBelow classifiers (ok/warn/crit) - FPS ok >= 15, warn 10-15, crit < 10 (matches the issue log) - DMA queue ok >= 3, warn 2, crit < 2 - drops and interrupt-ahead ok 0, warn 1-9, crit >= 10 - digital gain warn only while analog gain has headroom, crit at max - match issue-log severities to the same bands Signed-off-by: Paul Philippov paul@themactep.com
- 90dfeb3 external.mk: exclude -override.mk from package glob The -override.mk fragments are already included through BR2_PACKAGE_OVERRIDE_FILE (thingino-overrides.mk). external.mk's package//.mk glob picked them up a second time, so every override ran twice. Harmless for idempotent overrides (duplicate sed expressions), but a real bug for any override that registers hooks or uses non-idempotent +=. Signed-off-by: Paul Philippov paul@themactep.com
- 2921579 uboot: restore binary blobs dropped by GNU patch GNU patch cannot apply the "Binary files differ" hunks in the 2013.07-to-thingino patch, so the blobs vendored in the bundle came out empty after patching. Only the three prebuilt SPL images were restored; the host tools, logos, GPT/MBR blobs and NAND manager library were silently lost. Vendor all thirty binaries under package/thingino-uboot/files/, mirroring the U-Boot source layout, and copy the whole directory back in a single post-patch hook. The extracted tarball plus the 2013.07 patch set is now byte-identical to the previous git checkout, apart from the follow-up text patches. Signed-off-by: Paul Philippov paul@themactep.com
- 6598e3f soc/ingenic: state a family's shared values once (#1451) The family files enumerated one ifeq block per model, so a value the whole family shares got repeated once per model. t33 named isvp_t33_sfcnor eight times; a1 and t21 named theirs five times each; t10 repeated its RAM size three times. State what the models share once, and express what differs as an exhaustive if/else: # what's common SOC_ARCH := xburst1 SOC_FAMILY := t33 SOC_UBOOT_NOR := isvp_t33_sfcnor # what's different ifneq ($(filter $(SOC_MODEL),t33n t33vn t33zn),) SOC_RAM_MB := 128 else SOC_RAM_MB := 64 endif No variable is assigned a value that a later line replaces. A default with per-model overrides would read shorter still, but it means every model briefly holds a value that is wrong for it, and a model added to the filter and nowhere else would inherit that default rather than being noticed. Which value is common differs by family. t10 shares a RAM size and splits on the bootloader; a1 and t21 share a bootloader and split on RAM; t20, t40 and t41 vary in both, so their branches carry both lines. t41 gains least -- its six parts take six different NAND defconfigs -- but a per-model ladder still reads shorter than six ifeq blocks. Changed: a1, t10, t20, t21, t33, t40, t41 -- 153 lines out, 63 in. Left alone: c100 has one model. t23, t30, t31 and t32 have a distinct bootloader per model with no majority to hoist, so this would save a line or two while making a model's values harder to find. t31's eight models carry five NOR defconfigs and six NAND ones -- that table is earning its length. No functional change, verified two ways: 1. Evaluated both versions for all 35 models the seven filters claim and diffed every variable they set (SOC_FAMILY, SOC_ARCH, SOC_RAM_MB, SOC_UBOOT_NOR, SOC_UBOOT_NAND, SOC_UBOOT_BIN). Identical. 2. Checked that no file assigns a variable at both the common level and inside a branch. Worth doing properly because 27 of the 54 models have no camera config -- including all eight t33 parts -- so no build would have caught a wrong value. Co-authored-by: John Chia john@johnchia.com Co-authored-by: Paul Philippov themactep@gmail.com
- a429e0a usbnet: fix MAC address lookup in CDC NCM scripts (#1463) The S36cdcnet and S36cdcnet-client scripts read ethaddr from U-Boot env via fw_printenv, but S03mac never set ethaddr in the env - it only stored MACs in thingino.json. When ethaddr is absent, both scripts fail. - S03mac: also persist eth MAC to U-Boot env (ethaddr) for network ops - S36cdcnet: add jct fallback for eth.mac, save MAC before decrement_mac, remove redundant second fw_printenv call - S36cdcnet-client: fix pre-existing bug where ethaddr was never read before decrement_mac, add jct fallback, remove redundant fw_printenv Reported-by: Josh <@wltechblog> Signed-off-by: WLTB-Gino gino@wltechblog.com Co-authored-by: WLTB Gino gino@wltb.local
- 1951efc scripts: add local site method support to manage-package-overrides (#1464) The manage-package-overrides.sh script only supported cloning git repos for package overrides. Packages using SITE_METHOD = local (e.g. usbnet, where source lives in package//files/) would fail with 'Unsupported site method: local'. This patch adds a local branch to download_package() that copies the package source files into overrides// instead of cloning, and registers the override in local.mk just like git packages. Signed-off-by: WLTB-Gino gino@wltechblog.com Co-authored-by: WLTB Gino gino@wltb.local
- f342e06 webui: raptor/timps preview pages, install-order fix (no plugin schema change) (#1460) * thingino-raptor: install preview.html directly, drop plugin indirection Simpler alternative to the "provides" manifest key added and then reverted in this branch's history, per upstream review feedback: rather than a new manifest schema entry that assemble_plugins.py has to resolve and apply, raptor's preview page just uses the exact same filename as core webui's (files/www/preview.html, moved from thingino-webui into thingino-raptor) and is installed straight over it. thingino-webui.mk drops the BR2_PACKAGE_THINGINO_STREAMER_RAPTOR ifeq that used to pick preview-raptor.html vs preview.html at ITS OWN install time - core webui always installs its own default now, no knowledge of raptor. raptor's THINGINO_RAPTOR_INSTALL_TARGET_CMDS overwrites it with its own copy, gated on THINGINO_RAPTOR_DEPENDENCIES += thingino-webui (added earlier in this branch) for ordering: that dependency guarantees the stock page exists first, and raptor's own per-package install step always completes before Buildroot's global target-finalize phase - where thingino-webui's plugin-assembly hook lives - runs. So by the time assembly processes preview.html, raptor's version is already there, and it comes out the other side with the normal plugin layer (<script src="/a/plugins.js">, nav data, THINGINO_PLUGIN_PREVIEW_BODY overlays) same as any other page. No manifest, no assemble_plugins.py changes. Also keeps THINGINO_WEBUI_ASSEMBLE_PLUGINS failing the build on any assemble_plugins.py error instead of printing "non-fatal" and continuing - independent of this change, but was bundled with it upstream; every error that script raises (duplicate plugin name, two plugins claiming the same page) is a real manifest conflict that silently ships a broken WebUI if swallowed. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com * timps: install preview.html directly, drop plugin manifest indirection Same simplification as the previous commit for thingino-raptor, applied to timps: files/www/preview-timps.html is renamed to files/www/preview.html (same filename core webui uses) and package/timps/files/timps.webui.json (a manifest that existed only to declare the swap) is dropped entirely. Unlike raptor, timps needed no new install step at all: preview.html now sits in the same files/www/*.html directory TIMPS_INSTALL_WEBUI_CGIS already glob-installs for its other ~15 native pages (
for f in $(TIMPS_PKGDIR)/files/www/*.html), so it goes out through that existing loop and wins by the same plain-overwrite, same-filename mechanism - no separate TIMPS_INSTALL_PREVIEW hook, no separate gate (TIMPS_INSTALL_WEBUI_CGIS was already gated identically: WebUI present + TIMPS_CONTROL enabled, the same condition the removed hook used, since preview.html pulls /x/timps-token.cgi which only that hook installs). TIMPS_DEPENDENCIES += thingino-webui and TIMPS_INSTALL_WEBUI_CGIS's move to TIMPS_POST_INSTALL_TARGET_HOOKS (both from the previous commit in this branch's history) still stand and are what make the overwrite land before thingino-webui's plugin-assembly finalize hook runs - that ordering fix is unrelated to the provides-vs-plain-overwrite question and is still needed either way. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com * timps: drop USE_TRACE/TIMPS_TRACE debug flag from this PR Unrelated scope: a debug-build make-variable override for src/trace.c's opt-in latency instrumentation, deliberately not a Kconfig option. Flagged in upstream review as not belonging in a preview-page/install-order PR - correct, it has nothing to do with either. Dropping it here; it belongs in its own small, separate change. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com --------- Co-authored-by: Claude Sonnet 5 noreply@anthropic.com Co-authored-by: Paul Philippov themactep@gmail.com - 3bbaa82 litokam c1: correct audio gpio active level
- d201ce9 Merge remote-tracking branch 'origin/ciao' into ciao
- 482ed3a prudynt-t: bump to 6afc440 (RTSP audio-only fix) Pick up themactep/prudynt-t#30: the drain loop now serves audio-only sessions, and sendRtcpSr no longer emits a bogus video Sender Report on the audio RTCP channel. Signed-off-by: Paul Philippov paul@themactep.com
- 5c9a3bd timps: add opt-in TIMPS_TRACE debug build flag (#1461) Wires USE_TRACE (src/trace.c, opt-in send-pipeline latency instrumentation) into TIMPS_BUILD_CMDS. Deliberately NOT a BR2_PACKAGE_TIMPS_* Kconfig option - it must not be reachable from menuconfig, since it's a debug-only instrumentation build, not a feature. For a one-off debug build, pass TIMPS_TRACE=1 as a plain make-variable override on the invocation: make CAMERA=... IP=... TIMPS_TRACE=1 rebuild-timps Default (TIMPS_TRACE unset) is USE_TRACE=0, identical to every other build - zero behavior change unless explicitly requested per-invocation. Split out of #1460 (preview-page install-order fix) per review feedback - unrelated scope, its own small change. Co-authored-by: Claude Sonnet 5 noreply@anthropic.com Co-authored-by: Paul Philippov themactep@gmail.com
- 6668fe6 uboot: fix flashing autoupdate-full.bin from a card
- 5ce4522 sysupgrade: fix segfault when flashing data partition after rootfs in full upgrade The full upgrade loop flashes partitions sequentially with dd. After rootfs (mtd4) is overwritten, the on-disk dd binary is corrupted, causing a segfault when the loop reaches the data partition (mtd5). Create tmpfs symlinks for dd and flash_eraseall after cloning busybox to tmpfs, and prepend the workdir to PATH so the loop uses tmpfs binaries that survive the rootfs being overwritten. Also add dd to the global bbapplets list for the stage2 exec path. Signed-off-by: Paul Philippov paul@themactep.com
- cc178f6 AGENTS: add strict rule against inventing git hashes Never type hashes by hand. Always obtain the full hash from the actual git repo, verify it with git cat-file -t, and use update_packages.py for package version changes. Includes the recovery procedure for when a bogus hash is already committed. Signed-off-by: Paul Philippov paul@themactep.com
- de7b305 prudynt-t: update package hash to 73ae2b8 (DMA fallback fix) Signed-off-by: Paul Philippov paul@themactep.com
- 6f88c84 prudynt-t: fix mangled package hash The previous hash 84edac095beb10c4ae0982ed98c1b85b40cd3eae was a typo of 84edac016f21f3419591407eccababeeb7812861. The mangled hash was never a real commit and can't be resolved by update_packages.py. Signed-off-by: Paul Philippov paul@themactep.com
- b74ec29 package/buildscope: update to 6ce53f6 Update buildscope from 902e0af to 6ce53f6 Hash change: 902e0af3ad90b208d49b1c74f5c1f9cb938b68da -> 6ce53f6a4a687ae0ae228b9e5691b449a9a2d66f Changelog: 6ce53f6: Point the fleet proxy at the thingino Cloudflare account
- 21ab390 timps: install the board day/night hardware scripts (daynight/ircut/light) timps runs its own day/night detection and drives the hardware by exec'ing a configurable switch_cmd (default "daynight"). On a timps image that command did not exist: /usr/sbin/{daynight,ircut,light} and S06ircut are installed only by thingino-daynightd, which is selected by exactly one Kconfig symbol - BR2_PACKAGE_THINGINO_STREAMER_PRUDYNT. A camera built with the timps streamer therefore never got any of them. Live incident (Garage, T31/SC4336P): detection worked correctly ("[DAYNIGHT] switching to night (total_gain 3557)") but every switch_cmd failed with rc=127, so the IR-cut filter was never removed and the IR illuminator never lit. The ISP kept ramping total_gain (3500 -> 22000+) trying to expose a scene it could not see through the IR-cut filter, and the image went purple/IR-tinted. Installing only 'daynight' would not have been enough: it guards every hardware step with command_present, so without ircut/light it would have called 'color' alone - an ISP-only flip, i.e. the same purple image, just silently. ircut/light are installed unconditionally because timps's own WebUI bridge (json-imp.cgi) shells out to them for the control-bar IR-cut and IR-LED buttons regardless of who does the detection. Installed straight from thingino-daynightd's PKGDIR (same pattern TIMPS_INSTALL_SEND2 already uses for prudynt-t's send2* tools) so there is a single source of truth and no copy to drift. Also fix TIMPS_DISABLE_DAYNIGHTD, which still removed S97daynightd after thingino-daynightd 2.0.0 renamed it to S10daynightd - it had been a no-op, leaving the daemon free to autostart and double-switch against timps. Match by glob, and cover S07dusk2dawn for the same reason. S06ircut is deliberately kept: it is a one-shot boot-time IR-cut latch, not a daemon. Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- aa82ae0 raptor, raptor-hal: bump to current heads raptor dd05912104451e4bebbbf239e636905c8537980a: the T41 refmode keyframe drop fix (silent publish_ref rejection starved every new RTSP client once the encoder used a third buffer), rmr segment rotation aligned to the wall boundary (the pre-boundary IDR request landed a full GOP late on long-GOP HEVC), the day/night campaign for Gen1 sensors (IR-off ambient probe, EV dip, photo trigger dark boot in seconds, forced modes always drive hardware), the rsd send queue extracted and unit-tested, and a ric audit pass (config file clamped like the ctrl API, SIGFPE on poll_interval_ms=0 fixed, ctrl surface validates and rejects unknown commands). raptor-hal d473d8a85f026a0c493fdcee02b7952730cc6d8f: real AE histogram luma and exposure-time fallback on Gen1 SoCs, the foundation for the day/night work.
- c853870 configs: fix leakage
- d5b5261 open-isp: integrate the complete open media stack (#1368) * open-isp: integrate the complete open media stack Extend open-tx-isp to its current T23, T31, T40, and T41 targets, with OpenIMP on its supported T31 and T40 platforms. Pin open-tx-isp after its native canonical-module and T40 SDK sensor-registry integration. Add an opt-in aggregate profile that selects the neo system and audio libraries, while making the proprietary providers mutually exclusive. Order the replacement libraries before streamer consumers and preserve them during target finalization. Document the current support matrix and limitations. Camera profiles remain unchanged; local fragments can opt individual builds into the complete open stack. Signed-off-by: Matt Davis matteius@gmail.com * PR feedback * open-isp: add provider choice and update open stack Signed-off-by: Matt Davis matteius@gmail.com * raptor: gate V4L2 OpenIMP backend with provider Signed-off-by: Matt Davis matteius@gmail.com * open-isp: advance source pins for mainline T31 fixes Signed-off-by: Matt Davis matteius@gmail.com * openimp: make symbol coverage locale-stable Signed-off-by: Matt Davis matteius@gmail.com --------- Signed-off-by: Matt Davis matteius@gmail.com
- f36b26c webui: remove extras storage from system usage page The extras partition no longer exists. Remove it from the UI (progress bar, legend, summary line), the JS rendering logic, the dead CSS class, and the CGI so it stops reading /opt. Also add shellcheck suppressions for pre-existing warnings: SC1091 (auth.sh not available at lint time), SC2329 (unused json_error kept for API completeness), and SC2086 (intentional word splitting for df output parsing). Signed-off-by: Paul Philippov paul@themactep.com
- 7a7229b isp-inspector: show EV as log2 stops instead of raw register value The EV stat card and chart previously displayed ev.value, a raw ISP register integer (e.g. 524288) that users could not interpret. - EV stat card now shows ev.log2 (photographic EV in stops, e.g. 12.3 EV) - EV chart plots dual y-axes: EV in log2 stops (left) + exposure time in microseconds (right, dashed) - statCard() now accepts a 5th tooltip arg, rendering a ? help icon with a native browser title tooltip on hover - All 11 stat card tooltips rewritten with plain-language explanations of what each parameter is, what affects it, and what abnormal values mean - Chart card titles also have hover tooltips - LLM prompt sends ev.log2 for more useful AI analysis Signed-off-by: Paul Philippov paul@themactep.com
- 0fed06a AGENTS.md: document that cameras use BusyBox sh, not bash Signed-off-by: Paul Philippov paul@themactep.com
- c3de103 package/prudynt-t: move prudynt-specific webui files from thingino-webui Move all prudynt-streamer-specific CGIs, streamer config pages, audio settings page, and supporting JavaScript from thingino-webui into the prudynt-t package, wired through the WebUI plugin manifest system. Files moved (16 CGIs, 6 HTML, 3 JS): - CGIs: json-prudynt*, restart-prudynt, json-imaging, json-osd-sei, ch0/ch1/dl0/dl1 snapshots, mjpeg streams, events, preview - HTML: streamer-{main,substream,image,osd,sensor}, config-audio - JS: streamer-config, audio, sei-osd Added prudynt.webui.json manifest that populates the ddStreamer dropdown, adds Audio to Settings, and declares all pages/CGIs. navigation.js: emptied hardcoded ddStreamer items, removed Audio from Settings, removed attachPrudyntHandlers — all now driven by the plugin manifest at build time via assemble_plugins.py. json-imp.cgi kept in thingino-webui (shared day/night control with raptor fallback). Signed-off-by: Paul Philippov paul@themactep.com
- 09c2d0c isp-inspector: add T10/T20 field name fallbacks in CGI parsers The T20 isp_info proc file uses different field names than T31+: - No SENSOR Max Integration Time field - EV: ISP total gain / ISP exposure log2 id (not ISP EV value / log2) - WB: ISP WB rg / ISP WB bg / ISP WB Temperature (not ISP WB weighted rgain / bgain / color temperature) Add fallback lookups so EV and WB cards show data on T20 cameras. Signed-off-by: Paul Philippov paul@themactep.com isp-inspector: hide max integration time on T20 when absent T20 isp_info has no SENSOR Max Integration Time field. Show just '1405 lines' instead of '1405 / 0 lines' when the max value is missing or zero. Signed-off-by: Paul Philippov paul@themactep.com isp-inspector: use soc -f for accurate platform detection T20 was showing as T10 because both use isp_info proc file. Use 'soc -f' command (already present on all Thingino cameras) to report the actual SoC model: t20, t31, t40, etc. Signed-off-by: Paul Philippov paul@themactep.com isp-inspector: show Antiflicker as '60 Hz' not 'AF:60' Map raw T20 antiflicker frequencies (50, 60) to human-readable '50 Hz' / '60 Hz' instead of the cryptic 'AF:' prefix. Signed-off-by: Paul Philippov paul@themactep.com isp-inspector: restore Antiflicker label in header bar Show 'Antiflicker: 60 Hz' instead of bare '60 Hz'. Signed-off-by: Paul Philippov paul@themactep.com isp-inspector: move Day/Night mode badge to header bar Mode is now a compact badge next to resolution instead of a full stat card. Shows 'Night', 'Day', 'Day +Custom', etc. Signed-off-by: Paul Philippov paul@themactep.com isp-inspector: drop badge class from header mode span Plain text-muted, matching the rest of the header line. Signed-off-by: Paul Philippov paul@themactep.com isp-inspector: show 'Mode: Night', split image values for reflow Mode now reads 'Mode: Night' instead of bare 'Night'. Image tuning values (Saturation, Sharpness, Contrast, Brightness) are now four separate dot-separated spans so they reflow independently on narrow screens. Signed-off-by: Paul Philippov paul@themactep.com isp-inspector: add dot separator between resolution and mode Signed-off-by: Paul Philippov paul@themactep.com
- 845f826 raptor: let daynightd replace RIC as the day/night engine Invert the exclusion from 5c29bf3: daynightd is selectable on any image again, and selecting it disables RIC instead (both would drive the same IR-CUT and LED pins and ship the same wrapper scripts). The raptor wrappers install only with RIC, so daynightd images get its scripts; json-imp.cgi prefers daynightd when present, so the web UI drives whichever engine the image ships.
- 757a432 prudynt-t: bump to 84edac0 (min 2 DMA buffers per channel) Fixes frame drops on low-RAM devices where the 15% RAM budget was capping framesource buffer pools to 1. Queue count: 1 causes ch0_pre_dequeue_drop counter to climb. Signed-off-by: Paul Philippov paul@themactep.com
- 7d49aad daynightd: exclude on raptor images Raptor's ric owns day/night and the same wrapper script names, so daynightd on a raptor image means two daemons driving the same GPIO pins plus a rootfs file collision. Prudynt still selects daynightd; the streamer choice already keeps raptor out of those configs.
- 7c2831a raptor: daynight, ircut and light wrappers for the web UI On raptor images the daynightd package is absent, so the web UI's day/night, ircut and light calls went nowhere. These wrappers keep the daynightd era CLI and route it through raptorctl: ric owns the filter, the IR LEDs and the ISP mode, so read/toggle answer from live ric state instead of a run file, auto is a real verb, and ir850/ir940 switching stays coherent with automatic day/night. White light keeps the stock gpio path with active_low handling. json-imp.cgi branches per streamer: raptor paths skip the daynightd config keys and reload, prudynt paths are unchanged. Validated on z55 T31: full verb matrix, filter+LED+ISP coherent on mode changes, gpio readback confirms LED level, camera left in auto. Supersedes the approach in PR #1454.
- 31e47eb isp-inspector: remove point radius from chart lines Set pointRadius: 0 on all Chart.js datasets to keep lines clean when the history buffer fills up. Signed-off-by: Paul Philippov paul@themactep.com isp-inspector: set elements.point.radius=0 at options level Add global elements.point.radius: 0 to chart defaults as a safety net in case dataset-level pointRadius isn't picked up after hot-reload. Signed-off-by: Paul Philippov paul@themactep.com isp-inspector: force pointRadius=0 in updateCharts on every push Set pointRadius: 0 explicitly on every dataset in updateCharts() so it survives whatever Chart.js does internally during updates. Matches the pattern used in tool-sensor-data.js. Signed-off-by: Paul Philippov paul@themactep.com isp-inspector: set Chart.defaults for pointRadius globally Use Chart.defaults.datasets.line.pointRadius=0 and pointHoverRadius=3 before creating any chart instances. This is the idiomatic Chart.js v4 way — no per-dataset or per-update overrides needed. Dots now only appear on hover. Signed-off-by: Paul Philippov paul@themactep.com isp-inspector: rebuild chart datasets from scratch each update Match the sensor-data page pattern: create charts with empty datasets array, then in updateCharts() replace the entire datasets array with fresh objects that include pointRadius: 0. This is how Chart.js v4 reliably hides points — the init-time dataset objects were somehow retaining a default pointRadius > 0. Signed-off-by: Paul Philippov paul@themactep.com isp-inspector: add pointHoverRadius: 4 for hover dots Signed-off-by: Paul Philippov paul@themactep.com isp-inspector: match sensor-data chart pattern, add history cache Chart: use pointRadius:1 (1px dots, invisible on dense charts), pointHoverRadius:4 for clear hover dots, pointHitRadius:10 for easy hover targeting. Max Int. Time reference line keeps pointRadius:0. History: cache ring buffer in sessionStorage so charts and stats cards are pre-populated on page reload — matching sensor-data's history-then-live flow. Signed-off-by: Paul Philippov paul@themactep.com
- f7b8efa webui: fix daynight toggle JSON parse error Replace res.text() + JSON.parse() with res.json() in toggleDayNight. The old code parsed the raw response body as text then called JSON.parse, which could fail if the CGI produced unexpected whitespace or line breaks. res.json() handles edge cases and throws proper SyntaxError messages. Also remove debug console.log and replace template literal with string concat for broader browser compat. Signed-off-by: Paul Philippov paul@themactep.com
- ea62818 isp-inspector: cumulative timestamped issue log with dedup Replace the transient issues panel with a fixed-height (200px) scrollable cumulative log below the charts. Issues persist after values return to normal — each unique message appears once with a timestamp. The log never shrinks or jumps. Clear button resets the log. Dedup via seen-issue key set. Signed-off-by: Paul Philippov paul@themactep.com isp-inspector: log issue resolution events When a previously-detected issue (e.g. FPS drop, gain saturation) returns to normal, emit an [OK] log entry with the original message and a fresh timestamp. Track active vs seen issues separately so resolved issues re-trigger if they recur. Signed-off-by: Paul Philippov paul@themactep.com isp-inspector: log day/night mode transitions Track the current ISP running mode (Day/Night) and emit a [MODE] log entry whenever it changes. Night entries in blue, Day in yellow. Resets on clear. Signed-off-by: Paul Philippov paul@themactep.com isp-inspector: rename [OK] to [NORM] for consistent label width All severity labels now have 4 characters: CRIT, WARN, MODE, NORM. Prevents layout jitter in the fixed-width issue log. Signed-off-by: Paul Philippov paul@themactep.com isp-inspector: override .terminal to neutral gray The global terminal style (green-on-black) is too loud for the issue log and raw data panels. Override with Bootstrap's secondary text color on tertiary background for a subdued look. Signed-off-by: Paul Philippov paul@themactep.com isp-inspector: always show vertical scrollbar in issue log Change overflow-y from auto to scroll so the scrollbar track is always visible, making it obvious the log is scrollable. Signed-off-by: Paul Philippov paul@themactep.com
- a8f3686 isp-inspector: move tuning/antiflicker/orientation to header bar Remove Saturation, Sharpness, Antiflicker, and Mirror/Flip stat cards. Add them as compact labels in the header bar alongside platform/sensor/resolution. Frees four more card slots. Header now reads: T31 sc2336 1920x1080 · Sat:128 Sharp:128 · AF:60Hz · Mir:Disable Flp:Disable Signed-off-by: Paul Philippov paul@themactep.com
- 3c2cad1 package/prudynt-t: update to b8d94db Update prudynt-t from 90b9363 to b8d94db Hash change: 90b936321f6edc3ad2e70427c2f22670a4942cbe -> b8d94db20dc5c108585be3d6825f976422d3560f Changelog: 4314f9f: fix: improve UDP burst handling and RTCP SR reliability 0cacb27: fix: pace initial frame burst to prevent jitter buffer overflow 860883d: fix: use configured fps for JPEG encoder instead of hardcoded 24 88734f3: formatting; replace non-ascii symbols 73be095: reorganize: split monolith into 10 logical modules 2f032e6: rtsp: extract Session struct and utility functions into separate headers 28d0324: rtsp: split sendVideoNal into sub-methods 616353c: fix: prevent shutdown hang in video/JPEG worker threads 96a9790: fix: prevent shutdown hang from thread restart race e3aa646: debug: add detailed shutdown logs to trace hang location f80d237: fix: skip IMP_Encoder_StopRecvPic during shutdown e6d6a67: fix: skip IMP_Encoder_StopRecvPic inside deinit() during shutdown 1cdb92f: fix: also skip IMP_Encoder_DestroyChn during shutdown ea53b80: fix: reorder shutdown - video before audio 7e2da9c: fix: remove PollingStream guard - it caused StopRecvPic hang f486f83: debug: add audio join trace log dada7c6: debug: add jpeg[1] join trace log af7a81d: fix: add running check to JPEGWorker inner wait loop 45ea15b: fix: guard JPEGWorker poll path with running flag d140e35: remove: ConfigWatcher - dead code 31a27ef: fix: add running guard between PollingStream and GetStream in JPEGWorker b8d94db: fix: skip jpeg[1] thread join during shutdown
- 9c9ad35 Makefile: split 1488-line monolith into 4 included fragments Makefile 456 lines (setup, variables, includes) Makefile.targets 280 lines (build, config targets) Makefile.ota 315 lines (pack, OTA, clean, TFTP, download-cache) Makefile.utils 442 lines (Buildroot pass-through, build-all, help, show-vars, run, cloner, dfu, scriba) The main Makefile is now a dispatcher: all variable definitions and build flow logic stay at the top, then three 'include' directives pull in the target definitions. Verified with 'make shellcheck', 'make help', and 'CAMERA=... make show-vars'. Signed-off-by: Paul Philippov paul@themactep.com
- 1ff7781 AGENTS.md: document scripts/tts/ TTS tool in repo layout Added note about the TTS audio generation tool and its ~315MB of gitignored model/venv data, to prevent confusion when 'du -sh' reports a large scripts/ directory. Signed-off-by: Paul Philippov paul@themactep.com
- 7cb7310 Repo hygiene: add trash/README.md, harden .gitignore trash/README.md explains what each trashed component is and when it can be safely deleted: - prudynt-t/: refactored daynight code - thingino-daynightd/: replaced standalone daemon - scripts/: staging area (empty) .gitignore additions: - ~, ##, core, core.* (editor backups, core dumps) - .pyo, pycache/ (Python bytecode) - /trash/ with !/trash/README.md (ignore trash contents, track README) Signed-off-by: Paul Philippov paul@themactep.com
- 032ec4e Remove all non-ASCII characters from .sh, .mk, and Makefile Replaced Unicode box-drawing, em dashes, arrows, and checkmarks with ASCII equivalents: --- (box drawing) -> --- (ASCII dashes) -- (em dash) -> -- (ASCII double dash) -> (arrow) -> -> (ASCII arrow) checkmark/xmark -> [OK] / [FAIL] These characters silently corrupt on serial consoles, embedded terminals, and fonts without Unicode support. Also updated thingino-dev-persona skill to enforce ASCII-only for .sh, .mk, and Makefiles. Signed-off-by: Paul Philippov paul@themactep.com
- cc8380b board.mk: document and harden BUILD_MEMO session scoping; Makefile: document WORKFLOW/PRISTINE board.mk: - Added detailed comment block explaining the PID-based memo file design: same terminal → shared memo, different terminals → isolated. - Replaced 'ps -o ppid= -p 1223136PPID | xargs' with /proc-based primary path + ps fallback + 1223136 final fallback. /proc/.../stat is faster and doesn't depend on ps output format differences between procps-ng and busybox. Makefile: - Documented WORKFLOW=1 (CI fast-path: skip dep check + camera prompt) and PRISTINE=1 (OEM/reproducible: disable user config layer). Signed-off-by: Paul Philippov paul@themactep.com
- 81bc0f3 thingino.mk: DRY clock and ISP configuration resolution Replaced ~320 lines of repetitive ifeq chains with four table-driven helper functions: resolve_clock_src — maps BR2_
=y to output=value resolve_clock_freq — maps BR2
MHZ=y to output=N_hz resolve_choice — maps BR2
=y to output=value isp_param — maps BR2
=y to output=
_VALUE Clock assignments for IPU, AVPU, ISP, ISP_CLKA, ISP_CLKS now each take 2-3 lines instead of 10-20. Adding a new clock frequency is a one-line change to the freq table instead of a 4-line ifeq block. Verified identical output for wyze_cam3_t31x_gc2053_atbm6031 (no diff in show-vars output before/after). Signed-off-by: Paul Philippov paul@themactep.com
- d49fcd8 package: add thingino-isp-inspector developer tool Add an optional WebUI plugin for real-time inspection and analysis of Ingenic ISP status registers (/proc/jz/isp/isp-m0, isp-fs). Features: - Live dashboard with 16+ color-coded stat cards - Automatic issue detection (FPS drops, gain saturation, buffer starvation, DMA pipeline faults, antiflicker disabled) - Historical trend charts via Chart.js (FPS, gain, integration time, EV) - LLM-assisted analysis via DeepSeek/OpenAI/custom API (API key stored in browser localStorage, no server-side keys) - Raw data tab with formatted JSON - T10/T20 and T31+ platform auto-detection Gated behind BR2_THINGINO_DEV_PACKAGES (development menu). Signed-off-by: Paul Philippov paul@themactep.com isp-inspector: move nav to Tools, wrap API key field in form Move the menu entry from Information dropdown to Tools dropdown (positioned after Network test). Wrap the LLM API key input in a element to silence the browser DOM warning about password fields outside a form. Signed-off-by: Paul Philippov paul@themactep.com isp-inspector: compact live stat cards Reduce card min-height (120→72px), font sizes, and padding. Remove per-card status badge — border color alone conveys health. Drop unused icons/tooltip from statCard builder. Signed-off-by: Paul Philippov paul@themactep.com isp-inspector: replace polling with SSE stream Add /x/isp-sse.cgi — a single persistent SSE endpoint that reads both isp-m0 and isp-fs and pushes unified events at the requested interval. The JS now uses EventSource instead of setInterval + fetch, eliminating TCP handshake overhead on every sample. The poll interval dropdown now controls the SSE event interval (via ?interval=N query param). Auto-refresh toggle connects/disconnects the EventSource. Old fetchJson / poll / startPolling / stopPolling functions removed. Signed-off-by: Paul Philippov paul@themactep.com isp-inspector: move static info to header bar Replace the three static stat cards (Platform, Sensor, Resolution) with a compact header bar showing T31 · sc2336 · 1920×1080. Frees three card slots for dynamic data. Remove unused statCardRaw. Signed-off-by: Paul Philippov paul@themactep.com isp-inspector: strip redundant 'lines' unit from integration time The proc file values include the unit suffix ('2350 lines'), and the UI stat cards also append 'lines' as the unit parameter, producing '2350 lines lines'. Strip the suffix at parse time in both json-isp-m0.cgi and isp-sse.cgi. Signed-off-by: Paul Philippov paul@themactep.com isp-inspector: remove card min-height and justify-between gap Drop min-height constraint and justify-content-between on card bodies. Cards now size to content with label close to value. Add 2px bottom margin on label for visual separation. Signed-off-by: Paul Philippov paul@themactep.com
- 8a800ff Add shellcheck to pre-commit hook and 'make shellcheck' target Pre-commit hook now runs shellcheck -x on all staged .sh files (matching both #!/bin/sh and #!/bin/bash shebangs). Fails the commit if any warnings are found. 'make shellcheck' target added for manual linting; exempted from camera selection via NOCAMERA_TARGETS in board.mk. Signed-off-by: Paul Philippov paul@themactep.com
- 1a5f64d scripts: fix all remaining shellcheck warnings across 26 scripts File-level shellcheck disables added where patterns are intentional: - SC2086: unquoted variables that are space/glob-safe by construction - SC2155: local var=$(cmd) where masking return values is harmless - SC3043/SC3045: 'local' and '[[' in bash scripts - SC2034: variables read by sourcing/sourced scripts - SC2162: read without -r in interactive prompts - SC2016: intentional single-quoted $ for inner shell expansion - SC1091: sourced files resolved at runtime via $SCRIPT_DIR - SC2001/SC2005: sed/grep vs parameter expansion (clarity preferred) - SC2029: intentional client-side ssh expansion - SC2012/SC2013: ls/read patterns in well-known directory contexts - SC2181: $? checks in scripts where set -e handles critical paths - SC2221/SC2222: duplicate case patterns (false positive for fallthrough) - SC1007/SC2129/SC2094/SC2329/SC3001: minor style/portability shellcheck: 0 warnings across all 56 scripts. Signed-off-by: Paul Philippov paul@themactep.com
- 5b4ce03 scripts: fix shellcheck warnings in manage-package-overrides, sd_card_* manage-package-overrides.sh (51 warnings): file-level SC2155/SC2086 disables, fixed SC2295 (quoted expansion in pattern), suppressed SC2034 for update_mode (read by sourcing callers) sd_card_monitor.sh (37 warnings): file-level SC2155 disable, suppressed SC2034 for DRY_RUN (read by sd_card_flasher.sh), suppressed SC2016 for intentional single-quoted $ in bash -c sd_card_flasher.sh (30 warnings): file-level SC2155/SC1091 disables, suppressed SC2034 for VERBOSE (read by sourced sd_card_monitor.sh) Signed-off-by: Paul Philippov paul@themactep.com
- 27fe0d7 scripts: fix shellcheck warnings in stitcher, binpadder, hijacker, list4web stitcher.sh (31 warnings): file-level SC2086 disable, removed unnecessary $ on arithmetic vars (SC2004) binpadder.sh (12 warnings): file-level SC2086 disable, removed duplicate '0' in case pattern (SC2221/SC2222) hijacker.sh (28 warnings): file-level SC2086/SC2015 disables, fixed SC2004 ( in arithmetic), added SC2154 disables for 'compression' var set via eval list4web.sh (27 warnings): file-level SC2086 disable, replaced ls with find (SC2012), quoted dirname expansion (SC2046), suppressed SC2034 for loop-counter variable i Signed-off-by: Paul Philippov paul@themactep.com
- 0b97a81 scripts/rootfs_script.sh: fix all 52 shellcheck warnings - Added file-level shellcheck disable for SC2086 at shebang line (all vars are Buildroot-internal; dep_check.sh guarantees safe paths) - Fixed SC2062/SC2063: quoted grep '^*' pattern Signed-off-by: Paul Philippov paul@themactep.com
- ae27bfe scripts/fw_ota.sh: fix all 61 shellcheck warnings - Added file-level shellcheck disable for SC2086, SC2029, SC2001 with justification comments (SSH_OPTS word-splitting is intentional, remote commands expand client-side by design, sed M@ parsing is clearer than bash parameter expansion) - Fixed SC2046: quoted all remote_copy call arguments Signed-off-by: Paul Philippov paul@themactep.com
- 5ff4d83 scripts/show_toolchains.sh: fix all 92 shellcheck warnings - Quoted all unquoted variable expansions (, , , etc.) - Removed dead SOC= assignment (SC2034) - Fixed for-loop glob quoting: /configs/* -> "$D"/configs/* (SC2231) - Combined echo arguments into single quoted strings - Quoted "$0", "$1", "$2" in main body Signed-off-by: Paul Philippov paul@themactep.com
- a2f6595 scripts/menu/menu-common.sh: fix all shellcheck warnings - Added '# shellcheck shell=bash' directive (sourced script, no shebang) - SC2062/SC2063: quoted grep '^*' pattern - SC2206: quoted "" and all array elements in DIALOG_COMMON - SC2034: added disable comments for temp_rc/temp_ip (used by sourcing scripts) - SC2086: quoted , , - SC2162: added -r flag to read Signed-off-by: Paul Philippov paul@themactep.com
- ba19c98 scripts/select_camera.sh: replace ls parsing with find+sort cameras=($(ls ... | sort)) parses ls output — breaks on directory names with spaces or special characters. Replaced with 'find -type d -printf '%f
' | sort' piped into a 'while read' loop that properly handles any valid filename (newlines excepted, which aren't legal in filesystem paths anyway). Signed-off-by: Paul Philippov paul@themactep.com - 6b27666 scripts/fw_ota.sh: fix unbound $DEBUG with set -u DEBUG is an optional env var for verbose output, never initialized in the script. Four bare '$DEBUG' references now use '${DEBUG:-}' so the script doesn't crash under set -u during normal (non-debug) invocation. Reported-by: make ota Signed-off-by: Paul Philippov paul@themactep.com
- b2a7c47 scripts/menu, scripts/tts: add set -euo pipefail to entry points menu-common.sh is a sourced library — it inherits settings from the three menu entry-point scripts (main-menu, menu1-dev-sel, menu2-guided) which now all have set -euo pipefail. tts/batch.sh and tts/run.sh are standalone entry points; both now fail early on errors. Skipped the vendored scripts/tts/.venv/ tree. Signed-off-by: Paul Philippov paul@themactep.com
- 1cd93a1 scripts/video_latency.sh: add set -euo pipefail, fix unset codec="" avoids -u failure when no second argument is passed (defaults to h264 via the empty-string case match). Signed-off-by: Paul Philippov paul@themactep.com
- 6552701 scripts/uniflasher.sh: add set -eu, remove UUOC Replaced 'cat | wc -c' with 'wc -c < ""' — avoids the useless cat, eliminates the pipeline (no pipefail needed in this /bin/sh script), and properly quotes . Signed-off-by: Paul Philippov paul@themactep.com
- b43b0a6 scripts/uboot-device-env.sh: add set -euo pipefail Positional args validated early, all variables assigned before use. tail is inside [ ... ] conditional so -e is suppressed for it. Signed-off-by: Paul Philippov paul@themactep.com
- e30c3bd scripts/thingino_config_gen.sh: add set -euo pipefail, fix {:echo typo '{:echo' is a missing-space-after-{ bug — bash requires a space between '{' and the command. The fallback path (creating a default {} JSON when OUTPUT_FILE doesn't exist) was silently broken. Changed to '{ echo ...; }'. Signed-off-by: Paul Philippov paul@themactep.com
- f28dd8d scripts/test-snmpd.sh: promote set -o pipefail to set -euo pipefail Script already uses || true patterns for snmp command failures and default for positional args; fully compatible with -eu. Signed-off-by: Paul Philippov paul@themactep.com
- 1ff75ac scripts/stitcher.sh: add set -euo pipefail, fix copy-paste bug Initialized u_boot/kernel/rootfs to empty strings so -u doesn't reject the -z checks at lines 83-94 when scan_files finds nothing. Fixed line 94: '! -f ' was copy-pasted from the kernel check above; corrected to '! -f ' so the rootfs existence test actually checks rootfs. Signed-off-by: Paul Philippov paul@themactep.com
- e47d7d5 scripts/show_toolchains.sh: add set -euo pipefail, fix unset refs FMT= triggers -u when toolchain_by_config is called with a single argument (the direct config-path invocation at line 77). Changed to FMT="" and replaced the bare test inside the function with the already-captured variable. Signed-off-by: Paul Philippov paul@themactep.com
- 87812ab scripts/select_camera.sh: add set -euo pipefail All positional parameters use default or are validated early. selected_camera is initialized to empty string before conditional assignment. No pipefail conflicts. Signed-off-by: Paul Philippov paul@themactep.com
- 15acedd scripts/rootfs_script.sh: add set -euo pipefail, fix rm without -f rm /etc/dropbear fails if the file doesn't exist (first build, or dropbear not enabled). With set -e this would abort the entire rootfs post-build script. Changed to rm -f (idempotent: succeeds whether the symlink exists or not). All required env vars (BR2_EXTERNAL, TARGET_DIR, CAMERA, BR2_CONFIG) are always set by Buildroot's make environment; -u catches missing ones early instead of producing a broken rootfs. Signed-off-by: Paul Philippov paul@themactep.com
- 22a0877 scripts/resolve_toolchain_value.sh: add set -eu Pure POSIX script, no pipelines. All variables resolved via fallback, safe for -u. Signed-off-by: Paul Philippov paul@themactep.com
- 19b8bce scripts/pcmtool.sh: add set -eu No pipelines, so pipefail not needed. ffmpeg/ffplay failures now propagate instead of being silently ignored. Signed-off-by: Paul Philippov paul@themactep.com
- 43557d1 scripts/ota_roster.sh: add -eo pipefail, fix needs_build for set -e needs_build() runs 'make -q' which returns 1 when a rebuild is needed — a normal path, not an error. With set -e this would kill the script before the case/esac handler runs. Fixed with the '|| rc=0' pattern inside needs_build to capture the exit code without triggering -e, and restructured the caller to use 'if needs_build; then ... else build_status=0; case ...' so -e doesn't fire on the normal 'needs rebuild' return. Also promoted the existing 'set -u' to full 'set -euo pipefail'. Signed-off-by: Paul Philippov paul@themactep.com
- f62ae2c scripts/log2bin.sh: add set -euo pipefail, /bin/sh -> /bin/bash Script uses 'sed -E' (GNU extension), already requiring bash on most systems. -u forces a usage arg: was previously unchecked, so cat would silently read stdin instead of failing. -o pipefail catches sed failures in the pipeline. Signed-off-by: Paul Philippov paul@themactep.com
- 0f3b029 scripts/list4web.sh: add set -euo pipefail, fix unset old_brand/old_model old_brand and old_model are referenced in comparisons before their first assignment (during the first loop iteration). Changed to and so the first comparison works against empty strings instead of triggering -u. Signed-off-by: Paul Philippov paul@themactep.com
- a4bc68e scripts/hijacker.sh: add set -euo pipefail, fix uninitialized n was used at line 64 before ever being assigned (first reference in the 'if [ "" = "" ]' check, first assignment at line 72 in the n=1 increment). Initialized n=0 before the partition loop so set -u doesn't reject it. Script uses 'run() { eval ; }' throughout; with set -e, any eval failure aborts the script, which is correct behavior for this tool. Signed-off-by: Paul Philippov paul@themactep.com
- f28413f scripts/fw_ota.sh: add set -eu, fix TRIMMED_FILES unset in kernel mode No pipefail: the sysupgrade pipeline captures 0 to check remote_run independently of tee; pipefail would abort before PIPESTATUS can be read. Initialized TRIMMED_FILES='' at script top so it's always defined; kernel mode never sets it but the trap on line 435 expands it. Also hardened the trap to use as belt-and-suspenders. All remote_run/remote_copy calls already use || die, so -e is safe. Signed-off-by: Paul Philippov paul@themactep.com
- dd86e68 scripts/dl_buildroot_cache.sh: add set -euo pipefail, fix 0 antipattern Converted three 'cmd; if [ 0 -ne 0 ]' patterns to 'if ! cmd; then' so they don't conflict with set -e. All env vars validated before use so -u is safe. Signed-off-by: Paul Philippov paul@themactep.com
- 795f0c2 scripts/detect_camera_from_ip.sh: add set -euo pipefail Straightforward script: is validated early, all variables are assigned before use, no pipefail conflicts. Safe for all three flags. Signed-off-by: Paul Philippov paul@themactep.com
- c67a8a4 scripts/dep_check.sh: add set -eu, change shebang to bash Switched shebang from /bin/sh to /bin/bash — the project already requires bash (board.mk sets SHELL := /bin/bash) and this script uses bashisms like >&2 redirects. Added 'set -eu' but deliberately omitted pipefail: the dd version check pipeline (grep | { read ... }) relies on explicit 0 inspection after the pipeline, and pipefail would kill the script before the error handler runs. All branch-specific variables (pkg_update_cmd, etc.) are only expanded in the branches that set them, so -u is safe. Signed-off-by: Paul Philippov paul@themactep.com
- a99cc89 scripts/check-busybox-lopts.sh: add set -euo pipefail All positional parameter references use default forms, so -u is safe. check_script() runs inside a for-loop; its grep calls are inside 'if' conditionals so -e won't falsely trigger. -o pipefail covers the echo|while pipeline. Signed-off-by: Paul Philippov paul@themactep.com
- 0b9df4e scripts/binpadder.sh: add set -euo pipefail is guarded by the initial argument count check; all parameter expansions operate on defined variables so -u is safe. -o pipefail catches failures in the dd|tr pipeline on line 42. Signed-off-by: Paul Philippov paul@themactep.com
- 4481b8f scripts/backup_overlay.sh: add set -euo pipefail Replaces bare 'set -o pipefail' with full 'set -euo pipefail'. Script already uses explicit die() for error handling; -e catches the unchecked mkdir -p on line 48. -u is safe: all variables are assigned before use, no optional env vars referenced unguarded. Signed-off-by: Paul Philippov paul@themactep.com
- 4f52cce sysupgrade: use tmpfs busybox for all commands during reboot sequence After the full-upgrade dd loop overwrites rootfs, the bare killall and sleep commands can segfault because their backing binaries are gone. Switch them to $workdir/busybox (already cloned to tmpfs) to match the existing $workdir/busybox reboot -f pattern. Signed-off-by: Paul Philippov paul@themactep.com
- 6c10c64 webui: fix file manager JSON error with control-character filenames Escape all ASCII control characters in JSON output from the file manager CGI. Previously only , ",
, and
were escaped; other control chars (like �) passed through unescaped, producing invalid JSON that broke the file manager with: "Bad control character in string literal in JSON at position 2180" - Shell json_escape(): strip control chars via tr before sed escaping - Awk escape(): add escaping, replace remaining controls with '?' Fixes #1455 Signed-off-by: Paul Philippov paul@themactep.com - 99ea5d6 shell: show overlay stats in the banner
- 906190e thingino-pkg: use curl instead of wget wget is not present in the firmware image. curl is provided by thingino-libcurl, so add it as a dependency and switch the download command. Co-authored-by: Matias De lellis matiasdelellis@users.noreply.github.com
- 8f35ec9 webui: report a failed termbin upload instead of an empty redirect On failure url is empty, and unquoted it left redirect_to with no arguments at all, so the response was a 303 carrying an empty Location: a broken redirect and no explanation. The path was barely reachable while the old bin accepted anything; the bin refuses payloads, oversized bodies and an exhausted daily allowance, so it is reachable now. Uses the flash message every other failure in this file already uses.
- 84b0d58 send2termbin: post to the diagnostics bin over HTTPS The bin is a Cloudflare Worker now, not fiche on a raw TCP port, so netcat cannot reach it. stdout stays one line so url=$(send2termbin) keeps working for thingino-diag -u, -j and the web UI. Also stops the empty-file branch printing stray echo args and leaking its temp file. thingino-diag and the web UI both said uploads are kept for a week and named the old host. The bin keeps diagnostic reports for three days, and the hostname now lives only in send2termbin.
- 239da10 scripts/tts: add standardized Kokoro TTS pipeline Add text-to-speech audio generation using Kokoro-82M neural TTS model with pinned voice configuration for repeatable output across sessions. - setup.sh: one-time bootstrap (downloads model + voices, creates venv) - generate.py: main engine (text -> espeak-ng phonemes -> Kokoro -> WAV) - config.yaml: locked voice (af_heart), speed, format settings - run.sh / batch.sh: convenience wrappers (single phrase or batch) - kokoro/: spacy-free model modules (avoids Python 3.14 incompatibility) - README.md: full documentation Model weights and voices are downloaded by setup.sh and gitignored. Signed-off-by: Paul Philippov paul@themactep.com
- 425e320 webui: merge motion and speaker save buttons into one The "Play audio on speaker" checkbox was saved only by the "Save Motion Settings" button (as motion.playonspeaker to /etc/prudynt.json) while the speaker file/volume/gain/loop were saved separately by "Save Speaker Settings" (to /etc/send2.json). Since the checkbox is visually grouped with the speaker controls, users naturally clicked the wrong button and the setting was lost on reload. Merge both save functions into a single "Save Settings" button that sends motion and speaker in one request. Update the backend CGI to handle combined payloads by extracting each domain's key to isolated temp files before import, and change the speaker branch from elif to a separate if so both domains are processed. Signed-off-by: Paul Philippov paul@themactep.com
- 81ff129 webui: redesign play on speaker in motion detection form
- 01110e3 cameras: move Cinnado B6 to experimental (missing libs)
- e033522 webui: add speaker config and playonspeaker toggle to Send to Services page Add Speaker configuration card to the Send to Services page with fields for file path, volume, gain, and loop count. Add 'Play audio on speaker when motion detected' toggle to the Motion Detection card. Wire both through json-send2.cgi (GET/POST) and send.cgi (test button). Signed-off-by: WLTB-Gino WLTB-Gino@users.noreply.github.com
- 963cb2f prudynt-t: add missing playonspeaker script The motion script calls 'playonspeaker &' when motion.playonspeaker is enabled, but no such script was ever installed. This left the speaker notification feature completely non-functional. Add a playonspeaker script that reads speaker config (file, volume, gain, loop) from /etc/send2.json and invokes the existing 'play' command, matching the pattern of the other send2* scripts. Signed-off-by: WLTB-Gino gino@wltechblog.com
- 74ab6e0 cameras: graduate Sannce I21AG to supported
- e5628af thingino.mk: derive UBOOT_BOARDNAME from defconfig-provided BR2_TARGET_UBOOT_BOARDNAME When a camera defconfig provides BR2_TARGET_UBOOT_BOARDNAME directly (e.g. eufy_t8400x_t31x_sc3235_syn4343), the ifeq block was skipped, leaving UBOOT_BOARDNAME empty. force-config then wrote an empty board name into .config, overriding the defconfig value and causing u-boot to fail with "No U-Boot board name set". Fix by adding an else branch that strips quotes from the defconfig- supplied value to populate UBOOT_BOARDNAME. Signed-off-by: Paul Philippov paul@themactep.com
- 412e24e Update buildroot to latest version
- 7d07838 configs: add Wyze Cam Pan v1 (T20X, JXF23, RTL8189FTV) Newer hardware revision of the Wyze Cam Pan v1 ships with JXF23 sensor and RTL8189FTV WiFi instead of the original JXF22 and RTL8189ETV. All GPIO, motor, and peripheral config identical to the original Pan V1.
- bd2d8f4 Update buildroot to latest version
- 3111aa3 scripts: remove soc_database.txt and its consumers soc/*.mk files are now the single source of truth for SoC data. The database file, its query script, the validator, and the example are all obsolete — nothing in the build references them anymore. Signed-off-by: Paul Philippov paul@themactep.com
- 5fc18d0 thingino.mk: source U-Boot defconfig from soc/.mk, not soc_database.txt BR2_TARGET_UBOOT_BOARD_DEFCONFIG now uses SOC_UBOOT_NOR / SOC_UBOOT_NAND from the soc/.mk files directly, same as BR2_TARGET_UBOOT_BOARDNAME already does. This removes the last build-time dependency on get_soc_params.sh → soc_database.txt from the main Makefile. make-bundle.sh: resolve SOC_FAMILY from soc/.mk instead of get_soc_params.sh. Signed-off-by: Paul Philippov paul@themactep.com make-bundle.sh: accept SOC_FAMILY from Makefile instead of shell grep Pass SOC_FAMILY as 4th argument from the bundle-% target, which already has it via the soc/.mk includes. The script keeps a .config fallback for manual invocation. Signed-off-by: Paul Philippov paul@themactep.com
- e89cfc0 soc: use model-specific U-Boot NOR board names matching 2026.07 Replace the canonical-family name approach (reverted from 7630771) with the opposite strategy: patch U-Boot 2013.07 to accept the 2026.07 model-specific naming convention. This way soc/.mk and soc_database.txt share one set of names that work with both U-Boot versions. soc/.mk + soc_database.txt: use the model-specific NOR board names that U-Boot 2026.07 defconfigs expect (e.g. isvp_t10l_sfcnor instead of isvp_t10_sfcnor_lite, isvp_t33_sfcnor for all T33 models, isvp_t41lq_sfcnor instead of isvp_t41lq_sfc_nor, isvp_a1n_sfcnor instead of isvp_a1_all_lzma_sfc0nor). uboot 2013.07: add 0004 patch with 18 model-specific board entries in boards.cfg. Each new entry is a one-line alias that reuses the same configuration header and options as the existing canonical entry, so no behavior changes for existing boards. Signed-off-by: Paul Philippov paul@themactep.com
- 7630771 soc: align U-Boot board names with soc_database.txt Update SOC_UBOOT_NOR / SOC_UBOOT_NAND targets in all Ingenic SoC family .mk files to match the canonical names from scripts/soc_database.txt. Key changes by family: - T10/T20/T30: model suffixes replaced with canonical family names (_lite, _ddr128M, bare family name) - T21: all models now use isvp_t21_sfcnor (was isvp_t21n_sfcnor) - T23: t23zn uses isvp_t23n_sfcnor (was isvp_t23zn_sfcnor) - T31: NOR targets aligned (_lite, _ddr128M, bare family, per-model) - T33: per-model NOR targets (was generic isvp_t33_sfcnor) - T40: t40a NOR uses isvp_t40a_sfcnor (was isvp_t40n_sfcnor) - T41: NOR targets use sfc_nor (was sfcnor); per-model canonicals - A1: all use isvp_a1_all_lzma_sfc0nor (was isvp_a1n_sfcnor) - C100: isvp_c100_sfcnor/sfcnand (was isvp_t31a_sfcnor/sfcnand)
- 9b5eea4 package/prudynt-t: update to 90b9363 Update prudynt-t from d5336b3 to 90b9363 Hash change: d5336b363f4ca44090185d77579612bad640a7f6 -> 90b936321f6edc3ad2e70427c2f22670a4942cbe Changelog: 90b9363: Fix -Wunused-but-set-variable warnings
- d9eaae0 thingino-sensor-info: remove .hash from a git repo
- cb045d0 makefile: add soc .mk files
- b812da8 kernel: vfat driver causes false corruption detection on sensing a card
- d1489af cameras: chime button is actually gpio.chime
- c1728ce add helper scripts for testing with go2rtc and mediamtx containers
- 658bf4b sync timps package from master
- fe18b50 sync raptor packages from master
- 104cda9 package/prudynt-t: correct hash
- f72ef02 package/timps: update to v1.8.1 Update timps from v1.7.8 to v1.8.1 Hash change: v1.7.8 -> v1.8.1 (No changelog available)
- a82ff1c package/thingino-sensor-info: update to 625667a Update thingino-sensor-info from 85a4c83 to 625667a Hash change: 85a4c830d8a1ce17bf4e06baa8d7a0c68cc8308e -> 625667a0d58838dd3b8cac31062727c61fa38366 Changelog: 1893c44: Halve the binary: pack the table, drop scanf, size-tune the build d99c51d: build: adopt raptor's remaining size flags, minus lto 35a0d38: build: -fno-pie/-no-pie 845c9c4: Cut compressed size: 32-bit kHz clock math, LTO, headerless release 625667a: build: -mno-abicalls
- 3f75476 package/open-tx-isp: update to 3f8166c Update open-tx-isp from 14d83f7 to 3f8166c Hash change: 14d83f7790f4dd4e711eada466c544830a9ab611 -> 3f8166c7b89363f996923e2edd2a6bb52a504d9c Changelog: 3f8166c: t31: fix mainline CSI and frame DMA setup
- 4f12e21 package/libjuice: update to v1.7.3 Update libjuice from v1.7.2 to v1.7.3 Hash change: v1.7.2 -> v1.7.3 (No changelog available)
- 02f0456 package/buildscope: update to 902e0af Update buildscope from f1cb5a6 to 902e0af Hash change: f1cb5a698037664947df38abaa9985d838cc92a0 -> 902e0af3ad90b208d49b1c74f5c1f9cb938b68da Changelog: a02bfcb: Read the device tree inside a bootloader, not just beside it 7aed7b1: Device trees: say which stage each one came from 1da5bd8: Version 0.1.8 335f251: Record named files from the target filesystem 9a159a8: Show a captured device config, and diff it 81ecee2: Version 0.1.9 9b2657c: Title the panel that is already open 902e0af: Title the last three untitled panels
- 7f96e64 webui: add some raptor flavor
- f2a35d5 cameras: jooan w8u, set memopt 0
- ce7ec8f cameras: add cinnado b6 t23zn
- 1227c18 clean up
- 237863f makefile: changes from master
- b82f37e make thingino agent aware of raptor
- b0f75d2 scripts: add daynightd test
- a1b01d0 linux: switch erase size to 64KB where supported (all)
- da04fa8 ingenic-lib: enable c++ lib where needed
- 57089d1 ha: handle boolean values in privacy payload
- 92a13c2 system: update info
- 52193a8 webui: delete runtime config
- ec95fff daynightd: select with prudynt
- 8358971 agents: update onboarding information
- eb2a23c cameras: normalize configs
- ce4be88 soc: read the SoC model from whichever vendor declares it #1404 added BR2_SIGMASTAR_SOC_MODEL, but nothing has ever read it: thingino.mk takes the model from BR2_INGENIC_SOC_MODEL alone, so a board selecting the SigmaStar vendor resolves an empty SOC_MODEL and skips the family lookup entirely, silently. Falling back to the other symbol is the whole fix. Everything downstream was already vendor-neutral -- the include is soc/$(SOC_VENDOR)/*.mk and the unknown-model error names $(SOC_VENDOR) -- so this one read was the only thing keeping the block Ingenic-only. A second vendor now needs no arm here at all. The two symbols stay separate in Kconfig, and should: each carries its own help text listing that vendor's valid models, and depends on its vendor so menuconfig shows one. It is only make that has no use for the distinction, having just a string either way. That is also why the order is not a precedence -- the vendor choice makes them mutually exclusive, so at most one is ever set. Testing after qstrip rather than before is deliberate: a defconfig carrying an explicit BR2_INGENIC_SOC_MODEL="" holds two characters, not an empty string, and would otherwise win the fallback. Verified: .config for all 171 camera defconfigs is byte-identical to master. A board selecting the SigmaStar vendor now resolves SOC_MODEL and reaches the unknown-model error naming it, where before it resolved nothing at all -- which is the correct result here, since no soc/sigmastar/ exists yet.
- dcaf3cc webui: fix photosensing button states in native heartbeat payload (#1434) Two fixes for the native (Prudynt) heartbeat payload: 1. Sensor states were hardcoded to null — replaced with calls to existing thingino_heartbeat_ircut_state() and thingino_heartbeat_light_state() helpers (already used by the raptor payload). 2. color_mode was derived from daynight_mode (photosensing policy) instead of actual ISP state. Always read image.running_mode from prudyntctl so manual toggles are reflected immediately. Fixes #1423. Signed-off-by: WLTBAgent
- cafc26d motors: convert invert_x/invert_y booleans to integers for SPI modprobe (#1433) SPI motor kernel module expects integer parameters (0/1) for invert_x and invert_y, but jct returns JSON booleans (true/false). Passing false to modprobe causes Invalid argument error, preventing the motor module from loading. Fix: convert true→1, false→0 before passing to modprobe. Reported-by: CaptainRon (Discord) Signed-off-by: WLTB-Gino
- 602aa6e docs: document doorbell chime volume hardware limitations Add a Hardware limitations section explaining the discrepancy between the protocol byte (0-255), the software range (UI clamps to 1-8, CLI accepts 1-32), and the actual hardware PWM resolution (~4-8 distinct levels). Also update volume references in the parameters table and troubleshooting section. Signed-off-by: Paul Philippov paul@themactep.com
- f094b89 webui: clamp doorbell chime volume max to 8 The Wyze Doorbell V1 chime hardware only differentiates ~8 distinct volume levels, so showing a 1-32 range in the UI is misleading. Clamp the slider and event volume inputs to max 8. Signed-off-by: Paul Philippov paul@themactep.com
- c173a2a package/prudynt-t: bump to d5336b3 (refuse corrupted config) Signed-off-by: Paul Philippov paul@themactep.com
- e90fc0c privacy: consolidate config, update plugin and docs - Rewrite thingino-privacy-lite WebUI plugin to use the new top-level privacy.enabled and privacy.save_state keys instead of the removed per-stream osd.privacy.enabled. - Update docs/streamer.md: document privacy.enabled / privacy.save_state, remove obsolete osd.privacy section. - Bump prudynt-t to c66bd5e (JSON API save_state support). Signed-off-by: Paul Philippov paul@themactep.com
- 3ff2b4a package/prudynt-t: bump to 3056017 (privacy persistence + IMP error trapping) - privacy: persist state across restarts with privacy.enabled and privacy.save_state - privacy: add error trapping on all IMP OSD calls Signed-off-by: Paul Philippov paul@themactep.com
- cee1f68 prudynt-t: bump to dfe359b (fix privacy cover on T10/T20/T21/T30) Signed-off-by: Paul Philippov paul@themactep.com
- a995403 package/prudynt-t: bump to ccd1e63 (RTSP auth enforcement) Signed-off-by: Paul Philippov paul@themactep.com
- e85d719 package/prudynt-t: update to a29a966 Update prudynt-t from 585aac4 to a29a966 Hash change: 585aac4db0520dc9b1f78f15b6c4f7a3ecd9a9cd -> a29a96625d983e504066514869e6402078e1b16a Changelog: fcf4ada: fix: revert broken night-mode framerate halving, cap T31 1080p to 25fps ce2080b: feat: encoder watchdog — force-cycle on consecutive polling timeouts f3a2836: fix: honor configured running_mode at ISP init instead of hardcoding Day a29a966: test: daynightd initial mode detection simulator
- 2c9fff0 webui: fix URL-encoded diagnostic uploads Replace the broken upload_data POST roundtrip with direct_upload, which re-runs thingino-diag -j on the backend. The old path sent diagnostic data URL-encoded through JS -> CGI -> nc, but the CGI's naive eval-based form parser never decoded percent-sequences, resulting in garbled termbin pastes like 'Sat+Aug++8+13%3A55%3A12'. Now the upload button triggers the same clean backend path as the direct_upload checkbox, going thingino-diag -> send2termbin -> nc with no encoding middlemen. Signed-off-by: Paul Philippov paul@themactep.com
- 110e1c1 uclibc: guard _ABI64 with defined() in bits/wordsize.h on mips
- 4f0bcf1 sensor-info: update .hash file
- 9d7cb7f sensor: handle both suffixed and unsuffixed /proc/jz/sensor layouts The kernel can expose /proc/jz/sensor in two formats: - suffixed: numbered subdirs like sensor0/ with a count file - unsuffixed: sensor attributes directly in /proc/jz/sensor/ Make the sensor script auto-detect the layout at runtime, and add a fallback to the two CGI scripts so they try sensor0/name first then name for the unsuffixed case. Signed-off-by: Paul Philippov paul@themactep.com
- 326aeb3 package/buildscope: update to f1cb5a6 Update buildscope from afa9252 to f1cb5a6 Hash change: afa9252925afdbe0ecb88bb9f62145390dfafa16 -> f1cb5a698037664947df38abaa9985d838cc92a0 Changelog: d232f3e: Flash table: say what each size column means f1cb5a6: Sizes can be read as KiB/MiB, exact bytes, or hex
- 4e61f59 webui: typo in a macro command
- 6c66c31 mdnsd: add thingino service
- 556e562 uboot: clean up default uenv.txt
- e01c7a2 kopt: check for both t10 and t20 soc
- 67070f4 uboot: update 2026.07 files
- d0a1ac6 remove deprecated ledd
- 016a830 cameras-exp: add configs from master
- 8d1c024 cameras: rename stray uenv.txt
- 68b404d cameras: formatting
- 2dd3392 boards: add wyze_floodlightv2_t41nq.dts from master
- 91012f4 makefile: default libc to uclibc
- f0f7eed makefile: add architecture based on vendor
- 4b7d805 wyze-accessory: fix commands. blank lines break concatenation
- 6c4359d atbm6062u: get kernel version from a variable
- 2cf9107 typos
- 43b13c6 uboot: update version descriptions
- 9d8be90 sysupgrade: define branch as a variable
- e22f8e8 onvif: drop patch, patched upstream
- bcb9567 mmc: check for multiple endpoints
- f11326a package/dropbear: drop patched for older versions
- f9cdfa4 update toolchain defconfigs from master
- ce51e6d cameras: remove goorbell.fragment, remove chimes from vdb2 config
- c5367cf package/thingino-onvif: update to 81962a6 Update thingino-onvif from 4ca8f06 to 81962a6 Hash change: 4ca8f063563b96631d04e1ed7ceb2244d413f736 -> 81962a644aa459f61b96cfd2da884249385af1a3 Changelog: 81962a6: media: add silent audio_output_available() for GetProfiles/GetProfile
- 9145f5d package/open-tx-isp: update to 14d83f7 Update open-tx-isp from 96c5dc2 to 14d83f7 Hash change: 96c5dc2b5733d4879e38b94356871bd4bc55edbe -> 14d83f7790f4dd4e711eada466c544830a9ab611 Changelog: c0d8ea0: Add working T41 V4L2 MMAP capture 9ca32dc: Add standalone T41 V4L2 lifecycle and DMA-BUF export 7d649ec: t41: preserve main-channel tuning with V4L2 0678f96: t41: support live color profile handoff 14d83f7: t41: add live low-light color model
- 27952f5 package/buildscope: update to afa9252 Update buildscope from 8422478 to afa9252 Hash change: 8422478d4557679a141b5334472df631b78fda6f -> afa9252925afdbe0ecb88bb9f62145390dfafa16 Changelog: de2856b: Viewer: stop a hyphenated format chip from wrapping e8c7eb4: Add export --fleet: a release-ready index and report tarball 8d3e1f7: Viewer: read a fleet snapshot from a release 796e034: Viewer: let ?repo= point a fleet at the fork 311a207: Add buildscope's own fleet proxy Worker d82b382: Publish prebuilt CLI binaries on release c60d4bd: Create the release before attaching binaries to it 1892856: Release: test for a program interpreter, not file(1) wording c7e0cce: Release: build the tag being released, not the dispatch ref 8ae55e9: Landing page: a way into a published fleet 5a3ef72: Fleet: a visible way back to the device listing 0d3ad79: Report what a build was made from, via its os-release 695c639: Release 0.1.1 f6310b5: worker: let readers revalidate instead of re-downloading 21ff7fa: Fleet: sort by name by default 08fdc32: Packages: expand the treemap to the viewport ee14eef: Discover snapshots through the proxy, and say so while looking 6d340e2: Fleet: let the brand link leave the fleet 3aa25f9: export --fleet: carry each build's flash layout in the index 0c29740: Fleet: a flash-map view, and stepping between builds d186df6: Release 0.1.2 4658816: Read the kernel's own config out of the image b3f8bda: Release 0.1.3 dc7caea: Modules: list the built-in ones behind their count 29d88c2: Fold the kernel config into one Kernel tab e519ed3: Landing page: say whose releases these are, and what is in them 66c3de5: Drop zone: say what buildscope reads, not just how 17c4c3f: README: document integrating buildscope into a Buildroot build 0f7cc0f: docs: bring the other three up to date c2e10a9: Opt-in help balloons, as the other thingino web apps do them 5266e0f: Help toggle: fill it while on, so hover cannot impersonate it e9545a9: Explain context source and scan mode where they are shown fbcd86c: Read Ingenic JZLZMA, which no standard tool does 67150ad: Carve a layout for images that keep no readable environment 2db1768: Landing page: line the releases card up with the drop target cf80ac9: Escape every < in the report payload of an exported page fbd4720: Reduce a build name to a leaf before it becomes a tar member 5aa499b: Stop a crafted image from driving the terminal it is inspected on 91fd534: Version 0.1.4 0acd0ad: Take the footer version from Cargo.toml, not package.json 5885747: Drift: compare a profile against its own past, not its neighbour 3e48f4f: Keep the terminal filter off machine output 7bf0bb3: Drift: a partition that spans the others carries no delta d249364: Version 0.1.5 10141f9: Name the comparison tab after the column it is about 5c7ec4a: Delta: compare kernel config and U-Boot environment ed14ed4: Selects: stop the native control clipping its own text 1930750: Fleet proxy: stop a rate-limited API call hiding published releases a154a23: Write the map-key separator as an escape, not a raw NUL d8bf394: Fleet proxy: hold settled releases far longer 48e62dc: Fleet proxy: version the cache keys 3f613ab: Capture how a build was configured 9d62e92: Show the build configuration, and diff it 10db583: Version 0.1.6 df5d2c9: Keep the builder out of the captured config 53e46f0: Version 0.1.7 dc563a9: Fleet proxy: serve branch releases too, not just firmware-* 1ddc408: Fleet proxy: bump the cache version for the tag-rule change afa9252: Fleet proxy: an unknown tag is not a settled one
- f8dfd79 timps: bump TIMPS_VERSION to v1.7.8 C11 data-race hardening (audio.mute, daynight thread, OSD .enabled), osd.vars_file documentation + QA coverage, empty-credentials exposure documentation. https://github.com/Lu-Fi/timps/releases/tag/v1.7.8 Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
- d31ebfb package/open-tx-isp: update to 96c5dc2 Update open-tx-isp from f3757d1 to 96c5dc2 Hash change: f3757d1f736336b0de6fb0a0a2fd5bc8a20309e1 -> 96c5dc2b5733d4879e38b94356871bd4bc55edbe Changelog: 09438ef: Keep incomplete T41 TMO fail-safe after cold boot 2d9600d: Gate T41 recovery traces off hot paths bcf6d1d: Add reusable capture queue core for V4L2 96c5dc2: Record optimized T41 checkpoint and client state
- c3084e0 package/llhttp: add missing hash for v9.4.3 The .mk was already at 9.4.3 but the .hash file still only had the v9.4.2 entry. Download the v9.4.3 tarball and record its SHA-256.
- 3fa4180 scripts/update_packages: also update .hash file for release bundles When updating a GitHub release-bundle package, automatically download the new tarball, compute its SHA-256, and record it in the package's .hash file. Previously the script only bumped the _VERSION in the .mk file, leaving Buildroot without a matching hash and causing build failures.
- 6e723f3 package/open-tx-isp: update to f3757d1 Update open-tx-isp from ad9db44 to f3757d1 Hash change: ad9db44cb71b25460ee50e6bcbc5cfc27a5a0958 -> f3757d1f736336b0de6fb0a0a2fd5bc8a20309e1
- 6e5277b package/lightnvr: update to 0.36.7 Update lightnvr from 0.36.6 to 0.36.7 Hash change: 0.36.6 -> 0.36.7 (No changelog available)
- 8852396 webui: paranoid mode: run CDN rewrite after all package finalize hooks The paranoid CDN -> local rewriting was registered as a per-package TARGET_FINALIZE_HOOKS on thingino-webui. Streamer packages like timps install their own HTML overlays via THEIR finalize hooks, and when thingino-webui is processed first its paranoid rewrite fires before those overlays land - leaving CDN <script>/ tags intact on timps-specific pages (preview, streamer-main, config-motion, etc.). Move the hook to ROOTFS_PRE_CMD_HOOKS which runs after every package's finalize hooks. Plugin assembly (ASSEMBLE_PLUGINS) also completes before this point and only injects local paths, so the order is safe. Closes #1396 Signed-off-by: Paul Philippov paul@themactep.com
- ae9331a webui: motors: skip tilt validation on pan-only cameras When all tilt GPIOs are -1 the hardware has no tilt axis and steps_tilt = 0 is legitimate. Skip tilt GPIO and steps validation in that case instead of blocking the entire form with "Tilt max steps must be a positive number". Also fix the error display: the fallback showAlert used textContent which rendered
tags literally. Show each validation error as a separate alert instead. Closes #1402 Signed-off-by: Paul Philippov paul@themactep.com - 86a961a thingino-raptor-hal: own the vendor selects (#1398) * thingino-raptor: condition the ingenic hardware selects on the ingenic vendor Selecting Raptor pulls in ingenic-lib, ingenic-lib-libimp, libimp-debug, ingenic-system-libs-neo (+libalog), libaudioprocess-neo, ingenic-lib-audioprocess and the Ingenic musl/uClibc shims. Those are Ingenic silicon, but Raptor reaches the hardware through thingino-raptor-hal rather than linking them directly, so the streamer itself is not tied to a vendor. Condition them on BR2_SOC_VENDOR_INGENIC, which the SoC vendor choice provides. BR2_PACKAGE_LIBSCHRIFT, THINGINO_FONTS, THINGINO_LOGO and COMPY stay unguarded -- they are vendor-neutral. The IVS sub-options (ingenic-lib-jzdl, ingenic-lib-persondet) are left alone; they sit under features that are Ingenic by definition. Every existing board resolves BR2_SOC_VENDOR_INGENIC=y, so this is inert for them by construction. * thingino-streamer: source the raptor library Config.in files package/thingino-raptor-{hal,ipc,common}/Config.in are sourced nowhere, so BR2_PACKAGE_THINGINO_RAPTOR_{HAL,IPC,COMMON} are undefined and the three selects naming them in thingino-raptor/Config.in are silent no-ops. Kconfig does not warn when a select names a symbol it has never seen. Nothing reads the three symbols today, so this is latent rather than broken -- the packages build because Buildroot builds anything named in a _DEPENDENCIES list. It stops being latent in the next commit, which moves raptor's vendor selects into the HAL's Config.in and needs that file to actually be read. Each of the three currently declares a bare
booland nothing else, so defining them changes no package selection. * thingino-raptor-hal: own the vendor selects Moves raptor's Ingenic library selects into the HAL, replacing the per-lineif BR2_SOC_VENDOR_INGENICguards from the first commit. This is @themactep's review point: raptor the application does not know what silicon it runs on, the HAL does, so the HAL should carry the vendor knowledge. Rather than repeating the guard on each library, the HAL selects one hidden backend symbol per vendor and that symbol carries the libraries. A new vendor is one select and one block, not nine guards. The .mk gets the matching treatment -- oneifeqper vendor around its DEPENDENCIES, per the same review. The twoif BR2_TOOLCHAIN_USES_*conditions are kept: both shims declare a matchingdepends on, so dropping them would be selecting a symbol whose dependency is unmet. Depends on the previous commit. Without it nothing sources thingino-raptor-hal/Config.in, and moving the selects into a file Kconfig never reads would drop them: on a raptor board LIBIMP_DEBUG and INGENIC_LIB_AUDIOPROCESS have no other selector at all, and LIBIMP, SYSTEM_LIBS_NEO, _LIBALOG, LIBAUDIOPROCESS_NEO and INGENIC_UCLIBC are only selected by other streamers, which are not enabled when raptor is. No functional change for Ingenic: BR2_SOC_VENDOR_INGENIC is the Kconfig default and every existing board resolves to it. --------- Co-authored-by: John Chia john@johnchia.com - 7353048 Config.in: move the Ingenic selects into a per-vendor block (#1397) * Config.in: condition the ingenic-only selects on the ingenic vendor BR2_THINGINO_SYSTEM_PACKAGES hard-selects ingenic-diag-tools, ingenic-lib, ingenic-pwm, ingenic-sdk, ingenic-musl and BR2_TARGET_UBOOT. Those are Ingenic silicon, but the menu cannot simply be turned off by a non-Ingenic vendor: the same "if BR2_THINGINO_SYSTEM_PACKAGES" gates the Config.in sources for the whole application layer -- thingino-core, -jct, -system, -webui -- so disabling it to escape the vendor selects takes the application layer with it. Condition them on BR2_SOC_VENDOR_INGENIC instead, which the SoC vendor choice now provides. Every existing board resolves BR2_SOC_VENDOR_INGENIC=y, so this is inert for them by construction. * Config.in: move the Ingenic selects into a per-vendor block Replaces the per-line
if BR2_SOC_VENDOR_INGENICguards from the first commit with the shape @themactep proposed in review: one file per vendor, one select to reach it. Adding a vendor is one line here and one file, not a guard on every select. One deviation from the sketch in that review.selecthas to be a property of aconfig, andsourceis a top-level statement, so bare selects in the sourced file do not parse andsourcecannot go inside this menu's property list either. The vendor file therefore defines a hidden symbol that the menu selects. No functional change for Ingenic: BR2_SOC_VENDOR_INGENIC is the Kconfig default and every existing board resolves to it, so the same six packages are selected under the same conditions. --------- Co-authored-by: John Chia john@johnchia.com - 3fe80e9 mbedtls: shrink TLS OUT I/O buffer 16 KB -> 4 KB per connection (#1412) timps optimization review 2026-07-31, S4: mbedTLS allocates a 16 KB IN plus 16 KB OUT buffer per TLS connection (~34 KB heap each). The IN side must stay at 16 KB - peers may legally send full-size records and shrinking it safely needs the Max-Fragment-Length extension, which common clients do not negotiate. The OUT side only bounds the records we send: mbedtls_ssl_write() hands back partial writes and every consumer in the image (timps, libcurl, libwebsockets, ustream-ssl, libmosquitto, wpa_supplicant) already loops on short writes. Only hard requirement is that our own outgoing handshake messages fit; the self-signed ECDSA/RSA device certs are far below 4 KB. Saves ~12 KB heap per concurrent TLS connection for every mbedTLS user on the target. Verified on cam-garage (wuuk/T31X): TLS 1.3 handshake, 170 KB snapshot and MJPEG streaming over timps HTTPS, uhttpd on 443 - all clean with the rebuilt library. Co-authored-by: Claude Sonnet 5 noreply@anthropic.com
- 19703ce thingino-onvif: media GetProfiles must not fault when audio output is disabled (#1413) media_audio_output_supported() sends an AudioOutputNotSupported SOAP fault as a side effect of returning 0. GetProfiles/GetProfile used it as a plain conditional around the optional AudioOutputConfiguration block, so any configuration with audio.output_enabled=false (or every profile at audio_decoder=NONE) emitted that fault into the middle of the GetProfiles answer and broke profile discovery for every client. Adds a silent media_audio_output_available() predicate for the profile responses; the explicit AudioOutput actions (GetAudioOutputs, GetAudioOutputConfiguration[s|Options], GetCompatibleAudioOutput- Configurations) keep the faulting variant, which is correct there.
- 5282ee9 package/prudynt-t: update to 585aac4 Update prudynt-t from c630ae7 to 585aac4 Hash change: c630ae797a86b29e83999fe324323932ec33460c -> 585aac4db0520dc9b1f78f15b6c4f7a3ecd9a9cd Changelog: 585aac4: audio: add mic_hq toggle (48kHz vs 16kHz) with matching bitrate
- cc95244 cameras: preset t10/t20 units to 20 fps and 16k audio bitrate to lower cpu load
- f6a706b sysupgrade: point self-update to ciao branch Signed-off-by: Paul Philippov paul@themactep.com
- c701c51 all-patches: gcc16 MXU2 backend register-allocation fixes Four fixes on top of the initial 16.1.0 port, found by hardware validation of the shim delegate mode (setjmp + address-taken vector locals made LRA loop, then fail to spill): - mips_secondary_reload_class: regno<0 MXU2-mode pseudos reload via lu1q/su1q directly, no GPR intermediate - mov_mxu2: GPR alternatives disparaged (!*d/!*q) - mips_register_move_cost: COP2<->COP2 = ORV cost, GPR<->COP2 expensive - allocno-class steering + preferred_reload_class for MXU2 modes T20-validated with the rebuilt SDK: builtins 382/382, shim plain 441/441, shim -mmxu2 delegate 441/441, dsp 7/7.
- f34a671 all-patches: add MXU2 patches for gcc16 toolchains binutils/2.45.1: MXU2 rebase of the 2.44 patch (offsets only; opcode rows moved ahead of UDI so lu1q/su1q disassemble correctly under -M mxu2; ASE-gated, plain disassembly unchanged). gcc/16.1.0: the 15.2.0 backend patch, applies unchanged. The gcc16 toolchain defconfigs already select binutils 2.45.1 and gcc 16.1.0, so these version dirs were silently skipping MXU2 until now. Validated via GROUP=github BOARD=toolchain_xburst1_uclibc_gcc16 make sdk, then on T20 hardware: 382/382 native builtins, 431/431 shim, 7/7 dsp.
- 2570d26 daynightd: bump default night_threshold from 20 to 25 Signed-off-by: Paul Philippov paul@themactep.com
- d55c462 bump prudynt-t to c630ae7 (backchannel thread sync fix)
- f9981b6 fix: restore MXU v2 support for XBurst1 SoCs (T10/T20/T21/T30) The GCC 16 transition (5020dde) introduced empty C stubs (0006-mxu-v2-stubs.patch) that replaced the pre-compiled mxu-v2-ex.obj binary asset. The stubs returned soc_support_mxuv2() = 0 for all SoCs, which told the kernel that MXU v2 was absent. The kernel then never enabled the COP2 coprocessor, causing libimp.so's SmartH264 encoder (H264_SMA_CalMBFlag) to raise 'Coprocessor Unusable' -> SIGILL on the first MXU instruction. Fix by removing the harmful stubs patch entirely. The cumulative kernel patch (0001) already references mxu-v2-ex.obj correctly, and the binary assets hook now uses a versioned tarball so each kernel version can ship its own pre-compiled objects. Also make the binary assets hook version-aware so future kernel versions can have their own bundles: thingino-binary-assets-$(LINUX_VERSION).tar.gz
- 91e7690 dropbear: add wtmpx/wtmp/lastlog disable patch for 2026.94 The dropbear version was bumped from 2026.91 to 2026.94 in the buildroot submodule, but no patch directory was created for the new version, so the wtmpx/wtmp/lastlog disable patch was silently dropped. Without this patch, dropbear tries to write to /var/log/wtmp at login and emits: 'wtmpx_write: problem opening /var/log/wtmp: No such file or directory'
- 15391f2 thingino-diag: redact SSID and encryption key from WIFI-INFO output Pipe iw/iwconfig output through sed to redact sensitive fields: - ESSID (iwconfig) / ssid (iw) - Encryption key (iwconfig) Matches existing redaction patterns used for WPA-STATUS and WPA-CONF. Signed-off-by: Paul Philippov paul@themactep.com
- 062acce fix: preserve string values for daynight select fields in photosensing config fix: preserve string values for daynight select fields in photosensing config
- 299b16e fix: preserve string values for daynight select fields in photosensing config initial_mode and force_mode use elements with string values ("day", "night", ""). The save handlers converted all non-checkbox fields through Number(), which turned "day" into NaN and then fell back to 0 (a JSON number). daynightd checks for JSON_STRING type, so the values were silently ignored on boot and dropdowns appeared empty after reboot. Fix: treat elements as string-valued in both saveDaynightParam() and the save button click handler. Reported by: <@1113896715825713305>
- 4a29c65 wifi: fix captive portal DHCP regression on WiFi-only cameras Commit 179a502 (wifi: skip wired uplink polling when no wired interfaces exist) introduced a regression where watch_wired_uplink() returns early on WiFi-only cameras before reaching the portal_confirmed call. This means udhcpd and dnsd never start, so clients can associate with the THINGINO-xxxx AP but never receive a DHCP lease. Restructure the guard so any_wired_iface_exists only skips the polling loop. The portal_confirmed call always runs, ensuring DHCP/DNS starts whether or not wired interfaces are present. Reported-by: C-Walk Fixes: 179a502 (wifi: skip wired uplink polling when no wired interfaces exist) Signed-off-by: Paul Philippov paul@themactep.com
- 0616c02 snmpd: relocate documentation, add user tool, register the service with mdnsd
- eba1e54 agents: add ascii only rule for scripting
- 6f7c492 package/timps: update to v1.7.7 Update timps from v1.7.3 to v1.7.7 Hash change: v1.7.3 -> v1.7.7 (No changelog available)
- 70f3fdd package/prudynt-t: update to e5d4946 Update prudynt-t from be78b46 to e5d4946 Hash change: be78b46092c47b652ed71251c0d960177ddb8793 -> e5d4946ecc7e0874ca362f33ebcdcf9b5d346fcd Changelog: 0bbb467: fix: add missing <unistd.h> for GCC 16 compatibility e5d4946: handle_image: adjust encoder framerate dynamically on running_mode change
- eecb410 daynight: delegate night-mode FPS halving to prudynt Instead of reading fps from /etc/prudynt.json, halving it, and pushing it back via the prudynt API (which triggered an auto-save, persisting the transient night-mode value to disk), just send the running_mode. Prudynt now handles the FPS adjustment internally via hal::encoder::set_framerate() when the running_mode changes, leaving the config file untouched. Fixes the ratcheting FPS degradation described in issue #1401. Signed-off-by: Paul paul@earendil.org
- d0ae7c4 toolchain: leave the retired gcc13 fragments alone Upstream dropped gcc13 in 7505ea1, which deleted ext-gcc13-glibc.fragment and ext-gcc13-musl.fragment. Templating their URLs here turned the merge into a modify/delete conflict on both files. Restoring them to their merge-base content, rather than deleting them on this branch, leaves this branch's version identical to the base. The merge then resolves to upstream's deletion with no conflict, and the cumulative diff stops mentioning gcc13 at all.
- 02bfdb4 agents: update information
- 876d7ad makefile: default to uclibc and uboot 2013.07 in ciao branch
- cf7506a buildroot: switch from releases to rolling updates
- 36f175d sysupgrade: add sigmastar quirks, rewrite existing partition checking
- 991d73d toolchain: switch to gcc16, drop gcc13, clean up
- b0aeb85 Update buildroot to latest version
- afcc5b5 configs: toolchain: point loc-gcc14-uclibc at the uclibc toolchain The uclibc local fragment had BR2_TOOLCHAIN_EXTERNAL_PATH set to /opt/thingino/gcc14-musl-$(KERNEL_VER), a copy-paste from the musl fragment, so it looked for a musl toolchain while declaring BR2_TOOLCHAIN_EXTERNAL_CUSTOM_UCLIBC.
- 7bdc72f configs: toolchain: enable locale on buildroot uclibc fragments The br- fragments built uClibc without locale, while every CI toolchain profile and both ext- fragments have BR2_TOOLCHAIN_BUILDROOT_LOCALE=y. Locale selects UCLIBC_HAS_XLOCALE, which decides the ctype ABI: with it libc exports _ctype*_loc() functions, without it bare __ctype_b data pointers. So selecting the buildroot toolchain type produced a libc whose ctype ABI did not match any published tarball, and the ingenic-uclibc shim, written against the xlocale interface, broke. gcc14 was additionally missing WCHAR, which ext-gcc14-uclibc already declares (locale selects it too, set explicitly to match siblings).
- 37e8c43 toolchain: drop gcc13
- d258d2e Fix formatting in SNMPD configuration flow diagram
- 94d60ba docs: add thingino-snmpd documentation Comprehensive documentation for the new SNMP monitoring package, covering architecture, configuration, usage examples, monitoring system integration (LibreNMS, Zabbix, Prometheus, Nagios), bundle distribution, troubleshooting, and security considerations. Signed-off-by: Paul paul@thingino.com
- c4ed62e webui: move paranoid CDN rewriting to finalize hook apply_paranoid_mode.py ran during INSTALL_TARGET_CMDS, before plugin packages (thingino-snmpd, thingino-gpio, etc.) installed their HTML pages. This meant plugin pages kept CDN references even in paranoid mode while core pages got rewritten to local /a/vendor/ assets. Move only the CDN rewriting step to TARGET_FINALIZE_HOOKS. Vendor files are still installed during the main install step since they don't depend on plugin ordering. Signed-off-by: Paul paul@thingino.com
- 02c2f77 thingino-snmpd: add mini-snmpd 2.0 package with WebUI plugin thingino-snmpd: add mini-snmpd 2.0 package with WebUI plugin
- 85262f4 snmpd: add snmpd test script Add scripts/test-snmpd.sh — exercises all MIB groups exposed by mini-snmpd 2.0 (system, interfaces, IP, host resources, memory, disks, CPU load/stats, agent counters). Signed-off-by: Paul paul@thingino.com
- 1aad882 Merge branch 'ciao' into mini-snmpd
- 22521d9 package/ingenic-diag-tools: bump for the dump column header
- 55316ed package: port gpio-diag callers to the new CLI gpio-diag is now verb-first, so
gpio-diag PIN func N drive M' becomesgpio-diag mode PIN funcN' plusgpio-diag drive PIN M'. This changes behaviour on the MMC pin setups. The old tool dispatched on argv[2] and read its value from argv[3], so everything fromdrive' on was parsed as nothing and silently dropped: the drive strength those scripts asked for was never applied. It is applied now. pwm-ctrl only ever set a function, so it is a straight translation. - 8841ccc package/ingenic-diag-tools: point at thingino/ingenic-gpio The tool was rewritten from Ingenic's GPL-2.0 vendor u-boot and kernel sources and now lives at thingino/ingenic-gpio under GPL-2.0, replacing the AGPL-3.0 fork of Ingenic-community/jz-diag-tools. The Makefile now emits gpio-diag directly, so the install no longer renames the binary. The CLI changed and is not compatible with the old one: commands are verb-first (dump, get, level, mode, drive, bias, toggle, reg) instead of pin-first. Callers in this tree need updating.
- 510f3e4 uboot: regenerate 2026.07 master patch (ingenic-t-series @ 689f7efcc293)
- 9f72e09 fix: add numeric prefix to pwm and accessory module files The S11modules init script loads module files from /etc/modules.d/ in glob order. Without numeric prefixes, pwm and accessory files could load in unpredictable positions relative to numbered entries. Prefix pwm as 15-pwm (after 10-avpu, before 20-isp) and accessory as 50-accessory (after 40-audio, keeping USB device modules last). Signed-off-by: Paul Philippov paul@themactep.com
- 28df902 toolchain: template the target architecture into the fragment urls The eleven ext-*.fragment files name their release asset with a literal "-linux-mipsel.tar.gz". Only the build host and the SoC tag are interpolated, so the target architecture is the one dimension of the toolchain naming scheme that cannot vary. A non-MIPS board has no way to name its toolchain through a fragment and has to override BR2_TOOLCHAIN_EXTERNAL_URL wholesale in its camera defconfig, which duplicates the whole URL per board and silently breaks whenever the release tag or naming changes. Resolve the architecture once and template it in, reusing the mechanism already there: SED_CONFIG_VARS substitutes seven $(VAR) templates into every fragment before appending it, so this adds one clause rather than new machinery. SOC_TARGET_ARCH is resolved in thingino.mk rather than read from the BR2_mipsel/BR2_arm that the SoC fragment already sets, because fragments are appended to .config and never included as makefiles -- the symbol does not exist when the substitution runs. Inert for every board in the tree: SOC_TARGET_ARCH is "mipsel" on the Ingenic path, so all eleven URLs resolve to the byte they resolve to today. The cost of a further architecture is one line.
- c99ad33 toolchain: template the target architecture into the fragment urls The eleven ext-*.fragment files name their release asset with a literal "-linux-mipsel.tar.gz". Only the build host and the SoC tag are interpolated, so the target architecture is the one dimension of the toolchain naming scheme that cannot vary. A non-MIPS board has no way to name its toolchain through a fragment and has to override BR2_TOOLCHAIN_EXTERNAL_URL wholesale in its camera defconfig, which duplicates the whole URL per board and silently breaks whenever the release tag or naming changes. Resolve the architecture once and template it in, reusing the mechanism already there: SED_CONFIG_VARS substitutes seven $(VAR) templates into every fragment before appending it, so this adds one clause rather than new machinery. SOC_TARGET_ARCH is resolved in thingino.mk rather than read from the BR2_mipsel/BR2_arm that the SoC fragment already sets, because fragments are appended to .config and never included as makefiles -- the symbol does not exist when the substitution runs. Inert for every board in the tree: SOC_TARGET_ARCH is "mipsel" on the Ingenic path, so all eleven URLs resolve to the byte they resolve to today. The cost of a further architecture is one line.
- 08bebfe soc: declare the sigmastar soc model The SoC vendor choice offers Ingenic and SigmaStar, and its help text says it selects "which SoC model space is offered below" -- but only Ingenic has one. Selecting SigmaStar in menuconfig leaves no way to name the SoC, and BR2_SOC_FAMILY stays empty for it because that symbol's default chain is keyed entirely on BR2_INGENIC_SOC_MODEL. Nothing in Kconfig can gate on the family for a non-Ingenic vendor. Mirror BR2_INGENIC_SOC_MODEL: a prompted string gated on the vendor, plus a BR2_SOC_FAMILY default keyed on it. Only one vendor's model symbol is ever non-empty, so the two halves of the chain cannot both match and their order does not matter. Ingenic .configs are unaffected -- the new symbol is invisible without the SigmaStar vendor and defaults to the empty string.
- 3ec4e9c toolchain: switch default GCC to 16 Flip core.fragment, the Config.in choice default, the Makefile fallback, and the resolver fallback from 15 to 16 together. Type stays EXTERNAL so builds download the published gcc16 tarballs. Verified with a pristine vanhua_z55i full image build: gcc 16.1.0 across userspace and kernel, image packs clean.
- d3ee36e package/thingino-sensor-info: userspace sensor detector, replaces sensor-info script New package builds sinfo from github.com/thingino/sensor-info and installs /usr/sbin/sinfo with a sensor-info compatibility symlink, linked dynamically to keep images small. The old script downloaded a per-SoC, per-kernel sinfo.ko from a GitHub release at runtime; the userspace tool needs no module and works on every SoC. thingino-system stops installing the script; the sensor-utils option now selects BR2_PACKAGE_THINGINO_SENSOR_INFO so dev-camera images keep a sensor-info command.
- 261b2a1 toolchain: add GCC 16 selection and fragments Add BR2_THINGINO_TOOLCHAIN_GCC_16 to the version choice (default stays GCC 15) and the br/ext/loc gcc16 fragments for all three libcs, ported from feat/gcc16. Deviation from that branch: br-gcc16-uclibc enables BR2_TOOLCHAIN_BUILDROOT_LOCALE so an inline-built uclibc toolchain has the same xlocale ABI as the published toolchain tarballs; without it the libc stops exporting _ctype*_loc() and vendor-blob ctype compat in ingenic-uclibc breaks.
- b27589e Pin buildscope v0.1.7 Captures how each camera was configured: the defconfig verbatim plus the expanded Buildroot options, both viewable and diffable between releases.
- bf2b7fa soc: fold the ingenic default into the vendor else branch Review feedback: assigning SOC_VENDOR twice reads as a redefinition -- ingenic first, then sigmastar -- when only one value is ever wanted. Semantically inert. SOC_VENDOR resolves identically for every state of the vendor symbols, including the unset case that keeps thingino.mk usable before .config exists: ingenic BR2_SOC_VENDOR_SIGMASTAR=y sigmastar BR2_SOC_VENDOR_INGENIC=y ingenic and still expands to ingenic for jooan_w8u_t23n_sc2336_atbm6132u and iget_c5pt_t41lq_gc4023_jl1101.
- 17a7e4b soc: declare the SoC vendor as a choice SOC_VENDOR is hardcoded to "ingenic" at thingino.mk:8 and has no Kconfig counterpart, so there is nothing a board can set to say it is not an Ingenic part. Add a "SoC vendor" choice, default Ingenic, and derive SOC_VENDOR from it. Ingenic stays the make-level fallback rather than only the Kconfig default: thingino.mk is parsed on paths where .config does not exist yet, and every existing defconfig sets no vendor symbol at all, so an unset vendor has to keep resolving to ingenic. BR2_INGENIC_SOC_MODEL gains a depends on the Ingenic vendor. It is the entry point to the whole Ingenic SoC database -- BR2_SOC_FAMILY's default chain is keyed on it -- so it is exactly the symbol that should disappear for a non-Ingenic part. Generating .config for four boards spanning both kernel versions, before and after, the only difference is the two new symbols: jooan_w8u_t23n_sc2336_atbm6132u > BR2_SOC_VENDOR_INGENIC=y atom_cam2_t31x_gc2053_atbm6031 > # BR2_SOC_VENDOR_SIGMASTAR is not set iget_c5pt_t41lq_gc4023_jl1101 smart_nvr_a1n_eth No pre-existing symbol changes value, so every board builds what it built before.
- 86d4839 libhelix-aac: build the portable C path on arm assembly.h picks a MULSHIFT32/FASTABS/CLZ implementation per platform and ends the chain in "#error Unsupported platform in assembly.h". Both of its ARM branches are disabled by misspelt guards: assembly.h:246 #elif defined (XXX__arm) && defined (ARMCC_VERSION) assembly.h:368 #elif defined(GNUC) && defined(XXXX__arm) so an ARM GCC build matches no branch and stops at the #error on all 15 sources that include the header. The portable C branch just below covers ARDUINO, mips, powerpc and Solaris, but not arm. Add arm/aarch64 to that branch. It is the same path mips takes, so this is the plain-C implementation thingino already ships on Ingenic -- no inline assembly, and no change to any existing target. Reviving the disabled ARM assembly branch is the other option, but it is switched off upstream for a reason nobody wrote down, and this decoder feeds the WebRTC audio path. Evaluating the old and new conditions under the preprocessor, the branch taken changes for arm and aarch64 only: mips old=TAKEN new=TAKEN powerpc old=TAKEN new=TAKEN i386 old=NOT_TAKEN new=NOT_TAKEN arm old=NOT_TAKEN new=TAKEN aarch64 old=NOT_TAKEN new=TAKEN No MIPS target can reach the added clause, so every board in the tree builds the object it builds today.
- 508aebe odhcp6c: drop unused odhcp6c-update install and deprecated -v flag The daemon applies state via its built-in default script path, which overlay/usr/lib/netifd/dhcpv6.script provides; the example script installed to /usr/sbin/odhcp6c-update was referenced nowhere. The -v flag is deprecated in current odhcp6c and only produces a syslog warning. Also remove the unused TMP_LOG variable.
- f5d2464 Pin buildscope v0.1.5 Fixes diff --json emitting unparseable output, and stops a whole-chip mtdparts alias being reported as the entire flash being freed when a layout change drops it.
- 202cb6f libhelix-mp3, libflac: fail the build too; drop the .mk comment Extends the previous commit's fix to the two remaining packages built the same way, and removes its explanatory comment from libhelix-aac.mk, whose reasoning is already in that commit's notes. All three packages share one BUILD_CMDS shape, and they are the only three in the tree that do: a $(foreach ...) whose commands are joined by ";", followed by a link of "find ... | xargs $(TARGET_CC) -shared". Without "set -e" a source that fails to compile does not stop the loop, and a shared link permits undefined symbols, so the package builds green and installs a library missing whatever did not compile. libhelix-mp3 carries the identical gate that libhelix-aac tripped -- assembly.h:353, included by 8 of its 15 sources -- and would fail the same way on the same target; it was not hit there only because that build does not select it. libflac's own "#error Unsupported platform" is a narrower ppc-hwcaps path (cpu.c:257) rather than the same trigger, but its BUILD_CMDS has the same shape and the same silent partial-link outcome for any source that fails. Co-Authored-By: Claude Opus 5 noreply@anthropic.com
- a4743e9 Pin buildscope v0.1.4 Fixes three ways a crafted image could act on the machine reading it: terminal escapes from a partition name, a tar member escaping the directory it unpacks into, and a payload that broke an exported page.
- a233c5d os-release: derive ARCHITECTURE instead of hardcoding mips ARCHITECTURE was the literal "mips", which is correct for every target thingino currently builds -- this is groundwork, not a bug fix. /etc/os-release is read at runtime rather than only at build time:
soc -areports from it and the web UI displays it. On a MIPS build the derived value is identical, so this changes nothing for existing targets; it only stops the field being wrong if the tree ever builds for another architecture. Co-Authored-By: Claude Opus 5 noreply@anthropic.com - 2b700a9 libhelix-aac: fail the build instead of shipping a broken library The compile step is a $(foreach ...) whose commands are joined by ";", so a source that fails to compile does not stop the loop. The link that follows is "-shared" over whatever .o files exist, and a shared link permits undefined symbols, so the package builds green and installs a library missing whatever did not compile. Found while building for a non-MIPS target, where 15 of the 28 sources hit "#error Unsupported platform in assembly.h" and the resulting .so contained 13 objects. Nothing failed; the first caller died with symbol lookup error: /lib/libhelix-aac.so: undefined symbol: UncoupleSBRNoise This is a no-op on any target where every source already compiles -- it only changes what happens when one does not. Co-Authored-By: Claude Opus 5 noreply@anthropic.com
- 7107873 Pin buildscope v0.1.3, which recovers the kernel's own config v0.1.2 reads no kernel config, so the tab has nothing to show. It also fixes the uImage payload bound, which on a carved image cost the built-in device trees as well.
- 3f9ed9a Pin buildscope v0.1.2, which records each build's flash layout v0.1.1 writes an index without partition layouts, so the fleet view has nothing to compare and offers no map.
- 3dc3bec Pin buildscope v0.1.1, which records what a build came from v0.1.0 predates the os-release capture, so its reports carry no branch or revision and the fleet overview has nothing to show in that column.
- c66ca36 pack: correct where the size report is written It goes to the build root, beside uenv.txt, not into images/ -- which is what the CI glob that collects it already assumes.
- c7ef3cd Add the buildscope fleet snapshot to stable builds Same shape as master, adapted: the output path follows the branch input, and the release tag comes from prepare-release rather than the matrix. Guarded on should_build like the other jobs there.
- f9001ca Pin buildscope to the commit that has export --fleet
- e72a3ee Add buildscope fleet snapshot to master firmware builds Build the buildscope CLI once as a static musl binary and reuse it across the camera matrix, rather than paying the host-package cost in each of the 170 jobs. Each job uploads its buildscope-report.json; a new fleet job collects them and publishes fleet-index.json and fleet-reports.tar.gz to the release.
- 4514aff package/buildscope: pin a revision that reads this fleet's images The host tool writes a size report at the end of pack. The revision it is pinned to decides what that report can say, and the earlier pin predated the work that matters here: UBI volumes and UBIFS on the NAND boards, squashfs contents and per-file compressed cost, the device trees that are built into the kernel and appended to U-Boot rather than shipped as files. It also predated the report moving out of images/ and losing the builder's home directory from its path, both of which change what a build leaves behind. Pinned by full hash, as an unpinned host tool would make builds unreproducible.
- 1ecbbcc pack: write a buildscope size report when the tool is available Attributes the rootfs to the packages that installed it and reads real usage out of every image into images/buildscope-report.json, which needs the build tree that pack still has and distclean removes. Prefers the copy BR2_PACKAGE_HOST_BUILDSCOPE installs into HOST_DIR and falls back to PATH, so a report is available without enabling the package. Guarded on the tool being present, and never fails the build.
- 9bc0d1e package/buildscope: host tool for build size reports Cargo host package pinned by commit, following the thingino-dfu and scriba pattern. Host-only, so it needs Rust for the build machine and not for the target: the option depends on the host architecture alone and selects the Rust compiler, which defaults to the prebuilt toolchain. The repository is a cargo workspace whose root is a virtual manifest, so the subdir points cargo at the CLI crate; the lockfile and the vendored dependencies sit at the archive root and are found from there.