// Poziom ekspercki: trzy środowiska i jawna granica kodu autora.
struct PomiarTemperatury {
    celsius: Float
    czas: Time
}

struct StanTemperatury {
    celsius: Float
    przekroczony_prog: Bool
}

extern sensor OdczytTemperatury {
    target embedded
    language cpp
    file "user/embedded/odczyt_temperatury.cpp"

    fn odczytaj(pin: u8) -> Float
}

extern task OdczytTemperatury_odczytaj(pin: u8) @embedded -> Float
extern task pokaz_temperature(stan: StanTemperatury) @report

device CzujnikKuchenny @embedded(esp32c3) {
    hardware {
        pin_danych: u8 : 4
    }
    timing {
        okres: Duration : 5s
    }
}

task Czujnik() @embedded(CzujnikKuchenny) -> chan<PomiarTemperatury> {
    config {
        pin_danych: u8 : 4
        okres: Duration : 5s
    }

    every config.okres {
        send PomiarTemperatury {
            celsius: OdczytTemperatury_odczytaj(config.pin_danych),
            czas: now()
        }
    }
}

task Analiza(wejscie: chan<PomiarTemperatury>) @server -> stream<StanTemperatury> {
    config {
        prog: Float : 30.0
    }

    loop {
        let pomiar = recv wejscie
        send StanTemperatury {
            celsius: pomiar.celsius,
            przekroczony_prog: pomiar.celsius > config.prog
        }
    }
}

task Panel(stany: stream<StanTemperatury>) @report {
    for stan in stany {
        pokaz_temperature(stan)
    }
}

pipeline SystemTemperatury {
    use Czujnik -> Analiza
    use Analiza -> Panel
}
