~arcachofo/simulide/1.1.0

« back to all changes in this revision

Viewing changes to src/gui/circuitwidget/components/passive/potentiometer.cpp

  • Committer: arcachofo
  • Date: 2021-01-01 14:23:42 UTC
  • Revision ID: arcachofo@simulide.com-20210101142342-ozfljnll44g5lbl3
Initial Commit 0.5.15-RC3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/***************************************************************************
 
2
 *   Copyright (C) 2012 by santiago González                               *
 
3
 *   santigoro@gmail.com                                                   *
 
4
 *                                                                         *
 
5
 *   This program is free software; you can redistribute it and/or modify  *
 
6
 *   it under the terms of the GNU General Public License as published by  *
 
7
 *   the Free Software Foundation; either version 3 of the License, or     *
 
8
 *   (at your option) any later version.                                   *
 
9
 *                                                                         *
 
10
 *   This program is distributed in the hope that it will be useful,       *
 
11
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 
12
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 
13
 *   GNU General Public License for more details.                          *
 
14
 *                                                                         *
 
15
 *   You should have received a copy of the GNU General Public License     *
 
16
 *   along with this program; if not, see <http://www.gnu.org/licenses/>.  *
 
17
 *                                                                         *
 
18
 ***************************************************************************/
 
19
 
 
20
#include "potentiometer.h"
 
21
#include "connector.h"
 
22
#include "simulator.h"
 
23
#include "circuit.h"
 
24
#include "itemlibrary.h"
 
25
 
 
26
static const char* Potentiometer_properties[] = {
 
27
    QT_TRANSLATE_NOOP("App::Property","Value Ohm")
 
28
};
 
29
 
 
30
Component* Potentiometer::construct( QObject* parent, QString type, QString id )
 
31
{
 
32
    return new Potentiometer( parent, type, id );
 
33
}
 
34
 
 
35
LibraryItem* Potentiometer::libraryItem()
 
36
{
 
37
    return new LibraryItem(
 
38
        tr( "Potentiometer" ),
 
39
        tr( "Passive" ),
 
40
        "potentiometer.png",
 
41
        "Potentiometer",
 
42
        Potentiometer::construct );
 
43
}
 
44
 
 
45
Potentiometer::Potentiometer( QObject* parent, QString type, QString id )
 
46
             : Component( parent, type, id )
 
47
             , eElement( (id+"-eElement") )
 
48
             , m_pinA( 180, QPoint(-16,0 ), id+"-PinA", 0, this )
 
49
             , m_pinM( 270, QPoint( 0,16), id+"-PinM", 0, this )
 
50
             , m_pinB(   0, QPoint( 16,0 ), id+"-PinB", 0, this )
 
51
             , m_ePinA( (id+"-ePinA"), 1 )
 
52
             , m_ePinB( (id+"-ePinB"), 1 )
 
53
             , m_resA(  (id+"-resA") )
 
54
             , m_resB(  (id+"-resB") )
 
55
{
 
56
    Q_UNUSED( Potentiometer_properties );
 
57
 
 
58
    m_graphical = true;
 
59
    
 
60
    m_area = QRectF( -12, -4.5, 24, 12.5 );
 
61
    
 
62
    setLabelPos(-16,-40, 0);
 
63
    
 
64
    m_midEnode = 0l;
 
65
 
 
66
    m_pin.resize(3);
 
67
    m_pin[0] = &m_pinA;
 
68
    m_pin[1] = &m_pinM;
 
69
    m_pin[2] = &m_pinB;
 
70
    
 
71
    m_dialW.setupWidget();
 
72
    m_dialW.setFixedSize( 24, 24 );
 
73
    m_dialW.dial->setMinimum(0);
 
74
    m_dialW.dial->setMaximum(1000);
 
75
    m_dialW.dial->setValue(500);
 
76
    m_dialW.dial->setSingleStep(25);
 
77
    
 
78
    m_proxy = Circuit::self()->addWidget( &m_dialW );
 
79
    m_proxy->setParentItem( this );
 
80
    m_proxy->setPos( QPoint( -12, -24-5) );
 
81
    //m_proxy->setFlag(QGraphicsItem::ItemNegativeZStacksBehindParent, true );
 
82
 
 
83
    m_dial = m_dialW.dial;
 
84
    
 
85
    m_resA.setEpin( 0, &m_pinA );
 
86
    m_resA.setEpin( 1, &m_ePinA );
 
87
    
 
88
    m_resB.setEpin( 1, &m_pinB );
 
89
    m_resB.setEpin( 0, &m_ePinB );
 
90
 
 
91
    m_unit = "Ω";
 
92
    setRes(1000);
 
93
    setValLabelPos( 10,-20, 0);
 
94
    setShowVal( true );
 
95
    resChanged( 500 );
 
96
    
 
97
    Simulator::self()->addToUpdateList( this );
 
98
 
 
99
    connect( m_dial, SIGNAL(valueChanged(int)),
 
100
             this,   SLOT  (resChanged(int)), Qt::UniqueConnection );
 
101
}
 
102
 
 
103
Potentiometer::~Potentiometer() {}
 
104
 
 
105
void Potentiometer::stamp()
 
106
{
 
107
    eNode* enod = m_pinM.getEnode();        // Get eNode from middle Pin
 
108
 
 
109
    if( !enod )                       // Not connected: Create mid eNode
 
110
    {
 
111
        m_midEnode = new eNode( m_id+"-mideNode" );
 
112
        enod = m_midEnode;
 
113
        m_pinM.setEnode( enod );
 
114
    }
 
115
    else if( enod != m_midEnode ) // Connected to external eNode: Delete mid eNode
 
116
    {
 
117
        m_midEnode = enod;
 
118
    }
 
119
    m_ePinA.setEnode( m_midEnode );  // Set eNode to internal eResistors ePins
 
120
    m_ePinB.setEnode( m_midEnode );
 
121
    m_changed = true;
 
122
    updateStep();
 
123
}
 
124
 
 
125
void Potentiometer::updateStep()
 
126
{
 
127
    if( !m_changed ) return;
 
128
 
 
129
    double res1 = double( m_resist*m_dial->value()/1000 );
 
130
    double res2 = m_resist-res1;
 
131
 
 
132
    if( res1 < 1e-6 )
 
133
    {
 
134
        res1 = 1e-3;
 
135
        res2 = m_resist-res1;
 
136
    }
 
137
    if( res2 < 1e-6 )
 
138
    {
 
139
        res2 = 1e-6;
 
140
        res1 = m_resist-res2;
 
141
    }
 
142
    //qDebug()<<"Potentiometer::updateStep"<<res1<<res2;
 
143
    m_resA.setRes( res1 );
 
144
    m_resB.setRes( res2 );
 
145
 
 
146
    m_changed = false;
 
147
    Simulator::self()->addEvent( 0, 0l );
 
148
}
 
149
 
 
150
void Potentiometer::resChanged( int res ) // Called when dial is rotated
 
151
{
 
152
    //qDebug() << res << m_resist;
 
153
    m_changed = true;
 
154
}
 
155
 
 
156
void Potentiometer::setRes( double res ) // Called when property resistance is changed
 
157
{
 
158
    if( res == 0 ) res = 0.001;
 
159
    Component::setValue( res );       // Takes care about units multiplier
 
160
    m_resist = m_value*m_unitMult;
 
161
    
 
162
    m_changed = true;
 
163
}
 
164
 
 
165
void Potentiometer::setUnit( QString un ) 
 
166
{
 
167
    Component::setUnit( un );
 
168
    m_resist = m_value*m_unitMult;
 
169
 
 
170
    m_changed = true;
 
171
}
 
172
 
 
173
void Potentiometer::setVal( int val )
 
174
{
 
175
    m_dial->setValue( val*1000/m_resist );
 
176
    //resChanged( val );
 
177
}
 
178
 
 
179
int Potentiometer::val()
 
180
{
 
181
    return m_resist*m_dial->value()/1000;
 
182
}
 
183
 
 
184
void Potentiometer::remove()
 
185
{
 
186
    if( m_pinA.isConnected() ) m_pinA.connector()->remove();
 
187
    if( m_pinB.isConnected() ) m_pinB.connector()->remove();
 
188
    if( m_pinM.isConnected() ) 
 
189
    {
 
190
        Connector* con = m_pinM.connector();
 
191
        if( con ) con->remove();
 
192
    }
 
193
    
 
194
    //if( m_midEnode ) Simulator::self()->remFromEnodeList( m_midEnode, true );
 
195
    
 
196
    Simulator::self()->remFromUpdateList( this );
 
197
    
 
198
    Component::remove();
 
199
}
 
200
 
 
201
void Potentiometer::paint( QPainter *p, const QStyleOptionGraphicsItem *option, QWidget *widget )
 
202
{
 
203
    if( m_hidden ) return;
 
204
    //p->setBrush(Qt::white);
 
205
    //p->drawRoundedRect( QRect( 0, 0, 48, 48 ), 1, 1 );
 
206
    //p->setBrush(Qt::darkGray);
 
207
    //p->fillRect( QRect( 3, 3, 45, 45 ), Qt::darkGray );
 
208
 
 
209
    
 
210
    //p->drawRoundedRect( QRect( 8, -56, 8, 40 ), 1, 1 );
 
211
 
 
212
    Component::paint( p, option, widget );
 
213
    p->drawRect( -10.5, -4, 21, 8 );
 
214
    QPen pen = p->pen();
 
215
    pen.setWidth(3);
 
216
    p->setPen(pen);
 
217
 
 
218
    p->drawLine( 0, 6, -3, 9 );
 
219
    p->drawLine( 0, 6,  3, 9 );
 
220
}
 
221
 
 
222
#include "moc_potentiometer.cpp"
 
223
 
 
224