#![no_std]
#![no_main]

use esp_backtrace as _;
use esp_hal::{
    clock::ClockControl,
    peripherals::Peripherals,
    prelude::*,
    systimer::SystemTimer,
    timer::TimerGroup,
    Delay,
    gpio::{Gpio1, Gpio2, Gpio10, Output, PushPull, Input, PullDown},
};

use esp_hal::entry;

#[entry]
fn main() -> ! {
    // Setup peripherals
    let peripherals = Peripherals::take().unwrap();
    let system = peripherals.SYSTEM.split();
    let clocks = ClockControl::boot_defaults(system.clock_control).freeze();

    let io = peripherals.GPIO.split();
    let mut delay = Delay::new(&clocks);

    // PIR sensor input on GPIO10
    let pir: Gpio10<Input<PullDown>> = io.pins.gpio10.into_pull_down_input();

    // LED on GPIO2
    let mut led: Gpio2<Output<PushPull>> = io.pins.gpio2.into_push_pull_output();

    // Buzzer on GPIO1
    let mut buzzer: Gpio1<Output<PushPull>> = io.pins.gpio1.into_push_pull_output();

    loop {
        if pir.is_high().unwrap() {
            // Motion detected
            led.set_high().unwrap();
            buzzer.set_high().unwrap();
            delay.delay_ms(500u32); // Alarm duration
            buzzer.set_low().unwrap();
        } else {
            // No motion
            led.set_low().unwrap();
            buzzer.set_low().unwrap();
        }

        delay.delay_ms(100u32);
    }
}