Skip to content

Commit 50bcdc4

Browse files
committed
802.15.4 raw stack driver examples
1 parent 9664c0c commit 50bcdc4

File tree

4 files changed

+245
-0
lines changed

4 files changed

+245
-0
lines changed

examples/ieee802154.rs

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

examples/ieee802154_rx.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
//! An example showing use of IEEE 802.15.4 networking.
2+
//! It infinitely received a frame and prints its content to Console.
3+
4+
#![no_main]
5+
#![no_std]
6+
use core::fmt::Write as _;
7+
use libtock::console::Console;
8+
use libtock::ieee802154::{Ieee802154, RxOperator as _, RxRingBuffer, RxSingleBufferOperator};
9+
use libtock::runtime::{set_main, stack_size};
10+
11+
set_main! {main}
12+
stack_size! {0x600}
13+
14+
fn main() {
15+
// Configure the radio
16+
let pan: u16 = 0xcafe;
17+
let addr_short: u16 = 0xdead;
18+
let addr_long: u64 = 0xdead_dad;
19+
let tx_power: i8 = 5;
20+
let channel: u8 = 11;
21+
22+
Ieee802154::set_pan(pan);
23+
Ieee802154::set_address_short(addr_short);
24+
Ieee802154::set_address_long(addr_long);
25+
Ieee802154::set_tx_power(tx_power).unwrap();
26+
Ieee802154::set_channel(channel).unwrap();
27+
28+
// Don't forget to commit the config!
29+
Ieee802154::commit_config();
30+
31+
// Turn the radio on
32+
Ieee802154::radio_on().unwrap();
33+
assert!(Ieee802154::is_on());
34+
35+
let mut buf = RxRingBuffer::<2>::new();
36+
let mut operator = RxSingleBufferOperator::new(&mut buf);
37+
loop {
38+
let frame = operator.receive_frame().unwrap();
39+
40+
let body_len = frame.payload_len;
41+
writeln!(
42+
Console::writer(),
43+
"Received frame with body of len {}: {} {:?}!\n",
44+
body_len,
45+
core::str::from_utf8(&frame.body).unwrap(),
46+
&frame.body[..frame.body.len() - core::mem::size_of::<usize>()]
47+
)
48+
.unwrap();
49+
}
50+
}

examples/ieee802154_rx_tx.rs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
//! An example showing use of IEEE 802.15.4 networking.
2+
//! It infinitely sends a frame with a constantly incremented counter,
3+
//! and after each send receives a frame and prints it to Console.
4+
5+
#![no_main]
6+
#![no_std]
7+
use core::fmt::Write as _;
8+
use libtock::alarm::{Alarm, Milliseconds};
9+
use libtock::console::Console;
10+
use libtock::ieee802154::{Ieee802154, RxOperator as _, RxRingBuffer, RxSingleBufferOperator};
11+
use libtock::runtime::{set_main, stack_size};
12+
13+
set_main! {main}
14+
stack_size! {0x600}
15+
16+
fn main() {
17+
// Configure the radio
18+
let pan: u16 = 0xcafe;
19+
let addr_short: u16 = 0xdead;
20+
let addr_long: u64 = 0xdead_dad;
21+
let tx_power: i8 = 5;
22+
let channel: u8 = 11;
23+
24+
Ieee802154::set_pan(pan);
25+
Ieee802154::set_address_short(addr_short);
26+
Ieee802154::set_address_long(addr_long);
27+
Ieee802154::set_tx_power(tx_power).unwrap();
28+
Ieee802154::set_channel(channel).unwrap();
29+
30+
// Don't forget to commit the config!
31+
Ieee802154::commit_config();
32+
33+
// Turn the radio on
34+
Ieee802154::radio_on().unwrap();
35+
assert!(Ieee802154::is_on());
36+
37+
let mut buf = RxRingBuffer::<2>::new();
38+
let mut operator = RxSingleBufferOperator::new(&mut buf);
39+
40+
let mut counter = 0_usize;
41+
let mut buf = [
42+
b'f', b'r', b'a', b'm', b'e', b' ', b'n', b'.', b'o', b'.', b' ', b'\0', b'\0', b'\0',
43+
b'\0',
44+
];
45+
fn set_buf_cnt(buf: &mut [u8], counter: &mut usize) {
46+
let buf_len = buf.len();
47+
let buf_cnt = &mut buf[buf_len - core::mem::size_of_val(&counter)..];
48+
buf_cnt.copy_from_slice(&counter.to_be_bytes());
49+
}
50+
51+
loop {
52+
Alarm::sleep_for(Milliseconds(1000)).unwrap();
53+
54+
set_buf_cnt(&mut buf, &mut counter);
55+
56+
// Transmit a frame
57+
Ieee802154::transmit_frame(&buf).unwrap();
58+
59+
writeln!(Console::writer(), "Transmitted frame {}!\n", counter).unwrap();
60+
61+
let frame = operator.receive_frame().unwrap();
62+
63+
let body_len = frame.payload_len;
64+
writeln!(
65+
Console::writer(),
66+
"Received frame with body of len {}: {}-{} {:?}!\n",
67+
body_len,
68+
core::str::from_utf8(&frame.body[..frame.body.len() - core::mem::size_of::<usize>()])
69+
.unwrap_or("<error decoding>"),
70+
usize::from_le_bytes(
71+
frame.body[frame.body.len() - core::mem::size_of::<usize>()..]
72+
.try_into()
73+
.unwrap()
74+
),
75+
frame.body
76+
)
77+
.unwrap();
78+
79+
counter += 1;
80+
}
81+
}

examples/ieee802154_tx.rs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
//! An example showing use of IEEE 802.15.4 networking.
2+
//! It infinitely sends a frame with a constantly incremented counter.
3+
4+
#![no_main]
5+
#![no_std]
6+
use core::fmt::Write as _;
7+
8+
use libtock::alarm::{Alarm, Milliseconds};
9+
use libtock::console::Console;
10+
use libtock::ieee802154::Ieee802154;
11+
use libtock::runtime::{set_main, stack_size};
12+
13+
set_main! {main}
14+
stack_size! {0x600}
15+
16+
fn main() {
17+
// Configure the radio
18+
let pan: u16 = 0xcafe;
19+
let addr_short: u16 = 0xdead;
20+
let addr_long: u64 = 0xdead_dad;
21+
let tx_power: i8 = 5;
22+
let channel: u8 = 11;
23+
24+
Ieee802154::set_pan(pan);
25+
Ieee802154::set_address_short(addr_short);
26+
Ieee802154::set_address_long(addr_long);
27+
Ieee802154::set_tx_power(tx_power).unwrap();
28+
Ieee802154::set_channel(channel).unwrap();
29+
30+
// Don't forget to commit the config!
31+
Ieee802154::commit_config();
32+
33+
// Turn the radio on
34+
Ieee802154::radio_on().unwrap();
35+
assert!(Ieee802154::is_on());
36+
37+
let mut counter = 0_usize;
38+
let mut buf = [
39+
b'f', b'r', b'a', b'm', b'e', b' ', b'n', b'.', b'o', b'.', b' ', b'\0', b'\0', b'\0',
40+
b'\0',
41+
];
42+
fn set_buf_cnt(buf: &mut [u8], counter: &mut usize) {
43+
let buf_len = buf.len();
44+
let buf_cnt = &mut buf[buf_len - core::mem::size_of_val(&counter)..];
45+
buf_cnt.copy_from_slice(&counter.to_be_bytes());
46+
}
47+
48+
loop {
49+
Alarm::sleep_for(Milliseconds(1000)).unwrap();
50+
51+
set_buf_cnt(&mut buf, &mut counter);
52+
53+
// Transmit a frame
54+
Ieee802154::transmit_frame(&buf).unwrap();
55+
56+
writeln!(Console::writer(), "Transmitted frame {}!\n", counter).unwrap();
57+
58+
counter += 1;
59+
}
60+
}

0 commit comments

Comments
 (0)