/**
 * @file hei_main.hpp
 *
 * These are the primary APIs for Hardware Error Isolation (aka the isolator).
 * The intended flow is to:
 *
 *  - Call initialize() for each necessary Chip Data File.
 *
 *  - Call isolate() for each chip that needs error isolation.
 *
 *  - Once isolation is no longer needed, call uninitialize() to free up
 *    resources used for isolation.
 *
 * Note that initialize() allocates many objects used for isolation and keeps
 * them in memory. Its purpose is to avoid initializing the objects each time
 * isolation is required. The data provided by the Chip Data Files is static.
 * So reinitializing would be a waste of time, unless for some reason the Chip
 * Data Files themselves are updated, which would require reinitialization
 * anyway. Of course, leaving the object in memory chews up resources. So, some
 * users may need to weigh performance vs. memory usage.
 */

#pragma once

#include <hei_includes.hpp>
#include <hei_isolation_data.hpp>
#include <isolator/hei_isolator.hpp>

namespace libhei
{

/**
 * @brief Initializes all isolation objects based on data from the given Chip
 *        Data File.
 *
 * This function only takes one Chip Data File at a time. Therefore, the
 * user application must call this function for each Chip Data File required
 * for isolation.
 *
 * Storage and management of the Chip Data Files will vary per user application.
 * Therefore, the user application is responsible for loading the Chip Data
 * Files into memory as needed, and providing the location and size of the data.
 *
 * Once this function returns, the Chip Data File is no longer needed in memory.
 *
 * Details of the Chip Data File format can be found in CHIP_DATA.md.
 *
 * @param i_buffer     A pointer to the buffer containing a single Chip
 *                     Data File.
 *
 * @param i_bufferSize The size (in bytes) of the target Chip Data File.
 *
 * @param i_forceInit  It is possible the user application could call this
 *                     function for a chip type that has already been
 *                     initialized. This is useful if for some reason the Chip
 *                     Data File for a specific chip type has been updated. If
 *                     this function is called and a chip type has already been
 *                     initialized:
 *                      - false (default), the function will return
 *                        RC_CDF_INITIALIZED and exit.
 *                      - true, the function will delete the previous isolation
 *                        objects for this chip type and reinitialize.
 *
 * @return RC_SUCCESS or RC_CDF_INVALID or RC_CDF_INITIALIZED
 */
inline ReturnCode initialize( void * i_buffer, size_t i_bufferSize,
                              bool i_forceInit = false )
{
    return Isolator::getSingleton().initialize( i_buffer, i_bufferSize,
                                                i_forceInit );
}

/**
 * @brief Deletes all internal isolation objects that were created by
 *        initialize().
 */
inline void uninitialize()
{
    Isolator::getSingleton().uninitialize();
}

/**
 * @brief Isolates all active hardware errors found on the given chip.
 *
 * This functions requires initialize() to be called with the Chip Data File
 * corresponding to the given chip type.
 *
 * @param o_isoData  This parameter will contain a reference to the target chip
 *                   and its chip type. The rest of the data in the object will
 *                   be flushed and then repopulated with a list of all active
 *                   hardware errors on this chip, the contents of any
 *                   registers associated with the active errors, and any
 *                   other data that can be useful for debug.
 *
 * @return RC_SUCCESS or RC_CHIP_DATA_MISSING
 */
inline ReturnCode isolate( IsolationData & o_isoData )
{
    return Isolator::getSingleton().isolate( o_isoData );
}

} // end namespace libhei

