#协议 #照明 #DMX #控制 #RDM

dmx512-rdm-protocol

用Rust编写的DMX512和远程设备管理(RDM)协议

6个版本

0.3.0 2024年8月16日
0.2.2 2024年8月16日
0.1.1 2024年8月13日

#130 in 硬件支持

Download history 574/week @ 2024-08-10

574 个月下载量

MIT 许可证

155KB
4K SLoC

dmx512-rdm-protocol

用Rust编写的DMX512和远程设备管理(RDM)协议

Crates.io Docs Docs

关于项目

DMX512是一种单向基于数据包的通信协议,通常用于控制灯光和效果。

远程设备管理(RDM)是DMX512的向后兼容扩展,允许与兼容设备进行双向通信,用于发现、识别、报告和配置。

包含

  • 编码和解码DMX512和RDM数据包的数据类型和功能。

不包含

  • 驱动实现:DMX512 / RDM数据包通过RS485总线传输,但存在如Enttec DMX USB PRO这样的接口设备,通过USB与设备通信。这些接口设备通常需要在标准DMX512 / RDM数据包之上进行额外的数据包封装,这超出了本项目范围。

实现的规范

  • ANSI E1.11 (2008):用于控制灯光设备和附件的异步串行数字数据传输标准
  • ANSI E1.20 (2010):DMX512网络上的RDM远程设备管理

(回到顶部)

安装

cargo add dmx512-rdm-protocol

或添加到Cargo.toml依赖项,crates.io获取最新版本。

如果您只想使用基本的DMX512数据类型和功能,RDM已被条件编译并默认包含,但可以通过使用default-features = false依赖声明来禁用。

(回到顶部)

用法

DmxUniverse

use dmx512_rdm_protocol::dmx::DmxUniverse;

// Create a 512 channel universe
let dmx_universe = DmxUniverse::default();
// or create a smaller universe
let dmx_universe = DmxUniverse::new(4).unwrap();
// or decode a DMX packet
let mut dmx_universe = DmxUniverse::decode(&[0, 0, 0, 0, 0]).unwrap();

assert_eq!(dmx_universe.as_slice(), &[0, 0, 0, 0]);

dmx_universe.set_channel_value(0, 64).unwrap();
dmx_universe.set_channel_values(1, &[128, 192, 255]).unwrap();

assert_eq!(dmx_universe.get_channel_value(0).unwrap(), 64);
assert_eq!(dmx_universe.get_channel_values(1..=2).unwrap(), &[128, 192]);
assert_eq!(dmx_universe.as_slice(), &[64, 128, 192, 255]);
assert_eq!(dmx_universe.encode(), &[0, 64, 128, 192, 255]);

RdmRequest

let encoded = RdmRequest::new(
    DeviceUID::new(0x0102, 0x03040506),
    DeviceUID::new(0x0605, 0x04030201),
    0x00,
    0x01,
    SubDeviceId::RootDevice,
    RequestParameter::GetIdentifyDevice,
)
.encode();

let expected = &[
    0xcc, // Start Code
    0x01, // Sub Start Code
    0x18, // Message Length
    0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // Destination UID
    0x06, 0x05, 0x04, 0x03, 0x02, 0x01, // Source UID
    0x00, // Transaction Number
    0x01, // Port ID
    0x00, // Message Count
    0x00, 0x00, // Sub-Device ID = Root Device
    0x20, // Command Class = GetCommand
    0x10, 0x00, // Parameter ID = Identify Device
    0x00, // PDL
    0x01, 0x40, // Checksum
];

assert_eq!(encoded, expected);

RdmResponse

let decoded = RdmResponse::decode(&[
    0xcc, // Start Code
    0x01, // Sub Start Code
    0x19, // Message Length
    0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // Destination UID
    0x06, 0x05, 0x04, 0x03, 0x02, 0x01, // Source UID
    0x00, // Transaction Number
    0x00, // Response Type = Ack
    0x00, // Message Count
    0x00, 0x00, // Sub-Device ID = Root Device
    0x21, // Command Class = GetCommandResponse
    0x10, 0x00, // Parameter ID = Identify Device
    0x01, // PDL
    0x01, // Identifying = true
    0x01, 0x43, // Checksum
]);

let expected = Ok(RdmResponse::RdmFrame(RdmFrameResponse {
    destination_uid: DeviceUID::new(0x0102, 0x03040506),
    source_uid: DeviceUID::new(0x0605, 0x04030201),
    transaction_number: 0x00,
    response_type: ResponseType::Ack,
    message_count: 0x00,
    sub_device_id: SubDeviceId::RootDevice,
    command_class: CommandClass::GetCommandResponse,
    parameter_id: ParameterId::IdentifyDevice,
    parameter_data: ResponseData::ParameterData(Some(
        ResponseParameterData::GetIdentifyDevice(true),
    )),
}));

assert_eq!(decoded, expected);

请参阅测试以获取更多示例。

(回到顶部)

贡献

该项目接受贡献,创建一个新问题并让我们讨论。

(回到顶部)

许可证

根据MIT许可证分发。有关更多信息,请参阅LICENSE.txt

(回到顶部)

致谢

  • 创建此库使用的ANSI E1.11 (2008)和ANSI E1.20 (2010)规范由ESTA版权所有并出版。

(回到顶部)

无运行时依赖项

功能