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
This commit is contained in:
121
analysis/DEVICE_MODELS.md
Normal file
121
analysis/DEVICE_MODELS.md
Normal file
@ -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.
|
||||||
Reference in New Issue
Block a user