summaryrefslogtreecommitdiff
path: root/tmp117/src/id.rs
blob: e1fcc8b2dbe9758354f4e7c48e7c9c63319f1d02 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
pub struct Identity {
    pub device_id: u16,

    pub revision_number: u8,
}

impl From<u16> 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);
    }
}