Summary

Barco Pulse projectors controlled via JSON-RPC 2.0 over TCP/IP (port 9090) or RS-232 serial. API exposes methods (power, source selection, introspection, firmware, environment), settable properties (image, illumination, optics, warp, blend, black level, DMX), signal/property subscriptions, and HTTP file endpoints for warp/blend/blacklevel mask upload.

Transport

protocols:
  - tcp
  - serial
addressing:
  port: 9090
serial:
  baud_rate: 19200
  data_bits: 8
  parity: none
  stop_bits: 1
  flow_control: none
  cable: "9-pin female to host, 9-pin male to projector; pin2-pin2, pin3-pin3, pin5-pin5"
auth:
  type: optional  # source: authentication skippable for normal end-user access; required for higher access levels
  # UNRESOLVED: pass-code format not documented (example uses integer code 98765); credential distribution unknown

Traits

traits:
  - powerable    # inferred: system.poweron / system.poweroff present
  - queryable    # inferred: property.get and introspection methods present
  - levelable    # inferred: brightness/contrast/gamma/saturation/sharpness/laser power settable
  - routable     # inferred: image.window.main.source select + source/connector lists present

Actions

# JSON-RPC 2.0 methods enumerated as distinct actions. property.set/get/subscribe
# modelled as parameterized; their property targets also surfaced as named actions
# where the source documents a specific operational payload.

# --- System / power ---
- id: system_poweron
  label: Power On
  kind: action
  command: '{"jsonrpc":"2.0","method":"system.poweron"}'
  params: []
  notes: "Result null on success. No-op if already on or in transition. Verify state=standby|ready first."

- id: system_poweroff
  label: Power Off
  kind: action
  command: '{"jsonrpc":"2.0","method":"system.poweroff"}'
  params: []
  notes: "Result null on success. No-op if already off or in transition. Verify state=on first."

- id: eco_wake_serial
  label: ECO Mode Wake via Serial
  kind: action
  command: ':POWR1\r'
  params: []
  notes: "ASCII bytes sent over RS-232 to wake projector in ECO mode. Alternative wake methods: WoL (MAC address), remote power button, keypad power button."

# --- Authentication ---
- id: authenticate
  label: Authenticate Session
  kind: action
  command: '{"jsonrpc":"2.0","method":"authenticate","params":{"code":98765}}'
  params:
    - name: code
      type: integer
      description: "Secret pass code (example value 98765 shown in source). Format not documented."
  notes: "Sets user access level. Skippable for normal end-user access. # UNRESOLVED: code distribution and full value space not documented."

# --- Property API (parameterized) ---
- id: property_set
  label: Set Property
  kind: action
  command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"{property}","value":{value}}}'
  params:
    - name: property
      type: string
      description: "Property path in dot notation (e.g. image.brightness, image.window.main.source)."
    - name: value
      type: any
      description: "Value matching property type (string/int/float/bool/array)."
  notes: "Wait for confirmation before re-setting same property; flooding server degrades performance."

- id: property_get
  label: Get Property
  kind: query
  command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"{property}"}}'
  params:
    - name: property
      type: string
      description: "Property path in dot notation. Accepts a single string or an array of strings for batch reads."

- id: property_get_many
  label: Get Multiple Properties
  kind: query
  command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":["{property1}","{property2}"]}}'
  params:
    - name: property
      type: array
      description: "Array of property paths; result returned as object mapping each path to its value."

- id: property_subscribe
  label: Subscribe to Property Changes
  kind: action
  command: '{"jsonrpc":"2.0","method":"property.subscribe","params":{"property":"{property}"}}'
  params:
    - name: property
      type: string
      description: "Property path or array of paths. Subscribing does NOT return current value; use property.get for that."

- id: property_unsubscribe
  label: Unsubscribe from Property Changes
  kind: action
  command: '{"jsonrpc":"2.0","method":"property.unsubscribe","params":{"property":"{property}"}}'
  params:
    - name: property
      type: string
      description: "Property path or array of paths previously subscribed."

- id: signal_subscribe
  label: Subscribe to Signal
  kind: action
  command: '{"jsonrpc":"2.0","method":"signal.subscribe","params":{"signal":"{signal}"}}'
  params:
    - name: signal
      type: string
      description: "Signal name or array of names (e.g. modelupdated, image.processing.warp.gridchanged)."

- id: signal_unsubscribe
  label: Unsubscribe from Signal
  kind: action
  command: '{"jsonrpc":"2.0","method":"signal.unsubscribe","params":{"signal":"{signal}"}}'
  params:
    - name: signal
      type: string
      description: "Signal name or array of names previously subscribed."

# --- Introspection ---
- id: introspect
  label: Introspect Object
  kind: query
  command: '{"jsonrpc":"2.0","method":"introspect","params":{"object":"{object}","recursive":{recursive}}}'
  params:
    - name: object
      type: string
      description: "Object name in dot notation; empty string introspects everything."
    - name: recursive
      type: boolean
      description: "Default true. If false, only direct child object names are listed (one level)."
  notes: "Metadata restricted by authenticated access level. Also accepts positional params form: {\"params\":[\"foo\",true]}."

# --- Image / source / connector ---
- id: image_source_list
  label: List Available Sources
  kind: query
  command: '{"jsonrpc":"2.0","method":"image.source.list"}'
  params: []
  notes: "Returns array of source name strings. Roster varies per projector model (example: DVI 1, DVI 2, DisplayPort 1, DisplayPort 2, Dual DVI, Dual DisplayPort, Dual Head DVI, Dual Head DisplayPort, HDBaseT, HDMI, SDI)."

- id: image_connector_list
  label: List Available Connectors
  kind: query
  command: '{"jsonrpc":"2.0","method":"image.connector.list"}'
  params: []
  notes: "Returns array of physical connector name strings (example: DVI 1, DVI 2, DisplayPort 1, DisplayPort 2, HDBaseT, HDMI, SDI)."

- id: image_source_listconnectors
  label: List Connectors Used By Source
  kind: query
  command: '{"jsonrpc":"2.0","method":"image.source.{sourceobject}.listconnectors"}'
  params:
    - name: sourceobject
      type: string
      description: "Source object name = source name with non-word chars removed and lower-cased (e.g. 'DisplayPort 1' -> 'displayport1')."
  notes: "Returns array of {gridposition:{row,column,plane}, name}."

- id: select_source_displayport1
  label: Select DisplayPort 1 Input
  kind: action
  command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.window.main.source","value":"DisplayPort 1"}}'
  params: []

- id: select_source_hdmi
  label: Select HDMI Input
  kind: action
  command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.window.main.source","value":"HDMI"}}'
  params: []

- id: select_source_generic
  label: Select Source (Generic)
  kind: action
  command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.window.main.source","value":"{source}"}}'
  params:
    - name: source
      type: string
      description: "One of the names returned by image.source.list (e.g. 'DVI 1', 'DisplayPort 2', 'HDBaseT', 'SDI')."
  notes: "Generates two property.changed notifications: first empty string (deselect previous), then new source name."

# --- Color ---
- id: color_p7_custom_copypresettocustom
  label: Copy Color Preset To Custom
  kind: action
  command: '{"jsonrpc":"2.0","method":"image.color.p7.custom.copypresettocustom","params":{"presetname":"{presetname}"}}'
  params:
    - name: presetname
      type: string

- id: color_p7_custom_resetpreset
  label: Reset Color Custom Preset
  kind: action
  command: '{"jsonrpc":"2.0","method":"image.color.p7.custom.resetpreset","params":{"presetname":"{presetname}"}}'
  params:
    - name: presetname
      type: string
  notes: "Resets preset back to its default values."

- id: color_p7_custom_resettonative
  label: Reset Color Custom To Native
  kind: action
  command: '{"jsonrpc":"2.0","method":"image.color.p7.custom.resettonative"}'
  params: []

- id: color_rgbmode_next
  label: Next RGB Mode
  kind: action
  command: '{"jsonrpc":"2.0","method":"image.color.rgbmode.nextrgbmode"}'
  params: []
  notes: "Cycles through all possible RGB modes."

# --- Illumination ---
- id: illumination_clo_engage
  label: Engage CLO
  kind: action
  command: '{"jsonrpc":"2.0","method":"illumination.clo.engage"}'
  params: []
  notes: "Engage Constant Light Output at current light level."

- id: illumination_laser_getserialnumber
  label: Get Laser Serial Number
  kind: query
  command: '{"jsonrpc":"2.0","method":"illumination.laser.getserialnumber"}'
  params: []
  notes: "Returns string."

# --- DMX ---
- id: dmx_listchannels
  label: List DMX Channels
  kind: query
  command: '{"jsonrpc":"2.0","method":"dmx.listchannels"}'
  params: []
  notes: "Returns array of available channel name strings."

- id: dmx_listmodes
  label: List DMX Modes
  kind: query
  command: '{"jsonrpc":"2.0","method":"dmx.listmodes"}'
  params: []
  notes: "Returns array of all mode name strings."

# --- Environment ---
- id: environment_getcontrolblocks
  label: Get Environment Control Blocks
  kind: query
  command: '{"jsonrpc":"2.0","method":"environment.getcontrolblocks","params":{"type":"{type}","valuetype":"{valuetype}"}}'
  params:
    - name: type
      type: string
      description: "One of: Sensor, Filter, Controller, Actuator, Alarm, GenericBlock."
    - name: valuetype
      type: string
      description: "One of: Temperature, ADC, Median, Simulation, Speed, Coordinate, Noise, State, PWM, Peltier, Weighting, Pump, Voltage, Waveform, Comparison, Resistance, Current, Average, Threshold, Constant, Power, Delay, Formula, Manual, Altitude, Difference, Driver, Range, Pressure, Interpolation, PID, Any, Humidity, Limit, Mode."
  notes: "Returns array of {key,value(float)} pairs."

- id: environment_getalarminfo
  label: Get Alarm Info
  kind: query
  command: '{"jsonrpc":"2.0","method":"environment.getalarminfo"}'
  params: []
  notes: "Returns array of {severity,timestamp,source,description,custommessage}."

# --- Firmware ---
- id: firmware_listcomponents
  label: List Firmware Components
  kind: query
  command: '{"jsonrpc":"2.0","method":"firmware.listcomponents"}'
  params: []
  notes: "Returns array of managed component name strings."

- id: firmware_listcomponentversionstatus
  label: List Firmware Version Status
  kind: query
  command: '{"jsonrpc":"2.0","method":"firmware.listcomponentversionstatus"}'
  params: []
  notes: "Returns array of {name, versions:{available,running}, status}. status enum: Unknown, OK, Upgradable."

- id: firmware_schedulecomponentupgrade
  label: Schedule Component Upgrade
  kind: action
  command: '{"jsonrpc":"2.0","method":"firmware.schedulecomponentupgrade"}'
  params: []
  notes: "Forces a component upgrade at next reboot. # UNRESOLVED: params for selecting specific component not shown in source."

# --- Warp / blend / black level toggles (property.set wrappers for documented operations) ---
- id: warp_enable
  label: Enable Global Warp
  kind: action
  command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.processing.warp.enable","value":{enable}}}'
  params:
    - name: enable
      type: boolean

- id: warp_file_enable
  label: Enable File Warp
  kind: action
  command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.processing.warp.file.enable","value":{enable}}}'
  params:
    - name: enable
      type: boolean

- id: warp_file_select
  label: Select Warp File
  kind: action
  command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.processing.warp.file.selected","value":"{filename}"}}'
  params:
    - name: filename
      type: string

- id: blend_file_enable
  label: Enable File Blend
  kind: action
  command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.processing.blend.file.enable","value":{enable}}}'
  params:
    - name: enable
      type: boolean

- id: blend_file_select
  label: Select Blend File
  kind: action
  command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.processing.blend.file.selected","value":"{filename}"}}'
  params:
    - name: filename
      type: string

- id: blacklevel_file_enable
  label: Enable Black Level Correction
  kind: action
  command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.processing.blacklevel.file.enable","value":{enable}}}'
  params:
    - name: enable
      type: boolean

- id: blacklevel_file_select
  label: Select Black Level File
  kind: action
  command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.processing.blacklevel.file.selected","value":"{filename}"}}'
  params:
    - name: filename
      type: string

# --- HTTP file endpoints (upload) ---
- id: upload_warp_file
  label: Upload Warp Grid File
  kind: action
  command: 'curl -X POST -F file=@{localfile} http://{projector_address}/api/image/processing/warp/file/transfer'
  params:
    - name: localfile
      type: string
      description: "Local warp grid XML path. Format same as MCM500/400."
    - name: projector_address
      type: string
      description: "Projector IP (e.g. 192.168.1.100)."

- id: upload_blend_mask
  label: Upload Blend Mask
  kind: action
  command: 'curl -X POST -F file=@{localfile} http://{projector_address}/api/image/processing/blend/file/transfer'
  params:
    - name: localfile
      type: string
      description: "Grayscale PNG/JPEG/TIFF, 8 or 16-bit. Size must match projector blend-layer resolution (WUXGA 1920x1200, WQXGA 1280x800, 4K 1280x800, 4K Cinemascope 1280x540). Blue channel used if colour image uploaded."

- id: upload_blacklevel_mask
  label: Upload Black Level Mask
  kind: action
  command: 'curl -X POST -F file=@{localfile} http://{projector_address}/api/image/processing/blacklevel/file/transfer'
  params:
    - name: localfile
      type: string
      description: "Grayscale PNG/JPEG/TIFF, 8 or 16-bit. Same resolution table as blend masks."

# --- HTTP file endpoints (download) ---
- id: download_warp_file
  label: Download Warp Grid File
  kind: query
  command: 'curl -O -J http://{projector_address}/api/image/processing/warp/file/transfer'
  params:
    - name: projector_address
      type: string
  notes: "Append /{filename} (e.g. /warpgrid.xml) when endpoint does not serve the current file directly."

Feedbacks

# Observable states surfaced as query results or subscription notifications.

- id: system_state
  type: enum
  values: ["boot", "eco", "standby", "ready", "conditioning", "on", "service", "deconditioning", "error"]
  read_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"system.state"}}'
  subscribe_command: '{"jsonrpc":"2.0","method":"property.subscribe","params":{"property":"system.state"}}'

- id: illumination_state
  type: enum
  values: ["On", "Off"]
  read_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"illumination.state"}}'

- id: active_source
  type: string
  read_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"image.window.main.source"}}'
  notes: "Two notifications on switch: empty string (deselect), then new source name."

- id: environment_alarmstate
  type: enum
  values: ["Fatal", "Error", "Alert", "Warning", "Ok"]

- id: network_device_lan_state
  type: enum
  values: ["CONNECTED", "DISCONNECTED"]

- id: optics_shutter_position
  type: enum
  values: ["Open", "Closed"]

- id: connector_detectedsignal
  type: object
  properties:
    active: boolean
    name: string
    vertical_total: integer
    horizontal_total: integer
    vertical_resolution: integer
    horizontal_resolution: integer
    vertical_sync_width: integer
    vertical_front_porch: integer
    vertical_back_porch: integer
    horizontal_sync_width: integer
    horizontal_front_porch: integer
    horizontal_back_porch: integer
    horizontal_frequency: float
    vertical_frequency: float
    pixel_rate: integer
    scan: string
    bits_per_component: integer
    color_space: string
    signal_range:
      enum: ["0-255", "16-235"]
    chroma_sampling:
      enum: ["4:4:4", "4:2:2", "4:2:0"]
    gamma_type:
      enum: ["POWER", "sRGB", "REC_BT1886", "SMPTE_ST2084"]
    color_primaries:
      enum: ["REC709", "REC2020", "DCI-P3-D65", "DCI-P3-Theater"]
    mastering_luminance: float
    content_aspect_ratio:
      enum: ["5:4", "4:3", "16:10", "16:9", "1.85:1", "2.20:1", "2.35:1", "2.37:1", "2.39:1", "Unknown"]
    is_stereo: boolean
    stereo_mode:
      enum: ["None", "Sequential", "FramePacked", "TopBottom", "SideBySide"]
  read_command: '{"jsonrpc":"2.0","method":"property.get","params":{"property":"image.connector.{connectorobject}.detectedsignal"}}'
  notes: "Connector object name = connector name lowercased, non-word chars removed. If active=false, ignore remaining fields."

# UNRESOLVED: full set of introspectable signal/callback payloads not exhaustively enumerated; use introspect at runtime.

Variables

# Settable parameters reachable via property.set; min/max where source documents constraints.

- id: image_brightness
  type: float
  min: -1
  max: 1
  step_size: 1
  precision: 0.01
  description: "Image brightness/offset. 0 default, 1 = 100% offset."
  set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"image.brightness","value":{value}}}'

- id: image_contrast
  type: float
  min: 0
  max: 2
  step_size: 1
  precision: 0.01
  description: "Image contrast/gain. 1 default."

- id: image_gamma
  type: float
  min: 1
  max: 3
  step_size: 1
  precision: 0.1
  description: "Image gamma. Default 2.2."

- id: image_saturation
  type: float
  min: 0
  max: 2
  step_size: 1
  precision: 0.01
  description: "Color saturation. 1 default."

- id: image_sharpness
  type: integer
  min: -2
  max: 8
  step_size: 1
  precision: 1

- id: image_orientation
  type: enum
  values: ["DESKTOP_FRONT", "DESKTOP_REAR", "CEILING_FRONT", "CEILING_REAR"]

- id: image_window_main_scalingmode
  type: enum
  values: ["Fill", "OneToOne", "FillScreen", "Stretch"]

- id: illumination_sources_laser_power
  type: float
  description: "Target laser power in percent. RW. min/max dynamic - read illumination.sources.laser.minpower / .maxpower at runtime."
  set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"illumination.sources.laser.power","value":{value}}}'

- id: illumination_sources_laser_minpower
  type: float
  access: read_only
  description: "Minimum laser power in percent (dynamic)."

- id: illumination_sources_laser_maxpower
  type: float
  access: read_only
  description: "Maximum laser power in percent (dynamic)."

- id: optics_shutter_target
  type: enum
  values: ["Open", "Closed"]
  set_command: '{"jsonrpc":"2.0","method":"property.set","params":{"property":"optics.shutter.target","value":{value}}}'

- id: optics_zoom_position
  type: integer
  access: read_only

- id: optics_focus_position
  type: integer
  access: read_only

- id: optics_lensshift_horizontal_position
  type: integer
  access: read_only

- id: optics_lensshift_vertical_position
  type: integer
  access: read_only

- id: system_standby_enable
  type: boolean
  description: "Enable/disable standby state. Check availability first."

- id: system_eco_enable
  type: boolean
  description: "Enable/disable ECO state. Check availability first."

- id: dmx_mode
  type: string

- id: dmx_startchannel
  type: integer
  min: 1
  max: 512

- id: dmx_shutdown
  type: boolean

- id: network_device_lan_ip4config
  type: object
  access: read_only
  properties:
    Address: string
    Mask: string
    Gateway: string
    NameServers: string

# UNRESOLVED: motorized zoom/focus/lensshift setters not shown as RW in source - list positions as read_only. If a projector has motorized lens, setter methods may exist via introspection.

Events

# Unsolicited JSON-RPC notifications (no id; no response permitted).

- id: property_changed
  method: property.changed
  payload_shape:
    property:
      type: array
      items:
        type: object
        description: "Each element is {<propertyname>: <value>}."
  notes: "Server-pushed on any subscribed property change. Client must implement property.changed handler."

- id: signal_callback
  method: signal.callback
  payload_shape:
    signal:
      type: array
      items:
        type: object
        description: "Each element is {<signalname>: {<argname>: <argval>}} (e.g. {introspect.objectchanged: {object: motors.motor1, newobject: true}})."
  notes: "Server-pushed on any subscribed signal emission. Client must implement signal.callback handler."

- id: modelupdated_signal
  method: signal.callback
  trigger: "Object structure changes (objects added or removed). Subscribe via signal.subscribe with signal=modelupdated."

Macros

# Source documents explicit multi-step sequences for warp/blend/blacklevel activation.
# Each macro is the documented sequence; do not skip confirmation waits.

- id: activate_warp_file
  label: Upload + Activate Warp File
  steps:
    - "property.set image.processing.warp.enable=true"
    - "HTTP POST warp grid to /api/image/processing/warp/file/transfer"
    - "property.set image.processing.warp.file.selected=<filename>"
    - "property.set image.processing.warp.file.enable=true"

- id: activate_blend_mask
  label: Upload + Activate Blend Mask
  steps:
    - "HTTP POST blend mask to /api/image/processing/blend/file/transfer"
    - "property.set image.processing.blend.file.selected=<filename>"
    - "property.set image.processing.blend.file.enable=true"

- id: activate_blacklevel_mask
  label: Upload + Activate Black Level Mask
  steps:
    - "HTTP POST black level mask to /api/image/processing/blacklevel/file/transfer"
    - "property.set image.processing.blacklevel.file.selected=<filename>"
    - "property.set image.processing.blacklevel.file.enable=true"

Safety

confirmation_required_for: []
interlocks:
  - "Power-on: verify system.state is standby or ready before issuing system.poweron; otherwise no-op."
  - "Power-off: verify system.state is on before issuing system.poweroff; otherwise no-op."
  - "property.set: wait for confirmation before re-setting same property; flooding degrades performance."
  - "ECO wake: requires WoL (MAC), IR remote, keypad, or serial :POWR1\\r - standard poweron may not wake from ECO."
# UNRESOLVED: no explicit safety interlock procedure, fault recovery sequence, or power-on sequencing
# requirement documented in source beyond the soft "best practice" notes above. Lamp/laser thermal
# fault behaviour not documented.

Notes

  • All JSON-RPC parameter order is insignificant — parameters passed by name.
  • API surface is dynamic: actual properties/methods depend on mounted peripherals and projector configuration (e.g. motorized lens vs fixed, DMX basic vs extended mode). Use introspect to enumerate the live API for a specific unit.
  • Source/connector object names derived by stripping non-word chars and lowercasing the human name (DisplayPort 1displayport1).
  • Subscriptions deliver change notifications only — they do NOT return the current value. Always pair property.subscribe with an initial property.get.
  • Source-select emits two notifications: empty string for deselect, then new source name.
  • Warp file format identical to MCM500/400.
  • HTTP file endpoints: blend and black-level masks are grayscale-only (8 or 16-bit); colour images accepted but only blue channel used. Supported formats: PNG (up to 16-bit), JPEG, TIFF.
  • File-transfer URL pattern: http://<projector_address>/api/<endpoint> (e.g. /api/image/processing/warp/file/transfer). Append /<filename> to download a specific file when the endpoint does not serve the active one.

Provenance

source_domains:
  - audiogeneral.com
source_urls:
  - "https://www.audiogeneral.com/barco/UDX%20Series/JSON_ReferenceGuide.pdf"
retrieved_at: 2026-08-12T18:09:39.396Z
last_checked_at: 2026-08-19T08:44:49.916Z

Verification Summary

verdict: verified
checked_at: 2026-08-19T08:44:49.916Z
matched_actions: 42
action_count: 42
confidence: medium
summary: "All 42 spec actions match literal JSON-RPC methods, HTTP endpoints, or :POWR1 serial token in the source; transport params verbatim. (7 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- ledctrl.blink
- "device-name \"Io Gateway\" supplied by operator but source text describes \"Pulse projectors\"; relationship between Io Gateway and Pulse not stated in source. Model-specific source lists, connector rosters, and illumination source types vary per projector and must be obtained via introspection. Firmware version compatibility not stated."
- "pass-code format not documented (example uses integer code 98765); credential distribution unknown"
- "code distribution and full value space not documented.\""
- "params for selecting specific component not shown in source.\""
- "full set of introspectable signal/callback payloads not exhaustively enumerated; use introspect at runtime."
- "motorized zoom/focus/lensshift setters not shown as RW in source - list positions as read_only. If a projector has motorized lens, setter methods may exist via introspection."
- "no explicit safety interlock procedure, fault recovery sequence, or power-on sequencing"

From the AI4AV catalog (https://ai4av.net) · ODbL-1.0