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

#include "infowidget.h"
#include "mainwindow.h"
#include "mcu.h"

InfoWidget* InfoWidget::m_pSelf = nullptr; 

InfoWidget::InfoWidget( QWidget* parent )
          : QWidget( parent )
{
    setupUi( this ); 
    m_pSelf = this; 

    QFont font( MainWindow::self()->defaultFontName() , 10, QFont::Bold ); 
    double fontScale = MainWindow::self()->fontScale(); 
    font.setPixelSize( 12*fontScale ); 

    simTimeLabel->setFont( font ); 
    simTime->setFont( font ); 
    targetSpeedLabel->setFont( font ); 
    targetSpeed->setFont( font ); 
    realSpeedLabel->setFont( font ); 
    realSpeed->setFont( font ); 
    simLoadLabel->setFont( font ); 
    simLoadVal->setFont( font ); 
    guiLoadLabel->setFont( font ); 
    guiLoadVal->setFont( font ); 
    overLoadLabel->setFont( font ); 
    overLoadVal->setFont( font ); 
    fpsLabel->setFont( font ); 
    fpsVal->setFont( font ); 
    mainMcuLabel->setFont( font ); 
    mainMcu->setFont( font ); 
    mainMcuName->setFont( font ); 

    overLoadVal->setVisible( false ); 
}

void InfoWidget::setTargetSpeed( double s )
{
    QString speed = QString::number( s,'f', 2 )+" %"; 
    if( s < 100 ) speed = "0"+speed; 
    if( s < 10 )  speed = "0"+speed; 
    targetSpeed->setText("  "+speed ); 
    updtMcu(); 
}

void InfoWidget::updtMcu()
{
    if( Mcu::self() )
    {
        QString device = Mcu::self()->device(); 
        QString freq = QString::number( eMcu::self()->freq()*1e-6 ); 
        mainMcu->setText( "  "+device+" at "+freq+" MHz" ); 

        QString name; 
        Mcu* mcu = Mcu::self(); 
        if( mcu->isMainComp() && mcu->parentItem() )
        {
            Component* comp = static_cast<Component*>( mcu->parentItem() ); 
            name = comp->idLabel(); 
        }
        else name = mcu->idLabel(); 
        mainMcuName->setText( "  "+name ); 
    }else{
        mainMcu->setText( "  ---" ); 
        mainMcuName->setText( "  ---" ); 
    }
    mainMcuLabel->setVisible( Mcu::self() ); 
    mainMcu->setVisible( Mcu::self() ); 
    mainMcuName->setVisible( Mcu::self() ); 
}

void InfoWidget::setRate( double rate, double simLoad, double guiLoad, int fps )
{
    updtMcu(); 
    if( rate < 0 )
    {
        if( rate == -1 ) realSpeed->setText( "  "+tr("Speed: Debugger") ); 
        else             realSpeed->setText( "  "+tr("Circuit ERROR!!!") ); 
    }else{
        //if( (load > 150) || (load < 0) ) load = 0; 
        double speed = rate/100; 
        QString Srate = QString::number( speed,'f', 2 ); 
        while( Srate.size() < 6 ) Srate = "0"+Srate; 

        if( simLoad > 101 )
        {
            int overLoad = simLoad-100; 
            simLoad = 100; 

            QString Oload = QString::number( overLoad,'f', 2 ); 
            while( Oload.size() < 6 ) Oload = "0"+Oload; 

            overLoadVal->setText( "  "+Oload+" %    "); 
            overLoadLabel->setVisible( true ); 
            overLoadVal->setVisible( true ); 
        }else{
            overLoadLabel->setVisible( false ); 
            overLoadVal->setVisible( false ); 
        }
        QString Sload = QString::number( simLoad,'f', 2 ); 
        while( Sload.size() < 6 ) Sload = "0"+Sload; 

        QString Gload = QString::number( guiLoad,'f', 2 ); 
        while( Gload.size() < 6 ) Gload = "0"+Gload; 

        QString FPS = QString::number( fps ); 

        realSpeed->setText( "  "+Srate+" %" ); 
        simLoadVal->setText( "  "+Sload+" %    "); 
        guiLoadVal->setText( "  "+Gload+" %    "); 
        fpsVal->setText( "  "+FPS ); 
}   }

void InfoWidget::setCircTime( uint64_t tStep )
{
    double step = tStep/1e6; 
    int hours = step/3600e6; 
    step -= hours*3600e6; 
    int mins  = step/60e6; 
    step -= mins*60e6; 
    int secs  = step/1e6; 
    step -= secs*1e6; 
    int mSecs = step/1e3; 
    step -= mSecs*1e3; 
    int uSecs = step; 
    step -= uSecs; 
    int nSecs = step*1e3; 
    step -= nSecs/1e3; 
    step += 1e-7; 
    int pSecs = step*1e6; 

    QString strH = QString::number( hours ); 
    if( strH.length() < 2 ) strH = "0"+strH; 
    QString strM = QString::number( mins ); 
    if( strM.length() < 2 ) strM = "0"+strM; 
    QString strS = QString::number( secs ); 
    if( strS.length() < 2 ) strS = "0"+strS; 
    QString strMS = QString::number( mSecs ); 
    while( strMS.length() < 3 ) strMS = "0"+strMS; 
    QString strUS = QString::number( uSecs ); 
    while( strUS.length() < 3 ) strUS = "0"+strUS; 
    QString strNS = QString::number( nSecs ); 
    while( strNS.length() < 3 ) strNS = "0"+strNS; 
    QString strPS = QString::number( pSecs ); 
    while( strPS.length() < 3 ) strPS = "0"+strPS; 

    simTime->setText( strH+":"+strM+":"+strS+" s  "
                     +strMS+" ms  "+strUS+" µs  "+strNS+" ns  "+strPS+" ps " ); 
}
