ring
This commit is contained in:
parent
8c61dbeaea
commit
23538ef624
3 changed files with 67 additions and 40 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
|
@ -1102,6 +1102,7 @@ dependencies = [
|
||||||
"embassy-net",
|
"embassy-net",
|
||||||
"embassy-net-driver",
|
"embassy-net-driver",
|
||||||
"embassy-time",
|
"embassy-time",
|
||||||
|
"embedded-hal-async",
|
||||||
"embedded-io-async",
|
"embedded-io-async",
|
||||||
"esp-backtrace",
|
"esp-backtrace",
|
||||||
"esp-hal",
|
"esp-hal",
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ embassy-net = { version = "0.4.0", features = ["dhcpv4", "proto-ipv4", "tcp"] }
|
||||||
embedded-io-async = "0.6.1"
|
embedded-io-async = "0.6.1"
|
||||||
embassy-net-driver = "0.2.0"
|
embassy-net-driver = "0.2.0"
|
||||||
const_format = "0.2.32"
|
const_format = "0.2.32"
|
||||||
|
embedded-hal-async = "1.0.0"
|
||||||
|
|
||||||
[profile.dev]
|
[profile.dev]
|
||||||
# Rust debug is too slow.
|
# Rust debug is too slow.
|
||||||
|
|
|
||||||
45
src/main.rs
45
src/main.rs
|
|
@ -5,12 +5,14 @@
|
||||||
use embassy_executor::Spawner;
|
use embassy_executor::Spawner;
|
||||||
use embassy_net::tcp::TcpSocket;
|
use embassy_net::tcp::TcpSocket;
|
||||||
use embassy_net::{Config, Ipv4Address, Stack, StackResources};
|
use embassy_net::{Config, Ipv4Address, Stack, StackResources};
|
||||||
use esp_hal;
|
use esp_hal::{self, IO};
|
||||||
|
|
||||||
use const_format::formatcp;
|
use const_format::formatcp;
|
||||||
use embassy_time::{Duration, Timer};
|
use embassy_time::{Duration, Timer};
|
||||||
|
use embedded_hal_async::digital::Wait;
|
||||||
use esp_backtrace as _;
|
use esp_backtrace as _;
|
||||||
use esp_hal::clock::ClockControl;
|
use esp_hal::clock::ClockControl;
|
||||||
|
use esp_hal::gpio::{AnyPin, Input, PullUp};
|
||||||
use esp_hal::Rng;
|
use esp_hal::Rng;
|
||||||
use esp_hal::{embassy, peripherals::Peripherals, prelude::*, timer::TimerGroup};
|
use esp_hal::{embassy, peripherals::Peripherals, prelude::*, timer::TimerGroup};
|
||||||
use esp_println::println;
|
use esp_println::println;
|
||||||
|
|
@ -23,7 +25,7 @@ const SSID: &str = env!("SSID");
|
||||||
const PASSWORD: &str = env!("PASSWORD");
|
const PASSWORD: &str = env!("PASSWORD");
|
||||||
|
|
||||||
#[main]
|
#[main]
|
||||||
async fn main(spawner: Spawner) -> ! {
|
async fn main(spawner: Spawner) {
|
||||||
#[cfg(feature = "log")]
|
#[cfg(feature = "log")]
|
||||||
esp_println::logger::init_logger(log::LevelFilter::Info);
|
esp_println::logger::init_logger(log::LevelFilter::Info);
|
||||||
|
|
||||||
|
|
@ -67,9 +69,6 @@ async fn main(spawner: Spawner) -> ! {
|
||||||
spawner.spawn(connection(controller)).ok();
|
spawner.spawn(connection(controller)).ok();
|
||||||
spawner.spawn(net_task(&stack)).ok();
|
spawner.spawn(net_task(&stack)).ok();
|
||||||
|
|
||||||
let mut rx_buffer = [0; 4096];
|
|
||||||
let mut tx_buffer = [0; 4096];
|
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
if stack.is_link_up() {
|
if stack.is_link_up() {
|
||||||
break;
|
break;
|
||||||
|
|
@ -86,7 +85,16 @@ async fn main(spawner: Spawner) -> ! {
|
||||||
Timer::after(Duration::from_millis(500)).await;
|
Timer::after(Duration::from_millis(500)).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
loop {
|
let io = IO::new(peripherals.GPIO, peripherals.IO_MUX);
|
||||||
|
let button = io.pins.gpio12.into_pull_up_input();
|
||||||
|
println!("Spawning button task");
|
||||||
|
spawner.must_spawn(button_task(button.into(), stack));
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn ring(stack: &'static Stack<WifiDevice<'static, WifiStaDevice>>) -> Result<(), &str> {
|
||||||
|
let mut rx_buffer = [0; 4096];
|
||||||
|
let mut tx_buffer = [0; 4096];
|
||||||
|
|
||||||
Timer::after(Duration::from_millis(1_000)).await;
|
Timer::after(Duration::from_millis(1_000)).await;
|
||||||
|
|
||||||
let mut socket = TcpSocket::new(&stack, &mut rx_buffer, &mut tx_buffer);
|
let mut socket = TcpSocket::new(&stack, &mut rx_buffer, &mut tx_buffer);
|
||||||
|
|
@ -98,21 +106,21 @@ async fn main(spawner: Spawner) -> ! {
|
||||||
let r = socket.connect(remote_endpoint).await;
|
let r = socket.connect(remote_endpoint).await;
|
||||||
if let Err(e) = r {
|
if let Err(e) = r {
|
||||||
println!("connect error: {:?}", e);
|
println!("connect error: {:?}", e);
|
||||||
continue;
|
return Err("connect error");
|
||||||
}
|
}
|
||||||
|
|
||||||
const json: &'static str = "{
|
const JSON: &'static str = "{
|
||||||
\"token\": \"ahgvt9acdx5sowxfobadt9cmpqhrzp\",
|
\"token\": \"ahgvt9acdx5sowxfobadt9cmpqhrzp\",
|
||||||
\"user\": \"ud2btptjwvy92xi8y77tfurfew6z7a\",
|
\"user\": \"ud2btptjwvy92xi8y77tfurfew6z7a\",
|
||||||
\"message\": \"DOOR BELL!!!\"
|
\"message\": \"DOOR BELL!!!\"
|
||||||
}";
|
}";
|
||||||
const json_len: usize = json.len();
|
const JSON_LEN: usize = JSON.len();
|
||||||
|
|
||||||
println!("connected!");
|
println!("connected!");
|
||||||
let mut buf = [0; 1024];
|
let mut buf = [0; 1024];
|
||||||
loop {
|
loop {
|
||||||
use embedded_io_async::Write;
|
use embedded_io_async::Write;
|
||||||
let req = formatcp!("POST /1/messages.json HTTP/1.0\r\nHost: api.pushover.net\r\nContent-Type: application/json\r\nContent-Length: {}\r\n\r\n{}\r\n\r\n", json_len, json);
|
let req = formatcp!("POST /1/messages.json HTTP/1.0\r\nHost: api.pushover.net\r\nContent-Type: application/json\r\nContent-Length: {}\r\n\r\n{}\r\n\r\n", JSON_LEN, JSON);
|
||||||
println!("{}", req);
|
println!("{}", req);
|
||||||
let r = socket.write_all(req.as_bytes()).await;
|
let r = socket.write_all(req.as_bytes()).await;
|
||||||
if let Err(e) = r {
|
if let Err(e) = r {
|
||||||
|
|
@ -133,6 +141,23 @@ async fn main(spawner: Spawner) -> ! {
|
||||||
println!("{}", core::str::from_utf8(&buf[..n]).unwrap());
|
println!("{}", core::str::from_utf8(&buf[..n]).unwrap());
|
||||||
}
|
}
|
||||||
Timer::after(Duration::from_millis(5000)).await;
|
Timer::after(Duration::from_millis(5000)).await;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[embassy_executor::task]
|
||||||
|
async fn button_task(
|
||||||
|
mut button: AnyPin<Input<PullUp>>,
|
||||||
|
stack: &'static Stack<WifiDevice<'static, WifiStaDevice>>,
|
||||||
|
) {
|
||||||
|
loop {
|
||||||
|
button.wait_for_falling_edge().await.unwrap();
|
||||||
|
Timer::after_millis(10).await;
|
||||||
|
if button.is_low().unwrap() {
|
||||||
|
println!("Button pressed");
|
||||||
|
ring(stack)
|
||||||
|
.await
|
||||||
|
.unwrap_or_else(|e| println!("ring error: {}", e));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue