Skip to content

Spec/behaviour mismatches found in full 47-endpoint hardware sweep #47

Description

@takusaito-ctrl

Environment: ILCE-7M5 · USB · Camera Remote SDK V2.02.00 · linux-arm64 (Raspberry Pi) · server 3.0.0

Full sweep of all 47 OpenAPI operations against live hardware. 40 behaved exactly per spec. The critical failures are filed separately (#40, #41, #42, #43, #44, #46); this issue collects the smaller contract mismatches, each independently reproducible.

Status codes / validation

  • /actions/button does not validate against the operable-key list. The camera reports 24 operable keys, but delete, c7, home, thumbnail, slot-select and display all return 200 "pressed" regardless. The spec promises 400 plus data.supported_buttons — that list is returned correctly for names outside the enum, so only the operable-key check is missing.
  • POST /connection with an invalid mode returns 200 "Camera already connected" when a camera is connected: the already-connected short-circuit runs before mode validation. Correctly returns 400 when disconnected.
  • GET /properties/all for an unknown camera returns 200 with success:false. Spec says 400.
  • GET /live-view/frame serves a cached JPEG with 200 after stop + disable, with status confirming streaming:false, enabled:false. Spec says 404.

Response body inconsistencies

  • /actions/zoom returns camera:{connected:false,model:"",id:""} on a successful call with a live camera. The same empty block appears on GET /properties/{unknown} and on focus-near-far validation errors.
  • /actions/touch returns x/y as strings; /af-area-position returns them as integers. Same conceptual value, two types.
  • PUT /properties/aperture {"value":"0x190"} replies "Aperture set to f/0x190" — the message blindly prefixes f/ without formatting the raw value. The set itself works correctly.

SSE event catalog

  • transferProgress payload does not match the spec. openapi.yaml:1304 documents {cameraId, contentId, fileId, percent, savedPath?}. The server actually emits {percent, notify, filename} (CameraDeviceRest.cpp:1471-1480), and the polling fallback adds synthetic:true (line 1554). None of cameraId, contentId, fileId or savedPath are present.
  • propertyChanged carries {codes, count} and disconnected carries {} — the catalog says both include cameraId.
  • Undocumented events observed in the wild: warning (e.g. {"code":"0x20011","message":"Captured_Event"}) and cautionDisplay.
  • lutImportResult and settingsResult are referenced in endpoint descriptions but missing from the event catalog table.

Confirmed correct (for the record)

  • af-area-position clamping matches the documented model exactly; on this body 0,080,72, usable x ≈ 80-559.
  • settings/upload: 200 + reboot warning, then SSE settingsResult {"operation":"read","success":true}, then disconnected.
  • settings/download wrote a 198 KB .DAT file.
  • movie-rec toggle verified against the recording-state property.
  • Live view 1024x680; OSD composite 720x480 with full camera UI rendered.
  • Thumbnail (160x120) and screennail (1616x1080) pulls work — until RemoteTransfer full-size download silently never completes and latches the whole subsystem into 0x8D03 #40 latches 0x8D03.
  • 0x8D02 (ContentNotFound) is surfaced with a genuinely helpful message.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions