use embassy_time::{Duration, Instant, Timer};
use rttp::PulseFrameHeader;
use crate::aal::{ActionAbstractionLayer, ActionPrimitive};
use crate::shadow::ShadowState;
use crate::fusion::SensorFusion;
use crate::resonance::KineticResonance;
#[embassy_executor::task]
pub async fn sensory_motor_loop() {
let mut sensor_fusion = SensorFusion::new();
let mut shadow_state = ShadowState::new();
let aal = ActionAbstractionLayer::new();
let mut hive_sync = KineticResonance::new();
let motor_primitive = ActionPrimitive::default();
#[cfg(debug_assertions)]
log_gtiot("Body Homeostasis Initialized. RFC-005 Standard Active.");
let mut last_pulse_time = Instant::now();
loop {
let raw_sensors = crate::hw::read_sensors();
let fused_shadow = sensor_fusion.fuse(&raw_sensors);
let mut header = PulseFrameHeader::new(
[0x88; 32], 80_000, fused_shadow.parity_score as u64, );
if hive_sync.is_active() {
header.flags |= 0b1000;
}
let mock_command: Option<&[u8]> = None;
if let Some(cmd_frame) = mock_command {
let cmd_header = unsafe { &*(cmd_frame.as_ptr() as *const PulseFrameHeader) };
let payload = &cmd_frame[64..];
if !rpki::parallel_immune_scan(cmd_header, payload).is_safe() {
crate::hw::hardware_kill_switch(); continue;
}
if zcmk::circulatory_pump(cmd_header, payload).is_none() {
continue;
}
let brain_intent = crate::parser::parse_intent_stub(payload);
let packed_kinetics = aal.collapse(brain_intent, &shadow_state);
let aligned_kinetics = if cmd_header.flags & 0b1000 != 0 {
hive_sync.align_with_swarm_u128(packed_kinetics)
} else {
packed_kinetics
};
aal.commit_to_actuators(&motor_primitive, aligned_kinetics);
crate::hw::execute_actuators(&motor_primitive);
last_pulse_time = Instant::now();
shadow_state.update(aligned_kinetics);
shadow_state.predict_trajectories();
}
if Instant::now() - last_pulse_time > Duration::from_millis(3) {
let safe_action = shadow_state.get_safe_trajectory();
crate::hw::execute_actuators_direct(&safe_action.torque_vectors());
#[cfg(debug_assertions)]
log_gtiot("Neural sever detected. Fail-safe Oracle engaged.");
}
Timer::after_micros(833).await;
}
}
fn log_gtiot(msg: &str) {
println!("\x1b[1;33m[GTIOT-BODY]\x1b[0m 🦾 {}", msg);
}