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

#pragma once

#include "mcucomparator.h"

class PicComp : public McuComp
{
    public:
        PicComp( eMcu* mcu, QString name );
        ~PicComp();

        virtual void setup() override;

        virtual void initialize() override;
        virtual void voltChanged() override;

 static PicComp* createComparator( eMcu* mcu, QString name, int type );

    protected:
        void connect( McuPin* pinN, McuPin* pinP=nullptr, McuPin* pinOut=nullptr );

        bool m_inv;

        regBits_t m_COUT;
        regBits_t m_CINV;
};

class PicComp0 : public PicComp
{
    public:
        PicComp0( eMcu* mcu, QString name );
        ~PicComp0();

        virtual void setup() override;

        virtual void configureA( uint8_t newCMCON ) override;

    protected:
        bool m_cis;

        regBits_t m_CM;
        regBits_t m_CIS;
};

class PicComp01 : public PicComp0
{
    public:
        PicComp01( eMcu* mcu, QString name );
        ~PicComp01();

        virtual void setup() override;

    protected:
        virtual void setMode( uint8_t mode ) override;
};

class PicComp02 : public PicComp0
{
    public:
        PicComp02( eMcu* mcu, QString name );
        ~PicComp02();

        virtual void setup() override;

    protected:
        virtual void setMode( uint8_t mode ) override;
};

class PicComp03 : public PicComp0
{
    public:
        PicComp03( eMcu* mcu, QString name );
        ~PicComp03();

        virtual void setup() override;

    protected:
        virtual void setMode( uint8_t mode ) override;
};


class PicComp1 : public PicComp
{
    public:
        PicComp1( eMcu* mcu, QString name );
        ~PicComp1();

        virtual void setup() override;

        virtual void configureA( uint8_t newCMxCON0 ) override;

    protected:
        regBits_t m_CxON;
        regBits_t m_CxOE;
        regBits_t m_CxR;
        regBits_t m_CxCH;
};

class PicComp11 : public PicComp1
{
    public:
        PicComp11( eMcu* mcu, QString name );
        ~PicComp11();

        virtual void configureC( uint8_t newSRCON ) override;

    protected:
};

class PicComp12 : public PicComp1
{
    public:
        PicComp12( eMcu* mcu, QString name );
        ~PicComp12();

        virtual void configureB( uint8_t newCM2CON1 ) override;
        virtual void configureC( uint8_t newSRCON ) override;

    protected:
};

class PicComp20 : public PicComp
{
    public:
        PicComp20( eMcu* mcu, QString name );
        ~PicComp20();

        virtual void configureA( uint8_t newCMxCON0 ) override;
        virtual void configureB( uint8_t newCMxCON1 ) override;

    protected:
};
