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}