1use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
2use std::io::{self, Read, Write};
3
4use crate::error::TryIntoError;
5use crate::proto::ads_state::AdsState;
6use crate::proto::ads_transition_mode::AdsTransMode;
7use crate::proto::command_id::CommandID;
8use crate::proto::proto_traits::{Command, ReadFrom, WriteTo};
9use std::convert::TryInto;
10
11#[derive(Debug, PartialEq, Eq, Clone)]
20pub enum Request {
21 Invalid(InvalidRequest),
22 ReadDeviceInfo(ReadDeviceInfoRequest),
23 ReadState(ReadStateRequest),
24 Read(ReadRequest),
25 Write(WriteRequest),
26 WriteControl(WriteControlRequest),
27 AddDeviceNotification(AddDeviceNotificationRequest),
28 DeleteDeviceNotification(DeleteDeviceNotificationRequest),
29 DeviceNotification(DeviceNotificationRequest),
30 ReadWrite(ReadWriteRequest),
31}
32
33impl WriteTo for Request {
34 fn write_to<W: Write>(&self, wtr: W) -> io::Result<()> {
35 match self {
36 Request::Invalid(_) => Ok(()),
37 Request::ReadDeviceInfo(_) => Ok(()),
38 Request::ReadState(_) => Ok(()),
39 Request::Read(r) => r.write_to(wtr),
40 Request::Write(r) => r.write_to(wtr),
41 Request::ReadWrite(r) => r.write_to(wtr),
42 Request::AddDeviceNotification(r) => r.write_to(wtr),
43 Request::WriteControl(r) => r.write_to(wtr),
44 Request::DeviceNotification(_) => Ok(()),
45 Request::DeleteDeviceNotification(r) => r.write_to(wtr),
46 }
47 }
48}
49
50impl Command for Request {
51 fn command_id(&self) -> CommandID {
52 match self {
53 Request::Invalid(r) => r.command_id,
54 Request::ReadDeviceInfo(r) => r.command_id,
55 Request::ReadState(r) => r.command_id,
56 Request::Read(r) => r.command_id,
57 Request::Write(r) => r.command_id,
58 Request::ReadWrite(r) => r.command_id,
59 Request::AddDeviceNotification(r) => r.command_id,
60 Request::WriteControl(r) => r.command_id,
61 Request::DeviceNotification(r) => r.command_id,
62 Request::DeleteDeviceNotification(r) => r.command_id,
63 }
64 }
65}
66
67impl From<InvalidRequest> for Request {
68 fn from(request: InvalidRequest) -> Self {
69 Request::Invalid(request)
70 }
71}
72
73impl TryInto<InvalidRequest> for Request {
74 type Error = TryIntoError;
75
76 fn try_into(self) -> Result<InvalidRequest, Self::Error> {
77 match self {
78 Request::Invalid(r) => Ok(r),
79 _ => Err(TryIntoError::TryIntoRequestFailed),
80 }
81 }
82}
83
84impl From<ReadDeviceInfoRequest> for Request {
85 fn from(request: ReadDeviceInfoRequest) -> Self {
86 Request::ReadDeviceInfo(request)
87 }
88}
89
90impl TryInto<ReadDeviceInfoRequest> for Request {
91 type Error = TryIntoError;
92
93 fn try_into(self) -> Result<ReadDeviceInfoRequest, Self::Error> {
94 match self {
95 Request::ReadDeviceInfo(r) => Ok(r),
96 _ => Err(TryIntoError::TryIntoRequestFailed),
97 }
98 }
99}
100
101impl From<ReadStateRequest> for Request {
102 fn from(request: ReadStateRequest) -> Self {
103 Request::ReadState(request)
104 }
105}
106
107impl TryInto<ReadStateRequest> for Request {
108 type Error = TryIntoError;
109
110 fn try_into(self) -> Result<ReadStateRequest, Self::Error> {
111 match self {
112 Request::ReadState(r) => Ok(r),
113 _ => Err(TryIntoError::TryIntoRequestFailed),
114 }
115 }
116}
117
118impl From<ReadRequest> for Request {
119 fn from(request: ReadRequest) -> Self {
120 Request::Read(request)
121 }
122}
123
124impl TryInto<ReadRequest> for Request {
125 type Error = TryIntoError;
126
127 fn try_into(self) -> Result<ReadRequest, Self::Error> {
128 match self {
129 Request::Read(r) => Ok(r),
130 _ => Err(TryIntoError::TryIntoRequestFailed),
131 }
132 }
133}
134
135impl From<WriteRequest> for Request {
136 fn from(request: WriteRequest) -> Self {
137 Request::Write(request)
138 }
139}
140
141impl TryInto<WriteRequest> for Request {
142 type Error = TryIntoError;
143
144 fn try_into(self) -> Result<WriteRequest, Self::Error> {
145 match self {
146 Request::Write(r) => Ok(r),
147 _ => Err(TryIntoError::TryIntoRequestFailed),
148 }
149 }
150}
151
152impl From<WriteControlRequest> for Request {
153 fn from(request: WriteControlRequest) -> Self {
154 Request::WriteControl(request)
155 }
156}
157
158impl TryInto<WriteControlRequest> for Request {
159 type Error = TryIntoError;
160
161 fn try_into(self) -> Result<WriteControlRequest, Self::Error> {
162 match self {
163 Request::WriteControl(r) => Ok(r),
164 _ => Err(TryIntoError::TryIntoRequestFailed),
165 }
166 }
167}
168
169impl From<AddDeviceNotificationRequest> for Request {
170 fn from(request: AddDeviceNotificationRequest) -> Self {
171 Request::AddDeviceNotification(request)
172 }
173}
174
175impl TryInto<AddDeviceNotificationRequest> for Request {
176 type Error = TryIntoError;
177
178 fn try_into(self) -> Result<AddDeviceNotificationRequest, Self::Error> {
179 match self {
180 Request::AddDeviceNotification(r) => Ok(r),
181 _ => Err(TryIntoError::TryIntoRequestFailed),
182 }
183 }
184}
185
186impl From<DeleteDeviceNotificationRequest> for Request {
187 fn from(request: DeleteDeviceNotificationRequest) -> Self {
188 Request::DeleteDeviceNotification(request)
189 }
190}
191
192impl TryInto<DeleteDeviceNotificationRequest> for Request {
193 type Error = TryIntoError;
194
195 fn try_into(self) -> Result<DeleteDeviceNotificationRequest, Self::Error> {
196 match self {
197 Request::DeleteDeviceNotification(r) => Ok(r),
198 _ => Err(TryIntoError::TryIntoRequestFailed),
199 }
200 }
201}
202
203impl From<DeviceNotificationRequest> for Request {
204 fn from(request: DeviceNotificationRequest) -> Self {
205 Request::DeviceNotification(request)
206 }
207}
208
209impl TryInto<DeviceNotificationRequest> for Request {
210 type Error = TryIntoError;
211
212 fn try_into(self) -> Result<DeviceNotificationRequest, Self::Error> {
213 match self {
214 Request::DeviceNotification(r) => Ok(r),
215 _ => Err(TryIntoError::TryIntoRequestFailed),
216 }
217 }
218}
219
220impl From<ReadWriteRequest> for Request {
221 fn from(request: ReadWriteRequest) -> Self {
222 Request::ReadWrite(request)
223 }
224}
225
226impl TryInto<ReadWriteRequest> for Request {
227 type Error = TryIntoError;
228
229 fn try_into(self) -> Result<ReadWriteRequest, Self::Error> {
230 match self {
231 Request::ReadWrite(r) => Ok(r),
232 _ => Err(TryIntoError::TryIntoRequestFailed),
233 }
234 }
235}
236
237#[derive(Debug, Clone, PartialEq, Eq)]
239pub struct InvalidRequest {
240 command_id: CommandID,
241}
242
243impl InvalidRequest {
244 pub fn new() -> Self {
245 InvalidRequest {
246 command_id: CommandID::Invalid,
247 }
248 }
249}
250
251impl Default for InvalidRequest {
252 fn default() -> Self {
253 Self::new()
254 }
255}
256
257#[derive(Debug, Clone, PartialEq, Eq)]
259pub struct ReadDeviceInfoRequest {
260 command_id: CommandID,
261}
262
263impl ReadDeviceInfoRequest {
264 pub fn new() -> Self {
265 ReadDeviceInfoRequest {
266 command_id: CommandID::ReadDeviceInfo,
267 }
268 }
269}
270
271impl Default for ReadDeviceInfoRequest {
272 fn default() -> Self {
273 Self::new()
274 }
275}
276
277#[derive(Debug, Clone, PartialEq, Eq)]
279pub struct ReadStateRequest {
280 command_id: CommandID,
281}
282
283impl ReadStateRequest {
284 pub fn new() -> Self {
285 ReadStateRequest {
286 command_id: CommandID::ReadState,
287 }
288 }
289}
290
291impl Default for ReadStateRequest {
292 fn default() -> Self {
293 Self::new()
294 }
295}
296
297#[derive(Debug, Clone, PartialEq, Eq)]
299pub struct DeviceNotificationRequest {
300 command_id: CommandID,
301}
302
303impl DeviceNotificationRequest {
304 pub fn new() -> Self {
305 DeviceNotificationRequest {
306 command_id: CommandID::DeviceNotification,
307 }
308 }
309}
310
311impl Default for DeviceNotificationRequest {
312 fn default() -> Self {
313 Self::new()
314 }
315}
316
317#[derive(Debug, Clone, PartialEq, Eq)]
319pub struct ReadRequest {
320 pub index_group: u32,
321 pub index_offset: u32,
322 pub length: u32,
323 pub command_id: CommandID,
324}
325
326impl ReadRequest {
327 pub fn new(index_group: u32, index_offset: u32, length: u32) -> Self {
328 ReadRequest {
329 index_group,
330 index_offset,
331 length,
332 command_id: CommandID::Read,
333 }
334 }
335}
336
337impl WriteTo for ReadRequest {
338 fn write_to<W: Write>(&self, mut wtr: W) -> io::Result<()> {
339 wtr.write_u32::<LittleEndian>(self.index_group)?;
340 wtr.write_u32::<LittleEndian>(self.index_offset)?;
341 wtr.write_u32::<LittleEndian>(self.length)?;
342 Ok(())
343 }
344}
345
346impl ReadFrom for ReadRequest {
347 fn read_from<R: Read>(read: &mut R) -> io::Result<Self> {
348 Ok(ReadRequest {
349 index_group: read.read_u32::<LittleEndian>()?,
350 index_offset: read.read_u32::<LittleEndian>()?,
351 length: read.read_u32::<LittleEndian>()?,
352 command_id: CommandID::Read,
353 })
354 }
355}
356
357#[derive(Debug, Clone, PartialEq, Eq)]
359pub struct WriteRequest {
360 pub index_group: u32,
361 pub index_offset: u32,
362 pub length: u32,
363 pub data: Vec<u8>,
364 pub command_id: CommandID,
365}
366
367impl WriteRequest {
368 pub fn new(index_group: u32, index_offset: u32, data: Vec<u8>) -> Self {
369 WriteRequest {
370 index_group,
371 index_offset,
372 length: data.len() as u32,
373 data,
374 command_id: CommandID::Write,
375 }
376 }
377}
378
379impl WriteTo for WriteRequest {
380 fn write_to<W: Write>(&self, mut wtr: W) -> io::Result<()> {
381 wtr.write_u32::<LittleEndian>(self.index_group)?;
382 wtr.write_u32::<LittleEndian>(self.index_offset)?;
383 wtr.write_u32::<LittleEndian>(self.length)?;
384 wtr.write_all(self.data.as_slice())?;
385 Ok(())
386 }
387}
388
389impl ReadFrom for WriteRequest {
390 fn read_from<R: Read>(read: &mut R) -> io::Result<Self> {
391 let index_group = read.read_u32::<LittleEndian>()?;
392 let index_offset = read.read_u32::<LittleEndian>()?;
393 let length = read.read_u32::<LittleEndian>()?;
394 let mut data: Vec<u8> = Vec::with_capacity(length as usize);
395 read.read_to_end(&mut data)?;
396
397 Ok(WriteRequest {
398 index_group,
399 index_offset,
400 length,
401 data,
402 command_id: CommandID::Write,
403 })
404 }
405}
406
407#[derive(Debug, Clone, PartialEq, Eq)]
409pub struct WriteControlRequest {
410 pub ads_state: AdsState,
411 pub device_state: u16,
412 pub length: u32,
413 pub data: Vec<u8>,
414 pub command_id: CommandID,
415}
416
417impl WriteControlRequest {
418 pub fn new(ads_state: AdsState, device_state: u16, length: u32, data: Vec<u8>) -> Self {
419 WriteControlRequest {
420 ads_state,
421 device_state,
422 length,
423 data,
424 command_id: CommandID::WriteControl,
425 }
426 }
427}
428
429impl WriteTo for WriteControlRequest {
430 fn write_to<W: Write>(&self, mut wtr: W) -> io::Result<()> {
431 self.ads_state.write_to(&mut wtr)?;
432 wtr.write_u16::<LittleEndian>(self.device_state)?;
433 wtr.write_u32::<LittleEndian>(self.length)?;
434 wtr.write_all(self.data.as_slice())?;
435 Ok(())
436 }
437}
438
439impl ReadFrom for WriteControlRequest {
440 fn read_from<R: Read>(read: &mut R) -> io::Result<Self> {
441 let ads_state = AdsState::read_from(read)?;
442 let device_state = read.read_u16::<LittleEndian>()?;
443 let length = read.read_u32::<LittleEndian>()?;
444 let mut data: Vec<u8> = Vec::with_capacity(length as usize);
445 read.read_to_end(&mut data)?;
446 Ok(WriteControlRequest {
447 ads_state,
448 device_state,
449 length,
450 data,
451 command_id: CommandID::WriteControl,
452 })
453 }
454}
455
456#[derive(Debug, PartialEq, Clone, Eq)]
458pub struct AddDeviceNotificationRequest {
459 pub index_group: u32,
460 pub index_offset: u32,
461 pub length: u32,
462 pub transmission_mode: AdsTransMode,
463 pub max_delay: u32,
464 pub cycle_time: u32,
465 pub reserved: [u8; 16],
466 pub command_id: CommandID,
467}
468
469impl AddDeviceNotificationRequest {
470 pub fn new(
471 index_group: u32,
472 index_offset: u32,
473 length: u32,
474 transmission_mode: AdsTransMode,
475 max_delay: u32,
476 cycle_time: u32,
477 ) -> Self {
478 AddDeviceNotificationRequest {
479 index_group,
480 index_offset,
481 length,
482 transmission_mode,
483 max_delay,
484 cycle_time,
485 reserved: [0; 16],
486 command_id: CommandID::AddDeviceNotification,
487 }
488 }
489}
490
491impl WriteTo for AddDeviceNotificationRequest {
492 fn write_to<W: Write>(&self, mut wtr: W) -> io::Result<()> {
493 wtr.write_u32::<LittleEndian>(self.index_group)?;
494 wtr.write_u32::<LittleEndian>(self.index_offset)?;
495 wtr.write_u32::<LittleEndian>(self.length)?;
496 self.transmission_mode.write_to(&mut wtr)?;
497 wtr.write_u32::<LittleEndian>(self.max_delay)?;
498 wtr.write_u32::<LittleEndian>(self.cycle_time)?;
499 wtr.write_all(&self.reserved)?;
500 Ok(())
501 }
502}
503
504impl ReadFrom for AddDeviceNotificationRequest {
505 fn read_from<R: Read>(read: &mut R) -> io::Result<Self> {
506 Ok(AddDeviceNotificationRequest {
507 index_group: read.read_u32::<LittleEndian>()?,
508 index_offset: read.read_u32::<LittleEndian>()?,
509 length: read.read_u32::<LittleEndian>()?,
510 transmission_mode: AdsTransMode::read_from(read)?,
511 max_delay: read.read_u32::<LittleEndian>()?,
512 cycle_time: read.read_u32::<LittleEndian>()?,
513 reserved: [0; 16],
514 command_id: CommandID::AddDeviceNotification,
515 })
516 }
517}
518
519#[derive(Debug, Clone, PartialEq, Eq)]
521pub struct DeleteDeviceNotificationRequest {
522 pub handle: u32,
523 pub command_id: CommandID,
524}
525
526impl WriteTo for DeleteDeviceNotificationRequest {
527 fn write_to<W: Write>(&self, mut wtr: W) -> io::Result<()> {
528 wtr.write_u32::<LittleEndian>(self.handle)?;
529 Ok(())
530 }
531}
532
533impl ReadFrom for DeleteDeviceNotificationRequest {
534 fn read_from<R: Read>(read: &mut R) -> io::Result<Self> {
535 Ok(DeleteDeviceNotificationRequest {
536 handle: read.read_u32::<LittleEndian>()?,
537 command_id: CommandID::DeleteDeviceNotification,
538 })
539 }
540}
541
542impl DeleteDeviceNotificationRequest {
543 pub fn new(handle: u32) -> Self {
544 DeleteDeviceNotificationRequest {
545 handle,
546 command_id: CommandID::DeleteDeviceNotification,
547 }
548 }
549}
550
551#[derive(Debug, Clone, PartialEq, Eq)]
553pub struct ReadWriteRequest {
554 pub index_group: u32,
555 pub index_offset: u32,
556 pub read_length: u32,
557 pub write_length: u32,
558 pub data: Vec<u8>,
559 pub command_id: CommandID,
560}
561
562impl ReadWriteRequest {
563 pub fn new(index_group: u32, index_offset: u32, read_length: u32, data: Vec<u8>) -> Self {
564 ReadWriteRequest {
565 index_group,
566 index_offset,
567 read_length,
568 write_length: data.len() as u32,
569 data,
570 command_id: CommandID::ReadWrite,
571 }
572 }
573}
574
575impl WriteTo for ReadWriteRequest {
576 fn write_to<W: Write>(&self, mut wtr: W) -> io::Result<()> {
577 wtr.write_u32::<LittleEndian>(self.index_group)?;
578 wtr.write_u32::<LittleEndian>(self.index_offset)?;
579 wtr.write_u32::<LittleEndian>(self.read_length)?;
580 wtr.write_u32::<LittleEndian>(self.write_length)?;
581 wtr.write_all(self.data.as_slice())?;
582 Ok(())
583 }
584}
585
586impl ReadFrom for ReadWriteRequest {
587 fn read_from<R: Read>(read: &mut R) -> io::Result<Self> {
588 let index_group = read.read_u32::<LittleEndian>()?;
589 let index_offset = read.read_u32::<LittleEndian>()?;
590 let read_length = read.read_u32::<LittleEndian>()?;
591 let write_length = read.read_u32::<LittleEndian>()?;
592 let mut data: Vec<u8> = vec![0; write_length as usize];
593 read.read_exact(&mut data)?;
594
595 Ok(ReadWriteRequest {
596 index_group,
597 index_offset,
598 read_length,
599 write_length,
600 data,
601 command_id: CommandID::ReadWrite,
602 })
603 }
604}
605
606#[cfg(test)]
607mod tests {
608 use super::*;
609
610 #[test]
611 fn request_from_invalid() {
612 let invalid_request = InvalidRequest::new();
613
614 assert_eq!(
615 Request::Invalid(invalid_request.clone()),
616 Request::from(invalid_request)
617 );
618 }
619
620 #[test]
621 fn request_try_into_invalid() {
622 let invalid_request = InvalidRequest::new();
623
624 let request = Request::Invalid(invalid_request.clone());
625 let test = request.try_into().unwrap();
626
627 assert_eq!(invalid_request, test);
628 }
629
630 #[test]
631 fn request_from_read_device_info() {
632 let read_device_info_request = ReadDeviceInfoRequest::new();
633
634 assert_eq!(
635 Request::ReadDeviceInfo(read_device_info_request.clone()),
636 Request::from(read_device_info_request)
637 );
638 }
639
640 #[test]
641 fn request_try_into_read_device_info() {
642 let read_device_info_request = ReadDeviceInfoRequest::new();
643
644 let request = Request::ReadDeviceInfo(read_device_info_request.clone());
645 let test = request.try_into().unwrap();
646
647 assert_eq!(read_device_info_request, test);
648 }
649
650 #[test]
651 fn request_from_read_state() {
652 let read_state_request = ReadStateRequest::new();
653
654 assert_eq!(
655 Request::ReadState(read_state_request.clone()),
656 Request::from(read_state_request)
657 );
658 }
659
660 #[test]
661 fn request_try_into_read_state() {
662 let read_state_request = ReadStateRequest::new();
663
664 let request = Request::ReadState(read_state_request.clone());
665 let test = request.try_into().unwrap();
666
667 assert_eq!(read_state_request, test);
668 }
669
670 #[test]
671 fn request_from_read() {
672 let read_request = ReadRequest::new(1, 1, 1);
673
674 assert_eq!(
675 Request::Read(read_request.clone()),
676 Request::from(read_request)
677 );
678 }
679
680 #[test]
681 fn request_try_into_read() {
682 let read_request = ReadRequest::new(1, 1, 1);
683
684 let request = Request::Read(read_request.clone());
685 let test = request.try_into().unwrap();
686
687 assert_eq!(read_request, test);
688 }
689
690 #[test]
691 fn request_from_write() {
692 let write_request = WriteRequest::new(1, 1, vec![88]);
693
694 assert_eq!(
695 Request::Write(write_request.clone()),
696 Request::from(write_request)
697 );
698 }
699
700 #[test]
701 fn request_try_into_write() {
702 let write_request = WriteRequest::new(1, 1, vec![88]);
703 let request = Request::Write(write_request.clone());
704 let test = request.try_into().unwrap();
705
706 assert_eq!(write_request, test);
707 }
708
709 #[test]
710 fn request_from_write_control() {
711 let write_control_request =
712 WriteControlRequest::new(AdsState::AdsStateConfig, 1, 1, vec![88]);
713
714 assert_eq!(
715 Request::WriteControl(write_control_request.clone()),
716 Request::from(write_control_request)
717 );
718 }
719
720 #[test]
721 fn request_try_into_write_control() {
722 let write_control_request =
723 WriteControlRequest::new(AdsState::AdsStateConfig, 1, 1, vec![88]);
724 let request = Request::WriteControl(write_control_request.clone());
725 let test = request.try_into().unwrap();
726
727 assert_eq!(write_control_request, test);
728 }
729
730 #[test]
731 fn request_from_add_device_notification() {
732 let add_device_notification_request =
733 AddDeviceNotificationRequest::new(1, 1, 1, AdsTransMode::Cyclic, 1, 1);
734
735 assert_eq!(
736 Request::AddDeviceNotification(add_device_notification_request.clone()),
737 Request::from(add_device_notification_request)
738 );
739 }
740
741 #[test]
742 fn request_try_into_add_device_notification() {
743 let add_device_notification_request =
744 AddDeviceNotificationRequest::new(1, 1, 1, AdsTransMode::Cyclic, 1, 1);
745
746 let request = Request::AddDeviceNotification(add_device_notification_request.clone());
747 let test = request.try_into().unwrap();
748
749 assert_eq!(add_device_notification_request, test);
750 }
751
752 #[test]
753 fn request_from_delete_device_notification() {
754 let delete_device_notification_request = DeleteDeviceNotificationRequest::new(1);
755
756 assert_eq!(
757 Request::DeleteDeviceNotification(delete_device_notification_request.clone()),
758 Request::from(delete_device_notification_request)
759 );
760 }
761
762 #[test]
763 fn request_try_into_delete_device_notification() {
764 let delete_device_notification_request = DeleteDeviceNotificationRequest::new(1);
765
766 let request = Request::DeleteDeviceNotification(delete_device_notification_request.clone());
767 let test = request.try_into().unwrap();
768
769 assert_eq!(delete_device_notification_request, test);
770 }
771
772 #[test]
773 fn request_from_device_notification() {
774 let device_notification_request = DeviceNotificationRequest::new();
775
776 assert_eq!(
777 Request::DeviceNotification(device_notification_request.clone()),
778 Request::from(device_notification_request)
779 );
780 }
781
782 #[test]
783 fn request_try_into_device_notification() {
784 let device_notification_request = DeviceNotificationRequest::new();
785
786 let request = Request::DeviceNotification(device_notification_request.clone());
787 let test = request.try_into().unwrap();
788
789 assert_eq!(device_notification_request, test);
790 }
791
792 #[test]
793 fn request_from_read_write() {
794 let read_write_request = ReadWriteRequest::new(1, 1, 1, vec![85]);
795
796 assert_eq!(
797 Request::ReadWrite(read_write_request.clone()),
798 Request::from(read_write_request)
799 );
800 }
801
802 #[test]
803 fn request_try_into_read_write() {
804 let read_write_request = ReadWriteRequest::new(1, 1, 1, vec![85]);
805
806 let request = Request::ReadWrite(read_write_request.clone());
807 let test = request.try_into().unwrap();
808
809 assert_eq!(read_write_request, test);
810 }
811
812 #[test]
813 fn read_request_test() {
814 let mut buffer: Vec<u8> = Vec::new();
815 Request::Read(ReadRequest::new(259, 259, 4))
816 .write_to(&mut buffer)
817 .unwrap();
818
819 let compare: Vec<u8> = vec![3, 1, 0, 0, 3, 1, 0, 0, 4, 0, 0, 0];
820 assert_eq!(compare, buffer);
821 }
822
823 #[test]
824 fn read_request_read_from_test() {
825 let reader: Vec<u8> = vec![3, 1, 0, 0, 3, 1, 0, 0, 4, 0, 0, 0];
826 let request = ReadRequest::read_from(&mut reader.as_slice()).unwrap();
827
828 let compare = ReadRequest::new(259, 259, 4);
829 assert_eq!(request.index_group, compare.index_group);
830 assert_eq!(request.index_offset, compare.index_offset);
831 assert_eq!(request.length, compare.length);
832 }
833
834 #[test]
835 fn write_uint_request_test() {
836 let mut buffer: Vec<u8> = Vec::new();
837 let data: u32 = 12000;
838 Request::Write(WriteRequest::new(259, 259, data.to_le_bytes().to_vec()))
839 .write_to(&mut buffer)
840 .unwrap();
841
842 let compare: Vec<u8> = vec![3, 1, 0, 0, 3, 1, 0, 0, 4, 0, 0, 0, 224, 46, 0, 0];
843 assert_eq!(compare, buffer);
844 }
845
846 #[test]
847 fn write_float_request_test() {
848 let mut buffer: Vec<u8> = Vec::new();
849 let data: f32 = 12000.33;
850 Request::Write(WriteRequest::new(259, 259, data.to_le_bytes().to_vec()))
851 .write_to(&mut buffer)
852 .unwrap();
853
854 let compare: Vec<u8> = vec![3, 1, 0, 0, 3, 1, 0, 0, 4, 0, 0, 0, 82, 129, 59, 70];
855 assert_eq!(compare, buffer);
856 }
857
858 #[test]
859 fn write_request_read_from_test() {
860 let reader: Vec<u8> = vec![4, 1, 0, 0, 4, 1, 0, 0, 4, 0, 0, 0, 225, 46, 0, 0];
861 let request = WriteRequest::read_from(&mut reader.as_slice()).unwrap();
862 let data_value: u32 = 12001;
863 let data = data_value.to_le_bytes();
864 let compare = WriteRequest::new(260, 260, data.to_vec());
865
866 assert_eq!(
867 request.index_group, compare.index_group,
868 "Wrong index group"
869 );
870 assert_eq!(
871 request.index_offset, compare.index_offset,
872 "Wrong index offset"
873 );
874 assert_eq!(request.length, compare.length, "Wrong length");
875 assert_eq!(request.data, data, "Data not as expected");
876 }
877
878 #[test]
879 fn write_control_request_test() {
880 let mut buffer: Vec<u8> = Vec::new();
881 let data: u8 = 0;
882 Request::WriteControl(WriteControlRequest::new(
883 AdsState::AdsStateIdle,
884 296,
885 1,
886 data.to_le_bytes().to_vec(),
887 ))
888 .write_to(&mut buffer)
889 .unwrap();
890
891 let compare: Vec<u8> = vec![1, 0, 40, 1, 1, 0, 0, 0, 0];
892 assert_eq!(compare, buffer);
893 }
894
895 #[test]
896 fn write_contro_request_read_from_test() {
897 let reader: Vec<u8> = vec![1, 0, 40, 1, 1, 0, 0, 0, 0, 0, 0, 0];
898 let request = WriteControlRequest::read_from(&mut reader.as_slice()).unwrap();
899 let data_value: u32 = 0;
900 let data = data_value.to_le_bytes();
901 let compare = WriteControlRequest::new(AdsState::AdsStateIdle, 296, 1, data.to_vec());
902
903 assert_eq!(request.ads_state, compare.ads_state, "Wrong Ads state");
904 assert_eq!(
905 request.device_state, compare.device_state,
906 "Wrong device state"
907 );
908 assert_eq!(request.length, compare.length, "Wrong length");
909 assert_eq!(request.data, data, "Data not as expected"); }
911
912 #[test]
913 fn read_write_request_test() {
914 let mut buffer: Vec<u8> = Vec::new();
915 let data: u32 = 40000;
916 let data: Vec<u8> = data.to_le_bytes().to_vec();
917 Request::ReadWrite(ReadWriteRequest::new(259, 259, 4, data))
918 .write_to(&mut buffer)
919 .unwrap();
920
921 let compare: Vec<u8> = vec![
922 3, 1, 0, 0, 3, 1, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 64, 156, 0, 0,
923 ];
924 assert_eq!(compare, buffer);
925 }
926
927 #[test]
928 fn read_write_request_read_from_test() {
929 let reader: Vec<u8> = vec![3, 1, 0, 0, 3, 1, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 0, 0];
930 let request = ReadWriteRequest::read_from(&mut reader.as_slice()).unwrap();
931 let data_value: u16 = 0;
932 let data = data_value.to_le_bytes();
933 let compare = ReadWriteRequest::new(259, 259, 4, data.to_vec());
934
935 assert_eq!(
936 request.index_group, compare.index_group,
937 "Wrong index group"
938 );
939 assert_eq!(
940 request.index_offset, compare.index_offset,
941 "Wrong index offset"
942 );
943 assert_eq!(
944 request.read_length, compare.read_length,
945 "Wrong read length"
946 );
947 assert_eq!(
948 request.write_length, compare.write_length,
949 "Wrong write length"
950 );
951 assert_eq!(request.command_id, compare.command_id, "Wrong command id");
952 assert_eq!(request.data, data, "Data not as expected"); }
954
955 #[test]
956 fn add_device_notification_request_test() {
957 let mut buffer: Vec<u8> = Vec::new();
958 Request::AddDeviceNotification(AddDeviceNotificationRequest::new(
959 259,
960 259,
961 4,
962 AdsTransMode::Cyclic,
963 1,
964 1,
965 ))
966 .write_to(&mut buffer)
967 .unwrap();
968
969 let compare: Vec<u8> = vec![
970 3, 1, 0, 0, 3, 1, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
971 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
972 ];
973 assert_eq!(compare, buffer);
974 }
975
976 #[test]
977 fn add_device_notification_request_read_from_test() {
978 let reader: Vec<u8> = vec![
979 3, 1, 0, 0, 3, 1, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
980 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
981 ];
982 let request = AddDeviceNotificationRequest::read_from(&mut reader.as_slice()).unwrap();
983 let compare = AddDeviceNotificationRequest::new(259, 259, 4, AdsTransMode::Cyclic, 5, 1);
984
985 assert_eq!(
986 request.index_group, compare.index_group,
987 "Wrong index group"
988 );
989 assert_eq!(
990 request.index_offset, compare.index_offset,
991 "Wrong index offset"
992 );
993 assert_eq!(request.length, compare.length, "Wrong length");
994 assert_eq!(
995 request.transmission_mode, compare.transmission_mode,
996 "Wrong transmission mode"
997 );
998 assert_eq!(
999 request.max_delay, compare.max_delay,
1000 "Wrong max delay wrong"
1001 );
1002 assert_eq!(request.cycle_time, compare.cycle_time, "Wrong cycle time");
1003 assert_eq!(
1004 request.reserved, compare.reserved,
1005 "Reserved not as expected"
1006 );
1007 }
1008
1009 #[test]
1010 fn delete_device_notification_request_test() {
1011 let mut buffer: Vec<u8> = Vec::new();
1012 let notification_handle = DeleteDeviceNotificationRequest::new(1234);
1013 Request::DeleteDeviceNotification(notification_handle)
1014 .write_to(&mut buffer)
1015 .unwrap();
1016
1017 let compare: Vec<u8> = vec![210, 4, 0, 0];
1018 assert_eq!(compare, buffer);
1019 }
1020
1021 #[test]
1022 fn delete_device_notification_request_read_from_test() {
1023 let reader: Vec<u8> = vec![210, 4, 0, 0];
1024 let request = DeleteDeviceNotificationRequest::read_from(&mut reader.as_slice()).unwrap();
1025 let compare = DeleteDeviceNotificationRequest::new(1234);
1026
1027 assert_eq!(request.handle, compare.handle, "Wrong handle");
1028 assert_eq!(request.command_id, compare.command_id, "Wrong command id");
1029 }
1030}