mirror of
				https://github.com/Djeeberjr/fw-anwesenheit.git
				synced 2025-11-03 23:24:10 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			135 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			135 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
use embassy_time::{Duration, Timer};
 | 
						|
use esp_hal::gpio::{AnyPin, Output};
 | 
						|
use esp_hal::peripherals;
 | 
						|
use esp_hal_smartled::SmartLedsAdapterAsync;
 | 
						|
use log::debug;
 | 
						|
use smart_leds::SmartLedsWriteAsync;
 | 
						|
use smart_leds::colors::{BLACK, GREEN, RED, YELLOW};
 | 
						|
use smart_leds::{brightness, colors::BLUE};
 | 
						|
 | 
						|
use crate::init::hardware;
 | 
						|
use crate::{FEEDBACK_STATE, init};
 | 
						|
 | 
						|
#[derive(Copy, Clone, Debug)]
 | 
						|
pub enum FeedbackState {
 | 
						|
    Ack,
 | 
						|
    Nack,
 | 
						|
    Error,
 | 
						|
    Startup,
 | 
						|
    WIFI,
 | 
						|
    Idle,
 | 
						|
}
 | 
						|
 | 
						|
const LED_LEVEL: u8 = 255;
 | 
						|
 | 
						|
//TODO ERROR STATE: 1 Blink = unknows error,  3 Blink = no sd card
 | 
						|
 | 
						|
#[embassy_executor::task]
 | 
						|
pub async fn feedback_task(
 | 
						|
    mut led: SmartLedsAdapterAsync<'static, { hardware::LED_BUFFER_SIZE }>,
 | 
						|
    mut buzzer: Output<'static>,
 | 
						|
) {
 | 
						|
    debug!("Starting feedback task");
 | 
						|
    loop {
 | 
						|
        let feedback_state = FEEDBACK_STATE.wait().await;
 | 
						|
        match feedback_state {
 | 
						|
            FeedbackState::Ack => {
 | 
						|
                led.write(brightness(
 | 
						|
                    [GREEN; init::hardware::NUM_LEDS].into_iter(),
 | 
						|
                    LED_LEVEL,
 | 
						|
                ))
 | 
						|
                .await
 | 
						|
                .unwrap();
 | 
						|
                buzzer.set_high();
 | 
						|
                Timer::after(Duration::from_millis(100)).await;
 | 
						|
                buzzer.set_low();
 | 
						|
                Timer::after(Duration::from_millis(50)).await;
 | 
						|
                led.write(brightness(
 | 
						|
                    [BLACK; init::hardware::NUM_LEDS].into_iter(),
 | 
						|
                    LED_LEVEL,
 | 
						|
                ))
 | 
						|
                .await
 | 
						|
                .unwrap();
 | 
						|
            }
 | 
						|
            FeedbackState::Nack => {
 | 
						|
                led.write(brightness(
 | 
						|
                    [YELLOW; init::hardware::NUM_LEDS].into_iter(),
 | 
						|
                    LED_LEVEL,
 | 
						|
                ))
 | 
						|
                .await
 | 
						|
                .unwrap();
 | 
						|
                buzzer.set_high();
 | 
						|
                Timer::after(Duration::from_millis(100)).await;
 | 
						|
                buzzer.set_low();
 | 
						|
                Timer::after(Duration::from_millis(100)).await;
 | 
						|
                buzzer.set_high();
 | 
						|
                Timer::after(Duration::from_millis(100)).await;
 | 
						|
                buzzer.set_low();
 | 
						|
                led.write(brightness(
 | 
						|
                    [BLACK; init::hardware::NUM_LEDS].into_iter(),
 | 
						|
                    LED_LEVEL,
 | 
						|
                ))
 | 
						|
                .await
 | 
						|
                .unwrap();
 | 
						|
            }
 | 
						|
            FeedbackState::Error => {
 | 
						|
                led.write(brightness(
 | 
						|
                    [RED; init::hardware::NUM_LEDS].into_iter(),
 | 
						|
                    LED_LEVEL,
 | 
						|
                ))
 | 
						|
                .await
 | 
						|
                .unwrap();
 | 
						|
                buzzer.set_high();
 | 
						|
                Timer::after(Duration::from_millis(500)).await;
 | 
						|
                buzzer.set_low();
 | 
						|
                Timer::after(Duration::from_millis(500)).await;
 | 
						|
                buzzer.set_high();
 | 
						|
                Timer::after(Duration::from_millis(500)).await;
 | 
						|
                buzzer.set_low();
 | 
						|
            }
 | 
						|
            FeedbackState::Startup => {
 | 
						|
                led.write(brightness(
 | 
						|
                    [GREEN; init::hardware::NUM_LEDS].into_iter(),
 | 
						|
                    LED_LEVEL,
 | 
						|
                ))
 | 
						|
                .await
 | 
						|
                .unwrap();
 | 
						|
                buzzer.set_high();
 | 
						|
                Timer::after(Duration::from_millis(10)).await;
 | 
						|
                buzzer.set_low();
 | 
						|
                Timer::after(Duration::from_millis(10)).await;
 | 
						|
                buzzer.set_high();
 | 
						|
                Timer::after(Duration::from_millis(10)).await;
 | 
						|
                buzzer.set_low();
 | 
						|
                Timer::after(Duration::from_millis(50)).await;
 | 
						|
                buzzer.set_high();
 | 
						|
                Timer::after(Duration::from_millis(100)).await;
 | 
						|
                buzzer.set_low();
 | 
						|
                led.write(brightness(
 | 
						|
                    [BLACK; init::hardware::NUM_LEDS].into_iter(),
 | 
						|
                    LED_LEVEL,
 | 
						|
                ))
 | 
						|
                .await
 | 
						|
                .unwrap();
 | 
						|
            }
 | 
						|
            FeedbackState::WIFI => {
 | 
						|
                led.write(brightness(
 | 
						|
                    [BLUE; init::hardware::NUM_LEDS].into_iter(),
 | 
						|
                    LED_LEVEL,
 | 
						|
                ))
 | 
						|
                .await
 | 
						|
                .unwrap();
 | 
						|
            }
 | 
						|
            FeedbackState::Idle => {
 | 
						|
                led.write(brightness(
 | 
						|
                    [BLACK; init::hardware::NUM_LEDS].into_iter(),
 | 
						|
                    LED_LEVEL,
 | 
						|
                ))
 | 
						|
                .await
 | 
						|
                .unwrap();
 | 
						|
            }
 | 
						|
        };
 | 
						|
        debug!("Feedback state: {:?}", feedback_state);
 | 
						|
    }
 | 
						|
}
 |