1use crate::bus::LanBus;
6use crate::channel::Channel;
7use crate::df::{
8 HasAcceptanceFilter11Bit, HasAcceptanceFilter29Bit, HasAllowEchoFrames, HasAllowErrorFrames,
9 HasAllowRTRFrames, HasAllowStatusFrames, HasMessageFilter, HasReceiveStatus,
10 HasSetAcceptanceFilter11Bit, HasSetAcceptanceFilter29Bit, HasSetAllowEchoFrames,
11 HasSetAllowErrorFrames, HasSetAllowRTRFrames, HasSetAllowStatusFrames, HasSetMessageFilter,
12 HasSetReceiveStatus,
13};
14use crate::error::{CanError, CanOkError};
15use crate::hw::{
16 HasControllerNumber, HasDeviceId, HasDevicePartNumber, HasHardwareName, HasIpAddress,
17 HasSetControllerNumber, HasSetDeviceId,
18};
19use crate::info::{
20 HasBitrateInfo, HasChannelFeatures, HasChannelVersion, HasDataBusSpeed, HasFirmwareVersion,
21 HasNominalBusSpeed,
22};
23use crate::peak_lib;
24use crate::socket::{Baudrate, HasRecvCan, HasSendCan, Socket};
25use crate::trace::{
26 HasSetTraceConfigure, HasSetTraceLocation, HasSetTraceSize, HasSetTraceStatus,
27 HasTraceConfigure, HasTraceLocation, HasTraceSize, HasTraceStatus,
28};
29
30#[derive(Debug, PartialEq)]
31pub struct LanCanSocket {
32 handle: u16,
33}
34
35impl LanCanSocket {
36 pub fn open(bus: LanBus, baud: Baudrate) -> Result<LanCanSocket, CanError> {
37 let handle = bus.into();
38 let code = unsafe { peak_lib()?.CAN_Initialize(handle, baud.into(), 0, 0, 0) };
39
40 match CanOkError::try_from(code) {
41 Ok(CanOkError::Ok) => Ok(LanCanSocket { handle }),
42 Ok(CanOkError::Err(err)) => Err(err),
43 Err(_) => Err(CanError::Unknown),
44 }
45 }
46}
47
48impl Drop for LanCanSocket {
51 fn drop(&mut self) {
52 let Ok(peak_lib) = peak_lib() else {
53 return;
54 };
55 unsafe { peak_lib.CAN_Uninitialize(self.handle) };
56 }
57}
58
59impl Socket for LanCanSocket {
62 fn handle(&self) -> u16 {
63 self.handle
64 }
65}
66
67impl Channel for LanCanSocket {
70 fn channel(&self) -> u16 {
71 self.handle
72 }
73}
74
75impl HasRecvCan for LanCanSocket {}
78impl HasSendCan for LanCanSocket {}
79
80impl HasDeviceId for LanCanSocket {}
86impl HasSetDeviceId for LanCanSocket {}
87
88impl HasHardwareName for LanCanSocket {}
89
90impl HasControllerNumber for LanCanSocket {}
91impl HasSetControllerNumber for LanCanSocket {}
92
93impl HasIpAddress for LanCanSocket {}
94
95impl HasDevicePartNumber for LanCanSocket {}
96
97impl HasChannelVersion for LanCanSocket {}
100
101impl HasChannelFeatures for LanCanSocket {}
102
103impl HasBitrateInfo for LanCanSocket {}
104
105impl HasNominalBusSpeed for LanCanSocket {}
106
107impl HasDataBusSpeed for LanCanSocket {}
108
109impl HasFirmwareVersion for LanCanSocket {}
110
111impl HasMessageFilter for LanCanSocket {}
116impl HasSetMessageFilter for LanCanSocket {}
117
118impl HasReceiveStatus for LanCanSocket {}
119impl HasSetReceiveStatus for LanCanSocket {}
120
121impl HasAllowStatusFrames for LanCanSocket {}
122impl HasSetAllowStatusFrames for LanCanSocket {}
123
124impl HasAllowRTRFrames for LanCanSocket {}
125impl HasSetAllowRTRFrames for LanCanSocket {}
126
127impl HasAllowErrorFrames for LanCanSocket {}
128impl HasSetAllowErrorFrames for LanCanSocket {}
129
130impl HasAllowEchoFrames for LanCanSocket {}
131impl HasSetAllowEchoFrames for LanCanSocket {}
132
133impl HasAcceptanceFilter11Bit for LanCanSocket {}
134impl HasSetAcceptanceFilter11Bit for LanCanSocket {}
135
136impl HasAcceptanceFilter29Bit for LanCanSocket {}
137impl HasSetAcceptanceFilter29Bit for LanCanSocket {}
138
139impl HasTraceLocation for LanCanSocket {}
142impl HasSetTraceLocation for LanCanSocket {}
143
144impl HasTraceStatus for LanCanSocket {}
145impl HasSetTraceStatus for LanCanSocket {}
146
147impl HasTraceSize for LanCanSocket {}
148impl HasSetTraceSize for LanCanSocket {}
149
150impl HasTraceConfigure for LanCanSocket {}
151impl HasSetTraceConfigure for LanCanSocket {}