Skip to content

Commit a9c89c4

Browse files
authored
V0.9.2 (#33)
* Updated xcplib (XCPlite) to V0.9.2
1 parent d0b5548 commit a9c89c4

File tree

6 files changed

+24
-31
lines changed

6 files changed

+24
-31
lines changed

README.md

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,9 @@
11
# xcp-lite
22

3-
XCP for Rust - based on XCPlite (https://github.com/vectorgrp/XCPlite)
3+
XCP for Rust - based on XCPlite (<https://github.com/vectorgrp/XCPlite>)
44

55
Disclaimer: This code is in experimental state. There is no release yet.
6-
7-
Note: This repo contains a newer version of XCPlite (in folder xcplib).
8-
This version is not released yet.
9-
10-
* Breaking changes to V6.
11-
* Compiles as C11.
12-
* Lockless transmit queue. Works on x86-64 strong and ARM-64 weak memory model.
13-
* Measurement of and write access to variables on stack.
14-
* Supports multiple calibration segments with working and reference page with independent page switching.
15-
* Lock free and thread safe calibration parameter access, consistent calibration changes and page switches.
16-
* More C examples.
17-
* Build as a library.
18-
* Used (as FFI library) for the rust xcp-lite version.
19-
6+
Note: This repo refers to an unreleased version of XCPlite as a submodule (in folder xcplib, currently V0.9.2).
207

218
xcp-lite is a Rust API for measurement and calibration, which uses the ASAM XCP protocol for communication with a measurement and calibration tool like CANape and ASAM A2L for data description.
229

@@ -114,23 +101,21 @@ Demonstrates using XCP in an async tokio based application
114101
Measure a lidar point cloud and visualize it in CANapes 3D scene window
115102
Use CDR serialization over XCP and the CDR/IDL schema generator proc-macro
116103

117-
118104
## Code instrumentation for measurement and calibration
119105

120106
There are 3 important types: Xcp, XcpEvent/DaqEvent and CalSeg.
121107
Xcp is a wrapper for XCPlite. It is a singleton. There is a builder to initialize the XCP server or ethernet transport layer.
122108

123109
CalSeg is a generic type used to encapsulate structs containing calibration parameters. This is called a calibration segment and the parameter struct wrapped is a calibration page. A calibration page must be Copy and may contain nested structs of basic types or arrays with dimension up to 2.
124110

125-
A CalSeg has interior mutability. Parameter mutation happens only on acquiring a calibration segment guard.
111+
A CalSeg has interior mutability. Parameter mutation happens only on acquiring a calibration segment guard.
126112

127113
A CalSeg may be shared among multiple threads. It it cloned like an Arc, implements the Deref trait for convenience and does not do any locks to deref to the inner calibration parameter page struct.
128114

129115
Measurement code instrumentation provides event definition, registration or capture of measurement objects. Measurement objects can be captured (copied to a buffer inside the event) or accessed directly on stack memory after being registered. Capture works for variables on heap or stack. Measurement variables can be registered as single instance or multi instance, which creates one variable instance for each thread instance. Variable names and event names are automatically extended with an index in this case.
130116

131117
The registration of objects has to be completed, before the A2L file is generated. The A2L is created at latest on connect of the XCP client tool. Objects created later, will not be visible to CANape.
132118

133-
134119
## Safety Considerations
135120

136121
The fundamental functional concept of this XCP implementation is, to mutate the calibration variables in their original binary representation in a thread safe, transparent wrapper type.
@@ -190,7 +175,6 @@ Feature a2l_reader is needed for xcp_client based testing
190175

191176
Use --nocapture because the debug output from the XCPlite C library is via normal printf
192177

193-
194178
## Notes
195179

196180
All measurement and calibration code instrumentation is non blocking and the trigger event and sync methods is optimized for speed and minimal locking.

build.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ fn main() {
6262
.file("xcplib/src/xcpQueue32.c")
6363
.file("xcplib/src/xcpEthTl.c")
6464
.file("xcplib/src/xcpEthServer.c");
65+
66+
builder.define("XCPLIB_FOR_RUST", None);
67+
6568
if is_posix {
6669
//builder.define("_POSIX_C_SOURCE", "200112L");
6770
builder.flag("-std=c11");

src/xcp/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ impl Xcp {
337337
unsafe {
338338
// Initialize the XCP protocol layer
339339
// @@@@ UNSAFE - C library calls
340-
xcplib::XcpInit();
340+
xcplib::XcpInit(true);
341341

342342
// Register the callbacks from xcplib
343343
// @@@@ UNSAFE - C library calls

src/xcp/xcplib.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@ unsafe extern "C" {
2424
pub fn XcpEvent(event: tXcpEventId);
2525
}
2626
unsafe extern "C" {
27+
#[doc = " Set log level\n @param log level (0 = no logging, 1 = error, 2 = warning, 3 = info, 4 = debug, 5 = trace)"]
2728
pub fn XcpSetLogLevel(level: u8);
2829
}
2930
unsafe extern "C" {
30-
pub fn XcpInit();
31+
#[doc = " Initialize the XCP singleton, must be called befor starting the server"]
32+
pub fn XcpInit(activate: bool);
3133
}
3234
unsafe extern "C" {
3335
pub fn ApplXcpSetA2lName(name: *const ::std::os::raw::c_char);
@@ -36,15 +38,19 @@ unsafe extern "C" {
3638
pub fn XcpSetEpk(epk: *const ::std::os::raw::c_char);
3739
}
3840
unsafe extern "C" {
41+
#[doc = " Force Disconnect\n Stop DAQ, flush queue, flush pending calibrations"]
3942
pub fn XcpDisconnect();
4043
}
4144
unsafe extern "C" {
45+
#[doc = " Send terminate session event to the XCP client"]
4246
pub fn XcpSendTerminateSessionEvent();
4347
}
4448
unsafe extern "C" {
49+
#[doc = " Send a message to the XCP client"]
4550
pub fn XcpPrint(str_: *const ::std::os::raw::c_char);
4651
}
4752
unsafe extern "C" {
53+
#[doc = " Get the current DAQ clock value\n @return time in CLOCK_TICKS_PER_S units"]
4854
pub fn ApplXcpGetClock64() -> u64;
4955
}
5056
unsafe extern "C" {

xcp_lite.a2l

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@
7979
/begin TYPEDEF_CHARACTERISTIC C_I64 "" VALUE I64 0 NO_COMPU_METHOD -1e12 1e12 /end TYPEDEF_CHARACTERISTIC
8080
/begin TYPEDEF_CHARACTERISTIC C_F64 "" VALUE F64 0 NO_COMPU_METHOD -1e12 1e12 /end TYPEDEF_CHARACTERISTIC
8181
/begin TYPEDEF_CHARACTERISTIC C_F32 "" VALUE F32 0 NO_COMPU_METHOD -1e12 1e12 /end TYPEDEF_CHARACTERISTIC
82-
/begin MOD_PAR "" EPK "2025-07-04 12:36:58Z" ADDR_EPK 0x80000000
82+
/begin MOD_PAR "" EPK "2025-07-14 18:35:27Z" ADDR_EPK 0x80000000
8383
/begin MEMORY_SEGMENT epk "" DATA FLASH INTERN 0x80000000 20 -1 -1 -1 -1 -1 /end MEMORY_SEGMENT
8484
/begin MEMORY_SEGMENT calseg "" DATA FLASH INTERN 0x80010000 8 -1 -1 -1 -1 -1
8585
/begin IF_DATA XCP
@@ -149,7 +149,7 @@
149149
0x1 SIZE_DWORD UNIT_1US TIMESTAMP_FIXED
150150
/end TIMESTAMP_SUPPORTED
151151

152-
/begin EVENT "main" "main" 10 DAQ 0xFF 0 0 0 CONSISTENCY DAQ /end EVENT
152+
/begin EVENT "main" "main" 11 DAQ 0xFF 0 0 0 CONSISTENCY DAQ /end EVENT
153153
/begin EVENT "main_local" "main_local" 13 DAQ 0xFF 0 0 0 CONSISTENCY DAQ /end EVENT
154154
/begin EVENT "main_task1" "main_task1" 12 DAQ 0xFF 0 0 0 CONSISTENCY DAQ /end EVENT
155155
/begin EVENT "main_task2_1" "main_task2_1" 0 DAQ 0xFF 0 0 0 CONSISTENCY DAQ /end EVENT
@@ -161,7 +161,7 @@
161161
/begin EVENT "main_task2_7" "main_task2_7" 7 DAQ 0xFF 0 0 0 CONSISTENCY DAQ /end EVENT
162162
/begin EVENT "main_task2_8" "main_task2_8" 8 DAQ 0xFF 0 0 0 CONSISTENCY DAQ /end EVENT
163163
/begin EVENT "main_task2_9" "main_task2_9" 9 DAQ 0xFF 0 0 0 CONSISTENCY DAQ /end EVENT
164-
/begin EVENT "main_task2_10" "main_task2_10" 11 DAQ 0xFF 0 0 0 CONSISTENCY DAQ /end EVENT
164+
/begin EVENT "main_task2_10" "main_task2_10" 10 DAQ 0xFF 0 0 0 CONSISTENCY DAQ /end EVENT
165165
/begin EVENT "main_task2s" "main_task2s" 1 DAQ 0xFF 0 0 0 CONSISTENCY DAQ /end EVENT
166166

167167
/end DAQ
@@ -258,7 +258,7 @@
258258
/begin MEASUREMENT channel_7 "sine: f64" FLOAT64_IEEE NO_COMPU_METHOD 0 0 -100000000000000000000000000000000 100000000000000000000000000000000 ECU_ADDRESS 0x0 ECU_ADDRESS_EXTENSION 3 PHYS_UNIT "Volt" /begin IF_DATA XCP /begin DAQ_EVENT FIXED_EVENT_LIST EVENT 7 /end DAQ_EVENT /end IF_DATA /end MEASUREMENT
259259
/begin MEASUREMENT channel_8 "sine: f64" FLOAT64_IEEE NO_COMPU_METHOD 0 0 -100000000000000000000000000000000 100000000000000000000000000000000 ECU_ADDRESS 0x0 ECU_ADDRESS_EXTENSION 3 PHYS_UNIT "Volt" /begin IF_DATA XCP /begin DAQ_EVENT FIXED_EVENT_LIST EVENT 8 /end DAQ_EVENT /end IF_DATA /end MEASUREMENT
260260
/begin MEASUREMENT channel_9 "sine: f64" FLOAT64_IEEE NO_COMPU_METHOD 0 0 -100000000000000000000000000000000 100000000000000000000000000000000 ECU_ADDRESS 0x0 ECU_ADDRESS_EXTENSION 3 PHYS_UNIT "Volt" /begin IF_DATA XCP /begin DAQ_EVENT FIXED_EVENT_LIST EVENT 9 /end DAQ_EVENT /end IF_DATA /end MEASUREMENT
261-
/begin MEASUREMENT channel_10 "sine: f64" FLOAT64_IEEE NO_COMPU_METHOD 0 0 -100000000000000000000000000000000 100000000000000000000000000000000 ECU_ADDRESS 0x0 ECU_ADDRESS_EXTENSION 3 PHYS_UNIT "Volt" /begin IF_DATA XCP /begin DAQ_EVENT FIXED_EVENT_LIST EVENT 11 /end DAQ_EVENT /end IF_DATA /end MEASUREMENT
261+
/begin MEASUREMENT channel_10 "sine: f64" FLOAT64_IEEE NO_COMPU_METHOD 0 0 -100000000000000000000000000000000 100000000000000000000000000000000 ECU_ADDRESS 0x0 ECU_ADDRESS_EXTENSION 3 PHYS_UNIT "Volt" /begin IF_DATA XCP /begin DAQ_EVENT FIXED_EVENT_LIST EVENT 10 /end DAQ_EVENT /end IF_DATA /end MEASUREMENT
262262
/begin MEASUREMENT counter "" ULONG IDENTITY 0 0 0 4294967295 ECU_ADDRESS 0xFFFFF7B8 ECU_ADDRESS_EXTENSION 3 /begin IF_DATA XCP /begin DAQ_EVENT FIXED_EVENT_LIST EVENT 12 /end DAQ_EVENT /end IF_DATA /end MEASUREMENT
263263
/begin MEASUREMENT counter_i16 "counter: i16" SWORD IDENTITY 0 0 -32768 32767 ECU_ADDRESS 0xFFFFF7C2 ECU_ADDRESS_EXTENSION 3 /begin IF_DATA XCP /begin DAQ_EVENT FIXED_EVENT_LIST EVENT 12 /end DAQ_EVENT /end IF_DATA /end MEASUREMENT
264264
/begin MEASUREMENT counter_i32 "counter: i32" SLONG IDENTITY 0 0 -2147483648 2147483647 ECU_ADDRESS 0xFFFFF7C8 ECU_ADDRESS_EXTENSION 3 /begin IF_DATA XCP /begin DAQ_EVENT FIXED_EVENT_LIST EVENT 12 /end DAQ_EVENT /end IF_DATA /end MEASUREMENT
@@ -271,14 +271,14 @@
271271
/begin MEASUREMENT counter_u64 "counter: u64" A_UINT64 IDENTITY 0 0 0 18446744073709552000 ECU_ADDRESS 0xFFFFF7CC ECU_ADDRESS_EXTENSION 3 /begin IF_DATA XCP /begin DAQ_EVENT FIXED_EVENT_LIST EVENT 12 /end DAQ_EVENT /end IF_DATA /end MEASUREMENT
272272
/begin MEASUREMENT counter_u8 "counter: u8" UBYTE IDENTITY 0 0 0 255 ECU_ADDRESS 0xFFFFF7BE ECU_ADDRESS_EXTENSION 3 /begin IF_DATA XCP /begin DAQ_EVENT FIXED_EVENT_LIST EVENT 12 /end DAQ_EVENT /end IF_DATA /end MEASUREMENT
273273
/begin MEASUREMENT counter_usize "counter: u64" A_UINT64 IDENTITY 0 0 0 18446744073709552000 ECU_ADDRESS 0xFFFFF7DC ECU_ADDRESS_EXTENSION 3 /begin IF_DATA XCP /begin DAQ_EVENT FIXED_EVENT_LIST EVENT 12 /end DAQ_EVENT /end IF_DATA /end MEASUREMENT
274-
/begin MEASUREMENT mainloop_counter1 "" A_UINT64 IDENTITY 0 0 0 18446744073709552000 ECU_ADDRESS 0xFFFFFFBC ECU_ADDRESS_EXTENSION 3 /begin IF_DATA XCP /begin DAQ_EVENT FIXED_EVENT_LIST EVENT 10 /end DAQ_EVENT /end IF_DATA /end MEASUREMENT
274+
/begin MEASUREMENT mainloop_counter1 "" A_UINT64 IDENTITY 0 0 0 18446744073709552000 ECU_ADDRESS 0xFFFFFFBC ECU_ADDRESS_EXTENSION 3 /begin IF_DATA XCP /begin DAQ_EVENT FIXED_EVENT_LIST EVENT 11 /end DAQ_EVENT /end IF_DATA /end MEASUREMENT
275275
/begin COMPU_METHOD mainloop_local_var1 "" LINEAR "%.3" "no unit" COEFFS_LINEAR 0.5 10000000 /end COMPU_METHOD
276-
/begin MEASUREMENT mainloop_local_var1 "test local variable with conversion rule" A_UINT64 mainloop_local_var1 0 0 10000000 9223372036864776000 ECU_ADDRESS 0x1C ECU_ADDRESS_EXTENSION 3 PHYS_UNIT "no unit" /begin IF_DATA XCP /begin DAQ_EVENT FIXED_EVENT_LIST EVENT 10 /end DAQ_EVENT /end IF_DATA /end MEASUREMENT
276+
/begin MEASUREMENT mainloop_local_var1 "test local variable with conversion rule" A_UINT64 mainloop_local_var1 0 0 10000000 9223372036864776000 ECU_ADDRESS 0x1C ECU_ADDRESS_EXTENSION 3 PHYS_UNIT "no unit" /begin IF_DATA XCP /begin DAQ_EVENT FIXED_EVENT_LIST EVENT 11 /end DAQ_EVENT /end IF_DATA /end MEASUREMENT
277277
/begin COMPU_METHOD mainloop_local_var2 "" LINEAR "%.0" "no unit" COEFFS_LINEAR 2 -10000000 /end COMPU_METHOD
278278
/begin MEASUREMENT mainloop_local_var2 "test local variable with conversion rule" A_UINT64 mainloop_local_var2 0 0 -10000000 36893488147409105000 ECU_ADDRESS 0xFFFFFFEC ECU_ADDRESS_EXTENSION 3 PHYS_UNIT "no unit" /begin IF_DATA XCP /begin DAQ_EVENT FIXED_EVENT_LIST EVENT 13 /end DAQ_EVENT /end IF_DATA /end MEASUREMENT
279-
/begin INSTANCE mainloop_struct "" TestNestedStruct 0xFFFFFFC4 ECU_ADDRESS_EXTENSION 3 /begin IF_DATA XCP /begin DAQ_EVENT FIXED_EVENT_LIST EVENT 10 /end DAQ_EVENT /end IF_DATA /end INSTANCE
280-
/begin INSTANCE mainloop_struct1 "" TestStruct 0xFFFFFF24 ECU_ADDRESS_EXTENSION 3 /begin IF_DATA XCP /begin DAQ_EVENT FIXED_EVENT_LIST EVENT 10 /end DAQ_EVENT /end IF_DATA /end INSTANCE
281-
/begin INSTANCE mainloop_struct2 "" TestStruct 0xFFFFFF44 ECU_ADDRESS_EXTENSION 3 /begin IF_DATA XCP /begin DAQ_EVENT FIXED_EVENT_LIST EVENT 10 /end DAQ_EVENT /end IF_DATA /end INSTANCE
279+
/begin INSTANCE mainloop_struct "" TestNestedStruct 0xFFFFFFC4 ECU_ADDRESS_EXTENSION 3 /begin IF_DATA XCP /begin DAQ_EVENT FIXED_EVENT_LIST EVENT 11 /end DAQ_EVENT /end IF_DATA /end INSTANCE
280+
/begin INSTANCE mainloop_struct1 "" TestStruct 0xFFFFFF24 ECU_ADDRESS_EXTENSION 3 /begin IF_DATA XCP /begin DAQ_EVENT FIXED_EVENT_LIST EVENT 11 /end DAQ_EVENT /end IF_DATA /end INSTANCE
281+
/begin INSTANCE mainloop_struct2 "" TestStruct 0xFFFFFF44 ECU_ADDRESS_EXTENSION 3 /begin IF_DATA XCP /begin DAQ_EVENT FIXED_EVENT_LIST EVENT 11 /end DAQ_EVENT /end IF_DATA /end INSTANCE
282282
/begin GROUP Measurements "" ROOT /begin SUB_GROUP main main_local main_task1 main_task2 main_task2s /end SUB_GROUP /end GROUP
283283
/begin GROUP main "" /begin REF_MEASUREMENT mainloop_counter1 mainloop_local_var1 mainloop_struct mainloop_struct1 mainloop_struct2 /end REF_MEASUREMENT /end GROUP
284284
/begin GROUP main_local "" /begin REF_MEASUREMENT mainloop_local_var2 /end REF_MEASUREMENT /end GROUP

xcplib

Submodule xcplib updated 51 files

0 commit comments

Comments
 (0)