Skip to content

Commit 4af035c

Browse files
committed
Implement support for defmt
1 parent 6748c53 commit 4af035c

File tree

33 files changed

+194
-111
lines changed

33 files changed

+194
-111
lines changed

canadensis/Cargo.toml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ description = "A Cyphal implementation: Node types and re-exports from some othe
1313
fallible_collections = "0.5.1"
1414
heapless = "0.8.0"
1515
half = { version = ">=2.2, <2.5", default-features = false }
16-
log = "0.4"
16+
log = { version = "0.4", optional = true }
17+
defmt = { version = "1.0.1", optional = true }
18+
defmt-or-log = { git = "https://github.com/t-moe/defmt-or-log.git", rev = "a16380e8737b18846c45195328fa0b469ccf43f2" }
1719

1820
# Depends on most other canadensis crates that are not transport-specific
1921
[dependencies.canadensis_core]
@@ -50,3 +52,6 @@ path = "../canadensis_serial"
5052
version = "0.4.1"
5153
path = "../canadensis_udp"
5254

55+
[features]
56+
defmt = ["dep:defmt", "defmt-or-log/defmt", "canadensis_core/defmt", "canadensis_encoding/defmt"]
57+
log = ["dep:log", "defmt-or-log/log", "canadensis_core/log", "canadensis_encoding/log"]

canadensis/src/node/basic.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use canadensis_data_types::uavcan::node::port::subject_id_1_0;
1616
use canadensis_data_types::uavcan::node::port::subject_id_list_1_0::SubjectIDList;
1717
use canadensis_encoding::bits::BitArray;
1818
use canadensis_encoding::{Message, Request, Response, Serialize};
19+
use defmt_or_log::unwrap;
1920

2021
/// A node that provides all basic application-layer functionality
2122
///
@@ -76,18 +77,16 @@ where
7677
let port_list = List {
7778
publishers: SubjectIDList::SparseList({
7879
let mut published_topics = heapless::Vec::new();
79-
published_topics
80+
unwrap!(published_topics
8081
.push(subject_id_1_0::SubjectID {
8182
value: heartbeat_1_0::SUBJECT.into(),
8283
})
83-
.ok()
84-
.unwrap();
85-
published_topics
84+
.ok());
85+
unwrap!(published_topics
8686
.push(subject_id_1_0::SubjectID {
8787
value: list_1_0::SUBJECT.into(),
8888
})
89-
.ok()
90-
.unwrap();
89+
.ok());
9190
published_topics
9291
}),
9392
subscribers: SubjectIDList::SparseList(heapless::Vec::new()),

canadensis/src/node/core.rs

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use canadensis_core::transfer::{
99
use canadensis_core::transport::{Receiver, Transmitter, Transport};
1010
use canadensis_core::{nb, OutOfMemoryError, ServiceId, ServiceSubscribeError, SubjectId};
1111
use canadensis_encoding::{Message, Request, Response, Serialize};
12+
use defmt_or_log::{expect, unreachable};
1213

1314
use crate::publisher::Publisher;
1415
use crate::requester::{Requester, TransferIdTracker};
@@ -215,10 +216,10 @@ where
215216
where
216217
M: Message + Serialize,
217218
{
218-
let publisher = self
219-
.publishers
220-
.get_mut(&token.0)
221-
.expect("Bug: Token exists but no publisher");
219+
let publisher = expect!(
220+
self.publishers.get_mut(&token.0),
221+
"Bug: Token exists but no publisher"
222+
);
222223
publisher.publish(
223224
&mut self.clock,
224225
token.0,
@@ -236,10 +237,10 @@ where
236237
where
237238
M: Message + Serialize,
238239
{
239-
let publisher = self
240-
.publishers
241-
.get_mut(&token.0)
242-
.expect("Bug: Token exists but no publisher");
240+
let publisher = expect!(
241+
self.publishers.get_mut(&token.0),
242+
"Bug: Token exists but no publisher"
243+
);
243244
publisher.publish_loopback(
244245
&mut self.clock,
245246
token.0,
@@ -310,10 +311,10 @@ where
310311
where
311312
M: Request + Serialize,
312313
{
313-
let requester = self
314-
.requesters
315-
.get_mut(&token.0)
316-
.expect("Bug: No requester for token");
314+
let requester = expect!(
315+
self.requesters.get_mut(&token.0),
316+
"Bug: No requester for token"
317+
);
317318
requester.send(
318319
&mut self.clock,
319320
token.0,
@@ -336,10 +337,10 @@ where
336337
where
337338
M: Request + Serialize,
338339
{
339-
let requester = self
340-
.requesters
341-
.get_mut(&token.0)
342-
.expect("Bug: No requester for token");
340+
let requester = expect!(
341+
self.requesters.get_mut(&token.0),
342+
"Bug: No requester for token"
343+
);
343344
requester.send_loopback(
344345
&mut self.clock,
345346
token.0,

canadensis/src/register.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use canadensis_data_types::uavcan::register::name_1_0::Name;
1616
use canadensis_data_types::uavcan::register::value_1_0::Value;
1717
use canadensis_data_types::uavcan::time::synchronized_timestamp_1_0::SynchronizedTimestamp;
1818
use canadensis_encoding::Deserialize;
19+
use defmt_or_log::{debug, expect, warn};
1920

2021
pub use canadensis_derive_register_block::RegisterBlock;
2122

@@ -164,7 +165,7 @@ where
164165
fn handle_access_request(&mut self, request: &AccessRequest) -> AccessResponse {
165166
match str::from_utf8(&request.name.name) {
166167
Ok(register_name) => {
167-
log::debug!("Handling access request for {}", register_name);
168+
debug!("Handling access request for {}", register_name);
168169
if let Some(register) = self.block.register_by_name_mut(register_name) {
169170
register_handle_access(register, request)
170171
} else {
@@ -194,7 +195,7 @@ where
194195
}
195196

196197
fn handle_list_request(&mut self, request: &ListRequest) -> ListResponse {
197-
log::debug!("Handling register list request, index {}", {
198+
debug!("Handling register list request, index {}", {
198199
request.index
199200
});
200201
match self.block.register_by_index(request.index.into()) {
@@ -208,7 +209,7 @@ where
208209
};
209210
ListResponse {
210211
name: Name {
211-
name: heapless::Vec::from_slice(name).expect("Incorrect name length"),
212+
name: expect!(heapless::Vec::from_slice(name), "Incorrect name length"),
212213
},
213214
}
214215
}
@@ -261,7 +262,7 @@ where
261262
let response = self.handle_access_request(&request);
262263
let status = node.send_response(token, milliseconds(1000), &response);
263264
if status.is_err() {
264-
log::warn!("Out of memory when sending register access response");
265+
warn!("Out of memory when sending register access response");
265266
}
266267
true
267268
} else {
@@ -273,7 +274,7 @@ where
273274
let response = self.handle_list_request(&request);
274275
let status = node.send_response(token, milliseconds(1000), &response);
275276
if status.is_err() {
276-
log::warn!("Out of memory when sending register list response");
277+
warn!("Out of memory when sending register list response");
277278
}
278279
true
279280
} else {

canadensis/src/register/basic.rs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use canadensis_data_types::uavcan::primitive::unstructured_1_0;
1818
use canadensis_data_types::uavcan::register::value_1_0::Value;
1919
use canadensis_encoding::bits::BitArray;
2020
use core::convert::TryFrom;
21+
use defmt_or_log::{expect, unimplemented, unwrap};
2122
use half::f16;
2223

2324
/// A register containing its name, value, and mutable/persistent flags
@@ -263,7 +264,7 @@ macro_rules! register_primitive {
263264
impl RegisterType for $type {
264265
fn read(&self) -> Value {
265266
Value::$variant($variant {
266-
value: heapless::Vec::from_slice(&[*self]).unwrap(),
267+
value: unwrap!(heapless::Vec::from_slice(&[*self])),
267268
})
268269
}
269270

@@ -305,14 +306,16 @@ macro_rules! register_primitive_array {
305306
fn read(&self) -> Value {
306307
let mut value_vec = heapless::Vec::new();
307308
if N <= value_vec.capacity() {
308-
value_vec
309-
.extend_from_slice(&*self)
310-
.expect("Incorrect length calculation");
309+
expect!(
310+
value_vec.extend_from_slice(&*self),
311+
"Incorrect length calculation"
312+
);
311313
} else {
312314
// Truncate to the maximum allowed size
313-
value_vec
314-
.extend_from_slice(&self[..value_vec.capacity()])
315-
.expect("Incorrect length calculation");
315+
expect!(
316+
value_vec.extend_from_slice(&self[..value_vec.capacity()]),
317+
"Incorrect length calculation"
318+
);
316319
}
317320
Value::$variant($variant { value: value_vec })
318321
}
@@ -516,8 +519,10 @@ impl Register for FixedStringRegister {
516519

517520
fn read(&self) -> Value {
518521
Value::String(string_1_0::String {
519-
value: heapless::Vec::from_slice(self.value.as_bytes())
520-
.expect("Register value too long"),
522+
value: expect!(
523+
heapless::Vec::from_slice(self.value.as_bytes()),
524+
"Register value too long"
525+
),
521526
})
522527
}
523528

canadensis_can/Cargo.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ description = "A Cyphal implementation: Cyphal/CAN (CAN and CAN FD) transport la
1212
[dependencies]
1313
fallible_collections = "0.5.1"
1414
heapless = "0.8.0"
15-
log = "0.4"
15+
log = { version = "0.4", optional = true }
16+
defmt = { version = "1.0.1", optional = true }
17+
defmt-or-log = { git = "https://github.com/t-moe/defmt-or-log.git", rev = "a16380e8737b18846c45195328fa0b469ccf43f2" }
1618

1719
[dependencies.canadensis_core]
1820
version = "0.3.1"
@@ -25,3 +27,5 @@ path = "../canadensis_filter_config"
2527
[features]
2628
# The can-fd feature increases the maximum frame capacity and maximum MTU from 8 to 64 bytes
2729
can-fd = []
30+
defmt = ["dep:defmt", "defmt-or-log/defmt", "canadensis_core/defmt"]
31+
log = ["dep:log", "defmt-or-log/log", "canadensis_core/log"]

canadensis_can/src/data.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use core::fmt;
77

88
use canadensis_core::time::Microseconds32;
99
use canadensis_core::InvalidValue;
10+
use defmt_or_log::expect;
1011

1112
/// Bit mask for a 29-bit CAN ID
1213
const CAN_ID_MASK: u32 = 0x1f_ff_ff_ff;
@@ -119,7 +120,7 @@ impl Frame {
119120
timestamp,
120121
id,
121122
loopback: false,
122-
data: heapless::Vec::from_slice(data).expect("Data to large for a frame"),
123+
data: expect!(heapless::Vec::from_slice(data), "Data to large for a frame"),
123124
}
124125
}
125126

canadensis_can/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ extern crate canadensis_core;
1313
extern crate canadensis_filter_config;
1414
extern crate fallible_collections;
1515
extern crate heapless;
16-
extern crate log;
1716

1817
pub use crate::crc::TransferCrc;
1918
pub use crate::data::*;
@@ -31,6 +30,7 @@ mod tx;
3130
mod types;
3231

3332
use core::cmp;
33+
use defmt_or_log::{assert, panic};
3434

3535
/// Calculates the number of frames required and the number of padding bytes to add to a payload so
3636
/// that all frames will have valid length values for CAN FD

canadensis_can/src/queue/mod.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ pub use self::queue_only_driver::QueueOnlyDriver;
99
pub use self::single_frame_queue::SingleFrameQueue;
1010
use core::marker::PhantomData;
1111

12+
use defmt_or_log::expect;
13+
1214
use crate::driver::{ReceiveDriver, TransmitDriver};
1315
use crate::types::CanNodeId;
1416
use crate::Frame;
@@ -160,19 +162,18 @@ where
160162
if !frame_is_expired(&removed_frame, now) {
161163
// Because we just popped a frame from the queue, it must have space to
162164
// return a frame.
163-
queue
164-
.return_frame(removed_frame)
165-
.expect("return_frame out of memory");
165+
expect!(
166+
queue.return_frame(removed_frame),
167+
"return_frame out of memory"
168+
);
166169
}
167170
// Keep going and try the next frame
168171
}
169172
Err(nb::Error::WouldBlock) => {
170173
// The frame couldn't be transmitted, so put it back in the queue
171174
// Because we just popped a frame from the queue, it must have space to
172175
// return a frame.
173-
queue
174-
.return_frame(frame)
175-
.expect("return_frame out of memory");
176+
expect!(queue.return_frame(frame), "return_frame out of memory");
176177
return Err(nb::Error::WouldBlock);
177178
}
178179
Err(nb::Error::Other(e)) => return Err(nb::Error::Other(e)),

canadensis_can/src/redundant/deduplicator.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::Frame;
22
use canadensis_core::time::{MicrosecondDuration32, Microseconds32};
3+
use defmt_or_log::assert_ne;
34

45
/// Deduplicates incoming frames from multiple transports
56
///

0 commit comments

Comments
 (0)