1#![doc = include_str!("../README.md")]
2#![cfg_attr(target_os = "none", no_std)]
3
4#[cfg(all(
5 target_os = "none",
6 not(any(
7 feature = "esp32",
8 feature = "esp32c2",
9 feature = "esp32c3",
10 feature = "esp32c5",
11 feature = "esp32c6",
12 feature = "esp32c61",
13 feature = "esp32h2",
14 feature = "esp32s2",
15 feature = "esp32s3"
16 ))
17))]
18compile_error!(
19 "Select one chip feature for embedded builds: `esp32`, `esp32c2`, `esp32c3`, `esp32c5`, `esp32c6`, `esp32c61`, `esp32h2`, `esp32s2`, or `esp32s3` (with `--no-default-features --features <chip>`)."
20);
21
22#[cfg(all(
23 target_os = "none",
24 any(
25 all(feature = "esp32", feature = "esp32c2"),
26 all(feature = "esp32", feature = "esp32c3"),
27 all(feature = "esp32", feature = "esp32c5"),
28 all(feature = "esp32", feature = "esp32c6"),
29 all(feature = "esp32", feature = "esp32c61"),
30 all(feature = "esp32", feature = "esp32h2"),
31 all(feature = "esp32", feature = "esp32s2"),
32 all(feature = "esp32", feature = "esp32s3"),
33 all(feature = "esp32c2", feature = "esp32c3"),
34 all(feature = "esp32c2", feature = "esp32c5"),
35 all(feature = "esp32c2", feature = "esp32c6"),
36 all(feature = "esp32c2", feature = "esp32c61"),
37 all(feature = "esp32c2", feature = "esp32h2"),
38 all(feature = "esp32c2", feature = "esp32s2"),
39 all(feature = "esp32c2", feature = "esp32s3"),
40 all(feature = "esp32c3", feature = "esp32c5"),
41 all(feature = "esp32c3", feature = "esp32c6"),
42 all(feature = "esp32c3", feature = "esp32c61"),
43 all(feature = "esp32c3", feature = "esp32h2"),
44 all(feature = "esp32c3", feature = "esp32s2"),
45 all(feature = "esp32c3", feature = "esp32s3"),
46 all(feature = "esp32c5", feature = "esp32c6"),
47 all(feature = "esp32c5", feature = "esp32c61"),
48 all(feature = "esp32c5", feature = "esp32h2"),
49 all(feature = "esp32c5", feature = "esp32s2"),
50 all(feature = "esp32c5", feature = "esp32s3"),
51 all(feature = "esp32c6", feature = "esp32h2"),
52 all(feature = "esp32c6", feature = "esp32c61"),
53 all(feature = "esp32c6", feature = "esp32s2"),
54 all(feature = "esp32c6", feature = "esp32s3"),
55 all(feature = "esp32c61", feature = "esp32h2"),
56 all(feature = "esp32c61", feature = "esp32s2"),
57 all(feature = "esp32c61", feature = "esp32s3"),
58 all(feature = "esp32h2", feature = "esp32s2"),
59 all(feature = "esp32h2", feature = "esp32s3"),
60 all(feature = "esp32s2", feature = "esp32s3"),
61 )
62))]
63compile_error!("Select exactly one chip feature for embedded builds, not both.");
64
65pub mod button;
66#[cfg(all(target_os = "none", esp_has_wifi))]
67pub mod clock_sync {
68 pub use device_envoy_core::clock_sync::ClockSyncRuntime as ClockSyncEsp;
165 pub use device_envoy_core::clock_sync::ClockSyncStatic as ClockSyncStaticEsp;
167 pub use device_envoy_core::clock_sync::{
168 ClockSync, ClockSyncTick, ONE_DAY, ONE_MINUTE, ONE_SECOND, UnixSeconds, h12_m_s,
169 };
170 pub use device_envoy_core::{Error as CoreError, Result as CoreResult};
171}
172#[cfg(all(target_os = "none", esp_has_wifi))]
173#[doc(hidden)]
174pub mod time_sync {
175 pub use device_envoy_core::clock_sync::UnixSeconds;
178 pub use device_envoy_core::time_sync::{TimeSync, TimeSyncEvent, TimeSyncStatic};
179}
180#[cfg(esp_has_i2s)]
181pub mod audio_player;
182#[cfg(target_os = "none")]
183pub mod cyd;
184#[cfg(all(test, feature = "host"))]
188#[path = "cyd/buffer.rs"]
189mod cyd_buffer_host_tests;
190pub mod flash_block;
191pub mod init_and_start;
192#[cfg(esp_has_rmt)]
193pub mod ir;
194#[cfg(target_os = "none")]
195pub mod lcd_text;
196#[cfg(target_os = "none")]
197pub mod led;
198#[cfg(any(feature = "host", target_os = "none"))]
199pub mod led2d;
200pub mod led4;
201#[cfg(target_os = "none")]
202pub mod led_strip;
203#[cfg(target_os = "none")]
204pub mod rfid;
205#[cfg(esp_has_rmt)]
206mod rmt;
207mod rmt_mode;
208#[cfg(all(target_os = "none", esp_has_ledc))]
209pub mod servo;
210#[cfg(all(target_os = "none", esp_has_ledc))]
211mod servo_player;
212#[cfg(any(feature = "host", esp_has_wifi))]
213pub mod wifi_auto;
214
215#[cfg(doc)]
216pub mod docs {
217 pub mod development_guide {
219 #![doc = include_str!("docs/development_guide.md")]
220 }
221}
222
223pub use device_envoy_core::tone;
224#[doc(hidden)]
226pub use paste::paste as __paste;
227
228#[doc(hidden)]
230#[macro_export]
231macro_rules! __validate_keyword_fields_expr {
232 (
233 macro_name: $macro_name:literal,
234 allowed_macro: $allowed_macro:path,
235 fields: [ $( $field:ident : $value:expr ),* $(,)? ]
236 ) => {
237 const _: () = {
238 $( $allowed_macro!($field, $macro_name); )*
239 #[allow(non_snake_case)]
240 mod __device_envoy_keyword_fields_uniqueness {
241 $( pub(super) mod $field {} )*
242 }
243 };
244 };
245
246 (
247 macro_name: $macro_name:literal,
248 allowed_macro: $allowed_macro:path,
249 fields: [ $($fields:tt)* ]
250 ) => {
251 compile_error!(concat!($macro_name, " fields must use `name: value` syntax"));
252 };
253}
254
255#[cfg(all(target_arch = "riscv32", target_os = "none"))]
265mod _esp_radio_nvs_stubs {
266 #[unsafe(no_mangle)]
267 unsafe extern "C" fn __esp_radio_misc_nvs_deinit() {}
268
269 #[unsafe(no_mangle)]
270 unsafe extern "C" fn __esp_radio_misc_nvs_init() -> i32 {
271 0
272 }
273}
274
275#[doc(hidden)]
276#[cfg(target_os = "none")]
277pub use esp_hal;
278#[doc(hidden)]
279#[cfg(target_os = "none")]
280pub use esp_rtos;
281
282pub type Result<T, E = Error> = core::result::Result<T, E>;
283
284#[derive(Debug, derive_more::From)]
285#[non_exhaustive]
286pub enum Error {
287 TaskSpawn(embassy_executor::SpawnError),
288 #[from(ignore)]
289 Core(device_envoy_core::Error),
290 #[cfg(target_os = "none")]
291 FlashStorage(esp_storage::FlashStorageError),
292 InvalidFlashRegion,
293 IndexOutOfBounds,
294 FormatError,
295 StorageCorrupted,
296 FlashRegionMismatch,
297 Led4BitsToIndexesFull,
298 MissingCustomWifiAutoField,
299 Ntp(&'static str),
300 #[cfg(all(target_os = "none", esp_has_rmt))]
301 RmtConfig(esp_hal::rmt::ConfigError),
302 #[cfg(all(target_os = "none", esp_has_rmt))]
303 Rmt(esp_hal::rmt::Error),
304 #[cfg(target_os = "none")]
305 SpiConfig(esp_hal::spi::master::ConfigError),
306 #[cfg(target_os = "none")]
307 Spi(esp_hal::spi::Error),
308 #[cfg(target_os = "none")]
309 #[from(ignore)]
310 Mfrc522Init(esp_hal_mfrc522::consts::PCDErrorCode),
311 #[cfg(target_os = "none")]
312 #[from(ignore)]
313 Mfrc522Version(esp_hal_mfrc522::consts::PCDErrorCode),
314 #[cfg(target_os = "none")]
315 I2cConfig(esp_hal::i2c::master::ConfigError),
316 #[cfg(all(target_os = "none", esp_has_ledc))]
317 LedcTimer(esp_hal::ledc::timer::Error),
318 #[cfg(all(target_os = "none", esp_has_ledc))]
319 LedcChannel(esp_hal::ledc::channel::Error),
320 #[cfg(all(target_os = "none", esp_has_wifi))]
321 Wifi(esp_radio::wifi::WifiError),
322 #[cfg(target_os = "none")]
323 #[from(ignore)]
324 Cyd(cyd::Error),
326 #[cfg(target_os = "none")]
327 CydTouchUnavailable,
328}
329
330#[cfg(target_os = "none")]
331impl From<cyd::Error> for Error {
332 fn from(error: cyd::Error) -> Self {
333 Self::Cyd(error)
334 }
335}
336
337impl From<device_envoy_core::Error> for Error {
338 fn from(error: device_envoy_core::Error) -> Self {
339 match error {
340 device_envoy_core::Error::TaskSpawn(spawn_error) => Self::TaskSpawn(spawn_error),
341 core_error => Self::Core(core_error),
342 }
343 }
344}
345
346impl From<device_envoy_core::led4::Led4BitsToIndexesError> for Error {
347 fn from(error: device_envoy_core::led4::Led4BitsToIndexesError) -> Self {
348 match error {
349 device_envoy_core::led4::Led4BitsToIndexesError::Full => Self::Led4BitsToIndexesFull,
350 }
351 }
352}