rustpower 0.5.0-rc.3

An experimental ECS world snapshot system built on Bevy, featuring structured archetype storage and manifest-based serialization.
Documentation
use crate::io::pandapower::SGen;
use bevy_archive::prelude::SnapshotRegistry;
use bevy_ecs::prelude::*;

use super::{
    TargetPMW, TargetQMVar,
    bus::SnaptShotRegGroup,
    generator::{TargetBus, Uncontrollable},
};

/// Static Generator (SGen) device parameters, describing a fixed-power injection.
#[derive(Component, Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct SGenDevice {
    pub p_mw: f64,
    pub q_mvar: f64,
    pub scaling: f64,
    pub sn_mva: Option<f64>,
    pub gen_type: Option<String>,
    pub is_current_source: bool,
}

use rustpower_proc_marco::DeferBundle;

/// ECS bundle for inserting a static generator (SGen) into the simulation.
#[derive(DeferBundle, Debug, Clone)]
pub struct SGenBundle {
    pub target_bus: TargetBus,
    pub device: SGenDevice,
    pub target_p: TargetPMW,
    pub target_q: TargetQMVar,
    pub uncontrollable: Option<Uncontrollable>,
    pub name: Option<Name>,
}

impl From<&SGen> for SGenBundle {
    fn from(sgen: &SGen) -> Self {
        SGenBundle {
            target_bus: TargetBus(sgen.bus),
            device: SGenDevice {
                p_mw: sgen.p_mw,
                q_mvar: sgen.q_mvar,
                scaling: sgen.scaling,
                sn_mva: sgen.sn_mva,
                gen_type: sgen.type_.clone(),
                is_current_source: sgen.current_source,
            },
            uncontrollable: (!sgen.controllable.unwrap_or(true)).then_some(Uncontrollable),
            name: sgen.name.clone().map(Name::new),
            target_p: TargetPMW(sgen.p_mw),
            target_q: TargetQMVar(sgen.q_mvar),
        }
    }
}

pub struct SGenSnapShotReg;

impl SnaptShotRegGroup for SGenSnapShotReg {
    fn register_snap_shot(reg: &mut SnapshotRegistry) {
        reg.register::<SGenDevice>();
    }
}