Skip to content

Releases: hbentel/M5Stack-Unit-CamS3-5MP

v0.2.7

Choose a tag to compare

@github-actions github-actions released this 23 Jun 10:45
- Fix OTA rollback-confirmation crash (moved before Wi-Fi starts)
- Fix OTA SHA-256 chunked hashing
- Fix /setup POST body truncation, add XSS hardening
- Fix frame_pool init leak, JPEG EOI search UB
- config_mgr setter validation

v0.2.6

Choose a tag to compare

@github-actions github-actions released this 12 Apr 20:33
fix: increase frame pool from 3 to 5 slots to prevent exhaustion

A concurrent GET / snapshot holds a pool ref while sending ~150KB over
HTTP. Combined with a worker mid-send on the previous frame, all 3 slots
could be occupied simultaneously, stalling the broadcaster for up to 5s
and triggering Frigate's 20s ffmpeg watchdog.

5 slots (2.5MB PSRAM) eliminates the exhaustion window: snapshot(1) +
worker(1) + broadcaster(1) still leaves 2 free slots.

Also adds check_fw.sh utility script and removes stale coredump.elf.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

v0.2.5

Choose a tag to compare

@github-actions github-actions released this 11 Apr 18:05
fix: move recovery_mgr_init before Wi-Fi, port SHA-256 to PSA Crypto

- recovery_mgr_init() called nvs_commit() after Wi-Fi and MQTT were
  already running. nvs_commit disables the OPI PSRAM cache; concurrent
  PSRAM access by Wi-Fi/MQTT tasks caused ExcCause=7 crash (confirmed
  via coredump: wifi task crashed while main task was at
  recovery_mgr.c:67 nvs_set_i32). Fix: move recovery_mgr_init() to
  before wifi_init_sta() — no PSRAM-accessing tasks are alive at that
  point, making the NVS write safe.

- sha256_buffer() used legacy mbedtls_sha256_* context API which was
  removed in mbedTLS 4.0 (IDF v6). Replaced with psa_hash_compute()
  from PSA Crypto API, compatible with both IDF v5 (mbedTLS 3.x) and
  IDF v6 (mbedTLS 4.0). Fixes CI build failure on IDF v6 job.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

v0.2.4

Choose a tag to compare

@github-actions github-actions released this 10 Apr 15:51
feat: OTA token auth, SHA-256 verification, and coredump Bearer auth

Security hardening for the OTA and coredump endpoints:

- OTA token auth: unitcams3/ota/set requires JSON {"url":"...","token":"..."}
  when OTA token is configured; bare URL still accepted when token is empty
- OTA SHA-256: optional sha256 field verified against full PSRAM firmware
  buffer before any flash write; hash stored in RTC_NOINIT_ATTR alongside URL
- Coredump Bearer auth: GET /api/coredump requires Authorization: Bearer token
  when coredump token is configured; 401 with WWW-Authenticate on failure
- /setup page: OTA Token and Coredump Token fields added; values never
  reflected in HTML (placeholder only); POST preserves existing token if
  field left blank
- config_mgr: ota_token and cd_token fields backed by NVS + Kconfig fallbacks
- IPC task stack raised to 2048 bytes (fixes boot-time double-exception)
- esp_driver_gpio removed from mqtt_mgr; LED GPIO moved to main.c callback
- Docs: CHANGELOG v0.2.4, CLAUDE.md, ARCHITECTURE.md, SECURITY.md, README.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

v0.2.3

Choose a tag to compare

@github-actions github-actions released this 07 Apr 23:42
v0.2.3: Atomic reference-counted zero-copy MJPEG and production stabi…

v0.2.2

Choose a tag to compare

@github-actions github-actions released this 06 Apr 05:37
v0.2.2: Production hardening and stable startup refinements

v0.2.1

Choose a tag to compare

@github-actions github-actions released this 06 Apr 05:00
v0.2.1: Multi-client MJPEG support and critical stability fixes

Major Features:
- Asynchronous multi-client MJPEG streaming (up to 5 clients).
- Broadcaster idling to save PSRAM bandwidth and heat.
- 'active_streams' metric via HTTP and MQTT.
- Firmware version display on /setup and /health.

Critical Bug Fixes:
- Forced internal RAM for stacks to prevent Double Exception crashes during flash writes.
- Fixed main task stack overflow during startup.
- Fixed mDNS 'Service already exists' error.
- Fixed race condition in MQTT telemetry task.
- Fixed race condition in camera_reinit.

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 04 Apr 16:16
Fix Unsupported warnings and OTA rollback race

- Remove set_whitebal, set_awb_gain, set_gain_ctrl from apply_camera_settings():
  all three are wired to set_dummy in mega_ccm.c (W mega_ccm: Unsupported noise)
- Remove now-unused CAM_AWB and CAM_AGC defines
- ota_mgr_run_pending(): call recovery_mgr_signal_planned_reboot() before the
  OTA-complete esp_restart() so the new firmware boots with boot_count=0;
  previously two crashes post-OTA would trip the boot-loop threshold

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

v0.1.3 — Code review clean-up

Choose a tag to compare

@hbentel hbentel released this 06 Mar 16:08

Changes

  • Stale RTSP naming removedRECOVERY_ERR_RTSP_SEND renamed to RECOVERY_ERR_STREAM_SEND; the RTSP server was removed in an earlier phase.
  • Build warning: CONFIG_APP_UPDATE — orphaned/unknown symbol removed from sdkconfig.defaults.
  • Build warning: CAMERA_DMA_BUFFER_SIZE_MAX — Kconfig range extended to 65536 to match the value in use (was generating an out-of-range warning).
  • Empty camera_mgr component — removed empty directory that was causing CMake component warnings.

v0.1.2 — Bug fixes from code review

Choose a tag to compare

@github-actions github-actions released this 06 Mar 16:02

Bug fixes

  • Resolution options corrected/setup page now shows QVGA/VGA/HD/UXGA (PY260-native sizes only). Previous options SVGA/XGA are not supported by the sensor and caused a boot loop.
  • NVS validation — invalid resolution values loaded from NVS are now detected and reset to VGA instead of causing a boot loop.
  • MQTT image controls fixed — brightness (0–8), contrast (0–6), saturation (0–6) now match driver-native ranges. Previous -2..2 range silently did nothing.
  • XCLK validation — invalid XCLK frequency now returns a proper error instead of relying on assert() which is disabled in production builds.
  • Deinit ordering — ISR freed before queue deletion to prevent ISR writing to a deleted queue.
  • Camera task stack size wired to CONFIG_CAMERA_TASK_STACK_SIZE Kconfig symbol.