package mods.eln.sim.mna.component; import mods.eln.sim.mna.RootSystem; import mods.eln.sim.mna.SubSystem; import mods.eln.sim.mna.misc.IDestructor; import mods.eln.sim.mna.state.State; import mods.eln.sim.mna.state.VoltageState; public class InterSystemAbstraction implements IAbstractor, IDestructor { VoltageState aNewState; Resistor aNewResistor; DelayInterSystem2 aNewDelay; VoltageState bNewState; Resistor bNewResistor; DelayInterSystem2 bNewDelay; DelayInterSystem2.ThevnaCalculator thevnaCalc; RootSystem root; Resistor interSystemResistor; State aState; State bState; SubSystem aSystem; SubSystem bSystem; public InterSystemAbstraction(RootSystem root, Resistor interSystemResistor) { this.interSystemResistor = interSystemResistor; this.root = root; aState = interSystemResistor.aPin; bState = interSystemResistor.bPin; aSystem = aState.getSubSystem(); bSystem = bState.getSubSystem(); aSystem.interSystemConnectivity.add(bSystem); bSystem.interSystemConnectivity.add(aSystem); aNewState = new VoltageState(); aNewResistor = new Resistor(); aNewDelay = new DelayInterSystem2(); bNewState = new VoltageState(); bNewResistor = new Resistor(); bNewDelay = new DelayInterSystem2(); aNewResistor.connectGhostTo(aState, aNewState); aNewDelay.connectTo(aNewState, null); bNewResistor.connectGhostTo(bState, bNewState); bNewDelay.connectTo(bNewState, null); calibrate(); aSystem.addComponent(aNewResistor); aSystem.addState(aNewState); aSystem.addComponent(aNewDelay); bSystem.addComponent(bNewResistor); bSystem.addState(bNewState); bSystem.addComponent(bNewDelay); aSystem.breakDestructor.add(this); bSystem.breakDestructor.add(this); interSystemResistor.abstractedBy = this; thevnaCalc = new DelayInterSystem2.ThevnaCalculator(aNewDelay, bNewDelay); root.addProcess(thevnaCalc); } void calibrate() { double u = (aState.state + bState.state) / 2; aNewDelay.setU(u); bNewDelay.setU(u); double r = interSystemResistor.getR() / 2; aNewResistor.setR(r); bNewResistor.setR(r); } @Override public void dirty(Component component) { calibrate(); } @Override public SubSystem getAbstractorSubSystem() { return aSystem; } @Override public void destruct() { aSystem.breakDestructor.remove(this); aSystem.removeComponent(aNewDelay); aSystem.removeComponent(aNewResistor); aSystem.removeState(aNewState); bSystem.breakDestructor.remove(this); bSystem.removeComponent(bNewDelay); bSystem.removeComponent(bNewResistor); bSystem.removeState(bNewState); root.removeProcess(thevnaCalc); interSystemResistor.abstractedBy = null; aSystem.component.add(interSystemResistor); } }