/***************************************************************************
 *   Copyright (C) 2020 by Santiago González                               *
 *                                                                         *
 ***( see copyright.txt file at root folder )*******************************/

#include <QPainter>
#include <QtMath>

#include "thermistor.h"
#include "itemlibrary.h"
#include "resistor.h"

#include "intprop.h"
#include "propdialog.h"

#define tr(str) simulideTr("Thermistor",str)

Component* Thermistor::construct( QString type, QString id )
{ return new Thermistor( type, id );  }

LibraryItem* Thermistor::libraryItem()
{
    return new LibraryItem(
        tr("Thermistor"),
        "Resistive Sensors",
        "thermistor.png",
        "Thermistor",
        Thermistor::construct); 
}

Thermistor::Thermistor( QString type, QString id )
          : ThermistorBase( type, id  )
{
    m_bVal = 3455; 
    m_r25  = 10000; 

    addPropGroup( { tr("Parameters"), {
        new IntProp<Thermistor>("B", "B",""
                               , this, &Thermistor::bVal, &Thermistor::setBval,0,"uint" ),

        new IntProp<Thermistor>("R25", "R25","Ω"
                               , this, &Thermistor::r25, &Thermistor::setR25, 0,"uint" )
    }, 0} ); 
    addPropGroup( { tr("Dial"), Dialed::dialProps(), groupNoCopy } ); 
}
Thermistor::~Thermistor(){}

void Thermistor::updateStep()
{
    if( !m_needUpdate ) return; 
    m_needUpdate = false; 

    double t0 = 25+273.15;       // Temp in Kelvin
    double t = m_value+273.15; 
    double e = 2.7182; 
    //double k = t*t0/(t-t0); 
    //double res = m_r25/pow( e, m_bVal/k ); 
    double k = (t0-t)/(t*t0); 
    double res = m_r25*qPow( e, m_bVal*k ); 
    eResistor::setResistance( res ); 
    if( m_propDialog ) m_propDialog->updtValues(); 
    else setValLabelText( getPropStr( showProp() ) ); 
}

void Thermistor::setBval( int bval )
{
    m_bVal = bval; 
    m_needUpdate = true; 
}

void Thermistor::setR25( int r25 )
{
    m_r25 = r25; 
    m_needUpdate = true; 
}

void Thermistor::paint( QPainter* p, const QStyleOptionGraphicsItem* o, QWidget* w )
{
    if( m_hidden ) return; 

    Component::paint( p, o, w ); 

    if( m_ansiSymbol ) Resistor::drawAnsi( p, 0, 0 ); 
    else               p->drawRect( QRectF(-11,-4.5, 22, 9 )); 
    
    p->drawLine(-8, 6,  6,-8 ); 
    p->drawLine( 6,-8, 10,-8 ); 

    Component::paintSelected( p ); 
}
