summaryrefslogtreecommitdiff
path: root/tmp117/src/id.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tmp117/src/id.rs')
-rw-r--r--tmp117/src/id.rs52
1 files changed, 52 insertions, 0 deletions
diff --git a/tmp117/src/id.rs b/tmp117/src/id.rs
new file mode 100644
index 0000000..e1fcc8b
--- /dev/null
+++ b/tmp117/src/id.rs
@@ -0,0 +1,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);
+ }
+}