Files
dwarf-go/analysis/DEVICE_MODELS.md
Jacquin Antoine 3ec1143d6d Document all DWARF device models and Mini-specific features
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
2026-07-12 19:49:45 +02:00

122 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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.