#![no_std]
#![no_main]
use esp_backtrace as _;
use esp_hal::{
clock::ClockControl,
peripherals::Peripherals,
prelude::*,
timer::TimerGroup,
gpio::{IO, Level},
delay::Delay,
};
use esp_println::println;
#[entry]
fn main() -> ! {
// 1. Inisialisasi Periferal utama ESP32-S3
let peripherals = Peripherals::take();
let system = peripherals.SYSTEM.split();
// Konfigurasi clock sistem agar berjalan stabil
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
// Inisialisasi Timer Group untuk membuat delay acuan waktu mikrodetik
let timg0 = TimerGroup::new(peripherals.TIMG0, &clocks);
let timer0 = timg0.timer0;
let delay = Delay::new(&clocks);
// 2. Inisialisasi struktur GPIO
let io = IO::new(peripherals.GPIO, peripherals.IO_MUX);
// Set Pin GPIO 2 sebagai Output untuk LED Darurat
let mut led = io.pins.gpio2.into_push_pull_output();
// Set Pin GPIO 1 sebagai Input Digital/Analog (Simulasi pembacaan sensor)
let sensor_pin = io.pins.gpio1.into_floating_input();
println!("==================================================");
println!("Sistem AHIE-Framework Berbasis Rust Siap Dijalankan!");
println!("Core 0: Memulai Monitoring Sensor Kritis...");
println!("Core 1: Memulai Simulasi Tugas Berat Pemrosesan AI...");
println!("==================================================");
// Variasi penanda sampel data untuk plotting gnuplot nanti
let mut detik_sampel = 0.0;
loop {
// --- SIMULASI CORE 1 (Beban Komputasi AI Berat) ---
// Kita simulasikan matematika intensif langsung di dalam loop utama
// Ini merepresentasikan beban CPU tinggi saat AI sedang menebak anomali data
let mut _matriks_dummy: f32 = 1.0;
for i in 0..500 {
_matriks_dummy = (_matriks_dummy * 3.1415) / 2.718;
}
// --- SIMULASI CORE 0 (Tugas Kritis/Safety Mendeteksi Bahaya) ---
// Catat waktu tepat SEBELUM sensor dievaluasi
let waktu_mulai = timer0.now();
// Baca status pin sensor (Simulasi kondisi Kritis / Normal)
// Di Wokwi, kamu bisa klik Potensiometer saat simulasi jalan untuk mengubah tegangannya
let kondisi_kritis = sensor_pin.is_high();
if kondisi_kritis {
// JIKA KRITIS: NYALAKAN LED KESELAMATAN SECEPATNYA
led.set_level(Level::High);
// Catat waktu tepat SETELAH aktuator (LED) merespons sukses
let waktu_selesai = timer0.now();
// Hitung selisih waktu eksekusi (Latensi Respons) dalam Mikrodetik (us)
// Sistem bare-metal Rust biasanya mengeksekusi ini dalam < 5 mikrodetik!
let latensi_us = (waktu_selesai - waktu_mulai) / 240; // Asumsi clock internal 240MHz
// CETAK LOG DATA RESMI (Salin baris ini untuk file latensi.txt kamu nanti)
println!("{:.2} \t {}", detik_sampel, latensi_us);
} else {
// JIKA AMAN: Matikan LED
led.set_level(Level::Low);
}
// Tambah jeda sampling simulasi dan perbarui counter waktu
delay.delay_ms(100u32);
detik_sampel += 0.1;
}
}