Summary

The Vitec CenterStage CS-1 is a video processor/scaler controllable over RS-232 (DB-9 female, rear panel). The protocol uses a fixed 6-byte frame with attention byte 0xEE, length 0x04, command byte, two ASCII-hex data bytes, and a 7-bit sum checksum. This spec covers the transport, protocol, and the 23 command opcodes documented in the vendor manual.

Transport

protocols:
  - serial
serial:
  baud_rate: 9600  # source: "9600 or 57600 (selectable in Miscellaneous menu via front panel OSD)" - 9600 is the default; 57600 also valid
  data_bits: 8  # inferred: standard for 0-9, A-F ASCII byte protocol
  parity: none
  stop_bits: 1
  flow_control: none  # source: "No handshaking provided or required"
  connector: DB-9 female (rear panel)  # source: pinout table
  pinout:
    rx: 3
    tx: 2
    gnd: 5
auth:
  type: none  # inferred: no auth procedure in source

Traits

- powerable       # inferred from WRITE_POWER (0x50) command
- routable        # inferred from WRITE_SELECT_INPUT (0x53) command
- queryable       # inferred from Read Command description and data-byte feedback behavior
- levelable       # inferred from WRITE_SHARPNESS / WRITE_CONTRAST / WRITE_BRIGHTNESS / WRITE_COLOR_ADJUST / WRITE_TINT_ADJUST commands
- resettable      # inferred from WRITE_RESET (0x55) command

Actions

# Each action uses the 6-byte RS-232 frame:
#   EE 04 {CMD} {MS} {LS} {CS}
# where CS = lower 7 bits of the sum of the preceding 5 bytes.
# Command variants (per source):
#   Relative Write : CMD = base
#   Absolute Write : CMD = base + 0x30
#   Read           : CMD = base + 0x60   (MS/LS = 0)
# All actions below expose the base opcode as documented in the source command set table.
# Data bytes are ASCII hex digits (0-9, A-F) representing an 8-bit value
# (0-255 unsigned, or -128..127 signed for relative writes).

- id: power_write
  label: Power
  kind: action
  command: "EE 04 80 {MS} {LS} {CS}"  # WRITE_POWER 0x50, absolute (0x50+0x30=0x80)
  params:
    - name: state
      type: integer
      description: Power state (absolute). Data byte carries 0-255 value.
  notes: "Base opcode 0x50 (relative). Absolute write uses 0x80. Read (status) uses 0xB0."

- id: input_aspect_write
  label: Input Aspect Ratio
  kind: action
  command: "EE 04 81 {MS} {LS} {CS}"  # WRITE_INPUT_ASPECT 0x51 → absolute 0x81
  params:
    - name: value
      type: integer
      description: Input aspect ratio setting
  notes: "Base opcode 0x51. Relative 0x51, absolute 0x81, read 0xB1."

- id: vid_proc_write
  label: Video Processing Mode
  kind: action
  command: "EE 04 82 {MS} {LS} {CS}"  # WRITE_VID_PROC 0x52 → absolute 0x82
  params:
    - name: value
      type: integer
      description: Video processing mode
  notes: "Base opcode 0x52. Relative 0x52, absolute 0x82, read 0xB2."

- id: select_input_write
  label: Select Input
  kind: action
  command: "EE 04 83 {MS} {LS} {CS}"  # WRITE_SELECT_INPUT 0x53 → absolute 0x83
  params:
    - name: input
      type: integer
      description: Input number
  notes: "Base opcode 0x53. Relative 0x53, absolute 0x83, read 0xB3."

- id: output_aspect_write
  label: Output Aspect Ratio
  kind: action
  command: "EE 04 84 {MS} {LS} {CS}"  # WRITE_OUTPUT_ASPECT 0x54 → absolute 0x84
  params:
    - name: value
      type: integer
      description: Output aspect ratio setting
  notes: "Base opcode 0x54. Relative 0x54, absolute 0x84, read 0xB4."

- id: reset_write
  label: Reset
  kind: action
  command: "EE 04 85 {MS} {LS} {CS}"  # WRITE_RESET 0x55 → absolute 0x85
  params:
    - name: value
      type: integer
      description: Reset sub-mode value
  notes: "Base opcode 0x55. Relative 0x55, absolute 0x85, read 0xB5."

- id: front_panel_write
  label: Front Panel
  kind: action
  command: "EE 04 86 {MS} {LS} {CS}"  # WRITE_FRONT_PANEL 0x56 → absolute 0x86
  params:
    - name: value
      type: integer
      description: Front panel state value
  notes: "Base opcode 0x56. Relative 0x56, absolute 0x86, read 0xB6."

- id: output_res_write
  label: Output Resolution
  kind: action
  command: "EE 04 87 {MS} {LS} {CS}"  # WRITE_OUTPUT_RES 0x57 → absolute 0x87
  params:
    - name: value
      type: integer
      description: Output resolution selection
  notes: "Base opcode 0x57. Relative 0x57, absolute 0x87, read 0xB7."

- id: sharpness_write
  label: Sharpness
  kind: action
  command: "EE 04 90 {MS} {LS} {CS}"  # WRITE_SHARPNESS base opcode 0x60, absolute write 0x60+0x30=0x90
  params:
    - name: value
      type: integer
      description: Sharpness level (range enforced by device; out-of-range values clamped to limit)
  notes: "Base opcode 0x60. Relative 0x60, absolute 0x90, read 0xC0."

- id: contrast_write
  label: Contrast
  kind: action
  command: "EE 04 91 {MS} {LS} {CS}"  # WRITE_CONTRAST 0x61 → absolute 0x91
  params:
    - name: value
      type: integer
      description: Contrast level (range enforced by device; out-of-range values clamped to limit)
  notes: "Base opcode 0x61. Relative 0x61, absolute 0x91, read 0xC1."

- id: brightness_write
  label: Brightness
  kind: action
  command: "EE 04 92 {MS} {LS} {CS}"  # WRITE_BRIGHTNESS 0x62 → absolute 0x92
  params:
    - name: value
      type: integer
      description: Brightness level (range enforced by device; out-of-range values clamped to limit)
  notes: "Base opcode 0x62. Relative 0x62, absolute 0x92, read 0xC2."

- id: v_sz_mode_input_write
  label: Vertical Size Mode (Input)
  kind: action
  command: "EE 04 93 {MS} {LS} {CS}"  # WRITE_V_SZ_MODE_INPUT 0x63 → absolute 0x93
  params:
    - name: value
      type: integer
      description: Vertical size mode (input) value
  notes: "Base opcode 0x63. Relative 0x63, absolute 0x93, read 0xC3."

- id: v_pos_input_write
  label: Vertical Position (Input)
  kind: action
  command: "EE 04 94 {MS} {LS} {CS}"  # WRITE_V_POS_INPUT 0x64 → absolute 0x94
  params:
    - name: value
      type: integer
      description: Vertical position (input) value
  notes: "Base opcode 0x64. Relative 0x64, absolute 0x94, read 0xC4."

- id: h_sz_input_write
  label: Horizontal Size (Input)
  kind: action
  command: "EE 04 95 {MS} {LS} {CS}"  # WRITE_H_SZ_INPUT 0x65 → absolute 0x95
  params:
    - name: value
      type: integer
      description: Horizontal size (input) value
  notes: "Base opcode 0x65. Relative 0x65, absolute 0x95, read 0xC5."

- id: h_pos_input_write
  label: Horizontal Position (Input)
  kind: action
  command: "EE 04 96 {MS} {LS} {CS}"  # WRITE_H_POS_INPUT 0x66 → absolute 0x96
  params:
    - name: value
      type: integer
      description: Horizontal position (input) value
  notes: "Base opcode 0x66. Relative 0x66, absolute 0x96, read 0xC6."

- id: v_sz_output_write
  label: Vertical Size (Output)
  kind: action
  command: "EE 04 97 {MS} {LS} {CS}"  # WRITE_V_SZ_OUTPUT 0x67 → absolute 0x97
  params:
    - name: value
      type: integer
      description: Vertical size (output) value
  notes: "Base opcode 0x67. Relative 0x67, absolute 0x97, read 0xC7."

- id: v_pos_output_write
  label: Vertical Position (Output)
  kind: action
  command: "EE 04 98 {MS} {LS} {CS}"  # WRITE_V_POS_OUTPUT 0x68 → absolute 0x98
  params:
    - name: value
      type: integer
      description: Vertical position (output) value
  notes: "Base opcode 0x68. Relative 0x68, absolute 0x98, read 0xC8."

- id: h_sz_output_write
  label: Horizontal Size (Output)
  kind: action
  command: "EE 04 99 {MS} {LS} {CS}"  # WRITE_H_SZ_OUTPUT 0x69 → absolute 0x99
  params:
    - name: value
      type: integer
      description: Horizontal size (output) value
  notes: "Base opcode 0x69. Relative 0x69, absolute 0x99, read 0xC9."

- id: h_pos_output_write
  label: Horizontal Position (Output)
  kind: action
  command: "EE 04 9A {MS} {LS} {CS}"  # WRITE_H_POS_OUTPUT 0x6A → absolute 0x9A
  params:
    - name: value
      type: integer
      description: Horizontal position (output) value
  notes: "Base opcode 0x6A. Relative 0x6A, absolute 0x9A, read 0xCA."

- id: color_adjust_write
  label: Color Adjust
  kind: action
  command: "EE 04 9B {MS} {LS} {CS}"  # WRITE_COLOR_ADJUST 0x6B → absolute 0x9B
  params:
    - name: value
      type: integer
      description: Color adjustment value
  notes: "Base opcode 0x6B. Relative 0x6B, absolute 0x9B, read 0xCB."

- id: tint_adjust_write
  label: Tint Adjust
  kind: action
  command: "EE 04 9C {MS} {LS} {CS}"  # WRITE_TINT_ADJUST 0x6C → absolute 0x9C
  params:
    - name: value
      type: integer
      description: Tint adjustment value
  notes: "Base opcode 0x6C. Relative 0x6C, absolute 0x9C, read 0xCC."

- id: op_fmt_write
  label: Output Format
  kind: action
  command: "EE 04 9D {MS} {LS} {CS}"  # WRITE_OP_FMT 0x6D → absolute 0x9D
  params:
    - name: value
      type: integer
      description: Output format selection
  notes: "Base opcode 0x6D. Relative 0x6D, absolute 0x9D, read 0xCD."

- id: color_mode_write
  label: Color Mode
  kind: action
  command: "EE 04 9E {MS} {LS} {CS}"  # WRITE_COLOR_MODE 0x6E → absolute 0x9E
  params:
    - name: value
      type: integer
      description: Color mode selection
  notes: "Base opcode 0x6E. Relative 0x6E, absolute 0x9E, read 0xCE."

Feedbacks

- id: ack
  type: signal
  description: "ASCII ACK (0x06) - valid command received, accepted"
- id: nak
  type: signal
  description: "ASCII NAK (0x15) - invalid/bad command received"
- id: read_response
  type: object
  description: "6-byte response to a Read command. Frame: 0xEE 0x04 {cmd} {MS} {LS} {CS}, where {cmd} = base+0x60, and {MS}/{LS} carry the current setting of the queried function as ASCII hex digits."
- id: limit_clamp
  type: signal
  description: "When a Write command's Data Byte exceeds the register's accepted range, the device clamps to the limit and the response's Data Byte reflects that limit (not the sent value)."

Variables

# Each command in the Actions section represents a settable register / observable value.
# Source does not document specific register ranges or default values per register.
# UNRESOLVED: per-register min/max/default values not documented in source

Events

# Source describes only solicited responses (ACK/NAK/Read_Response) - no unsolicited events documented.
# UNRESOLVED: no unsolicited notification / asynchronous event stream documented in source

Macros

# UNRESOLVED: no multi-step sequences documented in source

Safety

confirmation_required_for: []
interlocks: []
# UNRESOLVED: no safety warnings, interlock procedures, or power-on sequencing requirements documented in source

Notes

  • All 23 command opcodes (0x50-0x57 and 0x60-0x6E) are listed as Relative Write base values in the source. Absolute Write uses base+0x30, Read uses base+0x60.
  • The 6-byte frame checksum is the lower 7 bits of the sum of the first 5 bytes (EE 04 {cmd} {MS} {LS}).
  • The Data Bytes are ASCII hex digit characters (0-9, A-F), not raw nibbles. Each Data Byte is the ASCII representation of the hex digit.
  • The client MUST wait for ACK/NAK (or a 6-byte Read_Response) after every command before sending the next — no pipelining.
  • The Limits section states that any out-of-range Data Byte will be clamped to the register's limit; the response will reflect the clamped value, not the erroneous sent value.
  • Baud rate is selectable between 9600 and 57600 via the front panel OSD Miscellaneous menu; no auto-baud-detection documented.
  • "No handshaking provided or required" — no RTS/CTS or XON/XOFF.

Spec emitted. 23 actions, transport + auth + traits populated from source, gaps marked unresolved. 23 command opcodes all covered.

## Provenance

```yaml
source_domains:
  - curtpalme.com
  - applicationmarket.crestron.com
source_urls:
  - "https://www.curtpalme.com/docs/CenterStage1&2_UserGuide.pdf"
  - https://applicationmarket.crestron.com/vitec-centerstage-cs-1-north-america/
retrieved_at: 2026-04-29T20:24:50.290Z
last_checked_at: 2026-06-02T10:14:13.284Z

Verification Summary

verdict: verified
checked_at: 2026-06-02T10:14:13.284Z
matched_actions: 23
action_count: 23
confidence: medium
summary: "All 23 spec actions verified against source; sharpness_write fix (0x91→0x90 = WRITE_SHARPNESS 0x60+0x30) is correct; all opcodes, transport params, and pinout confirmed verbatim. (6 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "baud rate is selectable (9600 or 57600) — spec must reflect both; firmware version not stated"
- "per-register min/max/default values not documented in source"
- "no unsolicited notification / asynchronous event stream documented in source"
- "no multi-step sequences documented in source"
- "no safety warnings, interlock procedures, or power-on sequencing requirements documented in source"
- "firmware version not stated; per-register value ranges not documented; no timing/timeout specifications in source; no unsolicited event stream documented"

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