open_protocol/
lib.rs

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    // job_advanced;
213    // multiple_identifiers;
214    // io_interface;
215    // plc_user_data;
216    // selector;
217    // tool_location_system;
218    // controller;
219    // statistic;
220    // automatic_manual_mode;
221    // open_protocol_commands_disabled;
222    // audi;
223    // motor_turning;
224
225    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}