File indexing completed on 2024-06-16 08:27:18

0001 /***************************************************************************
0002  *   Copyright (C) 2005 by David Saxton                                    *
0003  *   david@bluehaze.org                                                    *
0004  *                                                                         *
0005  *   This program is free software; you can redistribute it and/or modify  *
0006  *   it under the terms of the GNU General Public License as published by  *
0007  *   the Free Software Foundation; either version 2 of the License, or     *
0008  *   (at your option) any later version.                                   *
0009  ***************************************************************************/
0010 
0011 #include "pin.h"
0012 
0013 #include <QDebug>
0014 
0015 #include <cassert>
0016 
0017 #include <ktechlab_debug.h>
0018 
0019 Pin::Pin(ECNode *parent)
0020 {
0021     assert(parent);
0022     m_pECNode = parent;
0023     m_voltage = 0.;
0024     m_current = 0.;
0025     m_eqId = -2;
0026     m_bCurrentIsKnown = false;
0027     m_groundType = Pin::gt_never;
0028 }
0029 
0030 Pin::~Pin()
0031 {
0032     qDeleteAll(m_inputWireList);
0033     qDeleteAll(m_outputWireList);
0034 }
0035 
0036 PinList Pin::localConnectedPins() const
0037 {
0038     //  qCDebug(KTL_LOG) << "Input wires: "<<m_inputWireList.size()<<"   Output wires: " << m_outputWireList.size() << "   Switch connected: " << m_switchConnectedPins.size();
0039 
0040     PinList pins;
0041 
0042     WireList::const_iterator end = m_inputWireList.end();
0043     for (WireList::const_iterator it = m_inputWireList.begin(); it != end; ++it) {
0044         if (*it)
0045             pins << (*it)->startPin();
0046     }
0047 
0048     end = m_outputWireList.end();
0049     for (WireList::const_iterator it = m_outputWireList.begin(); it != end; ++it) {
0050         if (*it)
0051             pins << (*it)->endPin();
0052     }
0053 
0054     pins += m_switchConnectedPins;
0055 
0056     return pins;
0057 }
0058 
0059 void Pin::setSwitchConnected(Pin *pin, bool isConnected)
0060 {
0061     if (!pin)
0062         return;
0063 
0064     if (isConnected) {
0065         if (!m_switchConnectedPins.contains(pin))
0066             m_switchConnectedPins.append(pin);
0067     } else
0068         m_switchConnectedPins.removeAll(pin);
0069 }
0070 
0071 void Pin::setSwitchCurrentsUnknown()
0072 {
0073     if (!m_switchList.empty()) {
0074         m_switchList.removeAt(0l);
0075     } else {
0076         // 2022.06.26 - too noisy, better keep it disabled
0077         //qCDebug(KTL_LOG) << "Pin::setSwitchCurrentsUnknown - WARN - unexpected empty switch list";
0078     }
0079     m_unknownSwitchCurrents = m_switchList;
0080 }
0081 
0082 void Pin::addCircuitDependentPin(Pin *pin)
0083 {
0084     if (pin && !m_circuitDependentPins.contains(pin))
0085         m_circuitDependentPins.append(pin);
0086 }
0087 
0088 void Pin::addGroundDependentPin(Pin *pin)
0089 {
0090     if (pin && !m_groundDependentPins.contains(pin))
0091         m_groundDependentPins.append(pin);
0092 }
0093 
0094 void Pin::removeDependentPins()
0095 {
0096     m_circuitDependentPins.clear();
0097     m_groundDependentPins.clear();
0098 }
0099 
0100 void Pin::addElement(Element *e)
0101 {
0102     if (!e || m_elementList.contains(e))
0103         return;
0104     m_elementList.append(e);
0105 }
0106 
0107 void Pin::removeElement(Element *e)
0108 {
0109     m_elementList.removeAll(e);
0110 }
0111 
0112 void Pin::addSwitch(Switch *sw)
0113 {
0114     if (!sw || m_switchList.contains(sw))
0115         return;
0116     m_switchList << sw;
0117 }
0118 
0119 void Pin::removeSwitch(Switch *sw)
0120 {
0121     m_switchList.removeAll(sw);
0122 }
0123 
0124 void Pin::addInputWire(Wire *wire)
0125 {
0126     if (wire && !m_inputWireList.contains(wire))
0127         m_inputWireList << wire;
0128 }
0129 
0130 void Pin::addOutputWire(Wire *wire)
0131 {
0132     if (wire && !m_outputWireList.contains(wire))
0133         m_outputWireList << wire;
0134 }
0135 
0136 bool Pin::calculateCurrentFromWires()
0137 {
0138     m_inputWireList.removeAll(static_cast<Wire *>(nullptr));
0139     m_outputWireList.removeAll(static_cast<Wire *>(nullptr));
0140 
0141     const WireList inputs = m_inputWireList;
0142     const WireList outputs = m_outputWireList;
0143 
0144     m_current = 0.0;
0145 
0146     WireList::const_iterator end = inputs.end();
0147     for (WireList::const_iterator it = inputs.begin(); it != end; ++it) {
0148         if (!(*it)->currentIsKnown())
0149             return false;
0150 
0151         m_current -= (*it)->current();
0152     }
0153 
0154     end = outputs.end();
0155     for (WireList::const_iterator it = outputs.begin(); it != end; ++it) {
0156         if (!(*it)->currentIsKnown())
0157             return false;
0158 
0159         m_current += (*it)->current();
0160     }
0161 
0162     m_bCurrentIsKnown = true;
0163     return true;
0164 }