////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 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  camxfdconfig.cpp
/// @brief Auto-generated Chromatix parameter file
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include "camxfdconfig.h"
#include "parametersetmanager.h"

CAMXFDCONFIG_NAMESPACE_BEGIN

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// SetValue/GetValue Functions
/// Gets or sets the requested value
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief Read enum value
/// @param entry [in] Symbol table entry
/// @param enumValue [out] Enum value to read
/// @param alignment [in] Symbol table byte alignment
/// @return true if successful
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool ReadEnum_FDFaceSizeType(
    ParameterFileSymbolTableEntry* const entry,
    FDFaceSizeType& enumValue,
    BYTE const alignment)
{
    bool result {false};

    UINT32 uintValue {entry->ReadEnum(&result, alignment)};

    if (result)
    {
        switch (uintValue)
        {
        case static_cast<UINT32>(FDFaceSizeType::FDFaceAdjFixed):
            enumValue = FDFaceSizeType::FDFaceAdjFixed;
            result    = true;
            break;
        case static_cast<UINT32>(FDFaceSizeType::FDFaceAdjFloating):
            enumValue = FDFaceSizeType::FDFaceAdjFloating;
            result    = true;
            break;
        default:
            PARAMETER_LOG_ERROR(entry->SetManager, "Invalid value(% u) converting UINT32 to FDFaceSizeType", uintValue);
            break;
        }
    }
    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief Read enum value
/// @param entry [in] Symbol table entry
/// @param enumValue [out] Enum value to read
/// @param alignment [in] Symbol table byte alignment
/// @return true if successful
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool ReadEnum_FDSearchAngle(
    ParameterFileSymbolTableEntry* const entry,
    FDSearchAngle& enumValue,
    BYTE const alignment)
{
    bool result {false};

    UINT32 uintValue {entry->ReadEnum(&result, alignment)};

    if (result)
    {
        switch (uintValue)
        {
        case static_cast<UINT32>(FDSearchAngle::FDAngleNone):
            enumValue = FDSearchAngle::FDAngleNone;
            result    = true;
            break;
        case static_cast<UINT32>(FDSearchAngle::FDAngle15):
            enumValue = FDSearchAngle::FDAngle15;
            result    = true;
            break;
        case static_cast<UINT32>(FDSearchAngle::FDAngle45):
            enumValue = FDSearchAngle::FDAngle45;
            result    = true;
            break;
        case static_cast<UINT32>(FDSearchAngle::FDAngle75):
            enumValue = FDSearchAngle::FDAngle75;
            result    = true;
            break;
        case static_cast<UINT32>(FDSearchAngle::FDAngle105):
            enumValue = FDSearchAngle::FDAngle105;
            result    = true;
            break;
        case static_cast<UINT32>(FDSearchAngle::FDAngle135):
            enumValue = FDSearchAngle::FDAngle135;
            result    = true;
            break;
        case static_cast<UINT32>(FDSearchAngle::FDAngleAll):
            enumValue = FDSearchAngle::FDAngleAll;
            result    = true;
            break;
        default:
            PARAMETER_LOG_ERROR(entry->SetManager, "Invalid value(% u) converting UINT32 to FDSearchAngle", uintValue);
            break;
        }
    }
    return result;
}


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Default Constructor
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
FaceDetectionCtrlTypeClass::FaceDetectionCtrlTypeClass(
    const CHAR* const name)
    : ParameterModule(name, MAJOR, MINOR, PATCH, nullptr)
{
    PARAMETER_INITIALIZE(SymbolTableID);
    PARAMETER_INITIALIZE(module_version);
    PARAMETER_INITIALIZE(maxNumberOfFaces);
    PARAMETER_INITIALIZE(maxFPSWithFaces);
    PARAMETER_INITIALIZE(maxFPSWithNoFaces);
    PARAMETER_INITIALIZE(multiCameraMaxFPSWithFaces);
    PARAMETER_INITIALIZE(multiCameraMaxFPSWithNoFaces);
    PARAMETER_INITIALIZE(initialNoFrameSkipCount);
    PARAMETER_INITIALIZE(maxPendingFrames);
    PARAMETER_INITIALIZE(areaRatioThreshold);
    PARAMETER_INITIALIZE(delayCount);
    PARAMETER_INITIALIZE(holdCount);
    PARAMETER_INITIALIZE(supportRectROI);
    PARAMETER_INITIALIZE(hwConfig);
    PARAMETER_INITIALIZE(dlConfig);
    PARAMETER_INITIALIZE(managerConfig);
    PARAMETER_INITIALIZE(swPreprocess);
    PARAMETER_INITIALIZE(facialAttrConfig);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Constructor
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
FaceDetectionCtrlTypeClass::FaceDetectionCtrlTypeClass(
    const CHAR* const name,
    ModuleData* const moduleData)
    : ParameterModule(name, MAJOR, MINOR, PATCH, moduleData)
{
    PARAMETER_INITIALIZE(SymbolTableID);
    PARAMETER_INITIALIZE(module_version);
    PARAMETER_INITIALIZE(maxNumberOfFaces);
    PARAMETER_INITIALIZE(maxFPSWithFaces);
    PARAMETER_INITIALIZE(maxFPSWithNoFaces);
    PARAMETER_INITIALIZE(multiCameraMaxFPSWithFaces);
    PARAMETER_INITIALIZE(multiCameraMaxFPSWithNoFaces);
    PARAMETER_INITIALIZE(initialNoFrameSkipCount);
    PARAMETER_INITIALIZE(maxPendingFrames);
    PARAMETER_INITIALIZE(areaRatioThreshold);
    PARAMETER_INITIALIZE(delayCount);
    PARAMETER_INITIALIZE(holdCount);
    PARAMETER_INITIALIZE(supportRectROI);
    PARAMETER_INITIALIZE(hwConfig);
    PARAMETER_INITIALIZE(dlConfig);
    PARAMETER_INITIALIZE(managerConfig);
    PARAMETER_INITIALIZE(swPreprocess);
    PARAMETER_INITIALIZE(facialAttrConfig);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Destructor
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
FaceDetectionCtrlTypeClass::~FaceDetectionCtrlTypeClass()
{
    if (Loaded)
    {
        UnloadModule();
    }
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// GetName
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const CHAR* FaceDetectionCtrlTypeClass::GetName(
    const CHAR* const type)
{
    const CHAR* name = type;
    CHAR temp[ParameterFileSymbolTableEntry::TYPE_LEN + 1];
    if (PARAMETER_STRCMP(type, ModuleData::GetType(temp, "fdconfigdata")) == 0)
    {
        name = "fdconfigdata";
    }
    return name;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load FDFacialAttributeConfig
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool FDFacialAttributeConfig::Load(
    ParameterFileSymbolTableEntry* const entry,
    BYTE const alignment)
{
    bool result = true;

    PARAMETER_INITIALIZE(CTDMaxNumberOfFacesSingleCamera);
    PARAMETER_INITIALIZE(CTDMaxNumberOfFacesMultiCamera);
    PARAMETER_INITIALIZE(CTDLMinFaceSize);
    PARAMETER_INITIALIZE(CTDLYawAngleCutoff);
    PARAMETER_INITIALIZE(bFDStabilizationOverride);

    SYMBOL_TABLE_ENTRY_READ(entry, result, CTDMaxNumberOfFacesSingleCamera, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, CTDMaxNumberOfFacesMultiCamera, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, CTDLMinFaceSize, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, CTDLYawAngleCutoff, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, bFDStabilizationOverride, alignment)

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load FDSWPreprocessConfig
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool FDSWPreprocessConfig::Load(
    ParameterFileSymbolTableEntry* const entry,
    BYTE const alignment)
{
    bool result = true;

    PARAMETER_INITIALIZE(exposureShortBySafeThreshold);
    PARAMETER_INITIALIZE(deltaEVFromTargetThreshold);

    SYMBOL_TABLE_ENTRY_READ(entry, result, exposureShortBySafeThreshold, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, deltaEVFromTargetThreshold, alignment)

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load FDROIManagerConfig
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool FDROIManagerConfig::Load(
    ParameterFileSymbolTableEntry* const entry,
    BYTE const alignment)
{
    bool result = true;

    PARAMETER_INITIALIZE(enable);
    PARAMETER_INITIALIZE(newNormalFaceConfidence);
    PARAMETER_INITIALIZE(existingFaceConfidence);
    PARAMETER_INITIALIZE(angleDiffForStrictConfidence);
    PARAMETER_INITIALIZE(strictNewNormalFaceConfidence);
    PARAMETER_INITIALIZE(strictExistingFaceConfidence);
    PARAMETER_INITIALIZE(faceLinkMoveDistanceRatio);
    PARAMETER_INITIALIZE(faceLinkMinSizeRatio);
    PARAMETER_INITIALIZE(faceLinkMaxSizeRatio);
    PARAMETER_INITIALIZE(faceLinkRollAngleDifference);
    PARAMETER_INITIALIZE(smallNewNormalFaceConfidence);
    PARAMETER_INITIALIZE(smallExistingFaceConfidence);
    PARAMETER_INITIALIZE(smallFaceSizeCutoff);
    PARAMETER_INITIALIZE(yawNewNormalFaceConfidence);
    PARAMETER_INITIALIZE(yawExistingFaceConfidence);
    PARAMETER_INITIALIZE(fullHistoryLength);
    PARAMETER_INITIALIZE(positionRecentHistoryLength);
    PARAMETER_INITIALIZE(positionMotionThreshold);
    PARAMETER_INITIALIZE(positionStillThreshold);
    PARAMETER_INITIALIZE(sizeRecentHistoryLength);
    PARAMETER_INITIALIZE(sizeMotionThreshold);
    PARAMETER_INITIALIZE(sizeStillThreshold);
    PARAMETER_INITIALIZE(noFaceFDFPSScale);
    PARAMETER_INITIALIZE(stillFaceFDFPSScale);
    PARAMETER_INITIALIZE(movingFaceMinFDFPSScale);
    PARAMETER_INITIALIZE(movingFaceMaxFDFPSScale);
    PARAMETER_INITIALIZE(stillFaceFDFPSThreshold);
    PARAMETER_INITIALIZE(movingFaceMaxFDFPSThreshold);
    PARAMETER_INITIALIZE(waitCountForFPSSwitching);
    PARAMETER_INITIALIZE(newMaskConfidence);
    PARAMETER_INITIALIZE(trackingMaskConfidence);
    PARAMETER_INITIALIZE(maskHoldCount);
    PARAMETER_INITIALIZE(maskDelayCount);
    PARAMETER_INITIALIZE(maskPositionRecentHistoryLength);
    PARAMETER_INITIALIZE(maskPositionMotionThreshold);
    PARAMETER_INITIALIZE(maskPositionStillThreshold);
    PARAMETER_INITIALIZE(maskSizeRecentHistoryLength);
    PARAMETER_INITIALIZE(maskSizeMotionThreshold);
    PARAMETER_INITIALIZE(maskSizeStillThreshold);
    PARAMETER_INITIALIZE(sparseLMRecentHistoryLength);
    PARAMETER_INITIALIZE(sparseLMMotionThreshold);
    PARAMETER_INITIALIZE(sparseLMStillThreshold);
    PARAMETER_INITIALIZE(newHeadConfidence);
    PARAMETER_INITIALIZE(trackingHeadConfidence);
    PARAMETER_INITIALIZE(headHoldCount);
    PARAMETER_INITIALIZE(headDelayCount);
    PARAMETER_INITIALIZE(headPositionRecentHistoryLength);
    PARAMETER_INITIALIZE(headPositionMotionThreshold);
    PARAMETER_INITIALIZE(headPositionStillThreshold);
    PARAMETER_INITIALIZE(headSizeRecentHistoryLength);
    PARAMETER_INITIALIZE(headSizeMotionThreshold);
    PARAMETER_INITIALIZE(headSizeStillThreshold);
    PARAMETER_INITIALIZE(newBodyConfidence);
    PARAMETER_INITIALIZE(trackingBodyConfidence);
    PARAMETER_INITIALIZE(bodyHoldCount);
    PARAMETER_INITIALIZE(bodyDelayCount);
    PARAMETER_INITIALIZE(bodyPositionRecentHistoryLength);
    PARAMETER_INITIALIZE(bodyPositionMotionThreshold);
    PARAMETER_INITIALIZE(bodyPositionStillThreshold);
    PARAMETER_INITIALIZE(bodySizeRecentHistoryLength);
    PARAMETER_INITIALIZE(bodySizeMotionThreshold);
    PARAMETER_INITIALIZE(bodySizeStillThreshold);

    SYMBOL_TABLE_ENTRY_READ(entry, result, enable, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, newNormalFaceConfidence, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, existingFaceConfidence, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, angleDiffForStrictConfidence, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, strictNewNormalFaceConfidence, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, strictExistingFaceConfidence, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, faceLinkMoveDistanceRatio, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, faceLinkMinSizeRatio, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, faceLinkMaxSizeRatio, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, faceLinkRollAngleDifference, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, smallNewNormalFaceConfidence, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, smallExistingFaceConfidence, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, smallFaceSizeCutoff, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, yawNewNormalFaceConfidence, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, yawExistingFaceConfidence, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, fullHistoryLength, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, positionRecentHistoryLength, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, positionMotionThreshold, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, positionStillThreshold, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, sizeRecentHistoryLength, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, sizeMotionThreshold, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, sizeStillThreshold, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, noFaceFDFPSScale, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, stillFaceFDFPSScale, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, movingFaceMinFDFPSScale, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, movingFaceMaxFDFPSScale, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, stillFaceFDFPSThreshold, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, movingFaceMaxFDFPSThreshold, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, waitCountForFPSSwitching, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, newMaskConfidence, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, trackingMaskConfidence, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, maskHoldCount, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, maskDelayCount, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, maskPositionRecentHistoryLength, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, maskPositionMotionThreshold, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, maskPositionStillThreshold, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, maskSizeRecentHistoryLength, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, maskSizeMotionThreshold, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, maskSizeStillThreshold, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, sparseLMRecentHistoryLength, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, sparseLMMotionThreshold, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, sparseLMStillThreshold, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, newHeadConfidence, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, trackingHeadConfidence, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, headHoldCount, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, headDelayCount, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, headPositionRecentHistoryLength, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, headPositionMotionThreshold, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, headPositionStillThreshold, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, headSizeRecentHistoryLength, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, headSizeMotionThreshold, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, headSizeStillThreshold, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, newBodyConfidence, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, trackingBodyConfidence, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, bodyHoldCount, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, bodyDelayCount, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, bodyPositionRecentHistoryLength, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, bodyPositionMotionThreshold, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, bodyPositionStillThreshold, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, bodySizeRecentHistoryLength, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, bodySizeMotionThreshold, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, bodySizeStillThreshold, alignment)

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load FDFaceSize
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool FDFaceSize::Load(
    ParameterFileSymbolTableEntry* const entry,
    BYTE const alignment)
{
    bool result = true;

    PARAMETER_INITIALIZE(type);
    PARAMETER_INITIALIZE(value);

    result = camxfdconfig::ReadEnum_FDFaceSizeType(entry, type, alignment);
    if (result)
    {
        result = value.Load(entry, alignment);
    }

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load FDFaceSize_valueStruct
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool FDFaceSize::valueStruct::Load(
    ParameterFileSymbolTableEntry* const entry,
    BYTE const alignment)
{
    bool result = true;

    PARAMETER_INITIALIZE(size);
    PARAMETER_INITIALIZE(ratio);

    SYMBOL_TABLE_ENTRY_READ(entry, result, size, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, ratio, alignment)

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load FDDlConfig
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool FDDlConfig::Load(
    ParameterFileSymbolTableEntry* const entry,
    BYTE const alignment)
{
    bool result = true;

    PARAMETER_INITIALIZE(enable);
    PARAMETER_INITIALIZE(version);
    PARAMETER_INITIALIZE(minFaceSize);
    PARAMETER_INITIALIZE(maxFaceSize);

    SYMBOL_TABLE_ENTRY_READ(entry, result, enable, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, version, alignment)
    if (result)
    {
        result = minFaceSize.Load(entry, alignment);
    }
    if (result)
    {
        result = maxFaceSize.Load(entry, alignment);
    }

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load FDHwConfig
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool FDHwConfig::Load(
    ParameterFileSymbolTableEntry* const entry,
    BYTE const alignment)
{
    bool result = true;

    PARAMETER_INITIALIZE(enable);
    PARAMETER_INITIALIZE(minFaceSize);
    PARAMETER_INITIALIZE(maxFaceSize);
    PARAMETER_INITIALIZE(enableUpFrontAngles);
    PARAMETER_INITIALIZE(angle);
    PARAMETER_INITIALIZE(upFrontAngle);
    PARAMETER_INITIALIZE(threshold);
    PARAMETER_INITIALIZE(noFaceFrameSkip);
    PARAMETER_INITIALIZE(newFaceFrameSkip);
    PARAMETER_INITIALIZE(enableHWFP);

    SYMBOL_TABLE_ENTRY_READ(entry, result, enable, alignment)
    if (result)
    {
        result = minFaceSize.Load(entry, alignment);
    }
    if (result)
    {
        result = maxFaceSize.Load(entry, alignment);
    }
    SYMBOL_TABLE_ENTRY_READ(entry, result, enableUpFrontAngles, alignment)
    if (result)
    {
        result = camxfdconfig::ReadEnum_FDSearchAngle(entry, angle, alignment);
    }
    SYMBOL_TABLE_ENTRY_READ(entry, result, upFrontAngle, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, threshold, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, noFaceFrameSkip, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, newFaceFrameSkip, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, enableHWFP, alignment)

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load FaceDetectionCtrlType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool FaceDetectionCtrlType::Load(
    ParameterFileSymbolTableEntry* const entry,
    BYTE const alignment)
{
    bool result = true;

    PARAMETER_INITIALIZE(module_version);
    PARAMETER_INITIALIZE(maxNumberOfFaces);
    PARAMETER_INITIALIZE(maxFPSWithFaces);
    PARAMETER_INITIALIZE(maxFPSWithNoFaces);
    PARAMETER_INITIALIZE(multiCameraMaxFPSWithFaces);
    PARAMETER_INITIALIZE(multiCameraMaxFPSWithNoFaces);
    PARAMETER_INITIALIZE(initialNoFrameSkipCount);
    PARAMETER_INITIALIZE(maxPendingFrames);
    PARAMETER_INITIALIZE(areaRatioThreshold);
    PARAMETER_INITIALIZE(delayCount);
    PARAMETER_INITIALIZE(holdCount);
    PARAMETER_INITIALIZE(supportRectROI);
    PARAMETER_INITIALIZE(hwConfig);
    PARAMETER_INITIALIZE(dlConfig);
    PARAMETER_INITIALIZE(managerConfig);
    PARAMETER_INITIALIZE(swPreprocess);
    PARAMETER_INITIALIZE(facialAttrConfig);

    result = module_version.Load(entry, alignment);
    SYMBOL_TABLE_ENTRY_READ(entry, result, maxNumberOfFaces, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, maxFPSWithFaces, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, maxFPSWithNoFaces, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, multiCameraMaxFPSWithFaces, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, multiCameraMaxFPSWithNoFaces, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, initialNoFrameSkipCount, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, maxPendingFrames, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, areaRatioThreshold, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, delayCount, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, holdCount, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, supportRectROI, alignment)
    if (result)
    {
        result = hwConfig.Load(entry, alignment);
    }
    if (result)
    {
        result = dlConfig.Load(entry, alignment);
    }
    if (result)
    {
        result = managerConfig.Load(entry, alignment);
    }
    if (result)
    {
        result = swPreprocess.Load(entry, alignment);
    }
    if (result)
    {
        result = facialAttrConfig.Load(entry, alignment);
    }

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load module_versionStruct
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool FaceDetectionCtrlType::module_versionStruct::Load(
    ParameterFileSymbolTableEntry* const entry,
    BYTE const alignment)
{
    bool result = true;

    PARAMETER_INITIALIZE(major_revision);
    PARAMETER_INITIALIZE(minor_revision);
    PARAMETER_INITIALIZE(incr_revision);

    SYMBOL_TABLE_ENTRY_READ(entry, result, major_revision, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, minor_revision, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, incr_revision, alignment)

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Release the ParameterModule object
/// Requires that this object was created via a ParameterSetManager::GetModule call
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void FaceDetectionCtrlType::Release()
{
    ((FaceDetectionCtrlTypeClass*)this)->Release();
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Returns the ParameterModule::Modified value
/// The Modified value is incremented when the module's data or pointer values change
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
UINT32 FaceDetectionCtrlType::GetModified()
{
    return ((FaceDetectionCtrlTypeClass*)this)->Modified;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Create module, and return a new object
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ParameterModule* FaceDetectionCtrlTypeClass::Create(
    ModuleData*    moduleData,
    DefaultModule* const defModule) const
{
    FaceDetectionCtrlTypeClass* cls = nullptr;

    if (PARAMETER_STRCMP(Type, moduleData->Type) == 0 && Version.Value == moduleData->Version.Value)
    {
        const UINT32 id = moduleData->DuplicateID > 0 ? moduleData->DuplicateID : moduleData->ID;

        ParameterModule* const module = defModule->Find(id);
        if (module != nullptr)
        {
            cls = (FaceDetectionCtrlTypeClass*)module;
        }
        else
        {
            cls = PARAMETER_NEW FaceDetectionCtrlTypeClass(GetName(moduleData->Type), moduleData);
            cls->SymbolTableID = id;
            defModule->AddModule((ParameterModule*)cls);
        }
    }
    else if (Version.Value != moduleData->Version.Value)
    {
        PARAMETER_LOG_ERROR(moduleData->SetManager, "Unable to create FaceDetectionCtrlTypeClass, binary version (%lld) does not match source version (%lld)\n",
            moduleData->Version.Value, Version.Value);
    }
    else
    {
        PARAMETER_LOG_ERROR(moduleData->SetManager, "Unable to create FaceDetectionCtrlTypeClass, binary name (%s) does not match source name (%s)\n",
            moduleData->Type, Type);
    }

    return (ParameterModule*)cls;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load module data, return true is successful
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool FaceDetectionCtrlTypeClass::LoadModule(
    ParameterFileSymbolTable* const table)
{
    bool result = true;

    if (!Loaded)
    {
        BYTE const alignment = table->Alignment;
        FaceDetectionCtrlTypeClass* const cls = this;

        ParameterFileSymbolTableEntry  entryObj;
        ParameterFileSymbolTableEntry* const entry = &entryObj;
        result = table->Find(entryObj, SymbolTableID);

        if (!result)
        {
            PARAMETER_LOG_ERROR(entry->SetManager, "FaceDetectionCtrlTypeClass::LoadModule Failed to find module ID (%d) in Symbol Table\n", SymbolTableID);
        }

        if (result)
        {
            result = cls->Load(entry, alignment);
        }
        Modified++;
        Loaded = true;
    }

    if (!result)
    {
        /// Module failed to fully load, unload it
        UnloadModule();
    }

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload module data
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void FaceDetectionCtrlTypeClass::UnloadModule()
{
    if (Loaded)
    {
        Loaded = false;
    }
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// /// Release the ParameterModule object
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void FaceDetectionCtrlTypeClass::Release()
{
    ParameterModule::Release();
}

CAMXFDCONFIG_NAMESPACE_END
