6个版本
新 0.3.0 | 2024年8月16日 |
---|---|
0.2.2 | 2024年8月16日 |
0.1.1 | 2024年8月13日 |
#130 in 硬件支持
574 个月下载量
155KB
4K SLoC
关于项目
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版权所有并出版。
(回到顶部)