1pub mod messages;
2pub mod types;
3pub mod enums;
4mod messages_macro;
5
6pub use open_protocol_codec::encode;
7pub use open_protocol_codec::decode;
8pub use open_protocol_codec_proc_macro::{OpenProtocolDecode, OpenProtocolEncode};
9
10use open_protocol_codec::decode::{Decode};
11use open_protocol_codec::encode::{Encode};
12use crate::messages_macro::open_protocol_messages;
13use crate::messages::{
14 alarm,
15 communication,
16 job,
17 keep_alive,
18 link_communication,
19 mode,
20 multi_spindle_result,
21 multi_spindle_status,
22 parameter_set,
23 powermacs_result,
24 result,
25 tightening_result,
26 time,
27 tool,
28 user_interface,
29 vin
30};
31
32#[derive(Debug, Default, Eq, PartialEq, Clone, OpenProtocolEncode, OpenProtocolDecode)]
33pub struct Header {
34 #[open_protocol_field(length = 4)]
35 pub length: u16,
36 #[open_protocol_field(length = 4)]
37 pub mid: u16,
38 #[open_protocol_field(length = 3)]
39 pub revision: Option<u16>,
40 #[open_protocol_field(length = 1)]
41 pub no_ack_flag: Option<bool>,
42 #[open_protocol_field(length = 2)]
43 pub station_id: Option<u8>,
44 #[open_protocol_field(length = 2)]
45 pub spindle_id: Option<u8>,
46 #[open_protocol_field(length = 2)]
47 pub sequence_number: Option<u8>,
48 #[open_protocol_field(length = 1)]
49 pub message_parts: Option<u8>,
50 #[open_protocol_field(length = 1)]
51 pub message_part_number: Option<u8>
52}
53
54impl Header {
55 pub fn revision_number(&self) -> u16 {
56 match self.revision {
57 None => 1,
58 Some(0) => 1,
59 Some(1) => 1,
60 Some(n) => n
61 }
62 }
63}
64
65open_protocol_messages!(
66 MID 9998 revision 1: link_communication::MID9998rev1,
67 MID 9997 revision 1: link_communication::MID9997rev1,
68
69 MID 0001 revision 1: communication::MID0001rev7,
70 MID 0001 revision 7: communication::MID0001rev7,
71 MID 0002 revision 1: communication::MID0002rev1,
72 MID 0002 revision 2: communication::MID0002rev2,
73 MID 0002 revision 3: communication::MID0002rev3,
74 MID 0002 revision 4: communication::MID0002rev4,
75 MID 0002 revision 5: communication::MID0002rev5,
76 MID 0002 revision 6: communication::MID0002rev6,
77 MID 0002 revision 7: communication::MID0002rev7,
78 MID 0003 revision 1: communication::MID0003rev1,
79 MID 0004 revision 1: communication::MID0004rev1,
80 MID 0004 revision 2: communication::MID0004rev2,
81 MID 0005 revision 1: communication::MID0005rev1,
82 MID 0006 revision 1: communication::MID0006rev1,
83 MID 0008 revision 1: communication::MID0008rev1,
84 MID 0009 revision 1: communication::MID0009rev1,
85
86 MID 0010 revision 1: parameter_set::MID0010rev1,
87 MID 0011 revision 1: parameter_set::MID0011rev1,
88 MID 0011 revision 2: parameter_set::MID0011rev2,
89 MID 0011 revision 3: parameter_set::MID0011rev3,
90 MID 0011 revision 4: parameter_set::MID0011rev4,
91 MID 0012 revision 1: parameter_set::MID0012rev1,
92 MID 0013 revision 1: parameter_set::MID0013rev1,
93 MID 0013 revision 2: parameter_set::MID0013rev2,
94 MID 0014 revision 1: parameter_set::MID0014rev1,
95 MID 0015 revision 1: parameter_set::MID0015rev1,
96 MID 0015 revision 2: parameter_set::MID0015rev2,
97 MID 0016 revision 1: parameter_set::MID0016rev1,
98 MID 0017 revision 1: parameter_set::MID0017rev1,
99 MID 0018 revision 1: parameter_set::MID0018rev1,
100 MID 0019 revision 1: parameter_set::MID0019rev1,
101 MID 0019 revision 2: parameter_set::MID0019rev2,
102 MID 0020 revision 1: parameter_set::MID0020rev1,
103 MID 0021 revision 1: parameter_set::MID0021rev1,
104 MID 0022 revision 1: parameter_set::MID0022rev1,
105
106 MID 2600 revision 1: mode::MID2600rev1,
107 MID 2601 revision 1: mode::MID2601rev1,
108 MID 2602 revision 1: mode::MID2602rev1,
109 MID 2603 revision 1: mode::MID2603rev1,
110 MID 2604 revision 1: mode::MID2604rev1,
111 MID 2605 revision 1: mode::MID2605rev1,
112 MID 2606 revision 1: mode::MID2606rev1,
113
114 MID 0030 revision 1: job::MID0030rev1,
115 MID 0031 revision 1: job::MID0031rev1,
116 MID 0031 revision 2: job::MID0031rev2,
117 MID 0032 revision 1: job::MID0032rev1,
118 MID 0032 revision 2: job::MID0032rev2,
119 MID 0033 revision 1: job::MID0033rev1,
120 MID 0034 revision 1: job::MID0034rev1,
121 MID 0035 revision 1: job::MID0035rev1,
122 MID 0036 revision 1: job::MID0036rev1,
123 MID 0037 revision 1: job::MID0037rev1,
124 MID 0038 revision 1: job::MID0038rev1,
125 MID 0038 revision 2: job::MID0038rev2,
126 MID 0039 revision 1: job::MID0039rev1,
127 MID 0039 revision 2: job::MID0039rev2,
128
129 MID 0040 revision 6: tool::MID0040rev6,
130 MID 0041 revision 1: tool::MID0041rev1,
131 MID 0041 revision 2: tool::MID0041rev2,
132 MID 0042 revision 2: tool::MID0042rev2,
133 MID 0043 revision 2: tool::MID0043rev2,
134 MID 0044 revision 1: tool::MID0044rev1,
135 MID 0045 revision 1: tool::MID0045rev1,
136 MID 0045 revision 2: tool::MID0045rev2,
137 MID 0046 revision 1: tool::MID0046rev1,
138 MID 0047 revision 1: tool::MID0047rev1,
139 MID 0048 revision 1: tool::MID0048rev1,
140
141 MID 0050 revision 1: vin::MID0050rev1,
142 MID 0051 revision 1: vin::MID0051rev1,
143 MID 0052 revision 1: vin::MID0052rev1,
144 MID 0052 revision 2: vin::MID0052rev2,
145 MID 0053 revision 1: vin::MID0053rev1,
146 MID 0054 revision 1: vin::MID0054rev1,
147 MID 0054 revision 2: vin::MID0054rev2,
148
149 MID 0060 revision 1: tightening_result::MID0060rev1,
150 MID 0061 revision 1: tightening_result::MID0061rev1,
151 MID 0061 revision 2: tightening_result::MID0061rev2,
152 MID 0061 revision 3: tightening_result::MID0061rev3,
153 MID 0062 revision 1: tightening_result::MID0062rev1,
154 MID 0063 revision 1: tightening_result::MID0063rev1,
155 MID 0064 revision 1: tightening_result::MID0064rev1,
156 MID 0065 revision 1: tightening_result::MID0065rev1,
157 MID 0066 revision 1: tightening_result::MID0066rev1,
158 MID 0066 revision 2: tightening_result::MID0066rev2,
159 MID 0067 revision 1: tightening_result::MID0067rev1,
160 MID 0900 revision 1: tightening_result::MID0900rev1,
161 MID 0900 revision 2: tightening_result::MID0900rev2,
162 MID 0900 revision 3: tightening_result::MID0900rev3,
163 MID 0901 revision 1: tightening_result::MID0901rev1,
164 MID 0901 revision 2: tightening_result::MID0901rev2,
165 MID 0901 revision 3: tightening_result::MID0901rev3,
166 MID 0902 revision 1: tightening_result::MID0902rev1,
167
168 MID 1201 revision 1: result::MID1201rev1,
169 MID 1201 revision 2: result::MID1201rev2,
170 MID 1201 revision 3: result::MID1201rev3,
171 MID 1202 revision 1: result::MID1202rev1,
172 MID 1202 revision 2: result::MID1202rev2,
173 MID 1203 revision 1: result::MID1203rev1,
174
175 MID 0070 revision 1: alarm::MID0070rev1,
176 MID 0071 revision 1: alarm::MID0071rev1,
177 MID 0072 revision 1: alarm::MID0072rev1,
178 MID 0073 revision 1: alarm::MID0073rev1,
179 MID 0074 revision 1: alarm::MID0074rev1,
180 MID 0075 revision 1: alarm::MID0075rev1,
181 MID 0076 revision 1: alarm::MID0076rev1,
182 MID 0077 revision 1: alarm::MID0077rev1,
183 MID 0078 revision 1: alarm::MID0078rev1,
184 MID 1000 revision 1: alarm::MID1000rev1,
185 MID 1001 revision 1: alarm::MID1001rev1,
186
187 MID 0080 revision 1: time::MID0080rev1,
188 MID 0081 revision 1: time::MID0081rev1,
189 MID 0082 revision 1: time::MID0082rev1,
190
191 MID 0090 revision 1: multi_spindle_status::MID0090rev1,
192 MID 0091 revision 1: multi_spindle_status::MID0091rev1,
193 MID 0092 revision 1: multi_spindle_status::MID0092rev1,
194 MID 0093 revision 1: multi_spindle_status::MID0093rev1,
195
196 MID 0100 revision 1: multi_spindle_result::MID0100rev1,
197 MID 0101 revision 1: multi_spindle_result::MID0101rev1,
198 MID 0102 revision 1: multi_spindle_result::MID0102rev1,
199 MID 0103 revision 1: multi_spindle_result::MID0103rev1,
200 MID 0104 revision 1: multi_spindle_result::MID0104rev1,
201
202 MID 0105 revision 1: powermacs_result::MID0105rev1,
203 MID 0106 revision 1: powermacs_result::MID0106rev1,
204 MID 0107 revision 1: powermacs_result::MID0107rev1,
205 MID 0108 revision 1: powermacs_result::MID0108rev1,
206 MID 0109 revision 1: powermacs_result::MID0109rev1,
207
208 MID 0110 revision 1: user_interface::MID0110rev1,
209 MID 0111 revision 1: user_interface::MID0111rev1,
210 MID 0113 revision 1: user_interface::MID0113rev1,
211
212 MID 9999 revision 1: keep_alive::MID9999rev1,
226);
227
228#[cfg(test)]
229mod tests {
230 use open_protocol_codec::{encode, decode};
231 use open_protocol_codec::encode::Encoder;
232 use super::*;
233
234 #[test]
235 fn parse_header() {
236 let header_packet = "00530071 ";
237
238 let result = Header::decode(&mut header_packet.into());
239
240 assert_eq!(result, Ok(Header { length: 53, mid: 71, ..Default::default() }));
241 }
242
243 #[test]
244 fn parse_header_small() {
245 let header_packet = "00530071";
246
247 let result = Header::decode(&mut header_packet.into());
248
249 assert_eq!(result, Err(decode::Error::OutOfRightBound { request: 11, size: 8 }));
250 }
251
252 #[test]
253 fn write_header() {
254 let header = Header { length: 53, mid: 71, revision: Some(7), ..Default::default() };
255
256 let result = encode::encode(&header);
257
258 assert_eq!(result, Ok("00530071007 ".to_string()));
259 }
260
261 #[test]
262 fn read_payload() {
263 let packet = "00380011001 005001002003010020\0";
264 let (header, payload) = Message::decode_message(&mut packet.into()).unwrap();
265
266 assert_eq!(header, Header {
267 length: 38,
268 mid: 11,
269 revision: Some(1),
270 no_ack_flag: None,
271 station_id: None,
272 spindle_id: None,
273 sequence_number: None,
274 message_parts: None,
275 message_part_number: None
276 });
277
278 assert_eq!(payload.mid_revision(), (11, 1));
279
280 assert_eq!(payload, Message::MID0011rev1(parameter_set::MID0011rev1 {
281 number_of_parameter_sets: 5,
282 parameter_set_ids: vec![1, 2, 3, 10, 20]
283 }));
284 }
285
286 #[test]
287 fn encode_payload() {
288 let payload = Message::MID0011rev1(parameter_set::MID0011rev1 {
289 number_of_parameter_sets: 5,
290 parameter_set_ids: vec![1, 2, 3, 10, 20]
291 });
292
293 let mut encoder = Encoder::new();
294 payload.encode_payload(&mut encoder).unwrap();
295 let packet = encoder.to_string();
296
297 assert_eq!(packet, "005001002003010020");
298 }
299}