
#include <isolator/hei_isolator.hpp>
#include <isolator/hei_isolation_node.hpp>
#include <register/hei_hardware_register.hpp>
#include <util/hei_flyweight.hpp>

// BEGIN temporary code
#include <register/hei_scom_register.hpp>
// END temporary code

namespace libhei
{

ReturnCode Isolator::initialize( void * i_buffer, size_t i_bufferSize,
                                 bool i_forceInit )
{
    ReturnCode rc;

    // BEGIN temporary code
    HEI_INF( "Isolator::initialize(%p,%lu,%d)", i_buffer, i_bufferSize,
             i_forceInit );

    Flyweight<ScomRegister>   & sfw = Flyweight<ScomRegister>::getSingleton();
    Flyweight<IdScomRegister> & ifw = Flyweight<IdScomRegister>::getSingleton();

    sfw.get( ScomRegister { CHIP_TYPE_INVALID, REG_ID_INVALID,
                            REG_INST_DEFAULT, REG_ACCESS_RW, 0x01234567 } );
    sfw.get( ScomRegister { CHIP_TYPE_INVALID, REG_ID_INVALID,
                            REG_INST_DEFAULT, REG_ACCESS_RW, 0x00112233 } );

    ifw.get( IdScomRegister { CHIP_TYPE_INVALID, REG_ID_INVALID,
                              REG_INST_DEFAULT, REG_ACCESS_RW,
                              0x0123456789abcdef } );
    ifw.get( IdScomRegister { CHIP_TYPE_INVALID, REG_ID_INVALID,
                              REG_INST_DEFAULT, REG_ACCESS_RW,
                              0x0011223344556677 } );
    // END temporary code

    return rc;
}

void Isolator::uninitialize()
{
    // Remove all of the IsolationNode objects stored in the flyweights. This
    // must be done before removing the HardwareRegister objects
    Flyweight<IsolationNode>::getSingleton().clear();

    // Must flush the hardware register cache before deleting any
    // HardwareRegister objects.
    HardwareRegister::flushAll();

    // Remove all of the HardwareRegister objects stored in the flyweights.
    Flyweight<ScomRegister>::getSingleton().clear();
    Flyweight<IdScomRegister>::getSingleton().clear();
}

ReturnCode Isolator::isolate( const std::vector<Chip> & i_chipList,
                              IsolationData & o_isoData ) const
{
    ReturnCode rc;

    // Flush the isolation data to ensure a clean slate.
    o_isoData.flush();

    // Flush the hardware register cache to avoid using stale data.
    HardwareRegister::flushAll();

    // Analyze active error on each chip.
    for ( auto const & chip : i_chipList )
    {
        // BEGIN temporary code
        HEI_INF( "Isolator::isolate(%p,%u)", chip.getChip(),
                 chip.getType() );
        // END temporary code
    }

    return rc;
}

} // end namespace libhei
