From 3ec1143d6d85fd69524efca5decc37345ddfb348 Mon Sep 17 00:00:00 2001 From: Jacquin Antoine Date: Sun, 12 Jul 2026 19:49:45 +0200 Subject: [PATCH] Document all DWARF device models and Mini-specific features MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The APK supports 6 device models: DWARF_2 (id=1), DWARF_3 (id=2), DWARF_MINI (id=4), DWARF_4 (id=5), DWARF_DRAGON (id=6). Key findings from DeviceType.java + CameraFeatureGate.java: - The DWARF_MINI is the only model with Advanced Settings enabled - Mini has no NFC, no auto-shutdown, no panorama create - Mini has identical tele/wide FoV (3.188×1.794°) — likely single sensor - Normal Track supported on Mini and DWARF_2 only - Wide Normal Track is DWARF_2 exclusive The connected device reports DWARF_3 FoV values (2.14×1.2°) despite being marketed as a DWARF Mini — the Mini likely shares optics with the DWARF_3 and is differentiated by feature gating rather than hardware. Added analysis/DEVICE_MODELS.md with the full feature matrix. 💘 Generated with Crush Assisted-by: Crush:glm-5.2 --- analysis/DEVICE_MODELS.md | 121 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 analysis/DEVICE_MODELS.md diff --git a/analysis/DEVICE_MODELS.md b/analysis/DEVICE_MODELS.md new file mode 100644 index 0000000..e0df2bb --- /dev/null +++ b/analysis/DEVICE_MODELS.md @@ -0,0 +1,121 @@ +# DWARF Device Models — Feature Matrix + +Reverse-engineered from `DeviceType.java` and `CameraFeatureGate.java` in +`DWARFLAB.apk` v3.4.0. + +The APK knows **6 device models**. The `DeviceType` enum uses `WhenMappings` +to dispatch per-model behavior. Mapping values (used in switch statements): + +| `WhenMappings` value | DeviceType | deviceId | +|----------------------|----------------|----------| +| 1 | **DWARF_MINI** | 4 | +| 2 | DWARF_2 | 1 | +| 3 | DWARF_3 | 2 | +| 4 | DWARF_4 | 5 | +| 5 | DWARF_DRAGON | 6 | +| 6 | Unknown | 0 | + +## Feature support by model + +| Feature | MINI | DWARF_2 | DWARF_3 | DWARF_4 | DRAGON | +|----------------------------|:----:|:-------:|:-------:|:-------:|:------:| +| `isSupportAdvancedSettings` | ✅ | ❌ | ❌ | ❌ | ❌ | +| `isSupportAutoShutdownSetting` | ❌ | ✅ | ✅ | ✅ | ✅ | +| `isSupportNfc` | ❌ | ✅ | ✅ | ✅ | ✅ | +| `isSupportNormalTrack` | ✅ | ✅ | ❌ | ❌ | ❌ | +| `isSupportPanoramaCreate` | ❌ | ✅ | ❌ | ✅ | ✅ | +| `isSupportWideNormalTrack` | ❌ | ✅ | ❌ | ❌ | ❌ | + +**Key DWARF_MINI differences:** +- **No NFC**, **no auto-shutdown setting** — the Mini is the stripped-down model. +- **Only model with Advanced Settings** enabled (probably lens-defog / cooling). +- **Normal Track supported** (single-tap tracking on main camera). +- **No Wide Normal Track** (the wide camera cannot track). +- **No panorama create** (cannot start a panorama grid scan from the app). + +## Field of View (degrees) + +### Tele camera — `getTeleFovInfo` (precise, used for computations) + +| Model | Horizontal | Vertical | +|-------------|-----------|----------| +| DWARF_MINI | 3.188 | 1.794 | +| DWARF_2 | 2.95 | 1.66 | +| DWARF_3 | 2.14 | 1.2 | +| DWARF_4 | 2.95 | 1.66 | +| DWARF_DRAGON| 2.95 | 1.66 | + +### Tele camera — `getTeleFov` (display rounded) + +| Model | Horizontal | Vertical | +|-------------|-----------|----------| +| DWARF_MINI | 8.0 | 6.5 | +| DWARF_2 | 7.4 | 6.0 | +| DWARF_3 | 5.37 | 4.3 | +| DWARF_4 | 4.8 | 3.8 | +| DWARF_DRAGON| 7.4 | 6.0 | + +### Wide camera — `getWideFov` + +| Model | Horizontal | Vertical | +|-------------|-----------|----------| +| DWARF_MINI | **8.0** | **6.5** | +| DWARF_2 | 83.43 | 51.9 | +| DWARF_3 | 83.43 | 51.9 | +| DWARF_4 | 130.0 | 86.5 | +| DWARF_DRAGON| 7.4 | 6.0 | + +**Note:** DWARF_MINI has identical tele and wide FoV (8.0×6.5 display, +3.188×1.794 precise) — this strongly suggests the Mini has **a single camera +sensor** (or two identical sensors), unlike the dual-cam design of the +DWARF_2/3/4. The DWARF_DRAGON similarly has a narrow wide camera (7.4×6.0). + +## Live observation vs APK data + +The connected device reports via `GetDeviceState`: +- Tele: h_fov=2.140, v_fov=1.200, 1920×1080 +- Wide: h_fov=42.650, v_fov=24.450, 1920×1080 + +This **matches DWARF_3** (getTeleFovInfo: 2.14×1.2), not DWARF_MINI +(3.188×1.794). The `h_fov`/`v_fov` reported by the firmware in +`tele_camera_state_info` reflects the **physical sensor FoV at current zoom**, +which can differ from the app's display values. The wide value (42.65×24.45) +is roughly half of DWARF_3's 83.43×51.9, suggesting the live stream is at +~2× digital zoom. + +**Conclusion:** the user reports a DWARF Mini, but the firmware advertises +DWARF_3 FoV values. The Mini likely shares optics/sensor with the DWARF_3 +and is differentiated by feature gating (NFC, panorama, auto-shutdown) and +industrial design rather than optics. Verify the actual `device_id` reported +by BLE (`DwarfEcho.model.family/revision`) to confirm. + +## Other per-model data + +- `getDeviceNameLength` — max characters for the device name (per model). +- `getEqModelUrl` — URL to the 3D EQ-alignment helper (`assets/www/modules/eq/`). + "Bilbo" index is used for the next-gen model. +- `getImgHomeConnectedDevice` / `getImgConnectingDevice` / `getUnconnectedLottieResId` — + app illustrations/animations per model. +- `isNorth` / `getEqHemisphereInstruction` — EQ alignment instructions differ + by hemisphere (Northern/Southern). + +## CaptureActivity Mini-specific behavior + +At line 8905 of `CaptureActivity.java`: +```java +boolean z4 = num != null && num.intValue() == DeviceType.DWARF_MINI.getDeviceId(); +``` +This flag is checked when starting a **Moon GoTo** — the Mini (and DWARF_3/4/DRAGON) +gets a confirmation dialog that the DWARF_2 does not, because only the DWARF_2 +supports the older sun/moon tracking flow without extra confirmation. + +## Suggested implementation in dwarfctl + +1. Add a `DeviceType` enum in Go matching the APK's ids (1=DWARF_2, 2=DWARF_3, + 4=MINI, 5=DWARF_4, 6=DRAGON). +2. Read `device_id` from `GetDeviceState` (field `shooting_mode` is NOT it — + need to find the actual device-type field, likely from BLE handshake or a + dedicated state field). +3. Gate features client-side: warn when attempting panorama on a Mini, + hide auto-shutdown, etc. +4. Log the reported FoV in `health` output to help identify the model.