Skip to content

Open EOS Control 0.11.0 Development Preview

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 05 Oct 03:01
· 26 commits to main since this release
3af7df4

Open EOS Control v0.11.0 Development Preview

繁體中文 | English

繁體中文

0.11.0 把 Android「拍攝確認 → 最近素材 → 全螢幕預覽 → 原檔保存」接成可恢復的操作旅程,新增預覽內的保存進度、取消、位置及明確重試,因此採 minor 版號。同時修正 Android、Desktop Bridge/PC 與 iOS 的部分命令及停止恢復流程。這仍是 Development Preview,用於測試與回饋,不建議用於正式拍攝流程;不代表整個 App、所有 transport 或 Camera Connect 全功能已完成。

Android

  • 拍照命令已確認後,獨立狀態讀回失敗不再抹去先前確認;仍可有限查找最近素材,並保留狀態警告。尚未出現新素材時提供只讀重查,不再拍一次,不把舊圖標成這次新照片。
  • 全螢幕預覽內直接顯示原檔保存進度、取消、保存位置、失敗與明確重試。忙碌時阻止重複傳輸;回饋綁定素材 ID、保存請求與相機連線,避免同名檔或舊回應冒用另一筆結果。
  • 已知素材的 display 預覽可與相簿列檔並行,不必等整張卡讀完。從拍後確認進入相簿時,缺少已知素材會補查;部分列檔尚未看到目標,不會直接關閉使用者已開啟的預覽。保存保留原先取消並等待列檔結束的策略。
  • 相機事件的狀態/能力讀取短暫失敗後,保留尚待同步的事件,以有上限的退避重讀,不重播相機寫入。媒體 picker 的結果綁定原 session;同 ViewModel 重建可保留請求,舊程序/舊相機結果不會觸發新的檔案傳輸。
  • direct CCAPI 避免模糊失敗後自動重播寫入;未確認的 full-press/Bulb release 保留停止責任及只停止的恢復入口。Live View 取消、multipart 清理、首影格及被阻塞的讀取改善,舊 session 回應不覆寫替代連線。
  • Desktop Bridge Bulb 保留同 session 的停止責任,未知結果時阻止不安全的新操作。Stop 失敗後額外 status 補讀有 5 秒 whole-call 上限,逾時仍保留風險並可再 Stop 或 Disconnect;原 Stop 請求本身的保護與期限沒有縮短。
  • CCAPI/Bridge 原檔下載依已知媒體及 HTTP 長度拒絕空白或截斷檔。沿用既有 MediaStore/SAF 原檔流程、暫存清理及不覆寫命名;不轉碼、不自動刪除相機原檔。
  • 修正 Android API 26–32 的 USB host 已接收影像預覽使用 API33 才有的 InputStream.readNBytes 問題,改用相容的有界讀取,保留大小上限、取消檢查及既有 JPEG 首尾/PNG 簽章及結尾標記檢查;這不等同解碼完整性。依據為 API 契約、Lint、bytecode 與 15 項 JVM 案例;沒有新增 API26 裝置或實體 USB 相機驗收。

Desktop Bridge/PC

  • CCAPI Bulb 在開始送出前保存精確停止責任。開始或停止回應不明時阻止不安全寫入,持續提供原 session 的 stop-only retry,不重新開始曝光。
  • 停止警告跨模式變更保留;Disconnect 報告尚未確認的 release,上一相機警告與新連線分開。窄螢幕警告與錯誤訊息不再遮住 Stop,Start 的可用狀態與 handler 一致。
  • 這些恢復保證限於已驗證的 CCAPI/Bridge 路徑,不能延伸成所有 gphoto2/EDSDK engine 都有相同保證。

iOS

  • direct CCAPI/Bridge 在模糊 Bulb 開始或停止失敗後保留 session-owned release 責任,提供不受模式/能力切換隱藏的 stop-only recovery。取消及晚回應不能把責任帶入替代連線;目前與上一連線警告分開。
  • 可比較的 identity Content-Length 回應增加截斷檢查,避免 URLSession 將不完整 PUT 回應當成成功;不新增自動重送。HEAD、bodyless、encoded 與 Transfer-Encoding 回應不套用錯誤的解碼長度比較。
  • 連線 sheet 的 Stop/Disconnect 各有可達空間,避免安全控制重疊。既有背景曝光政策與正常開始的 120 秒 resource 期限不變;本版不包含短 idle deadline 實驗。

驗證

  • Android 功能 PR #203 以 source head 42066cb69ea6f632eafd6829f7f4faf290dd0ec6 通過 CI 37236220311,並以相同 tree 進入 accepted main b61c8372414474fbbce934d1eb5a636717c9a737(Main acceptance 37238311008)。API 34/36 各 211/211,0 failure/error/skip,均包含本輪 13 個拍後確認、預覽 UI 與保存旅程案例。
  • 同一已核對來源的本地 App JVM 649/649;Lint 8.8.2、0 errors/58 warnings/2 information,四個 Compose/Lifecycle registry 另以 canary 驗證可執行。這些是本地證據:目前 CI 沒有 Android Lint step。原聚合 launcher 的終局 exit 未取得;Lint 在相同 frozen source 補跑的 exit 為 0,不宣稱原整體 aggregate exit 0。
  • iOS PR #201 head 419ed6372ae902080263025cd3d4e816a5c2950c 通過 CI 37238805887:Core 228/228、App 90/90、UI 15/15,全部 0 failure;UI 為 14 個流程方法及 1 個含 14 邊界案例的幾何方法。這些均為本次 exact-head 實跑。相同 tree 4ed4b969625cc7f6165e57a5133ca4d0e76feae9 已 squash 至 main d70de29115320570d5f8fef3fcfc8ffcc79d0e4b,並通過 Main acceptance 37240097659。
  • 最終發布來源的 main commit、版本 PR head/CI run 及六個 payload 的大小/hash 由 BUILD-PROVENANCE.json 記錄,SHA256SUMS.txt 提供下載核對。實際完成狀態以版本 PR、main acceptance 與 Release 的結果核對。版本 PR 若按路徑刻意 skip standalone ios-core,只引用已通過且逐 blob 相同 Core source 的先前 CI;iOS App/UI build 不等於重新執行 standalone Core suite。
  • 全部新增驗證為 synthetic HTTP/protocol fixture、Android emulator、macOS 或 iPhone Simulator;本輪沒有新增實體 EOS/手機/USB 或光學對焦驗證。歷史裝置紀錄保留原日期、build 與操作範圍。

已知限制

  • 關閉仍在載入的 display 預覽不會取消該 display HTTP 工作。 UI 會關閉,但 MEDIA 可持續忙碌直到請求結束;較晚的 503 可顯示為全域媒體錯誤。可等待請求結束或 Disconnect/重新連線恢復。這個既有缺口沒有在本版修復;沒有目前證據顯示它會隱式重播快門或毀損原檔。它與「取消原檔保存」是不同操作,關閉預覽也不隱式取消正在進行的原檔下載。
  • 命令 ACK、相機狀態、新可見素材 ID 與真正曝光/光學清晰是不同證據。不同 ID 不確證由這一次快門產生。最近查找的 8 個候選不是 HTTP 總請求上限。
  • R6 Mark III 大卡、實際弱網、One-Shot/Servo、相機端停止結果、持續幀率、其他韌體/機型、實體 iPhone/USB 及真正 SAF provider/跨 App grants 仍待對應驗證。永久斷網或程序終止後不能保證相機已停止曝光;有停止警告時應確認機身。
  • 未新增跨程序可恢復下載、完整 RAW 解碼/顯影、拍後自動傳圖、藍牙配對、日期區間/評分篩選或所有平台同等相簿體驗。長度一致不代表來源 checksum 已驗證;第三方相簿仍不保證解碼所有 RAW。
  • Camera Import artifact 1.1.0/wire 1.0 與 Serein 契約不變。

安裝與發行檔

  • Android:open-eos-control-android-0.11.0-debug.apk,versionCode=27。維持既有 Preview package 與固定開發簽章,更新條件是相同 package/簽章;與隔離 .debug 測試 App 分開。
  • PC:open-eos-control-bridge-windows-x64-0.11.0.exe、open_eos_control_bridge-0.11.0-py3-none-any.whl、open_eos_control_bridge-0.11.0.tar.gz。
  • 契約:open-eos-camera-import-contract-1.1.0.zip、open-eos-camera-import-contract-kotlin-1.1.0.jar。
  • 六個 payload 另附 BUILD-PROVENANCE.json 與 SHA256SUMS.txt,合計八個 Release 檔案。iOS 版本 0.11.0/build 25,提供原始碼及 Simulator 驗證,沒有可直接安裝的已簽署 IPA。
  • 專用 Actions workflow 由 accepted main 的 immutable candidate promotion 發布;最終來源及六個 payload 的 hash 見 BUILD-PROVENANCE.json,下載檔案以 SHA256SUMS.txt 核對,不手動重建替換資產。

English

0.11.0 connects the Android capture-review, recent-media, full-screen-preview and original-file-save flow, adding in-viewer progress, cancellation, destination and explicit retry. That coherent user-visible capability warrants a minor version. It also improves selected Android, Desktop Bridge/PC and iOS command/recovery paths. This remains a Development Preview for testing and feedback, unsuitable for production camera workflows; it does not establish whole-app, every-transport or full Camera Connect parity.

Android

  • Preserve an acknowledged shutter command when its separate status read fails, continue bounded recent-media lookup, and retain the status warning. A read-only retry can look again for a not-yet-visible item without another shutter command or relabeling an old image as this capture.
  • Show original-file progress, cancellation, destination, failure and explicit retry inside the full-screen viewer. Busy controls prevent duplicate transfers; feedback belongs to the exact media ID, request and camera session rather than a filename alone.
  • Display a known item while album listing continues, including a slow full-card listing. Refresh when the known capture is missing from the album, and do not close an explicitly opened preview merely because an intermediate page lacks it. Saving retains the existing cancel-and-join listing policy.
  • Retain consumed camera-event hints until authoritative status/capability refresh succeeds, retrying reads with capped backoff rather than replaying camera writes. Picker results belong to the original session; same-ViewModel recreation preserves requests, while stale process/session results cannot start transfer I/O.
  • Direct CCAPI mutations are not automatically replayed after ambiguous failures. Unconfirmed full-press/Bulb releases retain stop responsibility and stop-only recovery. Live View cancellation, multipart cleanup and blocked-read handling improve without allowing stale callbacks to replace a new session.
  • Desktop Bridge Bulb retains same-session stop responsibility and blocks unsafe new operations while the result is unknown. Only the additional status read after a failed Stop has a five-second whole-call budget; expiry preserves the warning and permits another Stop or Disconnect. The protected Stop request itself keeps its existing budget.
  • CCAPI/Bridge original downloads reject empty or truncated files against known media/header lengths. Existing MediaStore/SAF original-byte, partial-cleanup and non-overwriting behavior remains; no transcoding or automatic deletion of camera originals is added.
  • Replace the API33-only InputStream.readNBytes call in USB host-capture image preview with a compatible bounded reader for Android API 26–32, retaining size limits, cancellation checks and existing JPEG boundary and PNG signature/end-marker checks, which do not establish decoding integrity. Evidence is API-contract, Lint, bytecode and 15 JVM cases; no API26-device or physical USB-camera validation is added.

Desktop Bridge/PC

  • Record exact CCAPI Bulb release responsibility before sending Start. Ambiguous starts/stops block unsafe mutations and retain same-session stop-only retry without starting another exposure.
  • Keep recovery reachable across mode changes. Disconnect reports unconfirmed release and separates the previous-camera warning from a replacement session. Narrow-screen warning/error layout keeps Stop reachable, with consistent disabled Start presentation and handling.
  • These tested CCAPI/Bridge paths do not establish equivalent safety guarantees for every gphoto2/EDSDK engine.

iOS

  • Direct CCAPI/Bridge retain session-owned release responsibility after ambiguous Bulb starts or failed stops. Stop-only recovery remains available across mode/capability changes; cancellation and late responses cannot transfer old responsibility to a new connection. Current- and previous-session warnings remain distinct.
  • Validate comparable identity Content-Length responses so a truncated PUT body cannot be accepted solely because URLSession returned HTTP success, without adding mutation replay. HEAD, bodyless, encoded and Transfer-Encoding responses avoid invalid decoded-length comparisons.
  • Allocate reachable space to Stop and Disconnect in the connection sheet. Existing background-exposure behavior and the normal Start's 120-second resource deadline remain unchanged; the short idle-deadline experiment is excluded.

Evidence

  • Android PR #203, source 42066cb69ea6f632eafd6829f7f4faf290dd0ec6, passed CI 37236220311. Its identical tree was accepted as main b61c8372414474fbbce934d1eb5a636717c9a737 by Main acceptance 37238311008. API 34 and 36 each passed 211/211, with zero failures/errors/skips, including all 13 capture-review, viewer-UI and save-journey cases.
  • Local validation of the verified source passed 649/649 App JVM tests. Lint 8.8.2 reported 0 errors, 58 warnings and 2 information findings, with a separate canary proving all four Compose/Lifecycle registries executed. This is local evidence: current CI has no Android Lint step. The original aggregate launcher's terminal exit is unknown; a separate Lint completion returned exit 0 on identical frozen source, not an asserted all-aggregate exit 0.
  • iOS PR #201, head 419ed6372ae902080263025cd3d4e816a5c2950c, passed CI 37238805887: Core 228/228, App 90/90, UI 15/15, all with zero failures. UI comprises 14 flow methods and one geometry method covering 14 boundary cases; these are actual results for this exact head. The identical tree 4ed4b969625cc7f6165e57a5133ca4d0e76feae9 was squash-merged as main d70de29115320570d5f8fef3fcfc8ffcc79d0e4b and passed Main acceptance 37240097659.
  • BUILD-PROVENANCE.json records the final release main commit, source version-PR head/CI run, and the six payload sizes/hashes; SHA256SUMS.txt supports download verification. Check the version PR, main acceptance and Release for actual completion status. If the version-only PR intentionally skips standalone ios-core, only prior passing CI with matching Core source blobs supplies standalone-suite evidence. The App/UI build is not a rerun of that suite.
  • New evidence uses synthetic peers/fixtures, Android emulators, macOS and iPhone Simulator. No new physical EOS, phone, USB or optical-focus validation is added. Historical device evidence retains its original date, build and tested operations.

Known Limitations

  • Closing a still-loading display preview does not cancel its display HTTP work. The viewer closes, but MEDIA can remain busy until the request ends; a late 503 may surface as a global media error. Wait for completion or recover through Disconnect/reconnect. This existing defect is not fixed here. Current evidence does not show implicit shutter replay or original-file corruption. Display Close and original-save Cancel are separate actions; closing the viewer also does not implicitly cancel an existing original download.
  • Command acknowledgement, camera status, a newly visible media ID and physical exposure/optical sharpness are distinct evidence. A different ID does not prove this shutter created it. The eight-candidate recent lookup is not an overall HTTP-request limit.
  • R6 Mark III large cards, real weak networks, One-Shot/Servo, physical stop results, sustained FPS, other firmware/models, physical iPhone/USB and real SAF providers/cross-app grants need corresponding validation. Permanent network loss or process death cannot guarantee camera-side exposure cleanup; check the camera when a release warning remains.
  • No process-resumable transfer queue, complete RAW decoding/development, automatic post-capture delivery, Bluetooth pairing, date/rating filtering or cross-platform gallery parity is added. Matching lengths do not establish a source checksum; third-party galleries may not decode every RAW format.
  • Camera Import artifact 1.1.0 / wire 1.0 and the Serein contract remain unchanged.

Distribution

  • Android: open-eos-control-android-0.11.0-debug.apk, versionCode=27, using the existing Preview package and persistent development signer. Updates require the matching package/signer and remain separate from the isolated .debug test App.
  • PC: open-eos-control-bridge-windows-x64-0.11.0.exe, open_eos_control_bridge-0.11.0-py3-none-any.whl and open_eos_control_bridge-0.11.0.tar.gz.
  • Contract: open-eos-camera-import-contract-1.1.0.zip and open-eos-camera-import-contract-kotlin-1.1.0.jar.
  • The six payloads plus BUILD-PROVENANCE.json and SHA256SUMS.txt make eight Release files. iOS is 0.11.0 / build 25, distributed as source and Simulator evidence without an installable signed IPA.
  • The dedicated Actions workflow promotes the exact accepted-main immutable candidate. Consult BUILD-PROVENANCE.json for final source and six payload hashes, and verify downloads with SHA256SUMS.txt; assets are never manually rebuilt or substituted.