peak_can/socket/
isa.rs

1//!
2//!
3//!
4
5use 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
45/* Drop trait implementation */
46
47impl 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
56/* Socket trait implementation */
57
58impl Socket for IsaCanSocket {
59    fn handle(&self) -> u16 {
60        self.handle
61    }
62}
63
64/* Channel trait implementation */
65
66impl Channel for IsaCanSocket {
67    fn channel(&self) -> u16 {
68        self.handle
69    }
70}
71
72/* CAN trait implementations */
73
74impl HasRecvCan for IsaCanSocket {}
75impl HasSendCan for IsaCanSocket {}
76
77// impl HasRecvCanFd for IsaCanSocket {}
78// impl HasSendCanFd for IsaCanSocket {}
79
80/* HARDWARE IDENTIFICATION */
81
82impl HasHardwareName for IsaCanSocket {}
83
84impl HasControllerNumber for IsaCanSocket {}
85impl HasSetControllerNumber for IsaCanSocket {}
86
87impl HasDevicePartNumber for IsaCanSocket {}
88
89/* INFORMATIONAL PARAMETER */
90
91impl 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
103/* SPECIAL BEHAVIOR */
104
105/* CONTROLLING DATA FLOW */
106
107impl 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
128/* TRACING PARAMETERS */
129
130impl 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 {}