Description
I'm just implementing the unproven ADC traits for RIOT and found an issue with Channel::channel:
As the channel() function does not even take a &self reference, there can't be implementations of it that are not fully contained in the type (ie. only really works for zero-sized types). Now the zero-sized types are a major plus of embedded Rust, but this signature precludes the use of eg. numeric channels as would be convenient when wrapping an operating system's ADCs.
I suggest adding a &self or &mut self argument to the .channel() function to make it usable as a method.
I don't understand the rationale behind there not being a self argument in or the existence of the channel method at all there in the first place, so I can't tell what it breaks. The example in the OneShot trait would need to say _pin.channel()
instead of PIN::channel()
-- but also there I don't see the rationale for not doing that in the first place.
(For the RIOT wrappers, until I can publish the code I'd like to point to, things look like this:
pub struct ADCLine(i32); // You'd get that from the OS on the long run; right now the int is pub
impl Channel<ADC> for ADCLine {
type ID = i32;
fn channel() -> i32 { unimplemented!() }
}
impl OneShot<ADC, i32, ADCLine> for ADC {
fn read(&mut self, pin: &mut ADCLine) {
unsafe { riot_sys::adc_init(pin.0) };
...
}
}
)