aboutsummaryrefslogtreecommitdiff
path: root/embassy-stm32f4-examples/src
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-stm32f4-examples/src')
-rw-r--r--embassy-stm32f4-examples/src/bin/usb_serial.rs85
1 files changed, 57 insertions, 28 deletions
diff --git a/embassy-stm32f4-examples/src/bin/usb_serial.rs b/embassy-stm32f4-examples/src/bin/usb_serial.rs
index d2ccb4b21..cf04c772e 100644
--- a/embassy-stm32f4-examples/src/bin/usb_serial.rs
+++ b/embassy-stm32f4-examples/src/bin/usb_serial.rs
@@ -10,12 +10,11 @@ use cortex_m_rt::entry;
10use defmt::panic; 10use defmt::panic;
11use embassy::executor::{task, Executor}; 11use embassy::executor::{task, Executor};
12use embassy::io::{AsyncBufReadExt, AsyncWriteExt}; 12use embassy::io::{AsyncBufReadExt, AsyncWriteExt};
13use embassy::time::{Duration, Timer};
14use embassy::util::Forever; 13use embassy::util::Forever;
15use embassy_stm32f4::interrupt::OwnedInterrupt; 14use embassy_stm32f4::interrupt::OwnedInterrupt;
16use embassy_stm32f4::usb::Usb; 15use embassy_stm32f4::usb::Usb;
17use embassy_stm32f4::usb_serial::UsbSerial; 16use embassy_stm32f4::usb_serial::UsbSerial;
18use embassy_stm32f4::{interrupt, pac, rtc}; 17use embassy_stm32f4::{interrupt, pac};
19use futures::future::{select, Either}; 18use futures::future::{select, Either};
20use futures::pin_mut; 19use futures::pin_mut;
21use stm32f4xx_hal::otg_fs::{UsbBus, USB}; 20use stm32f4xx_hal::otg_fs::{UsbBus, USB};
@@ -27,44 +26,81 @@ use usb_device::prelude::*;
27async fn run1(bus: &'static mut UsbBusAllocator<UsbBus<USB>>) { 26async fn run1(bus: &'static mut UsbBusAllocator<UsbBus<USB>>) {
28 info!("Async task"); 27 info!("Async task");
29 28
30 let mut read_buf = [0u8; 128]; 29 let mut read_buf1 = [0u8; 128];
31 let mut write_buf = [0u8; 128]; 30 let mut write_buf1 = [0u8; 128];
32 let serial = UsbSerial::new(bus, &mut read_buf, &mut write_buf); 31 let serial1 = UsbSerial::new(bus, &mut read_buf1, &mut write_buf1);
32
33 let mut read_buf2 = [0u8; 128];
34 let mut write_buf2 = [0u8; 128];
35 let serial2 = UsbSerial::new(bus, &mut read_buf2, &mut write_buf2);
33 36
34 let device = UsbDeviceBuilder::new(bus, UsbVidPid(0x16c0, 0x27dd)) 37 let device = UsbDeviceBuilder::new(bus, UsbVidPid(0x16c0, 0x27dd))
35 .manufacturer("Fake company") 38 .manufacturer("Fake company")
36 .product("Serial port") 39 .product("Serial port")
37 .serial_number("TEST") 40 .serial_number("TEST")
38 .device_class(0x02) 41 //.device_class(0x02)
39 .build(); 42 .build();
40 43
41 let irq = interrupt::take!(OTG_FS); 44 let irq = interrupt::take!(OTG_FS);
42 irq.set_priority(interrupt::Priority::Level3); 45 irq.set_priority(interrupt::Priority::Level3);
43 46
44 let usb = Usb::new(device, serial, irq); 47 let usb = Usb::new(device, (serial1, serial2), irq);
45 pin_mut!(usb); 48 pin_mut!(usb);
46 49
47 let (mut read_interface, mut write_interface) = usb.as_mut().into_ref().take_serial(); 50 let (mut read_interface1, mut write_interface1) = usb.as_ref().take_serial_0();
51 let (mut read_interface2, mut write_interface2) = usb.as_ref().take_serial_1();
48 52
49 let mut buf = [0u8; 5]; 53 let mut buf1 = [0u8; 64];
50 loop { 54 let mut buf2 = [0u8; 64];
51 let recv_fut = read_interface.read(&mut buf);
52 let timeout = Timer::after(Duration::from_ticks(32768 * 3));
53 55
54 match select(recv_fut, timeout).await { 56 loop {
55 Either::Left((recv, _)) => { 57 let mut n1 = 0;
56 let recv = unwrap!(recv); 58 let mut n2 = 0;
57 unwrap!(write_interface.write_all(&buf[..recv]).await); 59 let left = {
58 } 60 let read_line1 = async {
59 Either::Right(_) => { 61 loop {
60 unwrap!(write_interface.write_all(b"Hello\r\n").await); 62 let byte = unwrap!(read_interface1.read_byte().await);
63 unwrap!(write_interface1.write_byte(byte).await);
64 buf1[n1] = byte;
65
66 n1 += 1;
67 if byte == b'\n' || n1 == buf1.len() {
68 break;
69 }
70 }
71 };
72 pin_mut!(read_line1);
73
74 let read_line2 = async {
75 loop {
76 let byte = unwrap!(read_interface2.read_byte().await);
77 unwrap!(write_interface2.write_byte(byte).await);
78 buf2[n2] = byte;
79
80 n2 += 1;
81 if byte == b'\n' || n2 == buf2.len() {
82 break;
83 }
84 }
85 };
86 pin_mut!(read_line2);
87
88 match select(read_line1, read_line2).await {
89 Either::Left(_) => true,
90 Either::Right(_) => false,
61 } 91 }
92 };
93
94 if left {
95 unwrap!(write_interface2.write_all(b"\r\n").await);
96 unwrap!(write_interface2.write_all(&buf1[..n1]).await);
97 } else {
98 unwrap!(write_interface1.write_all(b"\r\n").await);
99 unwrap!(write_interface1.write_all(&buf2[..n2]).await);
62 } 100 }
63 } 101 }
64} 102}
65 103
66static RTC: Forever<rtc::RTC<pac::TIM2>> = Forever::new();
67static ALARM: Forever<rtc::Alarm<pac::TIM2>> = Forever::new();
68static EXECUTOR: Forever<Executor> = Forever::new(); 104static EXECUTOR: Forever<Executor> = Forever::new();
69static USB_BUS: Forever<UsbBusAllocator<UsbBus<USB>>> = Forever::new(); 105static USB_BUS: Forever<UsbBusAllocator<UsbBus<USB>>> = Forever::new();
70 106
@@ -91,14 +127,7 @@ fn main() -> ! {
91 w.dbg_stop().set_bit() 127 w.dbg_stop().set_bit()
92 }); 128 });
93 129
94 let rtc = RTC.put(rtc::RTC::new(p.TIM2, interrupt::take!(TIM2), clocks));
95 rtc.start();
96
97 unsafe { embassy::time::set_clock(rtc) };
98
99 let alarm = ALARM.put(rtc.alarm1());
100 let executor = EXECUTOR.put(Executor::new()); 130 let executor = EXECUTOR.put(Executor::new());
101 executor.set_alarm(alarm);
102 131
103 let gpioa = p.GPIOA.split(); 132 let gpioa = p.GPIOA.split();
104 let usb = USB { 133 let usb = USB {