diff --git a/outside/Cargo.toml b/outside/Cargo.toml index 80849da..4388b20 100644 --- a/outside/Cargo.toml +++ b/outside/Cargo.toml @@ -25,7 +25,7 @@ fixed-macro = "1.2" # for web request example reqwless = { version = "0.12.0", features = ["defmt",]} -serde = { version = "1.0.203", default-features = false, features = ["derive"] } +serde = { version = "1.0.203", default-features = false, features = ["derive", "alloc"] } serde-json-core = "0.5.1" # for assign resources example @@ -60,6 +60,7 @@ embedded-sdmmc = "0.7.0" bt-hci = { version = "0.1.0", default-features = false, features = ["defmt"] } hex = { version = "0.4.3", default-features=false} +embedded-alloc = "0.6.0" [profile.release] debug = 2 diff --git a/outside/src/main.rs b/outside/src/main.rs index c9df6bb..76c4426 100644 --- a/outside/src/main.rs +++ b/outside/src/main.rs @@ -5,48 +5,44 @@ #![no_main] #![allow(async_fn_in_trait)] -use core::array; -use core::borrow::BorrowMut; use core::cell::RefCell; -use core::fmt::Formatter; -use core::marker::PhantomData; use core::panic::PanicInfo; -use core::str::from_utf8; -use core::sync::atomic::{AtomicU8}; +use core::sync::atomic::AtomicU8; -use bt_hci::cmd::info; +use alloc::string::String; use critical_section::Mutex; -use cyw43::JoinOptions; use cyw43_pio::PioSpi; -use embassy_futures::join::join; -use embassy_futures::yield_now; -use embassy_rp::interrupt::typelevel::{Handler, Interrupt, IO_IRQ_BANK0}; +use defmt::println; use embassy_rp::multicore::{spawn_core1, Stack}; -use embassy_rp::pwm::{self, Pwm}; +use embassy_rp::uart::{BufferedInterruptHandler, BufferedUart}; use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; -use embassy_sync::channel::Channel; -use fixed::FixedU16; +use embassy_sync::channel::{Channel, Receiver}; use log::*; -//use embassy_rp::i2c::InterruptHandler; use embassy_executor::{InterruptExecutor, Spawner}; use embassy_net::tcp::TcpSocket; use embassy_net::{Config, IpEndpoint, Ipv4Address, StackResources}; -use embassy_rp::{bind_interrupts, interrupt}; +use embassy_rp::{bind_interrupts, interrupt, uart}; use embassy_rp::clocks::RoscRng; use embassy_rp::gpio::{AnyPin, Input, InterruptTrigger, Level, Output}; -use embassy_rp::peripherals::{DMA_CH0, PIN_21, PIO0, USB}; +use embassy_rp::peripherals::{DMA_CH0, PIN_21, PIO0, UART1, USB}; use embassy_rp::pio::{InterruptHandler, Pio}; use embassy_rp::usb::Driver; use embassy_time::{Duration, Timer}; -use embedded_io_async::Write; +use embedded_io_async::{Read, ReadReady, Write}; use rand::RngCore; use reqwless::response; use static_cell::StaticCell; use defmt_rtt as _; +use embedded_alloc::LlffHeap as Heap; +extern crate alloc; + +#[global_allocator] +static HEAP: Heap = Heap::empty(); bind_interrupts!(struct Irqs { PIO0_IRQ_0 => InterruptHandler; USBCTRL_IRQ => embassy_rp::usb::InterruptHandler; + UART1_IRQ => BufferedInterruptHandler; }); @@ -71,8 +67,6 @@ async fn net_task(mut runner: embassy_net::Runner<'static, cyw43::NetDriver<'sta runner.run().await } - - #[embassy_executor::task] async fn data_extractor() -> ! { let mut last_bit = 0; @@ -104,7 +98,7 @@ fn panic( info: &PanicInfo) -> ! { #[embassy_executor::main] async fn main(spawner: Spawner) { let p = embassy_rp::init(Default::default()); - let data_0= Input::new(p.PIN_21, embassy_rp::gpio::Pull::None); + let data_0= Input::new(p.PIN_18, embassy_rp::gpio::Pull::None); let data_1= Input::new(p.PIN_16, embassy_rp::gpio::Pull::None); let mut rng = RoscRng; @@ -112,6 +106,13 @@ async fn main(spawner: Spawner) { let driver = Driver::new(p.USB, Irqs); spawner.spawn(logger_task(driver)).unwrap(); + let mut config = uart::Config::default(); + config.baudrate = 115200; + let mut rx = [0; 2048]; + let mut tx = [0; 2048]; + let mut uart = BufferedUart::new(p.UART1, Irqs, p.PIN_20, p.PIN_21, &mut tx, &mut rx, config); + uart.read_ready().unwrap(); + let fw = include_bytes!("../../cyw43-firmware/43439A0.bin"); let clm = include_bytes!("../../cyw43-firmware/43439A0_clm.bin"); @@ -135,12 +136,12 @@ async fn main(spawner: Spawner) { control.init(clm).await; control - .set_power_management(cyw43::PowerManagementMode::PowerSave) + .set_power_management(cyw43::PowerManagementMode::None) .await; // Use a link-local address for communication without DHCP server let config = Config::ipv4_static(embassy_net::StaticConfigV4 { - address: embassy_net::Ipv4Cidr::new(embassy_net::Ipv4Address::new(169, 254, 2, 1), 16), + address: embassy_net::Ipv4Cidr::new(embassy_net::Ipv4Address::new(169, 254, 8, 1), 16), dns_servers: heapless::Vec::new(), gateway: None, }); @@ -149,18 +150,16 @@ async fn main(spawner: Spawner) { let seed = rng.next_u64(); // Init network stack - static RESOURCES: StaticCell> = StaticCell::new(); + static RESOURCES: StaticCell> = StaticCell::new(); let (stack, runner) = embassy_net::new(net_device, config, RESOURCES.init(StackResources::new()), seed); defmt::unwrap!(spawner.spawn(net_task(runner))); control.start_ap_wpa2(include_str!("../../ssid"), include_str!("../../password"), 5).await; - let mut rx_buffer = [0; 4096]; - let mut tx_buffer = [0; 4096]; - let mut buf = [0; 4096]; + let mut uart_buf = [0; 4096]; - spawner.spawn(data_extractor()).unwrap(); + //spawner.spawn(data_extractor()).unwrap(); let mut partial: u64 = 0; let mut bit: u8 = 0; @@ -196,21 +195,59 @@ async fn main(spawner: Spawner) { } }); + //defmt::unwrap!(spawner.spawn(send_badge(CHANNEL.receiver(),stack))); + + let mut rx_buffer = [0; 4096]; + let mut tx_buffer = [0; 4096]; + let mut to_send_buffer = [0; 512]; + let mut socket = TcpSocket::new(stack, &mut rx_buffer, &mut tx_buffer); + socket.set_timeout(Some(Duration::from_secs(10))); + control.gpio_set(0, false).await; + info!("recv on 2223"); + while let Err(_) = socket.accept(1234).await { + error!("socket failure"); + + } + info!("connected"); + control.gpio_set(0, true).await; + info!("connected"); + //info!("Received connection from {:?}", socket.remote_endpoint()); + info!("connected"); loop { - let card = CHANNEL.receive().await; + if socket.read_ready().unwrap() { + info!("attempting read"); + let n = socket.read(&mut to_send_buffer).await.unwrap(); + info!("recv: {}", String::from_utf8_lossy(&to_send_buffer[..n])); + + uart.write_all(&to_send_buffer[..n]).await.unwrap(); + } + + if uart.read_ready().unwrap() { + let n = uart.read(&mut uart_buf).await.unwrap(); + info!("read: {}", String::from_utf8_lossy(&uart_buf[..n])); + socket.write_all(&uart_buf[..n]).await.unwrap(); + } + + } +} + +#[embassy_executor::task] +async fn send_badge(channel: Receiver<'static,CriticalSectionRawMutex,u64,1>,stack: embassy_net::Stack<'static>) -> ! { + let mut rx_buffer = [0; 512]; + let mut tx_buffer = [0; 512]; + loop { + let card = channel.receive().await; let mut socket = TcpSocket::new(stack, &mut rx_buffer, &mut tx_buffer); socket.set_timeout(Some(Duration::from_secs(10))); info!("attempting conn to inside"); - control.gpio_set(0, false).await; if let Err(e) = socket.connect(IpEndpoint::new(Ipv4Address::new(169, 254, 1, 1).into_address(), 1234)).await { warn!("connect error: {:?}", e); continue; } info!("Connected to {:?}", socket.remote_endpoint()); - control.gpio_set(0, true).await; let mut data: [u8;18] = [b' ';18]; data[0] = b'B'; @@ -221,6 +258,5 @@ async fn main(spawner: Spawner) { info!("wrote to {:?}", socket.remote_endpoint()); socket.close(); - control.gpio_set(0, false).await; } }