esp-idf-svc 0.36.4

Implementation of the embedded-svc traits for ESP-IDF (Espressif's IoT Development Framework)
use ::log::*;

use esp_idf_hal::mutex;

use esp_idf_sys::*;

static TAKEN: mutex::Mutex<bool> = mutex::Mutex::new(false);

#[derive(Debug)]
struct PrivateData;

#[derive(Debug)]
pub struct EspSysLoopStack(PrivateData);

impl EspSysLoopStack {
    pub fn new() -> Result<Self, EspError> {
        let mut taken = TAKEN.lock();

        if *taken {
            esp!(ESP_ERR_INVALID_STATE as i32)?;
        }

        esp!(unsafe { esp_event_loop_create_default() })?;

        *taken = true;
        Ok(EspSysLoopStack(PrivateData))
    }
}

impl Drop for EspSysLoopStack {
    fn drop(&mut self) {
        {
            let mut taken = TAKEN.lock();

            esp!(unsafe { esp_event_loop_delete_default() }).unwrap();
            *taken = false;
        }

        info!("Dropped");
    }
}