我正在尝试将firmata固件移植到rust中,更多的是作为学习arduino编码的练习而不是其他任何东西。
但是,我需要知道引脚号,实际上协议的一部分需要使用引脚号进行代数以发送到串行端口,例如
REPORT_ANALOG | (pin_number & 0xF)
。
但是,当我通过
pin!
实例化引脚时,该对象不允许我访问引脚编号。
我正在尝试不同的方法,例如进行匹配案例以在自定义结构中实例化引脚以存储引脚号,
let pin = match pin_number {
0 => pins.d0,
1 => pins.d1,
2 => pins.d2,
...
但我遇到打字问题,因为似乎没有通用的引脚类型
`match` arms have incompatible types
expected struct `avr_hal_generic::port::Pin<_, PD0>`
found struct `avr_hal_generic::port::Pin<_, PD1>
有没有一种方法,甚至
unsafe
来取回密码?
可能有更好的方法来实现 Firmata 协议,但如果您需要将类型转换为数字,您可以使用特征来实现:
fn pin_number<MODE, PIN: PinNumber>(_: &avr_hal_generic::port::Pin<MODE, PIN>) -> usize {
PIN::PIN_NUMBER
}
trait PinNumber {
const PIN_NUMBER: usize;
}
impl PinNumber for PD0 {
const PIN_NUMBER: usize = 0;
}
impl PinNumber for PD1 {
const PIN_NUMBER: usize = 1;
}
// …