Skip to content

Commit 674c2ac

Browse files
committed
802.15.4 raw stack driver example usage
1 parent c03acd1 commit 674c2ac

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed

examples/ieee802154.rs

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
//! An example showing use of IEEE 802.15.4 networking.
2+
3+
#![no_main]
4+
#![no_std]
5+
use libtock::ieee802154::{
6+
Ieee802154, RxBufferAlternatingOperator, RxOperator as _, RxRingBuffer, RxSingleBufferOperator,
7+
};
8+
use libtock::runtime::{set_main, stack_size};
9+
10+
set_main! {main}
11+
stack_size! {0x400}
12+
13+
fn main() {
14+
// Configure the radio
15+
let pan: u16 = 0xcafe;
16+
let addr_short: u16 = 0xdead;
17+
let addr_long: u64 = 0xdead_dad;
18+
let tx_power: i8 = -0x42;
19+
let channel: u8 = 0xff;
20+
21+
Ieee802154::set_pan(pan);
22+
Ieee802154::set_address_short(addr_short);
23+
Ieee802154::set_address_long(addr_long);
24+
Ieee802154::set_tx_power(tx_power).unwrap();
25+
Ieee802154::set_channel(channel).unwrap();
26+
27+
// Don't forget to commit the config!
28+
Ieee802154::commit_config();
29+
30+
// Turn the radio on
31+
Ieee802154::radio_on().unwrap();
32+
assert!(Ieee802154::is_on());
33+
34+
// Transmit a frame
35+
Ieee802154::transmit_frame(b"foobar").unwrap();
36+
37+
// Showcase receiving to a single buffer - there is a risk of losing some frames.
38+
// See [RxSingleBufferOperator] and [RxBufferAlternatingOperator] docs for more details.
39+
rx_single_buffer();
40+
41+
// Showcase receiving to a pair of alternating buffers - there is no risk of losing frames.
42+
rx_alternating_buffers();
43+
}
44+
45+
fn rx_single_buffer() {
46+
let mut buf = RxRingBuffer::<2>::new();
47+
let mut operator = RxSingleBufferOperator::new(&mut buf);
48+
49+
let frame1 = operator.receive_frame().unwrap();
50+
// Access frame1 data here:
51+
let _body_len = frame1.payload_len;
52+
let _first_body_byte = frame1.body[0];
53+
54+
let _frame2 = operator.receive_frame().unwrap();
55+
// Access frame2 data here
56+
}
57+
58+
fn rx_alternating_buffers() {
59+
let mut buf1 = RxRingBuffer::<2>::new();
60+
let mut buf2 = RxRingBuffer::<2>::new();
61+
let mut operator = RxBufferAlternatingOperator::new(&mut buf1, &mut buf2).unwrap();
62+
63+
let frame1 = operator.receive_frame().unwrap();
64+
// Access frame1 data here:
65+
let _body_len = frame1.payload_len;
66+
let _first_body_byte = frame1.body[0];
67+
68+
let _frame2 = operator.receive_frame().unwrap();
69+
// Access frame2 data here
70+
}

0 commit comments

Comments
 (0)