From f96c8250346429f62f6d381057132b3298f7c129 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Sat, 6 Aug 2022 09:15:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E6=B5=81=E5=85=89?= =?UTF-8?q?=E6=95=88=E6=9E=9C=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cargo/config.toml | 35 +++++++++++++++++++++++++++++++++++ .gitignore | 4 ++++ Cargo.toml | 34 ++++++++++++++++++++++++++++++++++ build.rs | 5 +++++ rust-toolchain.toml | 3 +++ sdkconfig.defaults | 10 ++++++++++ src/main.rs | 36 ++++++++++++++++++++++++++++++++++++ 7 files changed, 127 insertions(+) create mode 100644 .cargo/config.toml create mode 100644 .gitignore create mode 100644 Cargo.toml create mode 100644 build.rs create mode 100644 rust-toolchain.toml create mode 100644 sdkconfig.defaults create mode 100644 src/main.rs diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..c4c6c6a --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,35 @@ +[build] +# Uncomment the relevant target for your chip here (ESP32, ESP32-S2, ESP32-S3 or ESP32-C3) +#target = "xtensa-esp32-espidf" +#target = "xtensa-esp32s2-espidf" +#target = "xtensa-esp32s3-espidf" +target = "riscv32imc-esp-espidf" + +[target.xtensa-esp32-espidf] +linker = "ldproxy" + +[target.xtensa-esp32s2-espidf] +linker = "ldproxy" + +[target.xtensa-esp32s3-espidf] +linker = "ldproxy" + +[target.riscv32imc-esp-espidf] +linker = "ldproxy" + +# Future - necessary for the experimental "native build" of esp-idf-sys with ESP32C3 +# See also https://github.com/ivmarkov/embuild/issues/16 +rustflags = ["-C", "default-linker-libraries"] + +[unstable] + +build-std = ["std", "panic_abort"] +#build-std-features = ["panic_immediate_abort"] # Required for older ESP-IDF versions without a realpath implementation + +[env] +# Note: these variables are not used when using pio builder +# Enables the esp-idf-sys "native" build feature (`cargo build --features native`) to build against ESP-IDF stable (v4.4) +#ESP_IDF_VERSION = { value = "branch:release/v4.4" } +# Enables the esp-idf-sys "native" build feature (`cargo build --features native`) to build against ESP-IDF master (mainline) +ESP_IDF_VERSION = { value = "master" } + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..73a638b --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/.vscode +/.embuild +/target +/Cargo.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..684956f --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,34 @@ +[package] +authors = ["Ivan Li "] +edition = "2018" +name = "esp32-c3-ws2812-leds" +resolver = "2" +version = "0.0.1" + +[profile.release] +opt-level = "s" + +[profile.dev] +debug = true # Symbols are nice and they don't increase the size on Flash +opt-level = "z" + +[features] +pio = ["esp-idf-sys/pio"] + +[dependencies] +# anyhow = {version = "1.0.57", features = ["backtrace"]} +# embedded-graphics = "0.7.1" +embedded-hal = "1.0.0-alpha.8" +# embedded-hal-0-2 = {package = "embedded-hal", version = "0.2.7", features = ["unproven"]} +embedded-svc = "0.21.3" +# env_logger = "0.9.0" +esp-idf-hal = { git = "https://github.com/esp-rs/esp-idf-hal", branch="master" } +esp-idf-svc = { git = "https://github.com/IvanLi-CN/esp-idf-svc", branch="master" } +esp-idf-sys = {version = "0.31.5", features = ["binstart"]} +# log = "0.4.17" +# retry = "1.3.1" +smart-leds = "0.3.0" +ws2812-esp32-rmt-driver = "0.3.1" +[build-dependencies] +anyhow = "1.0.57" +embuild = "0.29.1" diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..4dd5e1f --- /dev/null +++ b/build.rs @@ -0,0 +1,5 @@ +// Necessary because of this issue: https://github.com/rust-lang/cargo/issues/9641 +fn main() -> anyhow::Result<()> { + embuild::build::CfgArgs::output_propagated("ESP_IDF")?; + embuild::build::LinkArgs::output_propagated("ESP_IDF") +} diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..688f1c0 --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,3 @@ +[toolchain] + +channel = "nightly-2022-06-03" \ No newline at end of file diff --git a/sdkconfig.defaults b/sdkconfig.defaults new file mode 100644 index 0000000..0ac9af4 --- /dev/null +++ b/sdkconfig.defaults @@ -0,0 +1,10 @@ +# Rust often needs a bit of an extra main task stack size compared to C (the default is 3K) +CONFIG_ESP_MAIN_TASK_STACK_SIZE=7000 + +# Use this to set FreeRTOS kernel tick frequency to 1000 Hz (100 Hz by default). +# This allows to use 1 ms granuality for thread sleeps (10 ms by default). +#CONFIG_FREERTOS_HZ=1000 + +# Workaround for https://github.com/espressif/esp-idf/issues/7631 +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=n +CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=n diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..002f155 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,36 @@ +#![feature(is_some_with)] +#![feature(core_intrinsics)] +use smart_leds::hsv::{hsv2rgb, Hsv}; +use smart_leds::SmartLedsWrite; +use std::thread::sleep; +use std::{env,time::Duration}; +use ws2812_esp32_rmt_driver::Ws2812Esp32Rmt; +use esp_idf_sys::*; +fn main() { + env::set_var("DEFMT_LOG", "trace"); + env::set_var("RUST_LOG", "trace"); + // env_logger::init(); + // Temporary. Will disappear once ESP-IDF 4.4 is released, but for now it is necessary to call this function once, + // or else some patches to the runtime implemented by esp-idf-sys might not link properly. + esp_idf_sys::link_patches(); + + let mut ws2812 = Ws2812Esp32Rmt::new(0, 1).unwrap(); + + println!("Start NeoPixel rainbow!"); + + let mut hue = unsafe { esp_random() } as u8; + loop { + let pixels = (0..60).map(|i: u8| { + let hue = hue.wrapping_add(i.wrapping_mul(4)); + let sat = 170; + let val = 250; + let rgb = hsv2rgb(Hsv { hue, sat, val }); + rgb + }); + ws2812.write(pixels).unwrap(); + + sleep(Duration::from_millis(20)); + + hue = hue.wrapping_add(1); + } +}