|
| 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