////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// THIS IS AUTO-GENERATED CODE.  PLEASE DO NOT EDIT (File bug reports against tools).
///
/// Auto-generated by: Parameter Parser V5.5.1 (2411131018)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  imagesensormodulesetmanager.h
/// @brief Auto-generated Chromatix parameter file
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


#include "parametersetmanager.h"
#include "parametermodule.h"
#include "parametertypes.h"
#include "camxactuatordriver.h"
#include "camxeebindriver.h"
#include "camxeepromdriver.h"
#include "camxflashdriver.h"
#include "camxmoduleconfig.h"
#include "camxoisdriver.h"
#include "camxpdafconfig.h"
#include "camxsensordriver.h"
#include "camxsocidbinmap.h"

#ifndef IMAGESENSORMODULESETMANAGER_H
#define IMAGESENSORMODULESETMANAGER_H

#include <iostream>
#include <unordered_map>

class ImageSensorModuleSetManager : public ParameterSetManager
{
public:
    ImageSensorModuleSetManager();
    virtual ~ImageSensorModuleSetManager();

    void AddModule(ParameterModule* const module);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// UpdateBinaryParameters
    ///
    /// @brief Replaces exising parameters with the ones in a buffer. LoadBinaryParameters must be called first
    /// @brief After calling UpdateBinaryParameters, call FreeReplacedParameter to free up any replaced parameter objects
    ///
    /// @param buffer   Binary parameter buffer
    /// @param length   Length of the binary parameter buffer
    ///
    /// @return Node
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    bool UpdateBinaryParameters(
        UINT8* const buffer,
        const SIZE_T length);

    CamX::ActuatorDriverData* GetModule_actuatorDriver(
        const TuningMode* const modeBranch,
        UINT32 const      modeCount,
        CamX::ActuatorDriverData* const release = nullptr);

    CamX::ActuatorDriverData* GetModule_actuatorDriver1(
        const TuningMode* const modeBranch,
        UINT32 const      modeCount,
        CamX::ActuatorDriverData* const release = nullptr);

    CamX::EEbinDriver* GetModule_EEbinDriver(
        const TuningMode* const modeBranch,
        UINT32 const      modeCount,
        CamX::EEbinDriver* const release = nullptr);

    CamX::EEPROMDriverData* GetModule_EEPROMDriverData(
        const TuningMode* const modeBranch,
        UINT32 const      modeCount,
        CamX::EEPROMDriverData* const release = nullptr);

    CamX::FlashDriverData* GetModule_flashDriverData(
        const TuningMode* const modeBranch,
        UINT32 const      modeCount,
        CamX::FlashDriverData* const release = nullptr);

    CamX::FlashDriverData* GetModule_flashDriverDataSecondary(
        const TuningMode* const modeBranch,
        UINT32 const      modeCount,
        CamX::FlashDriverData* const release = nullptr);

    CamX::CameraModuleData* GetModule_cameraModuleData(
        const TuningMode* const modeBranch,
        UINT32 const      modeCount,
        CamX::CameraModuleData* const release = nullptr);

    CamX::OISDriverData* GetModule_OISDriver(
        const TuningMode* const modeBranch,
        UINT32 const      modeCount,
        CamX::OISDriverData* const release = nullptr);

    CamX::PDAFConfigurationData* GetModule_PDConfigData(
        const TuningMode* const modeBranch,
        UINT32 const      modeCount,
        CamX::PDAFConfigurationData* const release = nullptr);

    CamX::SensorDriverData* GetModule_sensorDriverData(
        const TuningMode* const modeBranch,
        UINT32 const      modeCount,
        CamX::SensorDriverData* const release = nullptr);

    CamX::SensorBinSocIdMap* GetModule_sensorBinSocIdMap(
        const TuningMode* const modeBranch,
        UINT32 const      modeCount,
        CamX::SensorBinSocIdMap* const release = nullptr);

protected:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// GetDefaultModule
    ///
    /// @brief  Returns the default module for the given type
    ///
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual DefaultModule* GetDefaultModule(
        char* const type)
    {
        ParameterMutexLock rlock {ReloadMutex, true, true}; // Shared LOCK

        if (DefaultModuleMap.find(type) != DefaultModuleMap.end())
        {
            return DefaultModuleMap[type];
        }
        else
        {
            PARAMETER_LOG_ERROR(this, "Failed to find module %s in DefaultModuleMap\n", type);
            return nullptr;
        }
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// SaveAndClearModules
    ///
    /// @brief  Saves all current modules to the m_replaced list, and clears the module list
    ///
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual void SaveAndClearModules();
};

#endif
