aboutsummaryrefslogtreecommitdiff
path: root/examples/std/src/bin
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2021-06-02 01:30:07 +0200
committerDario Nieuwenhuis <[email protected]>2021-06-02 01:32:19 +0200
commitdff03ecfc74d6af716637888338ebfa99ab7a027 (patch)
treec06bf2b0a2e6657c3427c956dbd27a4e45211aaa /examples/std/src/bin
parenta0c5f7137fe0c45b8db0aad2a116aea91e6a93f7 (diff)
Move examples to a subdirectory
Diffstat (limited to 'examples/std/src/bin')
-rw-r--r--examples/std/src/bin/net.rs103
-rw-r--r--examples/std/src/bin/serial.rs59
-rw-r--r--examples/std/src/bin/tick.rs31
3 files changed, 193 insertions, 0 deletions
diff --git a/examples/std/src/bin/net.rs b/examples/std/src/bin/net.rs
new file mode 100644
index 000000000..5a726e5d2
--- /dev/null
+++ b/examples/std/src/bin/net.rs
@@ -0,0 +1,103 @@
1#![feature(type_alias_impl_trait)]
2#![feature(min_type_alias_impl_trait)]
3#![feature(impl_trait_in_bindings)]
4#![allow(incomplete_features)]
5
6use clap::{AppSettings, Clap};
7use embassy::executor::Spawner;
8use embassy::io::AsyncWriteExt;
9use embassy::util::Forever;
10use embassy_net::*;
11use embassy_std::Executor;
12use heapless::Vec;
13use log::*;
14
15#[path = "../tuntap.rs"]
16mod tuntap;
17
18use crate::tuntap::TunTapDevice;
19
20static DEVICE: Forever<TunTapDevice> = Forever::new();
21static CONFIG: Forever<DhcpConfigurator> = Forever::new();
22
23#[derive(Clap)]
24#[clap(version = "1.0")]
25#[clap(setting = AppSettings::ColoredHelp)]
26struct Opts {
27 /// TAP device name
28 #[clap(long, default_value = "tap0")]
29 tap: String,
30}
31
32#[embassy::task]
33async fn net_task() {
34 embassy_net::run().await
35}
36
37#[embassy::task]
38async fn main_task(spawner: Spawner) {
39 let opts: Opts = Opts::parse();
40
41 // Init network device
42 let device = TunTapDevice::new(&opts.tap).unwrap();
43
44 // Static IP configuration
45 let config = StaticConfigurator::new(Config {
46 address: Ipv4Cidr::new(Ipv4Address::new(192, 168, 69, 2), 24),
47 dns_servers: Vec::new(),
48 gateway: Some(Ipv4Address::new(192, 168, 69, 1)),
49 });
50
51 // DHCP configruation
52 let config = DhcpConfigurator::new();
53
54 // Init network stack
55 embassy_net::init(DEVICE.put(device), CONFIG.put(config));
56
57 // Launch network task
58 spawner.spawn(net_task()).unwrap();
59
60 // Then we can use it!
61 let mut rx_buffer = [0; 4096];
62 let mut tx_buffer = [0; 4096];
63 let mut socket = TcpSocket::new(&mut rx_buffer, &mut tx_buffer);
64
65 socket.set_timeout(Some(embassy_net::SmolDuration::from_secs(10)));
66
67 let remote_endpoint = (Ipv4Address::new(192, 168, 69, 74), 8000);
68 info!("connecting to {:?}...", remote_endpoint);
69 let r = socket.connect(remote_endpoint).await;
70 if let Err(e) = r {
71 warn!("connect error: {:?}", e);
72 return;
73 }
74 info!("connected!");
75 loop {
76 let r = socket.write_all(b"Hello!\n").await;
77 if let Err(e) = r {
78 warn!("write error: {:?}", e);
79 return;
80 }
81 }
82}
83
84#[no_mangle]
85fn _embassy_rand(buf: &mut [u8]) {
86 use rand_core::{OsRng, RngCore};
87 OsRng.fill_bytes(buf);
88}
89
90static EXECUTOR: Forever<Executor> = Forever::new();
91
92fn main() {
93 env_logger::builder()
94 .filter_level(log::LevelFilter::Debug)
95 .filter_module("async_io", log::LevelFilter::Info)
96 .format_timestamp_nanos()
97 .init();
98
99 let executor = EXECUTOR.put(Executor::new());
100 executor.run(|spawner| {
101 spawner.spawn(main_task(spawner)).unwrap();
102 });
103}
diff --git a/examples/std/src/bin/serial.rs b/examples/std/src/bin/serial.rs
new file mode 100644
index 000000000..1b22dc0de
--- /dev/null
+++ b/examples/std/src/bin/serial.rs
@@ -0,0 +1,59 @@
1#![feature(min_type_alias_impl_trait)]
2#![feature(impl_trait_in_bindings)]
3#![feature(type_alias_impl_trait)]
4#![allow(incomplete_features)]
5
6#[path = "../serial_port.rs"]
7mod serial_port;
8
9use async_io::Async;
10use embassy::io::AsyncBufReadExt;
11use embassy::util::Forever;
12use embassy_std::Executor;
13use log::*;
14use nix::sys::termios;
15
16use self::serial_port::SerialPort;
17
18#[embassy::task]
19async fn run() {
20 // Open the serial port.
21 let baudrate = termios::BaudRate::B115200;
22 let port = SerialPort::new("/dev/ttyACM0", baudrate).unwrap();
23 //let port = Spy::new(port);
24
25 // Use async_io's reactor for async IO.
26 // This demonstrates how embassy's executor can drive futures from another IO library.
27 // Essentially, async_io::Async converts from AsRawFd+Read+Write to futures's AsyncRead+AsyncWrite
28 let port = Async::new(port).unwrap();
29
30 // This implements futures's AsyncBufRead based on futures's AsyncRead
31 let port = futures::io::BufReader::new(port);
32
33 // We can then use FromStdIo to convert from futures's AsyncBufRead+AsyncWrite
34 // to embassy's AsyncBufRead+AsyncWrite
35 let mut port = embassy::io::FromStdIo::new(port);
36
37 info!("Serial opened!");
38
39 loop {
40 let mut buf = [0u8; 256];
41 let n = port.read(&mut buf).await.unwrap();
42 info!("read {:?}", &buf[..n]);
43 }
44}
45
46static EXECUTOR: Forever<Executor> = Forever::new();
47
48fn main() {
49 env_logger::builder()
50 .filter_level(log::LevelFilter::Debug)
51 .filter_module("async_io", log::LevelFilter::Info)
52 .format_timestamp_nanos()
53 .init();
54
55 let executor = EXECUTOR.put(Executor::new());
56 executor.run(|spawner| {
57 spawner.spawn(run()).unwrap();
58 });
59}
diff --git a/examples/std/src/bin/tick.rs b/examples/std/src/bin/tick.rs
new file mode 100644
index 000000000..6f30edb34
--- /dev/null
+++ b/examples/std/src/bin/tick.rs
@@ -0,0 +1,31 @@
1#![feature(min_type_alias_impl_trait)]
2#![feature(impl_trait_in_bindings)]
3#![feature(type_alias_impl_trait)]
4#![allow(incomplete_features)]
5
6use embassy::time::{Duration, Timer};
7use embassy::util::Forever;
8use embassy_std::Executor;
9use log::*;
10
11#[embassy::task]
12async fn run() {
13 loop {
14 info!("tick");
15 Timer::after(Duration::from_secs(1)).await;
16 }
17}
18
19static EXECUTOR: Forever<Executor> = Forever::new();
20
21fn main() {
22 env_logger::builder()
23 .filter_level(log::LevelFilter::Debug)
24 .format_timestamp_nanos()
25 .init();
26
27 let executor = EXECUTOR.put(Executor::new());
28 executor.run(|spawner| {
29 spawner.spawn(run()).unwrap();
30 });
31}