pub struct Identity { pub device_id: u16, pub revision_number: u8, } impl From for Identity { fn from(register: u16) -> Self { let device_id = register & 0x0FFF; let revision_number = ((register >> 12) & 0xF) as u8; Self { device_id, revision_number, } } } #[cfg(test)] mod tests { use super::*; #[test] fn test_identity_from_known_device_id() { let identity = Identity::from(0x0117); assert_eq!(identity.device_id, 0x117); assert_eq!(identity.revision_number, 0); } #[test] fn test_identity_device_id_masked() { // bits 11:0 are device ID let identity = Identity::from(0x0FFF); assert_eq!(identity.device_id, 0x0FFF); assert_eq!(identity.revision_number, 0); } #[test] fn test_identity_revision_number_extracted() { // bits 15:12 are revision let identity = Identity::from(0x1000); assert_eq!(identity.device_id, 0x000); assert_eq!(identity.revision_number, 1); } #[test] fn test_identity_both_fields() { // revision = 0xA, device_id = 0x117 let identity = Identity::from(0xA117); assert_eq!(identity.device_id, 0x117); assert_eq!(identity.revision_number, 0xA); } }