LED data gets transmitted using signal but not stable yet
Some checks failed
CI - nightly / esp-hal | nightly (${{ matrix.device.soc }}) (map[soc:esp32c2 target:riscv32imc-unknown-none-elf]) (push) Has been cancelled
CI - nightly / esp-hal | nightly (${{ matrix.device.soc }}) (map[soc:esp32c3 target:riscv32imc-unknown-none-elf]) (push) Has been cancelled
CI - nightly / esp-hal | nightly (${{ matrix.device.soc }}) (map[soc:esp32c6 target:riscv32imac-unknown-none-elf]) (push) Has been cancelled
CI - nightly / esp-hal | nightly (${{ matrix.device.soc }}) (map[soc:esp32h2 target:riscv32imac-unknown-none-elf]) (push) Has been cancelled

This commit is contained in:
ris 2025-01-09 19:43:59 -05:00
parent d581195df7
commit a7612ada45
2 changed files with 95 additions and 97 deletions

View File

@ -164,7 +164,7 @@ fn main() -> Result<(), Box<dyn Error>> {
( (
"country_code", "country_code",
"Country code. See [ESP-IDF Programming Guide](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/wifi.html#wi-fi-country-code)", "Country code. See [ESP-IDF Programming Guide](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/wifi.html#wi-fi-country-code)",
Value::String("CN".to_owned()), Value::String("CA".to_owned()),
None None
), ),
( (

View File

@ -13,20 +13,14 @@
#![no_std] #![no_std]
#![no_main] #![no_main]
use core::net::Ipv4Addr;
use bincode::Decode; use bincode::Decode;
// use cyw43::JoinOptions; // use cyw43::JoinOptions;
// use cyw43_pio::PioSpi; // use cyw43_pio::PioSpi;
use embassy_net::{Runner, StackResources};
use embassy_net::udp::{PacketMetadata, UdpSocket}; use embassy_net::udp::{PacketMetadata, UdpSocket};
use embassy_net::{tcp::TcpSocket, Runner, StackResources};
use embassy_executor::Spawner; use embassy_executor::Spawner;
use blocking_network_stack::Stack;
use embassy_time::{Duration, Timer}; use embassy_time::{Duration, Timer};
use embassy_sync::{blocking_mutex::raw::NoopRawMutex, mutex::Mutex};
use embassy_futures::select::{select, Either};
use esp_alloc as _; use esp_alloc as _;
use esp_backtrace as _; use esp_backtrace as _;
use esp_hal::{clock::CpuClock, use esp_hal::{clock::CpuClock,
@ -43,7 +37,6 @@ use esp_hal::{clock::CpuClock,
time::RateExtU32, time::RateExtU32,
gpio::{Level, Output}, gpio::{Level, Output},
}; };
use esp_hal::timer::systimer::SystemTimer;
use esp_hal_embassy::InterruptExecutor; use esp_hal_embassy::InterruptExecutor;
use esp_println::println; use esp_println::println;
use esp_wifi::{ use esp_wifi::{
@ -59,11 +52,8 @@ use esp_wifi::{
}, },
EspWifiController, EspWifiController,
}; };
use esp_println::print; use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex, signal::Signal};
use smoltcp::{ use esp_hal::timer::systimer::SystemTimer;
iface::{SocketSet, SocketStorage},
wire::{DhcpOption, IpAddress},
};
use ws2812_async::{ColorOrder, Ws2812}; use ws2812_async::{ColorOrder, Ws2812};
@ -77,7 +67,7 @@ const CLIENT_ID: &str = env!("CLIENT_ID");
//static mut LEDSTRIP: &mut [u8] = &mut [0u8; NUM_LEDS * 3]; //static mut LEDSTRIP: &mut [u8] = &mut [0u8; NUM_LEDS * 3];
static mut RGBARRAY: [RGB8; NUM_LEDS] = [RGB8::new(0, 0, 0); NUM_LEDS]; //static mut RGBARRAY: [RGB8; NUM_LEDS] = [RGB8::new(0, 0, 0); NUM_LEDS];
// When you are okay with using a nightly compiler it's better to use https://docs.rs/static_cell/2.1.0/static_cell/macro.make_static.html // When you are okay with using a nightly compiler it's better to use https://docs.rs/static_cell/2.1.0/static_cell/macro.make_static.html
macro_rules! mk_static { macro_rules! mk_static {
@ -123,8 +113,8 @@ async fn main(spawner: Spawner) -> ! {
let executor = InterruptExecutor::new(sw_ints.software_interrupt2); let executor = InterruptExecutor::new(sw_ints.software_interrupt2);
let executor = EXECUTOR.init(executor); let executor = EXECUTOR.init(executor);
// let spawner = executor.start(Priority::Priority3); static LED_ARRAY_DATA:StaticCell<Signal<CriticalSectionRawMutex, [RGB8; NUM_LEDS]>> = StaticCell::new();
// spawner.must_spawn(led_ctrl_core_task(sclk, miso, mosi, cs, peripherals.SPI2)); let led_array_signal = &*LED_ARRAY_DATA.init(Signal::new());
/////////////////////////// WIFI //////////////////////////////// /////////////////////////// WIFI ////////////////////////////////
@ -132,16 +122,8 @@ async fn main(spawner: Spawner) -> ! {
let (wifi_interface, controller) = let (wifi_interface, controller) =
esp_wifi::wifi::new_with_mode(&init, wifi, WifiStaDevice).unwrap(); esp_wifi::wifi::new_with_mode(&init, wifi, WifiStaDevice).unwrap();
cfg_if::cfg_if! { let systimer = SystemTimer::new(peripherals.SYSTIMER);
if #[cfg(feature = "esp32")] { esp_hal_embassy::init(systimer.alarm0);
let timg1 = TimerGroup::new(peripherals.TIMG1);
esp_hal_embassy::init(timg1.timer0);
} else {
use esp_hal::timer::systimer::SystemTimer;
let systimer = SystemTimer::new(peripherals.SYSTIMER);
esp_hal_embassy::init(systimer.alarm0);
}
}
let config = embassy_net::Config::dhcpv4(Default::default()); let config = embassy_net::Config::dhcpv4(Default::default());
@ -157,7 +139,11 @@ async fn main(spawner: Spawner) -> ! {
spawner.spawn(connection(controller)).ok(); spawner.spawn(connection(controller)).ok();
spawner.spawn(net_task(runner)).ok(); spawner.spawn(net_task(runner)).ok();
spawner.spawn(led_ctrl_core_task(sclk, miso, mosi, cs, peripherals.SPI2)).ok();
//let spawner = executor.start(Priority::Priority3);
//spawner.must_spawn(led_ctrl_core_task(sclk, miso, mosi, cs, peripherals.SPI2));
spawner.spawn(led_ctrl_core_task(sclk, miso, mosi, cs, peripherals.SPI2, led_array_signal)).ok();
let mut rx_buffer = [0; 4096]; let mut rx_buffer = [0; 4096];
let mut tx_buffer = [0; 4096]; let mut tx_buffer = [0; 4096];
@ -178,60 +164,78 @@ async fn main(spawner: Spawner) -> ! {
Timer::after(Duration::from_millis(500)).await; Timer::after(Duration::from_millis(500)).await;
} }
// Then we can use it!
let mut rx_buffer = [0; 312];
let mut tx_buffer = [0; 312];
let mut rx_meta = [PacketMetadata::EMPTY; 16];
let mut tx_meta = [PacketMetadata::EMPTY; 16];
let mut buf = [0; 312];
let mut socket = UdpSocket::new(
stack,
&mut rx_meta,
&mut rx_buffer,
&mut tx_meta,
&mut tx_buffer,
);
let mut cur_message_count: u32 = 0;
socket.bind(1234).unwrap();
let mut err_count: i32 = 0;
loop { loop {
Timer::after(Duration::from_millis(1_000)).await; println!("Start loop");
match socket.recv_from(&mut buf).await {
Ok((n, ep)) => {
println!("Start cat");
let mut socket = TcpSocket::new(stack, &mut rx_buffer, &mut tx_buffer); match bincode::decode_from_slice::<LedContainer, bincode::config::Configuration>(
&buf,
bincode::config::standard(),
) {
Ok(decoded) => {
//println!("Decoded cat correctly {:?}", decoded);
socket.set_timeout(Some(embassy_time::Duration::from_secs(10))); let ledcontainer = decoded.0;
//if ledcontainer.message_count > cur_message_count {
println!("updating cat");
let remote_endpoint = (Ipv4Addr::new(142, 250, 185, 115), 80); //ledcontainer.ledstrip.to_array();
println!("connecting..."); led_array_signal.signal(ledcontainer.ledstrip.to_array());
let r = socket.connect(remote_endpoint).await; //cur_message_count = ledcontainer.message_count;
if let Err(e) = r { //}
println!("connect error: {:?}", e);
continue; println!("[RECEIVED] Got message!");
} }
println!("connected!"); Err(_e) => {
let mut buf = [0; 1024]; println!("DOG ERROR");
loop { }
use embedded_io_async::Write; }
let r = socket
.write_all(b"GET / HTTP/1.0\r\nHost: www.mobile-j.de\r\n\r\n")
.await;
if let Err(e) = r {
println!("write error: {:?}", e);
break;
} }
let n = match socket.read(&mut buf).await { Err(_) => {
Ok(0) => { err_count += 1;
println!("read EOF"); println!("[RECEIVER] Could not get message with error: {:?}", buf);
// if we receive 10 error messages in a row with errors, we reconnect to wifi and restart all!
if err_count > 10 {
break; break;
} }
Ok(n) => n, }
Err(e) => {
println!("read error: {:?}", e);
break;
}
};
println!("{}", core::str::from_utf8(&buf[..n]).unwrap());
} }
Timer::after(Duration::from_millis(3000)).await; Timer::after(Duration::from_millis(30)).await;
} }
loop {
println!("Infinite loop");
}
} }
// highest priority task // highest priority task
#[embassy_executor::task] #[embassy_executor::task]
async fn led_ctrl_core_task(sclk: Output<'static>, miso: Output<'static>, mosi: Output<'static>, cs: Output<'static>, spi2: esp_hal::peripherals::SPI2) { async fn led_ctrl_core_task(sclk: Output<'static>, miso: Output<'static>, mosi: Output<'static>, cs: Output<'static>,
spi2: esp_hal::peripherals::SPI2, led_array_signal: &'static Signal<CriticalSectionRawMutex, [RGB8; NUM_LEDS]>,) {
esp_println::println!("Hello world from embassy using esp-hal-async!"); esp_println::println!("Hello world from embassy using esp-hal-async!");
// Spi configuration for the neopixel
// let mut spi_config = Config::default();
// spi_config.frequency = 3_800_000;
//let peripherals = esp_hal::init(esp_hal::Config::default());
let mut spi = Spi::new( let mut spi = Spi::new(
spi2, spi2,
Config::default() Config::default()
@ -248,40 +252,31 @@ async fn led_ctrl_core_task(sclk: Output<'static>, miso: Output<'static>, mosi:
let mut np: Ws2812<_, { 12 * NUM_LEDS }> = Ws2812::new(spi); let mut np: Ws2812<_, { 12 * NUM_LEDS }> = Ws2812::new(spi);
np.set_color_order(ColorOrder::GRB); np.set_color_order(ColorOrder::GRB);
let mut data = [RGB8::default(); NUM_LEDS]; //let mut data = [RGB8::default(); NUM_LEDS];
// for led in data.iter_mut().step_by(1) {
// led.r = 0; // blue
// led.g = 0; // red
// led.b = 100; // green
// }
//np.write(data.iter().cloned()).await.ok();
loop { loop {
println!("Writing led!"); println!("Waiting to write led");
for led in data.iter_mut().step_by(1) {
led.r = 0; // blue
led.g = 0; // red
led.b = 20; // green
}
np.write(data.iter().cloned()).await.ok();
Timer::after(embassy_time::Duration::from_millis(5)).await;
for led in data.iter_mut().step_by(1) { // unsafe {
led.r = 20; // blue // np.write(data.iter().cloned()).await.ok();
led.g = 0; // red // }
led.b = 0; // green
//let mut data = [RGB8::new(0, 0, 0); NUM_LEDS];
while let data = led_array_signal.wait().await {
np.write(data.iter().cloned());
println!("LED written!")
} }
np.write(data.iter().cloned()).await.ok(); Timer::after(embassy_time::Duration::from_millis(50)).await;
Timer::after(embassy_time::Duration::from_millis(5)).await;
for led in data.iter_mut().step_by(1) {
led.r = 0; // blue
led.g = 20; // red
led.b = 0; // green
}
np.write(data.iter().cloned()).await.ok();
Timer::after(embassy_time::Duration::from_millis(5)).await;
} }
} }
@ -345,10 +340,13 @@ impl LedStrip {
LedStrip { leds: arr } LedStrip { leds: arr }
} }
pub fn to_array(&self) {
pub fn to_array(&self) -> [RGB8; NUM_LEDS]{
let mut data = [RGB8::new(0, 0, 0); NUM_LEDS];
for i in 0..NUM_LEDS { for i in 0..NUM_LEDS {
unsafe { RGBARRAY[i] = RGB8::new(self.leds[i].g, self.leds[i].r, self.leds[i].b) } data[i] = RGB8::new(self.leds[i].g, self.leds[i].r, self.leds[i].b)
} }
data
} }
} }