peak_can/socket/
pcc.rs

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