device-driver 2.0.0

A toolkit to write better device drivers, faster
Documentation
use device_driver::{FieldsetMetadata, RegisterInterface, RegisterInterfaceBase};

pub struct DeviceInterface;

impl RegisterInterfaceBase for DeviceInterface {
    type Error = core::convert::Infallible;
    type AddressType = u8;
}
impl RegisterInterface for DeviceInterface {
    fn write_register(
        &mut self,
        _address: Self::AddressType,
        _data: &mut [u8],
        _metadata: &FieldsetMetadata,
    ) -> Result<(), Self::Error> {
        todo!()
    }

    fn read_register(
        &mut self,
        _address: Self::AddressType,
        _data: &mut [u8],
        _metadata: &FieldsetMetadata,
    ) -> Result<(), Self::Error> {
        todo!()
    }
}

device_driver::compile!(
    unstable_ddsl: "
        device MyTestDevice {
            register-address-type: u8,
            default-access: RW,

            register FooLe {
                address: 0,
                reset: 0xFF,
                fields: fieldset FooLeFields {
                    byte-order: LE,
                    size-bytes: 32,

                    field value-start 7:0 -> uint,
                    field value-end 255:248 -> uint,
                }
            },
            register FooBe {
                address: 1,
                reset: 0xFF,
                fields: fieldset FooBeFields {
                    byte-order: BE,
                    size-bytes: 32,

                    field value-start 7:0 -> uint,
                    field value-end 255:248 -> uint,
                }
            }
        }
    "
);

#[test]
fn reset_int_properly_extended() {
    let mut device = MyTestDevice::new(DeviceInterface);

    assert_eq!(device.foo_le().reset_value().value_start(), 0xFF);
    assert_eq!(device.foo_be().reset_value().value_start(), 0xFF);

    assert_eq!(device.foo_le().reset_value().value_end(), 0x00);
    assert_eq!(device.foo_be().reset_value().value_end(), 0x00);
}