aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorxoviat <[email protected]>2023-07-17 16:38:46 -0500
committerxoviat <[email protected]>2023-07-17 16:38:46 -0500
commit1d2c47273db6593a53018b1643dcadb491afc3de (patch)
treeb0191bc1bb70e5401b3263b7622c248480c1a4ad /examples
parent582006c75cdd7e9d819bcacc0f6724c05f161bee (diff)
parent6b5df4523aa1c4902f02e803450ae4b418e0e3ca (diff)
Merge branch 'master' into mac
Diffstat (limited to 'examples')
-rw-r--r--examples/rp/Cargo.toml1
-rw-r--r--examples/rp/src/bin/usb_hid_keyboard.rs188
-rw-r--r--examples/stm32wb/src/bin/mac_ffd.rs69
-rw-r--r--examples/stm32wb/src/bin/mac_rfd.rs90
4 files changed, 288 insertions, 60 deletions
diff --git a/examples/rp/Cargo.toml b/examples/rp/Cargo.toml
index 7c5a9dfbc..c812cb3ee 100644
--- a/examples/rp/Cargo.toml
+++ b/examples/rp/Cargo.toml
@@ -40,6 +40,7 @@ display-interface = "0.4.1"
40byte-slice-cast = { version = "1.2.0", default-features = false } 40byte-slice-cast = { version = "1.2.0", default-features = false }
41smart-leds = "0.3.0" 41smart-leds = "0.3.0"
42heapless = "0.7.15" 42heapless = "0.7.15"
43usbd-hid = "0.6.1"
43 44
44embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.11" } 45embedded-hal-1 = { package = "embedded-hal", version = "=1.0.0-alpha.11" }
45embedded-hal-async = "0.2.0-alpha.2" 46embedded-hal-async = "0.2.0-alpha.2"
diff --git a/examples/rp/src/bin/usb_hid_keyboard.rs b/examples/rp/src/bin/usb_hid_keyboard.rs
new file mode 100644
index 000000000..99af1f02f
--- /dev/null
+++ b/examples/rp/src/bin/usb_hid_keyboard.rs
@@ -0,0 +1,188 @@
1#![no_std]
2#![no_main]
3#![feature(type_alias_impl_trait)]
4
5use core::sync::atomic::{AtomicBool, Ordering};
6
7use defmt::*;
8use embassy_executor::Spawner;
9use embassy_futures::join::join;
10use embassy_rp::bind_interrupts;
11use embassy_rp::gpio::{Input, Pull};
12use embassy_rp::peripherals::USB;
13use embassy_rp::usb::{Driver, InterruptHandler};
14use embassy_usb::class::hid::{HidReaderWriter, ReportId, RequestHandler, State};
15use embassy_usb::control::OutResponse;
16use embassy_usb::{Builder, Config, Handler};
17use usbd_hid::descriptor::{KeyboardReport, SerializedDescriptor};
18use {defmt_rtt as _, panic_probe as _};
19
20bind_interrupts!(struct Irqs {
21 USBCTRL_IRQ => InterruptHandler<USB>;
22});
23
24#[embassy_executor::main]
25async fn main(_spawner: Spawner) {
26 let p = embassy_rp::init(Default::default());
27 // Create the driver, from the HAL.
28 let driver = Driver::new(p.USB, Irqs);
29
30 // Create embassy-usb Config
31 let mut config = Config::new(0xc0de, 0xcafe);
32 config.manufacturer = Some("Embassy");
33 config.product = Some("HID keyboard example");
34 config.serial_number = Some("12345678");
35 config.max_power = 100;
36 config.max_packet_size_0 = 64;
37
38 // Create embassy-usb DeviceBuilder using the driver and config.
39 // It needs some buffers for building the descriptors.
40 let mut device_descriptor = [0; 256];
41 let mut config_descriptor = [0; 256];
42 let mut bos_descriptor = [0; 256];
43 // You can also add a Microsoft OS descriptor.
44 // let mut msos_descriptor = [0; 256];
45 let mut control_buf = [0; 64];
46 let request_handler = MyRequestHandler {};
47 let mut device_handler = MyDeviceHandler::new();
48
49 let mut state = State::new();
50
51 let mut builder = Builder::new(
52 driver,
53 config,
54 &mut device_descriptor,
55 &mut config_descriptor,
56 &mut bos_descriptor,
57 // &mut msos_descriptor,
58 &mut control_buf,
59 );
60
61 builder.handler(&mut device_handler);
62
63 // Create classes on the builder.
64 let config = embassy_usb::class::hid::Config {
65 report_descriptor: KeyboardReport::desc(),
66 request_handler: Some(&request_handler),
67 poll_ms: 60,
68 max_packet_size: 64,
69 };
70 let hid = HidReaderWriter::<_, 1, 8>::new(&mut builder, &mut state, config);
71
72 // Build the builder.
73 let mut usb = builder.build();
74
75 // Run the USB device.
76 let usb_fut = usb.run();
77
78 // Set up the signal pin that will be used to trigger the keyboard.
79 let mut signal_pin = Input::new(p.PIN_16, Pull::None);
80
81 let (reader, mut writer) = hid.split();
82
83 // Do stuff with the class!
84 let in_fut = async {
85 loop {
86 info!("Waiting for HIGH on pin 16");
87 signal_pin.wait_for_high().await;
88 info!("HIGH DETECTED");
89 // Create a report with the A key pressed. (no shift modifier)
90 let report = KeyboardReport {
91 keycodes: [4, 0, 0, 0, 0, 0],
92 leds: 0,
93 modifier: 0,
94 reserved: 0,
95 };
96 // Send the report.
97 match writer.write_serialize(&report).await {
98 Ok(()) => {}
99 Err(e) => warn!("Failed to send report: {:?}", e),
100 };
101 signal_pin.wait_for_low().await;
102 info!("LOW DETECTED");
103 let report = KeyboardReport {
104 keycodes: [0, 0, 0, 0, 0, 0],
105 leds: 0,
106 modifier: 0,
107 reserved: 0,
108 };
109 match writer.write_serialize(&report).await {
110 Ok(()) => {}
111 Err(e) => warn!("Failed to send report: {:?}", e),
112 };
113 }
114 };
115
116 let out_fut = async {
117 reader.run(false, &request_handler).await;
118 };
119
120 // Run everything concurrently.
121 // If we had made everything `'static` above instead, we could do this using separate tasks instead.
122 join(usb_fut, join(in_fut, out_fut)).await;
123}
124
125struct MyRequestHandler {}
126
127impl RequestHandler for MyRequestHandler {
128 fn get_report(&self, id: ReportId, _buf: &mut [u8]) -> Option<usize> {
129 info!("Get report for {:?}", id);
130 None
131 }
132
133 fn set_report(&self, id: ReportId, data: &[u8]) -> OutResponse {
134 info!("Set report for {:?}: {=[u8]}", id, data);
135 OutResponse::Accepted
136 }
137
138 fn set_idle_ms(&self, id: Option<ReportId>, dur: u32) {
139 info!("Set idle rate for {:?} to {:?}", id, dur);
140 }
141
142 fn get_idle_ms(&self, id: Option<ReportId>) -> Option<u32> {
143 info!("Get idle rate for {:?}", id);
144 None
145 }
146}
147
148struct MyDeviceHandler {
149 configured: AtomicBool,
150}
151
152impl MyDeviceHandler {
153 fn new() -> Self {
154 MyDeviceHandler {
155 configured: AtomicBool::new(false),
156 }
157 }
158}
159
160impl Handler for MyDeviceHandler {
161 fn enabled(&mut self, enabled: bool) {
162 self.configured.store(false, Ordering::Relaxed);
163 if enabled {
164 info!("Device enabled");
165 } else {
166 info!("Device disabled");
167 }
168 }
169
170 fn reset(&mut self) {
171 self.configured.store(false, Ordering::Relaxed);
172 info!("Bus reset, the Vbus current limit is 100mA");
173 }
174
175 fn addressed(&mut self, addr: u8) {
176 self.configured.store(false, Ordering::Relaxed);
177 info!("USB address set to: {}", addr);
178 }
179
180 fn configured(&mut self, configured: bool) {
181 self.configured.store(configured, Ordering::Relaxed);
182 if configured {
183 info!("Device configured, it may now draw up to the configured current limit from Vbus.")
184 } else {
185 info!("Device is no longer configured, the Vbus current limit is 100mA.");
186 }
187 }
188}
diff --git a/examples/stm32wb/src/bin/mac_ffd.rs b/examples/stm32wb/src/bin/mac_ffd.rs
index e4d81997e..bc71e29aa 100644
--- a/examples/stm32wb/src/bin/mac_ffd.rs
+++ b/examples/stm32wb/src/bin/mac_ffd.rs
@@ -67,11 +67,16 @@ async fn main(spawner: Spawner) {
67 67
68 info!("resetting"); 68 info!("resetting");
69 mbox.mac_subsystem 69 mbox.mac_subsystem
70 .send_command(&ResetRequest { set_default_pib: true }) 70 .send_command(&ResetRequest {
71 set_default_pib: true,
72 ..Default::default()
73 })
71 .await 74 .await
72 .unwrap(); 75 .unwrap();
73 let evt = mbox.mac_subsystem.read().await; 76 {
74 defmt::info!("{:#x}", evt); 77 let evt = mbox.mac_subsystem.read().await;
78 defmt::info!("{:#x}", evt.mac_event());
79 }
75 80
76 info!("setting extended address"); 81 info!("setting extended address");
77 let extended_address: u64 = 0xACDE480000000001; 82 let extended_address: u64 = 0xACDE480000000001;
@@ -82,8 +87,10 @@ async fn main(spawner: Spawner) {
82 }) 87 })
83 .await 88 .await
84 .unwrap(); 89 .unwrap();
85 let evt = mbox.mac_subsystem.read().await; 90 {
86 defmt::info!("{:#x}", evt); 91 let evt = mbox.mac_subsystem.read().await;
92 defmt::info!("{:#x}", evt.mac_event());
93 }
87 94
88 info!("setting short address"); 95 info!("setting short address");
89 let short_address: u16 = 0x1122; 96 let short_address: u16 = 0x1122;
@@ -94,8 +101,10 @@ async fn main(spawner: Spawner) {
94 }) 101 })
95 .await 102 .await
96 .unwrap(); 103 .unwrap();
97 let evt = mbox.mac_subsystem.read().await; 104 {
98 defmt::info!("{:#x}", evt); 105 let evt = mbox.mac_subsystem.read().await;
106 defmt::info!("{:#x}", evt.mac_event());
107 }
99 108
100 info!("setting association permit"); 109 info!("setting association permit");
101 let association_permit: bool = true; 110 let association_permit: bool = true;
@@ -106,8 +115,10 @@ async fn main(spawner: Spawner) {
106 }) 115 })
107 .await 116 .await
108 .unwrap(); 117 .unwrap();
109 let evt = mbox.mac_subsystem.read().await; 118 {
110 defmt::info!("{:#x}", evt); 119 let evt = mbox.mac_subsystem.read().await;
120 defmt::info!("{:#x}", evt.mac_event());
121 }
111 122
112 info!("setting TX power"); 123 info!("setting TX power");
113 let transmit_power: i8 = 2; 124 let transmit_power: i8 = 2;
@@ -118,8 +129,10 @@ async fn main(spawner: Spawner) {
118 }) 129 })
119 .await 130 .await
120 .unwrap(); 131 .unwrap();
121 let evt = mbox.mac_subsystem.read().await; 132 {
122 defmt::info!("{:#x}", evt); 133 let evt = mbox.mac_subsystem.read().await;
134 defmt::info!("{:#x}", evt.mac_event());
135 }
123 136
124 info!("starting FFD device"); 137 info!("starting FFD device");
125 mbox.mac_subsystem 138 mbox.mac_subsystem
@@ -134,8 +147,10 @@ async fn main(spawner: Spawner) {
134 }) 147 })
135 .await 148 .await
136 .unwrap(); 149 .unwrap();
137 let evt = mbox.mac_subsystem.read().await; 150 {
138 defmt::info!("{:#x}", evt); 151 let evt = mbox.mac_subsystem.read().await;
152 defmt::info!("{:#x}", evt.mac_event());
153 }
139 154
140 info!("setting RX on when idle"); 155 info!("setting RX on when idle");
141 let rx_on_while_idle: bool = true; 156 let rx_on_while_idle: bool = true;
@@ -146,14 +161,17 @@ async fn main(spawner: Spawner) {
146 }) 161 })
147 .await 162 .await
148 .unwrap(); 163 .unwrap();
149 let evt = mbox.mac_subsystem.read().await; 164 {
150 defmt::info!("{:#x}", evt); 165 let evt = mbox.mac_subsystem.read().await;
166 defmt::info!("{:#x}", evt.mac_event());
167 }
151 168
152 loop { 169 loop {
153 let evt = mbox.mac_subsystem.read().await; 170 let evt = mbox.mac_subsystem.read().await;
154 defmt::info!("{:#x}", evt); 171 if let Ok(evt) = evt.mac_event() {
172 defmt::info!("parsed mac event");
173 defmt::info!("{:#x}", evt);
155 174
156 if let Ok(evt) = evt {
157 match evt { 175 match evt {
158 MacEvent::MlmeAssociateInd(association) => mbox 176 MacEvent::MlmeAssociateInd(association) => mbox
159 .mac_subsystem 177 .mac_subsystem
@@ -167,17 +185,22 @@ async fn main(spawner: Spawner) {
167 .await 185 .await
168 .unwrap(), 186 .unwrap(),
169 MacEvent::McpsDataInd(data_ind) => { 187 MacEvent::McpsDataInd(data_ind) => {
170 let data_addr = data_ind.msdu_ptr; 188 let payload = data_ind.payload();
171 let mut data = [0u8; 256]; 189 let ref_payload = b"Hello from embassy!";
172 unsafe { data_addr.copy_to(&mut data as *mut _, data_ind.msdu_length as usize) } 190 info!("{}", payload);
173 info!("{}", data[..data_ind.msdu_length as usize]);
174 191
175 if &data[..data_ind.msdu_length as usize] == b"Hello from embassy!" { 192 if payload == ref_payload {
176 info!("success"); 193 info!("success");
194 } else {
195 info!("ref payload: {}", ref_payload);
177 } 196 }
178 } 197 }
179 _ => {} 198 _ => {
199 defmt::info!("other mac event");
200 }
180 } 201 }
202 } else {
203 defmt::info!("failed to parse mac event");
181 } 204 }
182 } 205 }
183} 206}
diff --git a/examples/stm32wb/src/bin/mac_rfd.rs b/examples/stm32wb/src/bin/mac_rfd.rs
index b2dac72cc..7cb401d89 100644
--- a/examples/stm32wb/src/bin/mac_rfd.rs
+++ b/examples/stm32wb/src/bin/mac_rfd.rs
@@ -69,11 +69,16 @@ async fn main(spawner: Spawner) {
69 69
70 info!("resetting"); 70 info!("resetting");
71 mbox.mac_subsystem 71 mbox.mac_subsystem
72 .send_command(&ResetRequest { set_default_pib: true }) 72 .send_command(&ResetRequest {
73 set_default_pib: true,
74 ..Default::default()
75 })
73 .await 76 .await
74 .unwrap(); 77 .unwrap();
75 let evt = mbox.mac_subsystem.read().await; 78 {
76 info!("{:#x}", evt); 79 let evt = mbox.mac_subsystem.read().await;
80 defmt::info!("{:#x}", evt.mac_event());
81 }
77 82
78 info!("setting extended address"); 83 info!("setting extended address");
79 let extended_address: u64 = 0xACDE480000000002; 84 let extended_address: u64 = 0xACDE480000000002;
@@ -84,24 +89,30 @@ async fn main(spawner: Spawner) {
84 }) 89 })
85 .await 90 .await
86 .unwrap(); 91 .unwrap();
87 let evt = mbox.mac_subsystem.read().await; 92 {
88 info!("{:#x}", evt); 93 let evt = mbox.mac_subsystem.read().await;
94 defmt::info!("{:#x}", evt.mac_event());
95 }
89 96
90 info!("getting extended address"); 97 info!("getting extended address");
91 mbox.mac_subsystem 98 mbox.mac_subsystem
92 .send_command(&GetRequest { 99 .send_command(&GetRequest {
93 pib_attribute: PibId::ExtendedAddress, 100 pib_attribute: PibId::ExtendedAddress,
101 ..Default::default()
94 }) 102 })
95 .await 103 .await
96 .unwrap(); 104 .unwrap();
97 let evt = mbox.mac_subsystem.read().await;
98 info!("{:#x}", evt);
99 105
100 if let Ok(MacEvent::MlmeGetCnf(evt)) = evt { 106 {
101 if evt.pib_attribute_value_len == 8 { 107 let evt = mbox.mac_subsystem.read().await;
102 let value = unsafe { core::ptr::read_unaligned(evt.pib_attribute_value_ptr as *const u64) }; 108 info!("{:#x}", evt.mac_event());
109
110 if let Ok(MacEvent::MlmeGetCnf(evt)) = evt.mac_event() {
111 if evt.pib_attribute_value_len == 8 {
112 let value = unsafe { core::ptr::read_unaligned(evt.pib_attribute_value_ptr as *const u64) };
103 113
104 info!("value {:#x}", value) 114 info!("value {:#x}", value)
115 }
105 } 116 }
106 } 117 }
107 118
@@ -120,13 +131,15 @@ async fn main(spawner: Spawner) {
120 }; 131 };
121 info!("{}", a); 132 info!("{}", a);
122 mbox.mac_subsystem.send_command(&a).await.unwrap(); 133 mbox.mac_subsystem.send_command(&a).await.unwrap();
123 let evt = mbox.mac_subsystem.read().await; 134 let short_addr = {
124 info!("{:#x}", evt); 135 let evt = mbox.mac_subsystem.read().await;
136 info!("{:#x}", evt.mac_event());
125 137
126 let short_addr = if let Ok(MacEvent::MlmeAssociateCnf(conf)) = evt { 138 if let Ok(MacEvent::MlmeAssociateCnf(conf)) = evt.mac_event() {
127 conf.assoc_short_address 139 conf.assoc_short_address
128 } else { 140 } else {
129 defmt::panic!() 141 defmt::panic!()
142 }
130 }; 143 };
131 144
132 info!("setting short address"); 145 info!("setting short address");
@@ -137,34 +150,37 @@ async fn main(spawner: Spawner) {
137 }) 150 })
138 .await 151 .await
139 .unwrap(); 152 .unwrap();
140 let evt = mbox.mac_subsystem.read().await; 153 {
141 info!("{:#x}", evt); 154 let evt = mbox.mac_subsystem.read().await;
155 info!("{:#x}", evt.mac_event());
156 }
142 157
143 info!("sending data"); 158 info!("sending data");
144 let mut data_buffer = [0u8; 256];
145 let data = b"Hello from embassy!"; 159 let data = b"Hello from embassy!";
146 data_buffer[..data.len()].copy_from_slice(data);
147 mbox.mac_subsystem 160 mbox.mac_subsystem
148 .send_command(&DataRequest { 161 .send_command(
149 src_addr_mode: AddressMode::Short, 162 DataRequest {
150 dst_addr_mode: AddressMode::Short, 163 src_addr_mode: AddressMode::Short,
151 dst_pan_id: PanId([0x1A, 0xAA]), 164 dst_addr_mode: AddressMode::Short,
152 dst_address: MacAddress::BROADCAST, 165 dst_pan_id: PanId([0x1A, 0xAA]),
153 msdu_handle: 0x02, 166 dst_address: MacAddress::BROADCAST,
154 ack_tx: 0x00, 167 msdu_handle: 0x02,
155 gts_tx: false, 168 ack_tx: 0x00,
156 msdu_ptr: &data_buffer as *const _ as *const u8, 169 gts_tx: false,
157 msdu_length: data.len() as u8, 170 security_level: SecurityLevel::Unsecure,
158 security_level: SecurityLevel::Unsecure, 171 ..Default::default()
159 ..Default::default() 172 }
160 }) 173 .set_buffer(data),
174 )
161 .await 175 .await
162 .unwrap(); 176 .unwrap();
163 let evt = mbox.mac_subsystem.read().await; 177 {
164 info!("{:#x}", evt); 178 let evt = mbox.mac_subsystem.read().await;
179 info!("{:#x}", evt.mac_event());
180 }
165 181
166 loop { 182 loop {
167 let evt = mbox.mac_subsystem.read().await; 183 let evt = mbox.mac_subsystem.read().await;
168 info!("{:#x}", evt); 184 info!("{:#x}", evt.mac_event());
169 } 185 }
170} 186}