peak_can/socket/
dng.rs

1//!
2//!
3//!
4
5use crate::bus::DngBus;
6use crate::channel::Channel;
7use crate::df::{
8    HasAcceptanceFilter11Bit, HasAcceptanceFilter29Bit, HasAllowErrorFrames, HasAllowRTRFrames,
9    HasAllowStatusFrames, HasMessageFilter, HasReceiveStatus, HasSetAcceptanceFilter11Bit,
10    HasSetAcceptanceFilter29Bit, HasSetAllowErrorFrames, HasSetAllowRTRFrames,
11    HasSetAllowStatusFrames, HasSetMessageFilter, HasSetReceiveStatus,
12};
13use crate::error::{CanError, CanOkError};
14use crate::hw::{
15    HasControllerNumber, HasDevicePartNumber, HasHardwareName, HasSetControllerNumber,
16};
17use crate::info::{
18    HasBitrateInfo, HasChannelFeatures, HasChannelVersion, HasDataBusSpeed, HasFirmwareVersion,
19    HasNominalBusSpeed,
20};
21use crate::peak_lib;
22use crate::socket::{Baudrate, HasRecvCan, HasSendCan, Socket};
23use crate::trace::{
24    HasSetTraceConfigure, HasSetTraceLocation, HasSetTraceSize, HasSetTraceStatus,
25    HasTraceConfigure, HasTraceLocation, HasTraceSize, HasTraceStatus,
26};
27
28#[derive(Debug, PartialEq)]
29pub struct DngCanSocket {
30    handle: u16,
31}
32
33impl DngCanSocket {
34    pub fn open(bus: DngBus, baud: Baudrate) -> Result<DngCanSocket, CanError> {
35        let handle = bus.into();
36        let code = unsafe { peak_lib()?.CAN_Initialize(handle, baud.into(), 0, 0, 0) };
37
38        match CanOkError::try_from(code) {
39            Ok(CanOkError::Ok) => Ok(DngCanSocket { handle }),
40            Ok(CanOkError::Err(err)) => Err(err),
41            Err(_) => Err(CanError::Unknown),
42        }
43    }
44}
45
46/* Drop trait implementations */
47
48impl Drop for DngCanSocket {
49    fn drop(&mut self) {
50        let Ok(peak_lib) = peak_lib() else {
51            return;
52        };
53        unsafe { peak_lib.CAN_Uninitialize(self.handle) };
54    }
55}
56
57/* Socket trait implementation */
58
59impl Socket for DngCanSocket {
60    fn handle(&self) -> u16 {
61        self.handle
62    }
63}
64
65/* Channel trait implementation */
66
67impl Channel for DngCanSocket {
68    fn channel(&self) -> u16 {
69        self.handle
70    }
71}
72
73/* CAN trait implementations */
74
75impl HasRecvCan for DngCanSocket {}
76impl HasSendCan for DngCanSocket {}
77
78// impl HasRecvCanFd for DngCanSocket {}
79// impl HasSendCanFd for DngCanSocket {}
80
81/* HARDWARE IDENTIFICATION */
82
83impl HasHardwareName for DngCanSocket {}
84
85impl HasControllerNumber for DngCanSocket {}
86impl HasSetControllerNumber for DngCanSocket {}
87
88impl HasDevicePartNumber for DngCanSocket {}
89
90/* INFORMATIONAL PARAMETER */
91
92impl HasChannelVersion for DngCanSocket {}
93
94impl HasChannelFeatures for DngCanSocket {}
95
96impl HasBitrateInfo for DngCanSocket {}
97
98impl HasNominalBusSpeed for DngCanSocket {}
99
100impl HasDataBusSpeed for DngCanSocket {}
101
102impl HasFirmwareVersion for DngCanSocket {}
103
104/* SPECIAL BEHAVIOR */
105
106/* CONTROLLING DATA FLOW */
107
108impl HasMessageFilter for DngCanSocket {}
109impl HasSetMessageFilter for DngCanSocket {}
110
111impl HasReceiveStatus for DngCanSocket {}
112impl HasSetReceiveStatus for DngCanSocket {}
113
114impl HasAllowStatusFrames for DngCanSocket {}
115impl HasSetAllowStatusFrames for DngCanSocket {}
116
117impl HasAllowRTRFrames for DngCanSocket {}
118impl HasSetAllowRTRFrames for DngCanSocket {}
119
120impl HasAllowErrorFrames for DngCanSocket {}
121impl HasSetAllowErrorFrames for DngCanSocket {}
122
123impl HasAcceptanceFilter11Bit for DngCanSocket {}
124impl HasSetAcceptanceFilter11Bit for DngCanSocket {}
125
126impl HasAcceptanceFilter29Bit for DngCanSocket {}
127impl HasSetAcceptanceFilter29Bit for DngCanSocket {}
128
129/* TRACING PARAMETERS */
130
131impl HasTraceLocation for DngCanSocket {}
132impl HasSetTraceLocation for DngCanSocket {}
133
134impl HasTraceStatus for DngCanSocket {}
135impl HasSetTraceStatus for DngCanSocket {}
136
137impl HasTraceSize for DngCanSocket {}
138impl HasSetTraceSize for DngCanSocket {}
139
140impl HasTraceConfigure for DngCanSocket {}
141impl HasSetTraceConfigure for DngCanSocket {}