knx_rust/
address.rs

1use std::fmt::{Display, Formatter};
2use std::ops::Sub;
3
4
5pub struct IndividualAddress {
6    addr: u16
7}
8
9impl IndividualAddress {
10    pub fn new(area: u8, line: u8,device: u8) -> IndividualAddress{
11        return IndividualAddress{addr: ((area as u16) << 12) | (((line & 0xf) as u16) << 8) | (device as u16)}
12    }
13    pub fn from_u16(addr:u16) -> IndividualAddress{
14        return IndividualAddress{addr}
15    }
16    pub fn to_u16(&self) -> u16 {
17        self.addr
18    }
19    pub fn area(&self) -> u8 {
20        return (self.addr >> 12) as u8;
21    }
22    pub fn line(&self) -> u8  {
23        return ((self.addr >> 8) & 0xf) as u8;
24    }
25    pub fn device(&self) -> u8 {
26        return (self.addr & 0xff) as u8;
27    }
28}
29
30impl Display for IndividualAddress {
31    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
32        write!(f, "{}.{}.{}", self.area(), self.line(), self.device())
33    }
34}
35
36
37
38pub struct GroupAddress2 {
39    addr: u16
40}
41
42impl GroupAddress2 {
43    pub fn new(main: u8, sub: u16) -> GroupAddress2{
44        return GroupAddress2{addr: ((main as u16) << 11) | (sub & 0x7FF)}
45    }
46    pub fn from_u16(addr:u16) -> GroupAddress2{
47        return GroupAddress2{addr}
48    }
49    pub fn to_u16(&self) -> u16 {
50        self.addr
51    }
52    pub fn main(&self) -> u8 {
53        return (self.addr >> 11) as u8;
54    }
55    pub fn sub(&self) -> u16 {
56        return self.addr & 0x7ff;
57    }
58}
59
60impl Display for GroupAddress2 {
61    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
62        write!(f, "{}/{}", self.main(), self.sub())
63    }
64}
65
66pub struct GroupAddress3 {
67    addr: u16
68}
69impl GroupAddress3 {
70    pub fn new(main: u8, middle: u8, sub: u8) -> GroupAddress3{
71        return GroupAddress3{addr: ((main as u16) << 11) | ((middle as u16) << 8) | (sub as u16)}
72    }
73    pub fn from_u16(addr:u16) -> GroupAddress3{
74        return GroupAddress3{addr}
75    }
76    pub fn to_u16(&self) -> u16 {
77        self.addr
78    }
79    pub fn main(&self) -> u8 {
80        return (self.addr >> 11) as u8;
81    }
82    pub fn middle(&self) -> u8 {
83        return ((self.addr >> 8) & 0x7) as u8;
84    }
85    pub fn sub(&self) -> u8 {
86        return (self.addr & 0xff) as u8;
87    }
88}
89
90impl Display for GroupAddress3 {
91    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
92        write!(f, "{}/{}/{}", self.main(), self.middle(), self.sub())
93    }
94}
95
96
97#[cfg(test)]
98mod tests {
99    use crate::address::{GroupAddress2, GroupAddress3, IndividualAddress};
100
101    #[test]
102    fn individual_address() {
103        let address = IndividualAddress::new(1,2,3);
104
105        assert_eq!(address.area(), 1);
106        assert_eq!(address.line(), 2);
107        assert_eq!(address.device(), 3);
108        assert_eq!("1.2.3", format!("{}", address));
109
110        let from_u16 = IndividualAddress::from_u16(0x1234);
111        assert_eq!(from_u16.to_u16(), 0x1234)
112    }
113
114    #[test]
115    fn group_address3() {
116        let address = GroupAddress3::new(1,2,3);
117
118        assert_eq!(address.main(), 1);
119        assert_eq!(address.middle(), 2);
120        assert_eq!(address.sub(), 3);
121        assert_eq!("1/2/3", format!("{}", address));
122
123        let from_u16 = GroupAddress3::from_u16(0x1234);
124        assert_eq!(from_u16.to_u16(), 0x1234)
125    }
126
127
128    #[test]
129    fn group_address2() {
130        let address = GroupAddress2::new(1,3);
131
132        assert_eq!(address.main(), 1);
133        assert_eq!(address.sub(), 3);
134        assert_eq!("1/3", format!("{}", address));
135
136        let from_u16 = GroupAddress2::from_u16(0x1234);
137        assert_eq!(from_u16.to_u16(), 0x1234)
138    }
139}