diff --git a/src/demo_tasks.rs b/src/demo_tasks.rs index 21ae538eba775b85273d04bcbbb0e5bcf55149e0..9dbc431aee797aa8a9a98bb1e9df0e459fc2514b 100644 --- a/src/demo_tasks.rs +++ b/src/demo_tasks.rs @@ -6,14 +6,13 @@ use embassy_executor::Spawner; use embassy_futures::select::{select, select3, Either, Either3}; use embassy_net::{ udp::{UdpSocket, PacketMetadata}, - tcp::{TcpSocket}, - Ipv6Address, Stack, StaticConfigV6, Config, Ipv6Cidr, Ipv4Address, driver::Driver}; + Ipv6Address, Stack, StaticConfigV6, Config, Ipv6Cidr}; use embassy_net_badgelink::Device; use embassy_time::{Duration, Timer}; use embedded_graphics::{ image::Image, mono_font::{ascii::FONT_6X10, MonoTextStyle}, - pixelcolor::{Rgb565, Rgb888}, + pixelcolor::Rgb565, prelude::*, primitives::{Circle, PrimitiveStyle, Rectangle, StyledDrawable}, text::Text, @@ -21,10 +20,10 @@ use embedded_graphics::{ use esp_backtrace as _; use esp_println::println; use esp_wifi::EspWifiInitialization; -use hal::{Rng, uart, radio::Wifi}; -use heapless::{Vec, String}; -use smoltcp::{wire::{IpEndpoint, TcpOption}, phy}; +use hal::{Rng, radio::Wifi}; +use heapless::Vec; use tinybmp::Bmp; +use smoltcp::wire::IpEndpoint; use smart_leds::SmartLedsWrite; @@ -434,268 +433,3 @@ async fn send_task(network_stack: &'static Stack<Device<'static>>, addr_left: Ip } } - -struct SocketWrapper<'a> where -{ - pub socket: TcpSocket<'a>, -} - -struct LightClient<'a> -{ - // rx_buffer: &'b mut [u8; 1024], - // tx_buffer: &'b mut [u8; 1024], - socket: TcpSocket<'a>, - // socketwrapper: Option<SocketWrapper<'a>>, - // a: &'b str, -} - -struct LightBuffer { - pub rx: [u8; 1024], - pub tx: [u8; 1024], -} - -impl<'a> LightClient<'a> -{ - - pub async fn new<D>(stack: &'a Stack<D>, rx_buffer: &'a mut [u8; 1024], tx_buffer: &'a mut [u8; 1024]) // , buffer: &'b mut LightBuffer - ->Result<LightClient<'a>, &'static str> - where D: Driver - { - - let mut s = Self { - // socketwrapper: None, - socket: TcpSocket::new(&stack, rx_buffer, tx_buffer), - // a: "dsf".as_ref(), - }; - - let socket = &mut s.socket; - let endpoint = IpEndpoint{ - addr: Ipv4Address::new(151, 216, 192, 14).into(), - port: 80 - }; - socket.connect(endpoint).await.map_err(|err| "ConnectError")?; - socket.write("GET / HTTP/1.1\r\nServer: domelights.i.eta.st\r\n\r\n".as_bytes()).await.map_err(|err| "write error")?; - socket.flush().await.map_err(|err| "flush error")?; - - Ok(s) - } - - pub async fn http_get(&mut self, path: &str) -> Result<(), &'static str> { - let socket = &mut self.socket; - socket.write("GET ".as_ref()).await.map_err(|e| "write error")?; - socket.write(path.as_bytes()).await.map_err(|e| "write error")?; - socket.write(" HTTP/1.1\r\nServer: domelights.i.eta.st\r\n\r\n".as_bytes()).await.map_err(|err| "write error")?; - socket.flush().await.map_err(|err| "flush error")?; - - Ok(()) - } -} - -impl<'a> Drop for LightClient<'a> -{ - fn drop(&mut self) { - self.socket.close(); - } -} - - - -async fn set_color(client: &mut LightClient<'_>, i: usize, color: Rgb888) -> Result<(),&'static str> -{ - - let mut buf = [0; 7]; - // let a = String::new().; - let mut buf: String<128> =String::new(); - buf.write_fmt(format_args!("/illuminate?colour=%23{:02x}{:02x}{:02x}&light-{}={}", color.r(), color.g(), color.b(), i*10, i*10)).unwrap(); - - client.http_get(buf.as_str()).await?; - Ok(()) -} -// curl 'http://domelights.i.eta.st/illuminate?colour=%23a1ff89&light-0=0&light-10=10&light-20=20&light-30=30&light-40=40&light-50=50&light-60=60&light-70=70&light-80=80&light-90=90' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' -H 'Accept-Language: en-US,en;q=0.5' -H 'Accept-Encoding: gzip, deflate' -H 'Referer: http://domelights.i.eta.st/' -H 'DNT: 1' -H 'Connection: keep-alive' -H 'Upgrade-Insecure-Requests: 1' - -// #[embassy_executor::task] -pub async fn dome_demo(display: &mut Display , wifi: Wifi, init: EspWifiInitialization, mut rng: Rng) -> ! { - println!("dome_demo starting...."); - let config = Config::dhcpv4(Default::default()); - let mut wifi = start_wifi(wifi, init, config, rng.random().into(), "Camp2023-open", "").await; - - let mut buffer = LightBuffer{rx:[0; 1024], tx: [0; 1024]}; - - - let input = InputHandler; - let mut inputs = input.split(); - - let captouch = CaptouchHandler; - let top = captouch.top_petals(); - let bot = captouch.bottom_petals(); - - - let circle_top_style = PrimitiveStyle::with_fill(Rgb565::YELLOW); - let circle_bot_style = PrimitiveStyle::with_fill(Rgb565::GREEN); - - let bmp_data = include_bytes!("../img/milliways.bmp"); - let bmp = Bmp::from_slice(bmp_data).unwrap(); - let logo = Image::with_center(&bmp, display.bounding_box().center()); - - println!("dome_demo started"); - let colors = [Rgb888::CSS_BLUE, Rgb888::CSS_RED, Rgb888::CSS_GREEN]; - - let mut state = [0; 10]; - - loop { - loop { - if wifi.is_link_up() { - break; - } - Timer::after(Duration::from_millis(500)).await; - } - - println!("Waiting to get IP address..."); - loop { - if let Some(config) = wifi.config_v4() { - println!("Got IP: {}", config.address); - break; - }else { - Timer::after(Duration::from_millis(500)).await; - } - } - println!("got ip!"); - - let client = LightClient::new(&mut wifi, &mut buffer.rx, &mut buffer.tx).await; - if client.is_err() { - continue; - } - let mut client = client.unwrap(); - - loop { - - macro_rules! set_and_inc_color { - ($i:expr) => { - state[$i] = (state[$i]+ 1) % colors.len(); - let color = colors[state[$i]]; - println!("DEBUG: i {} color_id: {}",$i, state[$i]); - let _ = set_color(&mut client, $i,color).await; - }; - } - - match select(inputs.sw2_center.wait_for_press(), async { - display - .fill_solid(&display.bounding_box(), Rgb565::BLACK) - .unwrap(); - logo.draw(display).unwrap(); - if top.petal0.pressed().await { - set_and_inc_color!(0); - - Circle::with_center(Point::new(120, 20), 20) - .draw_styled(&circle_top_style, display) - .unwrap(); - } else { - Circle::with_center(Point::new(120, 20), 10) - .draw_styled(&circle_top_style, display) - .unwrap(); - } - if top.petal2.pressed().await { - set_and_inc_color!(1); - Circle::with_center(Point::new(215, 90), 20) - .draw_styled(&circle_top_style, display) - .unwrap(); - } else { - Circle::with_center(Point::new(215, 90), 10) - .draw_styled(&circle_top_style, display) - .unwrap(); - } - if top.petal4.pressed().await { - set_and_inc_color!(2); - Circle::with_center(Point::new(178, 200), 20) - .draw_styled(&circle_top_style, display) - .unwrap(); - } else { - Circle::with_center(Point::new(178, 200), 10) - .draw_styled(&circle_top_style, display) - .unwrap(); - } - if top.petal6.pressed().await { - set_and_inc_color!(3); - Circle::with_center(Point::new(61, 200), 20) - .draw_styled(&circle_top_style, display) - .unwrap(); - } else { - Circle::with_center(Point::new(61, 200), 10) - .draw_styled(&circle_top_style, display) - .unwrap(); - } - if top.petal8.pressed().await { - set_and_inc_color!(4); - Circle::with_center(Point::new(25, 90), 20) - .draw_styled(&circle_top_style, display) - .unwrap(); - } else { - Circle::with_center(Point::new(25, 90), 10) - .draw_styled(&circle_top_style, display) - .unwrap(); - } - - if bot.petal1.pressed().await { - set_and_inc_color!(6); - Circle::with_center(Point::new(178, 39), 20) - .draw_styled(&circle_bot_style, display) - .unwrap(); - } else { - Circle::with_center(Point::new(178, 39), 10) - .draw_styled(&circle_bot_style, display) - .unwrap(); - } - if bot.petal3.pressed().await { - set_and_inc_color!(5); - Circle::with_center(Point::new(215, 150), 20) - .draw_styled(&circle_bot_style, display) - .unwrap(); - } else { - Circle::with_center(Point::new(215, 150), 10) - .draw_styled(&circle_bot_style, display) - .unwrap(); - } - if bot.petal5.pressed().await { - set_and_inc_color!(9); - Circle::with_center(Point::new(120, 220), 20) - .draw_styled(&circle_bot_style, display) - .unwrap(); - } else { - Circle::with_center(Point::new(120, 220), 10) - .draw_styled(&circle_bot_style, display) - .unwrap(); - } - if bot.petal7.pressed().await { - set_and_inc_color!(8); - Circle::with_center(Point::new(24, 150), 20) - .draw_styled(&circle_bot_style, display) - .unwrap(); - } else { - Circle::with_center(Point::new(24, 150), 10) - .draw_styled(&circle_bot_style, display) - .unwrap(); - } - if bot.petal9.pressed().await { - set_and_inc_color!(7); - Circle::with_center(Point::new(61, 29), 20) - .draw_styled(&circle_bot_style, display) - .unwrap(); - } else { - Circle::with_center(Point::new(61, 29), 10) - .draw_styled(&circle_bot_style, display) - .unwrap(); - } - display.flush().await.unwrap(); - Timer::after(Duration::from_millis(50)).await; - }) - .await - { - Either::First(_) => break, - Either::Second(_) => (), - } - } - } - loop{ - println!("ended"); - } -} diff --git a/src/dome_lights.rs b/src/dome_lights.rs new file mode 100644 index 0000000000000000000000000000000000000000..c91e6da76df4b1d1d82b35591fce0e195b6bb053 --- /dev/null +++ b/src/dome_lights.rs @@ -0,0 +1,278 @@ + +use core::fmt::Write; + +use embassy_futures::select::{select, Either}; +use embassy_net::{ + tcp::TcpSocket, Stack, driver::Driver, + Ipv6Address, StaticConfigV6, Config, Ipv6Cidr, Ipv4Address +}; +use embassy_time::{Timer, Duration}; +use embedded_graphics::{primitives::*, pixelcolor::{Rgb888, Rgb565}, prelude::{WebColors, RgbColor, Dimensions, DrawTarget, Point}, image::Image, Drawable}; +use esp_println::println; +use esp_wifi::EspWifiInitialization; +use hal::{Rng, radio::Wifi}; +use heapless::String; +use smoltcp::wire::{IpEndpoint, TcpOption}; +use tinybmp::Bmp; + +use crate::flow3r::{display::Display, wifi::start_wifi, input::InputHandler, captouch::CaptouchHandler}; + +struct LightClient<'a> +{ + // rx_buffer: &'b mut [u8; 1024], + // tx_buffer: &'b mut [u8; 1024], + socket: TcpSocket<'a>, + // socketwrapper: Option<SocketWrapper<'a>>, + // a: &'b str, +} + +struct LightBuffer { + pub rx: [u8; 1024], + pub tx: [u8; 1024], +} + +impl<'a> LightClient<'a> +{ + + pub async fn new<D>(stack: &'a Stack<D>, rx_buffer: &'a mut [u8; 1024], tx_buffer: &'a mut [u8; 1024]) // , buffer: &'b mut LightBuffer + ->Result<LightClient<'a>, &'static str> + where D: Driver + { + + let mut s = Self { + // socketwrapper: None, + socket: TcpSocket::new(&stack, rx_buffer, tx_buffer), + // a: "dsf".as_ref(), + }; + + let socket = &mut s.socket; + let endpoint = IpEndpoint{ + addr: Ipv4Address::new(151, 216, 192, 14).into(), + port: 80 + }; + socket.connect(endpoint).await.map_err(|err| "ConnectError")?; + socket.write("GET / HTTP/1.1\r\nServer: domelights.i.eta.st\r\n\r\n".as_bytes()).await.map_err(|err| "write error")?; + socket.flush().await.map_err(|err| "flush error")?; + + Ok(s) + } + + pub async fn http_get(&mut self, path: &str) -> Result<(), &'static str> { + let socket = &mut self.socket; + socket.write("GET ".as_ref()).await.map_err(|e| "write error")?; + socket.write(path.as_bytes()).await.map_err(|e| "write error")?; + socket.write(" HTTP/1.1\r\nServer: domelights.i.eta.st\r\n\r\n".as_bytes()).await.map_err(|err| "write error")?; + socket.flush().await.map_err(|err| "flush error")?; + + Ok(()) + } +} + +impl<'a> Drop for LightClient<'a> +{ + fn drop(&mut self) { + self.socket.close(); + } +} + + + +async fn set_color(client: &mut LightClient<'_>, i: usize, color: Rgb888) -> Result<(),&'static str> +{ + + let mut buf = [0; 7]; + // let a = String::new().; + let mut buf: String<128> =String::new(); + buf.write_fmt(format_args!("/illuminate?colour=%23{:02x}{:02x}{:02x}&light-{}={}", color.r(), color.g(), color.b(), i*10, i*10)).unwrap(); + + client.http_get(buf.as_str()).await?; + Ok(()) +} +// curl 'http://domelights.i.eta.st/illuminate?colour=%23a1ff89&light-0=0&light-10=10&light-20=20&light-30=30&light-40=40&light-50=50&light-60=60&light-70=70&light-80=80&light-90=90' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' -H 'Accept-Language: en-US,en;q=0.5' -H 'Accept-Encoding: gzip, deflate' -H 'Referer: http://domelights.i.eta.st/' -H 'DNT: 1' -H 'Connection: keep-alive' -H 'Upgrade-Insecure-Requests: 1' + +// #[embassy_executor::task] +pub async fn dome_demo(display: &mut Display , wifi: Wifi, init: EspWifiInitialization, mut rng: Rng) -> ! { + println!("dome_demo starting...."); + let config = Config::dhcpv4(Default::default()); + let mut wifi = start_wifi(wifi, init, config, rng.random().into(), "Camp2023-open", "").await; + + let mut buffer = LightBuffer{rx:[0; 1024], tx: [0; 1024]}; + + + let input = InputHandler; + let mut inputs = input.split(); + + let captouch = CaptouchHandler; + let top = captouch.top_petals(); + let bot = captouch.bottom_petals(); + + + let circle_top_style = PrimitiveStyle::with_fill(Rgb565::YELLOW); + let circle_bot_style = PrimitiveStyle::with_fill(Rgb565::GREEN); + + let bmp_data = include_bytes!("../img/milliways.bmp"); + let bmp = Bmp::from_slice(bmp_data).unwrap(); + let logo = Image::with_center(&bmp, display.bounding_box().center()); + + println!("dome_demo started"); + let colors = [Rgb888::CSS_BLUE, Rgb888::CSS_RED, Rgb888::CSS_GREEN]; + + let mut state = [0; 10]; + + loop { + loop { + if wifi.is_link_up() { + break; + } + Timer::after(Duration::from_millis(500)).await; + } + + println!("Waiting to get IP address..."); + loop { + if let Some(config) = wifi.config_v4() { + println!("Got IP: {}", config.address); + break; + }else { + Timer::after(Duration::from_millis(500)).await; + } + } + println!("got ip!"); + + let client = LightClient::new(&mut wifi, &mut buffer.rx, &mut buffer.tx).await; + if client.is_err() { + continue; + } + let mut client = client.unwrap(); + + loop { + + macro_rules! set_and_inc_color { + ($i:expr) => { + state[$i] = (state[$i]+ 1) % colors.len(); + let color = colors[state[$i]]; + println!("DEBUG: i {} color_id: {}",$i, state[$i]); + let _ = set_color(&mut client, $i,color).await; + }; + } + + match select(inputs.sw2_center.wait_for_press(), async { + display + .fill_solid(&display.bounding_box(), Rgb565::BLACK) + .unwrap(); + logo.draw(display).unwrap(); + if top.petal0.pressed().await { + set_and_inc_color!(0); + + Circle::with_center(Point::new(120, 20), 20) + .draw_styled(&circle_top_style, display) + .unwrap(); + } else { + Circle::with_center(Point::new(120, 20), 10) + .draw_styled(&circle_top_style, display) + .unwrap(); + } + if top.petal2.pressed().await { + set_and_inc_color!(1); + Circle::with_center(Point::new(215, 90), 20) + .draw_styled(&circle_top_style, display) + .unwrap(); + } else { + Circle::with_center(Point::new(215, 90), 10) + .draw_styled(&circle_top_style, display) + .unwrap(); + } + if top.petal4.pressed().await { + set_and_inc_color!(2); + Circle::with_center(Point::new(178, 200), 20) + .draw_styled(&circle_top_style, display) + .unwrap(); + } else { + Circle::with_center(Point::new(178, 200), 10) + .draw_styled(&circle_top_style, display) + .unwrap(); + } + if top.petal6.pressed().await { + set_and_inc_color!(3); + Circle::with_center(Point::new(61, 200), 20) + .draw_styled(&circle_top_style, display) + .unwrap(); + } else { + Circle::with_center(Point::new(61, 200), 10) + .draw_styled(&circle_top_style, display) + .unwrap(); + } + if top.petal8.pressed().await { + set_and_inc_color!(4); + Circle::with_center(Point::new(25, 90), 20) + .draw_styled(&circle_top_style, display) + .unwrap(); + } else { + Circle::with_center(Point::new(25, 90), 10) + .draw_styled(&circle_top_style, display) + .unwrap(); + } + + if bot.petal1.pressed().await { + set_and_inc_color!(6); + Circle::with_center(Point::new(178, 39), 20) + .draw_styled(&circle_bot_style, display) + .unwrap(); + } else { + Circle::with_center(Point::new(178, 39), 10) + .draw_styled(&circle_bot_style, display) + .unwrap(); + } + if bot.petal3.pressed().await { + set_and_inc_color!(5); + Circle::with_center(Point::new(215, 150), 20) + .draw_styled(&circle_bot_style, display) + .unwrap(); + } else { + Circle::with_center(Point::new(215, 150), 10) + .draw_styled(&circle_bot_style, display) + .unwrap(); + } + if bot.petal5.pressed().await { + set_and_inc_color!(9); + Circle::with_center(Point::new(120, 220), 20) + .draw_styled(&circle_bot_style, display) + .unwrap(); + } else { + Circle::with_center(Point::new(120, 220), 10) + .draw_styled(&circle_bot_style, display) + .unwrap(); + } + if bot.petal7.pressed().await { + set_and_inc_color!(8); + Circle::with_center(Point::new(24, 150), 20) + .draw_styled(&circle_bot_style, display) + .unwrap(); + } else { + Circle::with_center(Point::new(24, 150), 10) + .draw_styled(&circle_bot_style, display) + .unwrap(); + } + if bot.petal9.pressed().await { + set_and_inc_color!(7); + Circle::with_center(Point::new(61, 29), 20) + .draw_styled(&circle_bot_style, display) + .unwrap(); + } else { + Circle::with_center(Point::new(61, 29), 10) + .draw_styled(&circle_bot_style, display) + .unwrap(); + } + display.flush().await.unwrap(); + Timer::after(Duration::from_millis(50)).await; + }) + .await + { + Either::First(_) => break, + Either::Second(_) => (), + } + } + } + loop{ + println!("ended"); + } +}