1use 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
46impl 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
57impl Socket for DngCanSocket {
60 fn handle(&self) -> u16 {
61 self.handle
62 }
63}
64
65impl Channel for DngCanSocket {
68 fn channel(&self) -> u16 {
69 self.handle
70 }
71}
72
73impl HasRecvCan for DngCanSocket {}
76impl HasSendCan for DngCanSocket {}
77
78impl HasHardwareName for DngCanSocket {}
84
85impl HasControllerNumber for DngCanSocket {}
86impl HasSetControllerNumber for DngCanSocket {}
87
88impl HasDevicePartNumber for DngCanSocket {}
89
90impl 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
104impl 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
129impl 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 {}