1use crate::bus::IsaBus;
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 IsaCanSocket {
30 handle: u16,
31}
32
33impl IsaCanSocket {
34 pub fn open(bus: IsaBus, baud: Baudrate) -> Result<IsaCanSocket, CanError> {
35 let code = unsafe { peak_lib()?.CAN_Initialize(bus.into(), baud.into(), 0, 0, 0) };
36
37 match CanOkError::try_from(code) {
38 Ok(CanOkError::Ok) => Ok(IsaCanSocket { handle: bus.into() }),
39 Ok(CanOkError::Err(err)) => Err(err),
40 Err(_) => Err(CanError::Unknown),
41 }
42 }
43}
44
45impl Drop for IsaCanSocket {
48 fn drop(&mut self) {
49 let Ok(peak_lib) = peak_lib() else {
50 return;
51 };
52 unsafe { peak_lib.CAN_Uninitialize(self.handle) };
53 }
54}
55
56impl Socket for IsaCanSocket {
59 fn handle(&self) -> u16 {
60 self.handle
61 }
62}
63
64impl Channel for IsaCanSocket {
67 fn channel(&self) -> u16 {
68 self.handle
69 }
70}
71
72impl HasRecvCan for IsaCanSocket {}
75impl HasSendCan for IsaCanSocket {}
76
77impl HasHardwareName for IsaCanSocket {}
83
84impl HasControllerNumber for IsaCanSocket {}
85impl HasSetControllerNumber for IsaCanSocket {}
86
87impl HasDevicePartNumber for IsaCanSocket {}
88
89impl HasChannelVersion for IsaCanSocket {}
92
93impl HasChannelFeatures for IsaCanSocket {}
94
95impl HasBitrateInfo for IsaCanSocket {}
96
97impl HasNominalBusSpeed for IsaCanSocket {}
98
99impl HasDataBusSpeed for IsaCanSocket {}
100
101impl HasFirmwareVersion for IsaCanSocket {}
102
103impl HasMessageFilter for IsaCanSocket {}
108impl HasSetMessageFilter for IsaCanSocket {}
109
110impl HasReceiveStatus for IsaCanSocket {}
111impl HasSetReceiveStatus for IsaCanSocket {}
112
113impl HasAllowStatusFrames for IsaCanSocket {}
114impl HasSetAllowStatusFrames for IsaCanSocket {}
115
116impl HasAllowRTRFrames for IsaCanSocket {}
117impl HasSetAllowRTRFrames for IsaCanSocket {}
118
119impl HasAllowErrorFrames for IsaCanSocket {}
120impl HasSetAllowErrorFrames for IsaCanSocket {}
121
122impl HasAcceptanceFilter11Bit for IsaCanSocket {}
123impl HasSetAcceptanceFilter11Bit for IsaCanSocket {}
124
125impl HasAcceptanceFilter29Bit for IsaCanSocket {}
126impl HasSetAcceptanceFilter29Bit for IsaCanSocket {}
127
128impl HasTraceLocation for IsaCanSocket {}
131impl HasSetTraceLocation for IsaCanSocket {}
132
133impl HasTraceStatus for IsaCanSocket {}
134impl HasSetTraceStatus for IsaCanSocket {}
135
136impl HasTraceSize for IsaCanSocket {}
137impl HasSetTraceSize for IsaCanSocket {}
138
139impl HasTraceConfigure for IsaCanSocket {}
140impl HasSetTraceConfigure for IsaCanSocket {}