The P3's focus ring is a purely mechanical twist ring. Nothing inside the camera senses it and nothing in its data reports it. What does work: a live sharpness score computed from the camera's own frames, a fixed working distance, and a witness mark on the ring.
| Where we looked | What was checked | Focus reading |
|---|---|---|
| Thermal Master's manual | Spec table says "Manual Focusing Lens"; the word focus appears nowhere else, and there are no focusing instructions | none |
| USB descriptors | Every interface is vendor-specific (0xFF), with no USB Video Class camera terminal, so the standard focus controls cannot exist | none |
| InfiRay's command library | libircmd020.so from the official app and two published copies of libircmd.h: no focus, lens, motor, encoder or Hall command; the only zoom is digital | none |
| The official app | All its native libraries and both dex files: no focus assist or sharpness indicator; its "focus" code drives the phone's own camera on dual-camera models | none |
| Per-frame metadata, live | The SDK's 35 metadata fields have no focus field; 491 of 512 words stayed byte-identical across captures 20 minutes apart | none |
This is evidence from absence: nobody has turned the ring while logging. The focus meter's exit report does exactly that check (below).
Drop in each score when a live P3 frame is blurred on the computer; the score's own wobble over 8 s was 0.4%.
Run it from any Mac that can reach the phone (Wi-Fi, Tailscale or an adb forward), then turn the ring slowly:
python3 ~/git/thermal-android/tools/p3_focus_meter.py --url http://<phone>:8080
9.7s 6549.3 ############################## 99.9% of peak norm 0.0258
Peak smoothed score 6556.7 over 248 frames.
No unexplained metadata word changed during the run.
| Lens to board | Board per pixel | Smallest feature | Depth in focus | Lens travel from ∞ |
|---|---|---|---|---|
| 45 mm | 0.11 mm | 0.23 mm | 4.3–4.8 mm | 0.45 mm |
| 60 mm | 0.16 mm | 0.31 mm | 7.9–8.8 mm | 0.33 mm |
| 70 mm | 0.18 mm | 0.37 mm | 10.8–12.1 mm | 0.28 mm |
4.3 mm lens (the serial's lens code), 12 µm pixels, f/1.0–1.1, 2-pixel blur with diffraction included; feature = 2 pixels. The focus simulator uses 1 pixel: ±2.2 mm at 60 mm.
About 0.7 µm of focus shift per kelvin. If the gap runs 20–25 K warmer than the bench, best focus moves about 3 mm toward the camera, most of the sharp zone at 45 mm.
About 3.4 times less shift, small next to the depth in focus. No source says which material the P3 uses.
Optics constants from Riedl via the University of Arizona OPTI 521 report. Rule: set or check focus after the camera has warmed up where it will work.
The ring carries no scale or index mark, so out of the box there is nothing to read. But reviewers find it smooth, damped and free of backlash, so a mark you add stays meaningful.
The P3's shell and ring are bare metal. Near a powered card, insulate the front face with Kapton, never over the lens. Gough Lui warns of shorting a live board this way.
P3Protocol.kt reads metadata words 176, 174 and 168 as FPA, lens and shutter temperatures, but they are the scene's mean, maximum and minimum. The same file's decodeInfoLine says so. So fpaTempC in /api/status is the scene mean, and there is no lens-temperature reading.P3R1; the stream actually sends P3FR.libircmd.h: copies in Kodrea/MINI2-IR-Android-App and Purer-lyk/fdemo. The official app's libraries, copied read-only from the Pixel.Part of the thermal camera hub. See also the focus simulator (where to put the camera), Friday thermal measurements and Remote camera setup.