RDM Vision Command
该 parameter 用于读取 Vision Controller 正常工作所需的全部必要信息。
| Data Type | DS_UNSIGNED_BYTE | PDL Size | Variable(See Protocolversion) |
| Cmd Class | CC_GET | Unit | UNITS_NONE |
| Prefix | PREFIX_NONE | Default | 0x00 |
| Min | 0x00 | Max | 0xFF |
| Description | "VISION" | ||
GET Command 0xA000
Controller Incoming Command:
| (Port ID) | (Msg. Count) | (Sub-Device) | |
| 0x01-0xFF | 0x00 | 0x0000 (Root) or 0x0001-0x0200 | |
| (CC) | (PID) | (PDL) | |
| GET_COMMAND | VISION (0xA000) | 0x00 | |
| (PD) | |||
Controller Response:
| (Response Type) | (Msg. Count) | (Sub-Device) | |
| ACK | 0x00-0xFF | Copy of Controller SD | |
| (CC) | (PID) | (PDL) | |
| GET_COMMAND_RESPONSE | VISION (0xA000) | Variable(See Protocolversion) | |
| (PD) | |||
| Info Stream | |||
Info Streams:
| Info Stream Protocol Version 1 | ||||
|---|---|---|---|---|
| Index | DataType | Name | Description | Value Definitions |
| 0 | uint8_t | Protocol Version | 描述 protocol version | 1: Version 1 |
| 1 | uint16_t | DeviceModelId | 来自 RDM DeviceInfo 的 DeviceModelId | |
| 3 | uint64_t | Serial | Fixture serial number,使用定义 format。注意 RDM 是 Big Endian。 | 必须是唯一 Serialnumber |
| 11 | uint8_t[4] | Vision Controller Firmware Version | 描述 Vision Controller Version。可从 SPI register 读取。 | [Major,Minor,Patch,Release]从 SPI Register 读取。如果不可用,设置为 zero。该 parameter 仅用于通过 DMX interface 读取 information。 |
| 15 | uint8_t[4] | Vision Controller Bootloader Version | 描述 Vision Controller Bootloader Version。可从 SPI register 读取。 | [Major,Minor,Patch,Release]从 SPI Register 读取。如果不可用,设置为 zero。该 parameter 仅用于通过 DMX interface 读取 information。 |
| 19 | uint8_t[4] | Fixture Firmware Version | 描述 Fixture Version | [Major,Minor,Patch,Release](Semantic Versioning)。每个 part 为 8 bit,并额外添加 Release part,用于表示是否为 release version。Release 必须为 255,firmware 才能通过 server 公开可用。否则 server 会拒绝该 software,因为它只被视为 developer version。因此,在正式 release version 255 之前,可以创建最多 244 个 developer versions。 |
| 23 | uint8_t[4] | Fixture Bootloader Version | 描述 Fixture Bootloader Version | [Major,Minor,Patch,Release]如果没有 bootloader,设置为 zero。 |
| 27 | uint8_t[8] | Vision Controller CPU ID | 描述 Vision Controller CPU ID。可从 SPI register 读取。 | 如果不可用,设置为 zero。该 parameter 仅用于通过 DMX interface 读取 information。 |
| 35 | uint8_t[12] | Fixture Main CPU ID | 描述 Fixture Main Controller CPU ID | 如果不可用,设置为 zero。该 parameter 仅用于通过 DMX interface 读取 information。 |
| 47 | uint8_t | Battery | Battery state / Level Indicator Info | 1-100: Battery available(用于 fixture operation 的 chargeable battery),1 到 100 表示 state of charge in % 0: No battery available 255: 仅用于 wakeup 和 fixture configuration 的小 battery 如果 Power Supply State 为 4 或 5:0-100 用作 Level Indicator |
| 48 | uint8_t | Power Supply State | Power Supply State / Level Indicator State | 0: No Power(Battery wakeup) 1: Battery Powered 2: Grid Power Supply / AC Power Supply 3: Charging Battery(使用小 battery 仅做 configuration 时不适用) 如果没有 battery,但需要 level indicator,例如 haze fluid level,请使用: 4: Level indicator 如果需要表示 preparation,例如 heat up,请使用: 5: Level indicator + Inpreparation |
| 49 | uint8_t | reserved | ||
| 50 | uint8_t | Selected Input Source | 描述 selected input source | 0: Vision 1: DMX 2: CRMX / WDMX 3: Artnet 4: SACN 5: GLP DOP 6: IR Remote (Fixture) 7: Manual Mode 8: Auto Mode(Automatic Source Selection with Priority。请参考 InputSource 章节) 9 - 252: Reserved 253: Wireless (2.4 GHz) 254: Wireless (Other) 255: Ethernet |
| 51 | uint8_t | Selected Input State | 描述 selected input source 的 state。如果 selected input source 为 Vision,请使用 Vision 的 Status register information 推导该 value。 | 0: Idle(DMX not available 等) 1: Unlinked(CRMX/Vision unlinked 等) 2: Linked(CRMX/Vision linked 等) 3: Active(DMX available、CRMX 等) 4: Active Vision(Vision Active or Master) |
| 52 | uint8_t | Selected Input Quality | 描述 input source 的 signal quality | 0: No quality available 1-100: Quality in % |
| 53 | uint16_t | DMX StartAdress | Fixture 的 DMX Startaddress | 1 - 512(来自 fixture menu 的 DMX start address) |
| 55 | uint8_t | DMX Personality | Fixture 的 DMX Personality | 0: DMX Personality not available 1-255: DMX Personalities(来自 fixture menu 的 DMX Personality) |
| 56 | uint16_t | DMX Footprint | Selected DMX Mode 的 DMX Channel count | 来自 fixture menu 中所选 DMX Personality 的 DMX Footprint |
| 58 | uint8_t | Error Count / Warning Count | Fixture 的 Error Count | Bit 0-3: Error Count Bit 4-7: Warning Count。Wake Up mode 中,fixture 应显示 last session 的 Error Count。 |
| 59 | uint16_t | Supported Input Sources | Supported input sources 的 flags | Bit 0: Vision Bit 1: DMX Bit 2: CRMX / WDMX Bit 3: Artnet Bit 4: SACN Bit 5: GLP DOP Bit 6: IR Remote (Fixture) Bit 7: Manual Mode Bit 8: Auto Mode Bit 9 - 15: Reserved 需要其他 source?请联系我们。 请记住 RDM 是 Big Endian。 所以数据顺序如下: [Bit 8-15],[Bit 0-7] |
| 61 | uint8_t | Feature: Sleep Mode | 0: NOT SUPPORTED 1: Supported | |
| 62 | uint8_t | Feature: Battery Shipping Mode | 0: NOT SUPPORTED 1: Supported | |
| 63 | uint8_t | Feature: Emergency Mode | 0: NOT SUPPORTED 1: Off 2: On | |
| 64 | uint8_t | Feature: Battery RunTime Selection | 0: NOT SUPPORTED 1: Full Power 2 - 25: Runtime in (Hours +1) | |
| 65 | uint8_t | Feature: Anti-Theft-Mode | 0: NOT SUPPORTED 1: Inactive 2: Ready 3: Active(Alarm triggered) | |
Code example
typedef enum
{
RDMVISIONSETTINGSCOMMAND_INPUTSOURCE = 1,
RDMVISIONSETTINGSCOMMAND_INPUTSTATE = 2,
RDMVISIONSETTINGSCOMMAND_DISPLAYPOPUP = 3,
RDMVISIONSETTINGSCOMMAND_EMERGENCYMODE = 4,
RDMVISIONSETTINGSCOMMAND_BATTERYRUNTIME = 5,
RDMVISIONSETTINGSCOMMAND_ANTITHEFTMODE = 6,
}rdm_vision_settings_command_t;
typedef enum
{
RDMVISIONINPUTSOURCE_VISION = 0,
RDMVISIONINPUTSOURCE_DMX = 1,
RDMVISIONINPUTSOURCE_CRMXWDMX = 2,
RDMVISIONINPUTSOURCE_ARTNET = 3,
RDMVISIONINPUTSOURCE_SACN = 4,
RDMVISIONINPUTSOURCE_GLPDOP = 5,
RDMVISIONINPUTSOURCE_IRREMOTE = 6,
RDMVISIONINPUTSOURCE_WIRELESS2_4GHZ = 253,
RDMVISIONINPUTSOURCE_WIRELESS2_OTHER = 254,
RDMVISIONINPUTSOURCE_ETHERNET = 255,
}rdm_vision_inputsource_t;
typedef enum
{
IQ_POWERSUPPLY_STATE_NOPOWER = 0, // No Power (Battery wakeup)
IQ_POWERSUPPLY_STATE_BATTERY_POWERED = 1,
IQ_POWERSUPPLY_STATE_GRID_POWERED = 2,
IQ_POWERSUPPLY_STATE_CHARGING = 3,
}rdm_vision_power_supply_state_t;
typedef enum
{
IQ_INPUTSTATE_IDLE = 0, // No Power (Battery wakeup)
IQ_INPUTSTATE_UNLINKED = 1,
IQ_INPUTSTATE_LINKED = 2,
IQ_INPUTSTATE_ACTIVE = 3,
}rdm_vision_input_state_t;
typedef struct __attribute__((__packed__))
{
uint8_t protocollVersion;
uint16_t deviceModelId;
uint64_t serial;
uint8_t iqControllerFirmware[4];
uint8_t iqControllerBootloaderFirmware[4];
uint8_t fixtureFirmware[4];
uint8_t fixtureBootloaderFirmware[4];
uint8_t iqControllerCpuId[8];
uint8_t fixtureMainCpuId[12];
uint8_t battery;
rdm_vision_power_supply_state_t powerSupplyState;
uint8_t reserved;
rdm_vision_inputsource_t inputSource;
rdm_vision_input_state_t inputState;
uint8_t inputQuality;
uint16_t dmxStartaddress;
uint8_t dmxPersonality;
uint16_t dmxFootprint;
uint8_t errorCount;
uint16_t supportedInputSource;
uint8_t reserved2;
uint8_t featureShippingMode;
uint8_t featureEmergency;
uint8_t featureRuntimeSelection;
uint8_t featureAntitheftMode;
}rdm_vision_get_response_t;
static void DecodeGetVision(rdm_message_header_t header, uint8_t * msg, uint16_t length)
{
rdm_answer_t implemented;
implemented.response = RDM_ACK;
implemented.reason = NR_UNKNOWN_PID;
rdm_vision_get_response_t response;
memset(&response,0,sizeof(response));
RdmExtGetVision(&implemented,&response);
if(implemented.response == RDM_ACK)
{
response.deviceModelId= __builtin_bswap16(response.deviceModelId);
response.serial = __builtin_bswap64(response.serial);
response.dmxStartaddress= __builtin_bswap16(response.dmxStartaddress);
response.dmxFootprint= __builtin_bswap16(response.dmxFootprint);
response.supportedInputSource= __builtin_bswap16(response.supportedInputSource);
SendResponse(header,(uint8_t*)&response,sizeof(response));
}
else
{
SendNackResponse(header, implemented.reason);
}
}
typedef enum
{
IQ_INPUTSTATE_UNLINK = 0,
IQ_INPUTSTATE_LINK = 1,
}rdm_vision_set_input_state_t;
typedef enum
{
RDMVISIONBATTERYRUNTIME_FULLOUTPUT = 0,
RDMVISIONBATTERYRUNTIME_1HOURS = 1,
RDMVISIONBATTERYRUNTIME_2HOURS = 2,
RDMVISIONBATTERYRUNTIME_3HOURS = 3,
RDMVISIONBATTERYRUNTIME_4HOURS = 4,
RDMVISIONBATTERYRUNTIME_5HOURS = 5,
RDMVISIONBATTERYRUNTIME_6HOURS = 6,
RDMVISIONBATTERYRUNTIME_7HOURS = 7,
RDMVISIONBATTERYRUNTIME_8HOURS = 8,
RDMVISIONBATTERYRUNTIME_9HOURS = 9,
RDMVISIONBATTERYRUNTIME_10HOURS = 10,
RDMVISIONBATTERYRUNTIME_11HOURS = 11,
RDMVISIONBATTERYRUNTIME_12HOURS = 12,
RDMVISIONBATTERYRUNTIME_13HOURS = 13,
RDMVISIONBATTERYRUNTIME_14HOURS = 14,
RDMVISIONBATTERYRUNTIME_15HOURS = 15,
RDMVISIONBATTERYRUNTIME_16HOURS = 16,
RDMVISIONBATTERYRUNTIME_17HOURS = 17,
RDMVISIONBATTERYRUNTIME_18HOURS = 18,
RDMVISIONBATTERYRUNTIME_19HOURS = 19,
RDMVISIONBATTERYRUNTIME_20HOURS = 20,
RDMVISIONBATTERYRUNTIME_21HOURS = 21,
RDMVISIONBATTERYRUNTIME_22HOURS = 22,
RDMVISIONBATTERYRUNTIME_23HOURS = 23,
RDMVISIONBATTERYRUNTIME_24HOURS = 24,
}rdm_vision_battery_runtime_t;
typedef enum
{
RDMVISIONANTITHEFT_ON,
RDMVISIONANTITHEFT_OFF,
RDMVISIONANTITHEFT_ALARM
}rdm_vision_antitheft_t;
typedef struct
{
uint8_t protocollVersion;
rdm_vision_settings_command_t command;
} rdm_vision_settings_stream_t;
static void DecodeSetVision(rdm_message_header_t header, uint8_t * msg, uint16_t length)
{
rdm_answer_t implemented;
implemented.response = RDM_ACK;
implemented.reason = NR_UNKNOWN_PID;
if(length >= sizeof(rdm_vision_settings_stream_t) + 1)
{
rdm_vision_settings_stream_t* stream = (rdm_vision_settings_stream_t*) msg;
switch(stream->command)
{
case RDMVISIONSETTINGSCOMMAND_INPUTSOURCE:
RdmExtSetVisionInputSource(&implemented,*((rdm_vision_inputsource_t*) &msg[sizeof(rdm_vision_settings_stream_t)]));
break;
case RDMVISIONSETTINGSCOMMAND_INPUTSTATE:
RdmExtSetVisionInputState(&implemented, *((rdm_vision_input_state_t*) &msg[sizeof(rdm_vision_settings_stream_t)]));
break;
case RDMVISIONSETTINGSCOMMAND_DISPLAYPOPUP:
RdmExtSetVisionPopup(&implemented,*((rdm_vision_popup_t*) &msg[sizeof(rdm_vision_settings_stream_t)]) );
break;
case RDMVISIONSETTINGSCOMMAND_EMERGENCYMODE:
RdmExtSetVisionEmergencyMode(&implemented,msg[sizeof(rdm_vision_settings_stream_t)] > 0);
break;
case RDMVISIONSETTINGSCOMMAND_BATTERYRUNTIME:
RdmExtSetVisionBatteryRuntime(&implemented,*((rdm_vision_battery_runtime_t*)&msg[sizeof(rdm_vision_settings_stream_t)]));
break;
case RDMVISIONSETTINGSCOMMAND_ANTITHEFTMODE:
if(*((uint32_t*)&msg[sizeof(rdm_vision_settings_stream_t)]) == 583619)
{
RdmExtSetVisionAntitheftMode(&implemented,RDMVISIONANTITHEFT_OFF);
}
else if(*((uint32_t*)&msg[sizeof(rdm_vision_settings_stream_t)]) == 204688)
{
RdmExtSetVisionAntitheftMode(&implemented,RDMVISIONANTITHEFT_ON);
}
else if(*((uint32_t*)&msg[sizeof(rdm_vision_settings_stream_t)]) == 388165)
{
RdmExtSetVisionAntitheftMode(&implemented,RDMVISIONANTITHEFT_ALARM);
}
else
{
implemented.response = RDM_NACK_REASON;
}
break;
default:
implemented.response = RDM_NACK_REASON;
break;
}
if(implemented.response == RDM_ACK)
{
uint8_t response = 0;
SendResponse(header,&response,1);
}
else
{
uint8_t response = 3; // 0 -Ok , 1 - Unknown Command , 2 Err Execution Command, 3 Unsupported command
SendResponse(header,&response,1);
}
}
else
{
SendNackResponse(header, NR_FORMAT_ERROR);
}
}
SET Command 0xA000
Controller Incoming Command:
| (Port ID) | (Msg. Count) | (Sub-Device) | |
| 0x01-0xFF | 0x00 | 0x0000 (Root) or 0x0001-0x0200 | |
| (CC) | (PID) | (PDL) | |
| SET_COMMAND | Vision (0xA000) | Variable(0-100) | |
| (PD) | |||
| Settings Stream | |||
Controller Response:
| (Response Type) | (Msg. Count) | (Sub-Device) | |
| ACK | 0x00-0xFF | Copy of Controller SD | |
| (CC) | (PID) | (PDL) | |
| SET_COMMAND_RESPONSE | Vision (0xA000) | 1 | |
| (PD) | |||
| uint8_t Status | 0 = OK, 1= Unknown Command, 2 = Error executing Command, 3 = Unsupported Command | |||
Settings Streams:
| Settings Stream Protocol Version 1 | ||||
|---|---|---|---|---|
| Index | DataType | Name | Description | Value Definitions |
| 0 | uint8_t | Protocol Version | 描述 Protocol Version | 1: Version 1 |
| 1 | uint8_t | Command Identifier | Command | - |
| 2 | uint8_t[variable] | Data | Data 取决于 command | - |
| Command | Identifier | DataType | Description | Value Definitions |
|---|---|---|---|---|
| Set Input Source | 0x01 | uint8_t | 0: Vision, 1: DMX, 2: CRMX / WDMX, 3: Artnet, 4: SACN, 5: GLP DOP, 6: IR Remote (Fixture), 7: Manual Mode, 8: Auto Mode, 9 - 252: Reserved, 253: Wireless (2.4 GHz), 254: Wireless (Other), 255: Ethernet 需要其他 Source?请联系我们。 | |
| Set Input Source State | 0x02 | uint8_t | 0: Unlink 1: Link (trigger) | |
| Show Display Popup | 0x03 | uint8_t [var] | See Command Details | |
| Set Emergency Mode | 0x04 | uint8_t | 在 supported fixtures 上设置 emergency mode | 0: Off 255: On |
| Set Battery RunTime Selection | 0x05 | uint8_t | 在 supported fixtures 上设置 battery runtime | 0: Full Power 1 - 24: Runtime in Hours |
| Set Anti-Theft-Mode | 0x06 | uint32_t | 在 supported fixtures 上设置 anti-theft-mode | 583619: Off 204688: On 388165: Alarm 出于 security reasons,该 Command 应仅通过 Vision active,不应通过 DMX RDM active。 |
| Set Shipping Mode | 0x07 | - | Set Shipping mode | 255: On |
| Set Serial number | 0x08 | uint8_t[8] uint64_t | Fixture Security Key Serialnumber | Fixture Security Key 由 Vision Web Service 生成,可在 Fixture Settings Page 中找到。 |
| Set Device Model ID / Fixture ID | 0x09 | uint8_t[8] uint16_t | Fixture Key DeviceModel/Fixture ID | Individual fixture key,可在 Fixture 的 RDM Libraries 下添加。 可使用 RDM Device Model ID 或 specific fixture id。 |
Feature: Emergency mode
Emergency Mode 可以 enabled 和 disabled。该 setting 应保存,因此 fixture 断电后仍能记住状态。
如果 emergency mode enabled,当没有 grid power available 时,fixture 应以 full output 点亮。如果 gridpower(AC)available,则应按 normal operation 行为工作。
Feature: Battery runtime selection
Battery RunTime Selection 可以 enabled 和 disabled。该 setting 应保存,因此 fixture 断电后仍能记住状态。
如果 enabled,fixture 必须确保 battery runtime 符合选择值,从 minimum 1 hour 到 24 hours。该 runtime 基于 100% charging state 定义。
良好的实现方式是限制 fixture 的 maximum power output。根据 battery capacity 和 energy consumption 计算需要的输出,并 dim down light,以保证所需 runtime。
Feature: Anti-theft mode
Anti-Theft-Mode 可以 enabled、disabled 和 triggered。启用 Anti-Theft-Mode 时,不应允许关闭 fixture,也不应允许使用 display 等 user interface。当 Anti-Theft-Mode 被 triggered 时,fixture 应通过 visual effects 和/或 sound effects 发出 alarm。
该 feature 只有在 fixture 为 battery powered 时才能完整实现。如果 feature active,所有 user interfaces 都应 locked(例如 menu locked、button locked 等)。Vision Controller 拥有 fixture 当前 acceleration information。如果 fixture 在 anti-theft-mode 下被移动,会触发 alarm。
- 使用 red 和 blue 之间的 dynamic color pattern
- 使用 internal speaker 作为 siren(optional)
Feature: Shipping mode
Shipping Mode 只能 enabled。
如果 shipping mode enabled,fixture 应关闭并 cut off battery power。Fixture 只能通过 gridpower(AC)再次启动,以确保 transport experience 更可靠。
设置 Serial number / Device Model ID
该 function 可用于向 fixture 写入 serial number 或 device model id。该 function 仅对 fixture owners 开放。
Fixture Security Key 由 Vision Web Service 生成,可在 Fixture Settings Page 中找到。