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

#include "aecxglobalelements.h"
#include "parametersetmanager.h"

AECXGLOBALELEMENTS_NAMESPACE_BEGIN

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// SetValue/GetValue Functions
/// Gets or sets the requested value
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool StartEndType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "start") == 0)
    {
        ParameterUtils::DoubleToString((double)start, __value, __size);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "end") == 0)
    {
        ParameterUtils::DoubleToString((double)end, __value, __size);
        __result = true;
    }

    return __result;
}

bool StartEndType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "start") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            start = (float)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "end") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            end = (float)dblValue; 
        }
    }

    return __result;
}

bool StartEndType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // start
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("start", ParameterParserDataType::Float, (double)start));
    }
    else if (PARAMETER_STRCMP(__name, "start") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Float, (double)start));
    }

    // end
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("end", ParameterParserDataType::Float, (double)end));
    }
    else if (PARAMETER_STRCMP(__name, "end") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Float, (double)end));
    }

    return __result;
}

bool triggerPointType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "start") == 0)
    {
        ParameterUtils::DoubleToString((double)start, __value, __size);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "end") == 0)
    {
        ParameterUtils::DoubleToString((double)end, __value, __size);
        __result = true;
    }

    return __result;
}

bool triggerPointType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "start") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            start = (float)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "end") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            end = (float)dblValue; 
        }
    }

    return __result;
}

bool triggerPointType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // start
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("start", ParameterParserDataType::Float, (double)start));
    }
    else if (PARAMETER_STRCMP(__name, "start") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Float, (double)start));
    }

    // end
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("end", ParameterParserDataType::Float, (double)end));
    }
    else if (PARAMETER_STRCMP(__name, "end") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Float, (double)end));
    }

    return __result;
}

bool aecFloatDataType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "data") == 0)
    {
        ParameterUtils::DoubleToString((double)data, __value, __size);
        __result = true;
    }

    return __result;
}

bool aecFloatDataType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "data") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            data = (float)dblValue; 
        }
    }

    return __result;
}

bool aecFloatDataType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // data
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("data", ParameterParserDataType::Float, (double)data));
    }
    else if (PARAMETER_STRCMP(__name, "data") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Float, (double)data));
    }

    return __result;
}

bool aecTriggerDataFloatType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "triggerPt") == 0)
    {
        __result = triggerPt.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "triggerData") == 0)
    {
        __result = triggerData.GetValue(&__path[__pos], __value, __size);
    }

    return __result;
}

bool aecTriggerDataFloatType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "triggerPt") == 0)
    {
        __result = triggerPt.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "triggerData") == 0)
    {
        __result = triggerData.SetValue(&__path[__pos], __value);
    }

    return __result;
}

bool aecTriggerDataFloatType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // triggerPt
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("triggerPt", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "triggerPt") == 0)
    {
        __result = triggerPt.GetInfo(&__path[__pos], __info);
    }

    // triggerData
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("triggerData", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "triggerData") == 0)
    {
        __result = triggerData.GetInfo(&__path[__pos], __info);
    }

    return __result;
}

bool ModuleVersionType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "major_revision") == 0)
    {
        ParameterUtils::DoubleToString((double)major_revision, __value, __size, 0);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "minor_revision") == 0)
    {
        ParameterUtils::DoubleToString((double)minor_revision, __value, __size, 0);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "incr_revision") == 0)
    {
        ParameterUtils::DoubleToString((double)incr_revision, __value, __size, 0);
        __result = true;
    }

    return __result;
}

bool ModuleVersionType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "major_revision") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            major_revision = (INT32)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "minor_revision") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            minor_revision = (INT32)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "incr_revision") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            incr_revision = (INT32)dblValue; 
        }
    }

    return __result;
}

bool ModuleVersionType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // major_revision
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("major_revision", ParameterParserDataType::Int32, (double)major_revision, 0));
    }
    else if (PARAMETER_STRCMP(__name, "major_revision") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Int32, (double)major_revision, 0));
    }

    // minor_revision
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("minor_revision", ParameterParserDataType::Int32, (double)minor_revision, 0));
    }
    else if (PARAMETER_STRCMP(__name, "minor_revision") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Int32, (double)minor_revision, 0));
    }

    // incr_revision
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("incr_revision", ParameterParserDataType::Int32, (double)incr_revision, 0));
    }
    else if (PARAMETER_STRCMP(__name, "incr_revision") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Int32, (double)incr_revision, 0));
    }

    return __result;
}

bool ChromatixBankDataPriorityType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "context") == 0)
    {
        if (__index < contextCount)
        {
            ParameterUtils::DoubleToString((double)(UINT32)context[__index], __value, __size, 0);
            __result = true;
        }
        else
        {
            SIZE_T __valuePos = 0;
            for (UINT32 i = 0; i < contextCount; i++)
            {
                if (i > 0)
                {
                    PARAMETER_STRCAT(__value, __size, ",");
                    __valuePos = PARAMETER_STRLEN(__value);
                }
                ParameterUtils::DoubleToString((double)(UINT32)context[i], &__value[__valuePos], (INT32)(__size - __valuePos), 0);
            }
            __result = true;
        }
    }
    else if (PARAMETER_STRCMP(__name, "priority") == 0)
    {
        ParameterUtils::DoubleToString((double)priority, __value, __size, 0);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "dataID") == 0)
    {
        ParameterUtils::DoubleToString((double)dataID, __value, __size, 0);
        __result = true;
    }

    return __result;
}

bool ChromatixBankDataPriorityType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "context") == 0)
    {
        if (__index < contextCount)
        {
            const double dblValue = ParameterUtils::StringToDouble(__value, __result);
            if (__result)
            {
                context[__index] = (AECXChromatixEventType)(UINT32)dblValue; 
            }
        }
        else
        {
            SIZE_T __valueLen = PARAMETER_STRLEN(__value);
            UINT32 __pos = 0;

            __index = 0;
            while (__pos < __valueLen && __index < contextCount)
            {
                CHAR __valueStr[MAX_SIZE];

                __pos += ParameterUtils::GetSubString(&__value[__pos], ',', __valueStr, MAX_SIZE);
                __pos++;

                const double dblValue = ParameterUtils::StringToDouble(__valueStr, __result);
                if (__result)
                {
                    context[__index] = (AECXChromatixEventType)(UINT32)dblValue; 
                }
                __index++;
            }
            __result = true;
        }
    }
    else if (PARAMETER_STRCMP(__name, "priority") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            priority = (INT32)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "dataID") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            dataID = (INT32)dblValue; 
        }
    }

    return __result;
}

bool ChromatixBankDataPriorityType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // context
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("context", ParameterParserDataType::Enum, true, false, contextCount));
    }

    // priority
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("priority", ParameterParserDataType::Int32, (double)priority, 0));
    }
    else if (PARAMETER_STRCMP(__name, "priority") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Int32, (double)priority, 0));
    }

    // dataID
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("dataID", ParameterParserDataType::Int32, (double)dataID, 0));
    }
    else if (PARAMETER_STRCMP(__name, "dataID") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Int32, (double)dataID, 0));
    }

    return __result;
}

bool ChromatixBankDataType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "bankID") == 0)
    {
        ParameterUtils::DoubleToString((double)(UINT32)bankID, __value, __size, 0);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "priorityMap") == 0)
    {
        if (__index < priorityMapCount)
        {
            __result = priorityMap[__index].GetValue(&__path[__pos], __value, __size);
        }
    }

    return __result;
}

bool ChromatixBankDataType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "bankID") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            bankID = (AECXBankIDType)(UINT32)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "priorityMap") == 0)
    {
        if (__index < priorityMapCount)
        {
            __result = priorityMap[__index].SetValue(&__path[__pos], __value);
        }
    }

    return __result;
}

bool ChromatixBankDataType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // bankID
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("bankID", ParameterParserDataType::Enum, (double)(UINT32)bankID, 0));
    }
    else if (PARAMETER_STRCMP(__name, "bankID") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Enum, (double)(UINT32)bankID, 0));
    }

    // priorityMap
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("priorityMap", ParameterParserDataType::Structure, true, false, priorityMapCount));
    }
    else if (PARAMETER_STRCMP(__name, "priorityMap") == 0)
    {
        if (__index < priorityMapCount)
        {
            __result = priorityMap[__index].GetInfo(&__path[__pos], __info);
        }
        else
        {
            __result = true;
            __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Structure, true, false, priorityMapCount));
        }
    }

    return __result;
}

bool AECCoreROI::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "leftOffset") == 0)
    {
        ParameterUtils::DoubleToString((double)leftOffset, __value, __size);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "topOffset") == 0)
    {
        ParameterUtils::DoubleToString((double)topOffset, __value, __size);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "width") == 0)
    {
        ParameterUtils::DoubleToString((double)width, __value, __size);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "height") == 0)
    {
        ParameterUtils::DoubleToString((double)height, __value, __size);
        __result = true;
    }

    return __result;
}

bool AECCoreROI::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "leftOffset") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            leftOffset = (float)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "topOffset") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            topOffset = (float)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "width") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            width = (float)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "height") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            height = (float)dblValue; 
        }
    }

    return __result;
}

bool AECCoreROI::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // leftOffset
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("leftOffset", ParameterParserDataType::Float, (double)leftOffset));
    }
    else if (PARAMETER_STRCMP(__name, "leftOffset") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Float, (double)leftOffset));
    }

    // topOffset
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("topOffset", ParameterParserDataType::Float, (double)topOffset));
    }
    else if (PARAMETER_STRCMP(__name, "topOffset") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Float, (double)topOffset));
    }

    // width
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("width", ParameterParserDataType::Float, (double)width));
    }
    else if (PARAMETER_STRCMP(__name, "width") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Float, (double)width));
    }

    // height
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("height", ParameterParserDataType::Float, (double)height));
    }
    else if (PARAMETER_STRCMP(__name, "height") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Float, (double)height));
    }

    return __result;
}

bool DBFloatPayload::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "dataID") == 0)
    {
        ParameterUtils::DoubleToString((double)dataID, __value, __size, 0);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "value") == 0)
    {
        ParameterUtils::DoubleToString((double)value, __value, __size);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "description") == 0)
    {
        PARAMETER_STRCPY(__value, __size, description);
        __result = true;
    }

    return __result;
}

bool DBFloatPayload::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "dataID") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            dataID = (INT32)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "value") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            value = (float)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "description") == 0)
    {
        // Cannot modify strings, risk of memory leaks or corruption
    }

    return __result;
}

bool DBFloatPayload::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // dataID
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("dataID", ParameterParserDataType::Int32, (double)dataID, 0));
    }
    else if (PARAMETER_STRCMP(__name, "dataID") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Int32, (double)dataID, 0));
    }

    // value
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("value", ParameterParserDataType::Float, (double)value));
    }
    else if (PARAMETER_STRCMP(__name, "value") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Float, (double)value));
    }

    // description
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("description", ParameterParserDataType::String, description));
    }
    else if (PARAMETER_STRCMP(__name, "description") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::String, description));
    }

    return __result;
}

bool DBStartEndPayload::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "dataID") == 0)
    {
        ParameterUtils::DoubleToString((double)dataID, __value, __size, 0);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "value") == 0)
    {
        __result = value.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "description") == 0)
    {
        PARAMETER_STRCPY(__value, __size, description);
        __result = true;
    }

    return __result;
}

bool DBStartEndPayload::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "dataID") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            dataID = (INT32)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "value") == 0)
    {
        __result = value.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "description") == 0)
    {
        // Cannot modify strings, risk of memory leaks or corruption
    }

    return __result;
}

bool DBStartEndPayload::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // dataID
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("dataID", ParameterParserDataType::Int32, (double)dataID, 0));
    }
    else if (PARAMETER_STRCMP(__name, "dataID") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Int32, (double)dataID, 0));
    }

    // value
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("value", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "value") == 0)
    {
        __result = value.GetInfo(&__path[__pos], __info);
    }

    // description
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("description", ParameterParserDataType::String, description));
    }
    else if (PARAMETER_STRCMP(__name, "description") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::String, description));
    }

    return __result;
}

bool TriggerDataType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "value") == 0)
    {
        ParameterUtils::DoubleToString((double)value, __value, __size);
        __result = true;
    }

    return __result;
}

bool TriggerDataType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "value") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            value = (float)dblValue; 
        }
    }

    return __result;
}

bool TriggerDataType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // value
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("value", ParameterParserDataType::Float, (double)value));
    }
    else if (PARAMETER_STRCMP(__name, "value") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Float, (double)value));
    }

    return __result;
}

bool TriggerSystemEndLevelType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "triggerData") == 0)
    {
        __result = triggerData.GetValue(&__path[__pos], __value, __size);
    }

    return __result;
}

bool TriggerSystemEndLevelType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "triggerData") == 0)
    {
        __result = triggerData.SetValue(&__path[__pos], __value);
    }

    return __result;
}

bool TriggerSystemEndLevelType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // trigger
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetInfo(&__path[__pos], __info);
    }

    // triggerData
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("triggerData", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "triggerData") == 0)
    {
        __result = triggerData.GetInfo(&__path[__pos], __info);
    }

    return __result;
}

bool OneLevelTriggerSystemType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger1Type") == 0)
    {
        ParameterUtils::DoubleToString((double)(UINT32)trigger1Type, __value, __size, 0);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "trigger1Data") == 0)
    {
        if (__index < trigger1DataCount)
        {
            __result = trigger1Data[__index].GetValue(&__path[__pos], __value, __size);
        }
    }

    return __result;
}

bool OneLevelTriggerSystemType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger1Type") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            trigger1Type = (AECXTriggerType)(UINT32)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "trigger1Data") == 0)
    {
        if (__index < trigger1DataCount)
        {
            __result = trigger1Data[__index].SetValue(&__path[__pos], __value);
        }
    }

    return __result;
}

bool OneLevelTriggerSystemType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // trigger1Type
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger1Type", ParameterParserDataType::Enum, (double)(UINT32)trigger1Type, 0));
    }
    else if (PARAMETER_STRCMP(__name, "trigger1Type") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Enum, (double)(UINT32)trigger1Type, 0));
    }

    // trigger1Data
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger1Data", ParameterParserDataType::Structure, true, false, trigger1DataCount));
    }
    else if (PARAMETER_STRCMP(__name, "trigger1Data") == 0)
    {
        if (__index < trigger1DataCount)
        {
            __result = trigger1Data[__index].GetInfo(&__path[__pos], __info);
        }
        else
        {
            __result = true;
            __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Structure, true, false, trigger1DataCount));
        }
    }

    return __result;
}

bool TwoLevelTriggerSystemLevel1Type::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "trigger2Data") == 0)
    {
        if (__index < trigger2DataCount)
        {
            __result = trigger2Data[__index].GetValue(&__path[__pos], __value, __size);
        }
    }

    return __result;
}

bool TwoLevelTriggerSystemLevel1Type::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "trigger2Data") == 0)
    {
        if (__index < trigger2DataCount)
        {
            __result = trigger2Data[__index].SetValue(&__path[__pos], __value);
        }
    }

    return __result;
}

bool TwoLevelTriggerSystemLevel1Type::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // trigger
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetInfo(&__path[__pos], __info);
    }

    // trigger2Data
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger2Data", ParameterParserDataType::Structure, true, false, trigger2DataCount));
    }
    else if (PARAMETER_STRCMP(__name, "trigger2Data") == 0)
    {
        if (__index < trigger2DataCount)
        {
            __result = trigger2Data[__index].GetInfo(&__path[__pos], __info);
        }
        else
        {
            __result = true;
            __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Structure, true, false, trigger2DataCount));
        }
    }

    return __result;
}

bool TwoLevelTriggerSystemType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger1Type") == 0)
    {
        ParameterUtils::DoubleToString((double)(UINT32)trigger1Type, __value, __size, 0);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "trigger2Type") == 0)
    {
        ParameterUtils::DoubleToString((double)(UINT32)trigger2Type, __value, __size, 0);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "trigger1Data") == 0)
    {
        if (__index < trigger1DataCount)
        {
            __result = trigger1Data[__index].GetValue(&__path[__pos], __value, __size);
        }
    }

    return __result;
}

bool TwoLevelTriggerSystemType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger1Type") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            trigger1Type = (AECXTriggerType)(UINT32)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "trigger2Type") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            trigger2Type = (AECXTriggerType)(UINT32)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "trigger1Data") == 0)
    {
        if (__index < trigger1DataCount)
        {
            __result = trigger1Data[__index].SetValue(&__path[__pos], __value);
        }
    }

    return __result;
}

bool TwoLevelTriggerSystemType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // trigger1Type
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger1Type", ParameterParserDataType::Enum, (double)(UINT32)trigger1Type, 0));
    }
    else if (PARAMETER_STRCMP(__name, "trigger1Type") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Enum, (double)(UINT32)trigger1Type, 0));
    }

    // trigger2Type
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger2Type", ParameterParserDataType::Enum, (double)(UINT32)trigger2Type, 0));
    }
    else if (PARAMETER_STRCMP(__name, "trigger2Type") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Enum, (double)(UINT32)trigger2Type, 0));
    }

    // trigger1Data
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger1Data", ParameterParserDataType::Structure, true, false, trigger1DataCount));
    }
    else if (PARAMETER_STRCMP(__name, "trigger1Data") == 0)
    {
        if (__index < trigger1DataCount)
        {
            __result = trigger1Data[__index].GetInfo(&__path[__pos], __info);
        }
        else
        {
            __result = true;
            __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Structure, true, false, trigger1DataCount));
        }
    }

    return __result;
}

bool ThreeLevelTriggerSystemLevel2Type::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "trigger3Data") == 0)
    {
        if (__index < trigger3DataCount)
        {
            __result = trigger3Data[__index].GetValue(&__path[__pos], __value, __size);
        }
    }

    return __result;
}

bool ThreeLevelTriggerSystemLevel2Type::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "trigger3Data") == 0)
    {
        if (__index < trigger3DataCount)
        {
            __result = trigger3Data[__index].SetValue(&__path[__pos], __value);
        }
    }

    return __result;
}

bool ThreeLevelTriggerSystemLevel2Type::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // trigger
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetInfo(&__path[__pos], __info);
    }

    // trigger3Data
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger3Data", ParameterParserDataType::Structure, true, false, trigger3DataCount));
    }
    else if (PARAMETER_STRCMP(__name, "trigger3Data") == 0)
    {
        if (__index < trigger3DataCount)
        {
            __result = trigger3Data[__index].GetInfo(&__path[__pos], __info);
        }
        else
        {
            __result = true;
            __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Structure, true, false, trigger3DataCount));
        }
    }

    return __result;
}

bool ThreeLevelTriggerSystemLevel1Type::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "trigger2Data") == 0)
    {
        if (__index < trigger2DataCount)
        {
            __result = trigger2Data[__index].GetValue(&__path[__pos], __value, __size);
        }
    }

    return __result;
}

bool ThreeLevelTriggerSystemLevel1Type::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "trigger2Data") == 0)
    {
        if (__index < trigger2DataCount)
        {
            __result = trigger2Data[__index].SetValue(&__path[__pos], __value);
        }
    }

    return __result;
}

bool ThreeLevelTriggerSystemLevel1Type::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // trigger
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetInfo(&__path[__pos], __info);
    }

    // trigger2Data
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger2Data", ParameterParserDataType::Structure, true, false, trigger2DataCount));
    }
    else if (PARAMETER_STRCMP(__name, "trigger2Data") == 0)
    {
        if (__index < trigger2DataCount)
        {
            __result = trigger2Data[__index].GetInfo(&__path[__pos], __info);
        }
        else
        {
            __result = true;
            __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Structure, true, false, trigger2DataCount));
        }
    }

    return __result;
}

bool ThreeLevelTriggerSystemType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger1Type") == 0)
    {
        ParameterUtils::DoubleToString((double)(UINT32)trigger1Type, __value, __size, 0);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "trigger2Type") == 0)
    {
        ParameterUtils::DoubleToString((double)(UINT32)trigger2Type, __value, __size, 0);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "trigger3Type") == 0)
    {
        ParameterUtils::DoubleToString((double)(UINT32)trigger3Type, __value, __size, 0);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "trigger1Data") == 0)
    {
        if (__index < trigger1DataCount)
        {
            __result = trigger1Data[__index].GetValue(&__path[__pos], __value, __size);
        }
    }

    return __result;
}

bool ThreeLevelTriggerSystemType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger1Type") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            trigger1Type = (AECXTriggerType)(UINT32)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "trigger2Type") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            trigger2Type = (AECXTriggerType)(UINT32)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "trigger3Type") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            trigger3Type = (AECXTriggerType)(UINT32)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "trigger1Data") == 0)
    {
        if (__index < trigger1DataCount)
        {
            __result = trigger1Data[__index].SetValue(&__path[__pos], __value);
        }
    }

    return __result;
}

bool ThreeLevelTriggerSystemType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // trigger1Type
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger1Type", ParameterParserDataType::Enum, (double)(UINT32)trigger1Type, 0));
    }
    else if (PARAMETER_STRCMP(__name, "trigger1Type") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Enum, (double)(UINT32)trigger1Type, 0));
    }

    // trigger2Type
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger2Type", ParameterParserDataType::Enum, (double)(UINT32)trigger2Type, 0));
    }
    else if (PARAMETER_STRCMP(__name, "trigger2Type") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Enum, (double)(UINT32)trigger2Type, 0));
    }

    // trigger3Type
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger3Type", ParameterParserDataType::Enum, (double)(UINT32)trigger3Type, 0));
    }
    else if (PARAMETER_STRCMP(__name, "trigger3Type") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Enum, (double)(UINT32)trigger3Type, 0));
    }

    // trigger1Data
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger1Data", ParameterParserDataType::Structure, true, false, trigger1DataCount));
    }
    else if (PARAMETER_STRCMP(__name, "trigger1Data") == 0)
    {
        if (__index < trigger1DataCount)
        {
            __result = trigger1Data[__index].GetInfo(&__path[__pos], __info);
        }
        else
        {
            __result = true;
            __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Structure, true, false, trigger1DataCount));
        }
    }

    return __result;
}

bool DataBankType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "bankID") == 0)
    {
        ParameterUtils::DoubleToString((double)(UINT32)bankID, __value, __size, 0);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "dataID") == 0)
    {
        ParameterUtils::DoubleToString((double)dataID, __value, __size, 0);
        __result = true;
    }

    return __result;
}

bool DataBankType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "bankID") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            bankID = (AECXBankIDType)(UINT32)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "dataID") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            dataID = (INT32)dblValue; 
        }
    }

    return __result;
}

bool DataBankType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // bankID
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("bankID", ParameterParserDataType::Enum, (double)(UINT32)bankID, 0));
    }
    else if (PARAMETER_STRCMP(__name, "bankID") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Enum, (double)(UINT32)bankID, 0));
    }

    // dataID
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("dataID", ParameterParserDataType::Int32, (double)dataID, 0));
    }
    else if (PARAMETER_STRCMP(__name, "dataID") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Int32, (double)dataID, 0));
    }

    return __result;
}

bool TwoLevelDataBankTriggerSystemType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger1DataBank") == 0)
    {
        __result = trigger1DataBank.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "trigger2DataBank") == 0)
    {
        __result = trigger2DataBank.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "trigger1Data") == 0)
    {
        if (__index < trigger1DataCount)
        {
            __result = trigger1Data[__index].GetValue(&__path[__pos], __value, __size);
        }
    }

    return __result;
}

bool TwoLevelDataBankTriggerSystemType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger1DataBank") == 0)
    {
        __result = trigger1DataBank.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "trigger2DataBank") == 0)
    {
        __result = trigger2DataBank.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "trigger1Data") == 0)
    {
        if (__index < trigger1DataCount)
        {
            __result = trigger1Data[__index].SetValue(&__path[__pos], __value);
        }
    }

    return __result;
}

bool TwoLevelDataBankTriggerSystemType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // trigger1DataBank
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger1DataBank", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger1DataBank") == 0)
    {
        __result = trigger1DataBank.GetInfo(&__path[__pos], __info);
    }

    // trigger2DataBank
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger2DataBank", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger2DataBank") == 0)
    {
        __result = trigger2DataBank.GetInfo(&__path[__pos], __info);
    }

    // trigger1Data
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger1Data", ParameterParserDataType::Structure, true, false, trigger1DataCount));
    }
    else if (PARAMETER_STRCMP(__name, "trigger1Data") == 0)
    {
        if (__index < trigger1DataCount)
        {
            __result = trigger1Data[__index].GetInfo(&__path[__pos], __info);
        }
        else
        {
            __result = true;
            __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Structure, true, false, trigger1DataCount));
        }
    }

    return __result;
}

bool ThreeLevelDataBankTriggerSystemType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger1DataBank") == 0)
    {
        __result = trigger1DataBank.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "trigger2DataBank") == 0)
    {
        __result = trigger2DataBank.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "trigger3DataBank") == 0)
    {
        __result = trigger3DataBank.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "trigger3Data") == 0)
    {
        if (__index < trigger3DataCount)
        {
            __result = trigger3Data[__index].GetValue(&__path[__pos], __value, __size);
        }
    }

    return __result;
}

bool ThreeLevelDataBankTriggerSystemType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger1DataBank") == 0)
    {
        __result = trigger1DataBank.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "trigger2DataBank") == 0)
    {
        __result = trigger2DataBank.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "trigger3DataBank") == 0)
    {
        __result = trigger3DataBank.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "trigger3Data") == 0)
    {
        if (__index < trigger3DataCount)
        {
            __result = trigger3Data[__index].SetValue(&__path[__pos], __value);
        }
    }

    return __result;
}

bool ThreeLevelDataBankTriggerSystemType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // trigger1DataBank
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger1DataBank", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger1DataBank") == 0)
    {
        __result = trigger1DataBank.GetInfo(&__path[__pos], __info);
    }

    // trigger2DataBank
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger2DataBank", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger2DataBank") == 0)
    {
        __result = trigger2DataBank.GetInfo(&__path[__pos], __info);
    }

    // trigger3DataBank
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger3DataBank", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger3DataBank") == 0)
    {
        __result = trigger3DataBank.GetInfo(&__path[__pos], __info);
    }

    // trigger3Data
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger3Data", ParameterParserDataType::Structure, true, false, trigger3DataCount));
    }
    else if (PARAMETER_STRCMP(__name, "trigger3Data") == 0)
    {
        if (__index < trigger3DataCount)
        {
            __result = trigger3Data[__index].GetInfo(&__path[__pos], __info);
        }
        else
        {
            __result = true;
            __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Structure, true, false, trigger3DataCount));
        }
    }

    return __result;
}

bool TriggerSystemEndLevelStartEndType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "triggerData") == 0)
    {
        __result = triggerData.GetValue(&__path[__pos], __value, __size);
    }

    return __result;
}

bool TriggerSystemEndLevelStartEndType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "triggerData") == 0)
    {
        __result = triggerData.SetValue(&__path[__pos], __value);
    }

    return __result;
}

bool TriggerSystemEndLevelStartEndType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // trigger
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetInfo(&__path[__pos], __info);
    }

    // triggerData
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("triggerData", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "triggerData") == 0)
    {
        __result = triggerData.GetInfo(&__path[__pos], __info);
    }

    return __result;
}

bool FloatArrayDataType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "value") == 0)
    {
        if (__index < 10)
        {
            ParameterUtils::DoubleToString((double)value[__index], __value, __size);
            __result = true;
        }
        else
        {
            SIZE_T __valuePos = 0;
            for (UINT32 i = 0; i < 10; i++)
            {
                if (i > 0)
                {
                    PARAMETER_STRCAT(__value, __size, ",");
                    __valuePos = PARAMETER_STRLEN(__value);
                }
                ParameterUtils::DoubleToString((double)value[i], &__value[__valuePos], (INT32)(__size - __valuePos));
            }
            __result = true;
        }
    }

    return __result;
}

bool FloatArrayDataType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "value") == 0)
    {
        if (__index < 10)
        {
            const double dblValue = ParameterUtils::StringToDouble(__value, __result);
            if (__result)
            {
                value[__index] = (float)dblValue; 
            }
        }
        else
        {
            SIZE_T __valueLen = PARAMETER_STRLEN(__value);
            UINT32 __pos = 0;

            __index = 0;
            while (__pos < __valueLen && __index < 10)
            {
                CHAR __valueStr[MAX_SIZE];

                __pos += ParameterUtils::GetSubString(&__value[__pos], ',', __valueStr, MAX_SIZE);
                __pos++;

                const double dblValue = ParameterUtils::StringToDouble(__valueStr, __result);
                if (__result)
                {
                    value[__index] = (float)dblValue; 
                }
                __index++;
            }
            __result = true;
        }
    }

    return __result;
}

bool FloatArrayDataType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // value
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("value", ParameterParserDataType::Float, true, false, 10));
    }

    return __result;
}

bool FloatArrayEndLevelType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "triggerData") == 0)
    {
        __result = triggerData.GetValue(&__path[__pos], __value, __size);
    }

    return __result;
}

bool FloatArrayEndLevelType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "triggerData") == 0)
    {
        __result = triggerData.SetValue(&__path[__pos], __value);
    }

    return __result;
}

bool FloatArrayEndLevelType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // trigger
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetInfo(&__path[__pos], __info);
    }

    // triggerData
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("triggerData", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "triggerData") == 0)
    {
        __result = triggerData.GetInfo(&__path[__pos], __info);
    }

    return __result;
}

bool ThreeLevelFloatArrayLevel2Type::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "trigger3Data") == 0)
    {
        if (__index < trigger3DataCount)
        {
            __result = trigger3Data[__index].GetValue(&__path[__pos], __value, __size);
        }
    }

    return __result;
}

bool ThreeLevelFloatArrayLevel2Type::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "trigger3Data") == 0)
    {
        if (__index < trigger3DataCount)
        {
            __result = trigger3Data[__index].SetValue(&__path[__pos], __value);
        }
    }

    return __result;
}

bool ThreeLevelFloatArrayLevel2Type::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // trigger
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetInfo(&__path[__pos], __info);
    }

    // trigger3Data
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger3Data", ParameterParserDataType::Structure, true, false, trigger3DataCount));
    }
    else if (PARAMETER_STRCMP(__name, "trigger3Data") == 0)
    {
        if (__index < trigger3DataCount)
        {
            __result = trigger3Data[__index].GetInfo(&__path[__pos], __info);
        }
        else
        {
            __result = true;
            __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Structure, true, false, trigger3DataCount));
        }
    }

    return __result;
}

bool ThreeLevelFloatArrayLevel1Type::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "trigger2Data") == 0)
    {
        if (__index < trigger2DataCount)
        {
            __result = trigger2Data[__index].GetValue(&__path[__pos], __value, __size);
        }
    }

    return __result;
}

bool ThreeLevelFloatArrayLevel1Type::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "trigger2Data") == 0)
    {
        if (__index < trigger2DataCount)
        {
            __result = trigger2Data[__index].SetValue(&__path[__pos], __value);
        }
    }

    return __result;
}

bool ThreeLevelFloatArrayLevel1Type::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // trigger
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetInfo(&__path[__pos], __info);
    }

    // trigger2Data
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger2Data", ParameterParserDataType::Structure, true, false, trigger2DataCount));
    }
    else if (PARAMETER_STRCMP(__name, "trigger2Data") == 0)
    {
        if (__index < trigger2DataCount)
        {
            __result = trigger2Data[__index].GetInfo(&__path[__pos], __info);
        }
        else
        {
            __result = true;
            __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Structure, true, false, trigger2DataCount));
        }
    }

    return __result;
}

bool ThreeLevelFloatArrayType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger1DataBank") == 0)
    {
        __result = trigger1DataBank.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "trigger2DataBank") == 0)
    {
        __result = trigger2DataBank.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "trigger3DataBank") == 0)
    {
        __result = trigger3DataBank.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "trigger3Data") == 0)
    {
        if (__index < trigger3DataCount)
        {
            __result = trigger3Data[__index].GetValue(&__path[__pos], __value, __size);
        }
    }

    return __result;
}

bool ThreeLevelFloatArrayType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger1DataBank") == 0)
    {
        __result = trigger1DataBank.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "trigger2DataBank") == 0)
    {
        __result = trigger2DataBank.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "trigger3DataBank") == 0)
    {
        __result = trigger3DataBank.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "trigger3Data") == 0)
    {
        if (__index < trigger3DataCount)
        {
            __result = trigger3Data[__index].SetValue(&__path[__pos], __value);
        }
    }

    return __result;
}

bool ThreeLevelFloatArrayType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // trigger1DataBank
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger1DataBank", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger1DataBank") == 0)
    {
        __result = trigger1DataBank.GetInfo(&__path[__pos], __info);
    }

    // trigger2DataBank
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger2DataBank", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger2DataBank") == 0)
    {
        __result = trigger2DataBank.GetInfo(&__path[__pos], __info);
    }

    // trigger3DataBank
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger3DataBank", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger3DataBank") == 0)
    {
        __result = trigger3DataBank.GetInfo(&__path[__pos], __info);
    }

    // trigger3Data
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger3Data", ParameterParserDataType::Structure, true, false, trigger3DataCount));
    }
    else if (PARAMETER_STRCMP(__name, "trigger3Data") == 0)
    {
        if (__index < trigger3DataCount)
        {
            __result = trigger3Data[__index].GetInfo(&__path[__pos], __info);
        }
        else
        {
            __result = true;
            __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Structure, true, false, trigger3DataCount));
        }
    }

    return __result;
}

bool AutoHDRDecisionType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "underExposureS1") == 0)
    {
        ParameterUtils::DoubleToString((double)underExposureS1, __value, __size);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "underExposureS2") == 0)
    {
        ParameterUtils::DoubleToString((double)underExposureS2, __value, __size);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "underExposureS3") == 0)
    {
        ParameterUtils::DoubleToString((double)underExposureS3, __value, __size);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "underExposureS4") == 0)
    {
        ParameterUtils::DoubleToString((double)underExposureS4, __value, __size);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "exposureCount") == 0)
    {
        ParameterUtils::DoubleToString((double)exposureCount, __value, __size);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "dropShort") == 0)
    {
        ParameterUtils::DoubleToString((double)dropShort, __value, __size);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "reserved1") == 0)
    {
        ParameterUtils::DoubleToString((double)reserved1, __value, __size);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "reserved2") == 0)
    {
        ParameterUtils::DoubleToString((double)reserved2, __value, __size);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "reserved3") == 0)
    {
        ParameterUtils::DoubleToString((double)reserved3, __value, __size);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "reserved4") == 0)
    {
        ParameterUtils::DoubleToString((double)reserved4, __value, __size);
        __result = true;
    }

    return __result;
}

bool AutoHDRDecisionType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "underExposureS1") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            underExposureS1 = (float)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "underExposureS2") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            underExposureS2 = (float)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "underExposureS3") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            underExposureS3 = (float)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "underExposureS4") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            underExposureS4 = (float)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "exposureCount") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            exposureCount = (float)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "dropShort") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            dropShort = (float)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "reserved1") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            reserved1 = (float)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "reserved2") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            reserved2 = (float)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "reserved3") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            reserved3 = (float)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "reserved4") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            reserved4 = (float)dblValue; 
        }
    }

    return __result;
}

bool AutoHDRDecisionType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // underExposureS1
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("underExposureS1", ParameterParserDataType::Float, (double)underExposureS1));
    }
    else if (PARAMETER_STRCMP(__name, "underExposureS1") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Float, (double)underExposureS1));
    }

    // underExposureS2
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("underExposureS2", ParameterParserDataType::Float, (double)underExposureS2));
    }
    else if (PARAMETER_STRCMP(__name, "underExposureS2") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Float, (double)underExposureS2));
    }

    // underExposureS3
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("underExposureS3", ParameterParserDataType::Float, (double)underExposureS3));
    }
    else if (PARAMETER_STRCMP(__name, "underExposureS3") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Float, (double)underExposureS3));
    }

    // underExposureS4
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("underExposureS4", ParameterParserDataType::Float, (double)underExposureS4));
    }
    else if (PARAMETER_STRCMP(__name, "underExposureS4") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Float, (double)underExposureS4));
    }

    // exposureCount
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("exposureCount", ParameterParserDataType::Float, (double)exposureCount));
    }
    else if (PARAMETER_STRCMP(__name, "exposureCount") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Float, (double)exposureCount));
    }

    // dropShort
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("dropShort", ParameterParserDataType::Float, (double)dropShort));
    }
    else if (PARAMETER_STRCMP(__name, "dropShort") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Float, (double)dropShort));
    }

    // reserved1
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("reserved1", ParameterParserDataType::Float, (double)reserved1));
    }
    else if (PARAMETER_STRCMP(__name, "reserved1") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Float, (double)reserved1));
    }

    // reserved2
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("reserved2", ParameterParserDataType::Float, (double)reserved2));
    }
    else if (PARAMETER_STRCMP(__name, "reserved2") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Float, (double)reserved2));
    }

    // reserved3
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("reserved3", ParameterParserDataType::Float, (double)reserved3));
    }
    else if (PARAMETER_STRCMP(__name, "reserved3") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Float, (double)reserved3));
    }

    // reserved4
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("reserved4", ParameterParserDataType::Float, (double)reserved4));
    }
    else if (PARAMETER_STRCMP(__name, "reserved4") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Float, (double)reserved4));
    }

    return __result;
}

bool AutoHDREndLevelType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "triggerData") == 0)
    {
        __result = triggerData.GetValue(&__path[__pos], __value, __size);
    }

    return __result;
}

bool AutoHDREndLevelType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "triggerData") == 0)
    {
        __result = triggerData.SetValue(&__path[__pos], __value);
    }

    return __result;
}

bool AutoHDREndLevelType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // trigger
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetInfo(&__path[__pos], __info);
    }

    // triggerData
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("triggerData", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "triggerData") == 0)
    {
        __result = triggerData.GetInfo(&__path[__pos], __info);
    }

    return __result;
}

bool ThreeLevelAutoHDRLevel2Type::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "trigger3Data") == 0)
    {
        if (__index < trigger3DataCount)
        {
            __result = trigger3Data[__index].GetValue(&__path[__pos], __value, __size);
        }
    }

    return __result;
}

bool ThreeLevelAutoHDRLevel2Type::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "trigger3Data") == 0)
    {
        if (__index < trigger3DataCount)
        {
            __result = trigger3Data[__index].SetValue(&__path[__pos], __value);
        }
    }

    return __result;
}

bool ThreeLevelAutoHDRLevel2Type::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // trigger
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetInfo(&__path[__pos], __info);
    }

    // trigger3Data
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger3Data", ParameterParserDataType::Structure, true, false, trigger3DataCount));
    }
    else if (PARAMETER_STRCMP(__name, "trigger3Data") == 0)
    {
        if (__index < trigger3DataCount)
        {
            __result = trigger3Data[__index].GetInfo(&__path[__pos], __info);
        }
        else
        {
            __result = true;
            __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Structure, true, false, trigger3DataCount));
        }
    }

    return __result;
}

bool ThreeLevelAutoHDRLevel1Type::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "trigger2Data") == 0)
    {
        if (__index < trigger2DataCount)
        {
            __result = trigger2Data[__index].GetValue(&__path[__pos], __value, __size);
        }
    }

    return __result;
}

bool ThreeLevelAutoHDRLevel1Type::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "trigger2Data") == 0)
    {
        if (__index < trigger2DataCount)
        {
            __result = trigger2Data[__index].SetValue(&__path[__pos], __value);
        }
    }

    return __result;
}

bool ThreeLevelAutoHDRLevel1Type::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // trigger
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetInfo(&__path[__pos], __info);
    }

    // trigger2Data
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger2Data", ParameterParserDataType::Structure, true, false, trigger2DataCount));
    }
    else if (PARAMETER_STRCMP(__name, "trigger2Data") == 0)
    {
        if (__index < trigger2DataCount)
        {
            __result = trigger2Data[__index].GetInfo(&__path[__pos], __info);
        }
        else
        {
            __result = true;
            __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Structure, true, false, trigger2DataCount));
        }
    }

    return __result;
}

bool ThreeLevelAutoHDRType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger1DataBank") == 0)
    {
        __result = trigger1DataBank.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "trigger2DataBank") == 0)
    {
        __result = trigger2DataBank.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "trigger3DataBank") == 0)
    {
        __result = trigger3DataBank.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "trigger1Data") == 0)
    {
        if (__index < trigger1DataCount)
        {
            __result = trigger1Data[__index].GetValue(&__path[__pos], __value, __size);
        }
    }

    return __result;
}

bool ThreeLevelAutoHDRType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger1DataBank") == 0)
    {
        __result = trigger1DataBank.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "trigger2DataBank") == 0)
    {
        __result = trigger2DataBank.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "trigger3DataBank") == 0)
    {
        __result = trigger3DataBank.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "trigger1Data") == 0)
    {
        if (__index < trigger1DataCount)
        {
            __result = trigger1Data[__index].SetValue(&__path[__pos], __value);
        }
    }

    return __result;
}

bool ThreeLevelAutoHDRType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // trigger1DataBank
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger1DataBank", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger1DataBank") == 0)
    {
        __result = trigger1DataBank.GetInfo(&__path[__pos], __info);
    }

    // trigger2DataBank
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger2DataBank", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger2DataBank") == 0)
    {
        __result = trigger2DataBank.GetInfo(&__path[__pos], __info);
    }

    // trigger3DataBank
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger3DataBank", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger3DataBank") == 0)
    {
        __result = trigger3DataBank.GetInfo(&__path[__pos], __info);
    }

    // trigger1Data
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger1Data", ParameterParserDataType::Structure, true, false, trigger1DataCount));
    }
    else if (PARAMETER_STRCMP(__name, "trigger1Data") == 0)
    {
        if (__index < trigger1DataCount)
        {
            __result = trigger1Data[__index].GetInfo(&__path[__pos], __info);
        }
        else
        {
            __result = true;
            __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Structure, true, false, trigger1DataCount));
        }
    }

    return __result;
}

bool AggressivenessDataType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "value") == 0)
    {
        ParameterUtils::DoubleToString((double)value, __value, __size);
        __result = true;
    }

    return __result;
}

bool AggressivenessDataType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "value") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            value = (float)dblValue; 
        }
    }

    return __result;
}

bool AggressivenessDataType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // value
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("value", ParameterParserDataType::Float, (double)value));
    }
    else if (PARAMETER_STRCMP(__name, "value") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Float, (double)value));
    }

    return __result;
}

bool AggressivenessThreeLevelTriggerSystemEndLevelType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "triggerData") == 0)
    {
        __result = triggerData.GetValue(&__path[__pos], __value, __size);
    }

    return __result;
}

bool AggressivenessThreeLevelTriggerSystemEndLevelType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "triggerData") == 0)
    {
        __result = triggerData.SetValue(&__path[__pos], __value);
    }

    return __result;
}

bool AggressivenessThreeLevelTriggerSystemEndLevelType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // trigger
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetInfo(&__path[__pos], __info);
    }

    // triggerData
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("triggerData", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "triggerData") == 0)
    {
        __result = triggerData.GetInfo(&__path[__pos], __info);
    }

    return __result;
}

bool AggressivenessThreeLevelTriggerSystemLevel2Type::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "trigger3Data") == 0)
    {
        if (__index < trigger3DataCount)
        {
            __result = trigger3Data[__index].GetValue(&__path[__pos], __value, __size);
        }
    }

    return __result;
}

bool AggressivenessThreeLevelTriggerSystemLevel2Type::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "trigger3Data") == 0)
    {
        if (__index < trigger3DataCount)
        {
            __result = trigger3Data[__index].SetValue(&__path[__pos], __value);
        }
    }

    return __result;
}

bool AggressivenessThreeLevelTriggerSystemLevel2Type::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // trigger
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetInfo(&__path[__pos], __info);
    }

    // trigger3Data
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger3Data", ParameterParserDataType::Structure, true, false, trigger3DataCount));
    }
    else if (PARAMETER_STRCMP(__name, "trigger3Data") == 0)
    {
        if (__index < trigger3DataCount)
        {
            __result = trigger3Data[__index].GetInfo(&__path[__pos], __info);
        }
        else
        {
            __result = true;
            __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Structure, true, false, trigger3DataCount));
        }
    }

    return __result;
}

bool AggressivenessThreeLevelTriggerSystemLevel1Type::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "trigger2Data") == 0)
    {
        if (__index < trigger2DataCount)
        {
            __result = trigger2Data[__index].GetValue(&__path[__pos], __value, __size);
        }
    }

    return __result;
}

bool AggressivenessThreeLevelTriggerSystemLevel1Type::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "trigger2Data") == 0)
    {
        if (__index < trigger2DataCount)
        {
            __result = trigger2Data[__index].SetValue(&__path[__pos], __value);
        }
    }

    return __result;
}

bool AggressivenessThreeLevelTriggerSystemLevel1Type::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // trigger
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger") == 0)
    {
        __result = trigger.GetInfo(&__path[__pos], __info);
    }

    // trigger2Data
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger2Data", ParameterParserDataType::Structure, true, false, trigger2DataCount));
    }
    else if (PARAMETER_STRCMP(__name, "trigger2Data") == 0)
    {
        if (__index < trigger2DataCount)
        {
            __result = trigger2Data[__index].GetInfo(&__path[__pos], __info);
        }
        else
        {
            __result = true;
            __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Structure, true, false, trigger2DataCount));
        }
    }

    return __result;
}

bool AggressivenessThreeLevelTriggerSystemType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger1DataBank") == 0)
    {
        __result = trigger1DataBank.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "trigger2DataBank") == 0)
    {
        __result = trigger2DataBank.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "trigger3DataBank") == 0)
    {
        __result = trigger3DataBank.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "trigger1Data") == 0)
    {
        if (__index < trigger1DataCount)
        {
            __result = trigger1Data[__index].GetValue(&__path[__pos], __value, __size);
        }
    }

    return __result;
}

bool AggressivenessThreeLevelTriggerSystemType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "trigger1DataBank") == 0)
    {
        __result = trigger1DataBank.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "trigger2DataBank") == 0)
    {
        __result = trigger2DataBank.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "trigger3DataBank") == 0)
    {
        __result = trigger3DataBank.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "trigger1Data") == 0)
    {
        if (__index < trigger1DataCount)
        {
            __result = trigger1Data[__index].SetValue(&__path[__pos], __value);
        }
    }

    return __result;
}

bool AggressivenessThreeLevelTriggerSystemType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // trigger1DataBank
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger1DataBank", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger1DataBank") == 0)
    {
        __result = trigger1DataBank.GetInfo(&__path[__pos], __info);
    }

    // trigger2DataBank
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger2DataBank", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger2DataBank") == 0)
    {
        __result = trigger2DataBank.GetInfo(&__path[__pos], __info);
    }

    // trigger3DataBank
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger3DataBank", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "trigger3DataBank") == 0)
    {
        __result = trigger3DataBank.GetInfo(&__path[__pos], __info);
    }

    // trigger1Data
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("trigger1Data", ParameterParserDataType::Structure, true, false, trigger1DataCount));
    }
    else if (PARAMETER_STRCMP(__name, "trigger1Data") == 0)
    {
        if (__index < trigger1DataCount)
        {
            __result = trigger1Data[__index].GetInfo(&__path[__pos], __info);
        }
        else
        {
            __result = true;
            __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Structure, true, false, trigger1DataCount));
        }
    }

    return __result;
}

bool SwitchCounterType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "type") == 0)
    {
        ParameterUtils::DoubleToString((double)(UINT32)type, __value, __size, 0);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "customInteger") == 0)
    {
        ParameterUtils::DoubleToString((double)customInteger, __value, __size, 0);
        __result = true;
    }

    return __result;
}

bool SwitchCounterType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "type") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            type = (AECSwitchCounterEnumType)(UINT32)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "customInteger") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            customInteger = (INT32)dblValue; 
        }
    }

    return __result;
}

bool SwitchCounterType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // type
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("type", ParameterParserDataType::Enum, (double)(UINT32)type, 0));
    }
    else if (PARAMETER_STRCMP(__name, "type") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Enum, (double)(UINT32)type, 0));
    }

    // customInteger
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("customInteger", ParameterParserDataType::Int32, (double)customInteger, 0));
    }
    else if (PARAMETER_STRCMP(__name, "customInteger") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Int32, (double)customInteger, 0));
    }

    return __result;
}

bool SnapshotFrameSelectionType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "searchMethod") == 0)
    {
        ParameterUtils::DoubleToString((double)(UINT32)searchMethod, __value, __size, 0);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "eVType") == 0)
    {
        ParameterUtils::DoubleToString((double)(UINT32)eVType, __value, __size, 0);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "value") == 0)
    {
        ParameterUtils::DoubleToString((double)value, __value, __size, 0);
        __result = true;
    }

    return __result;
}

bool SnapshotFrameSelectionType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "searchMethod") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            searchMethod = (SnapshotSearchMethod)(UINT32)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "eVType") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            eVType = (EVOffsetType)(UINT32)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "value") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            value = (INT32)dblValue; 
        }
    }

    return __result;
}

bool SnapshotFrameSelectionType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // searchMethod
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("searchMethod", ParameterParserDataType::Enum, (double)(UINT32)searchMethod, 0));
    }
    else if (PARAMETER_STRCMP(__name, "searchMethod") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Enum, (double)(UINT32)searchMethod, 0));
    }

    // eVType
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("eVType", ParameterParserDataType::Enum, (double)(UINT32)eVType, 0));
    }
    else if (PARAMETER_STRCMP(__name, "eVType") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Enum, (double)(UINT32)eVType, 0));
    }

    // value
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("value", ParameterParserDataType::Int32, (double)value, 0));
    }
    else if (PARAMETER_STRCMP(__name, "value") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Int32, (double)value, 0));
    }

    return __result;
}

bool PreviewFrameSelectionType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "searchMethod") == 0)
    {
        ParameterUtils::DoubleToString((double)(UINT32)searchMethod, __value, __size, 0);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "value") == 0)
    {
        ParameterUtils::DoubleToString((double)value, __value, __size, 0);
        __result = true;
    }

    return __result;
}

bool PreviewFrameSelectionType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "searchMethod") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            searchMethod = (PreviewSearchMethod)(UINT32)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "value") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            value = (INT32)dblValue; 
        }
    }

    return __result;
}

bool PreviewFrameSelectionType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // searchMethod
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("searchMethod", ParameterParserDataType::Enum, (double)(UINT32)searchMethod, 0));
    }
    else if (PARAMETER_STRCMP(__name, "searchMethod") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Enum, (double)(UINT32)searchMethod, 0));
    }

    // value
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("value", ParameterParserDataType::Int32, (double)value, 0));
    }
    else if (PARAMETER_STRCMP(__name, "value") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Int32, (double)value, 0));
    }

    return __result;
}

bool FrameSelectionType::GetValue(
    const CHAR* const __path,
    CHAR* const       __value,
    UINT32 const      __size)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "frameType") == 0)
    {
        ParameterUtils::DoubleToString((double)(UINT32)frameType, __value, __size, 0);
        __result = true;
    }
    else if (PARAMETER_STRCMP(__name, "snapshot") == 0)
    {
        __result = snapshot.GetValue(&__path[__pos], __value, __size);
    }
    else if (PARAMETER_STRCMP(__name, "preview") == 0)
    {
        __result = preview.GetValue(&__path[__pos], __value, __size);
    }

    return __result;
}

bool FrameSelectionType::SetValue(
    const CHAR* const __path,
    const CHAR* const __value)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    if (PARAMETER_STRCMP(__name, "frameType") == 0)
    {
        const double dblValue = ParameterUtils::StringToDouble(__value, __result);
        if (__result)
        {
            frameType = (FrameType)(UINT32)dblValue; 
        }
    }
    else if (PARAMETER_STRCMP(__name, "snapshot") == 0)
    {
        __result = snapshot.SetValue(&__path[__pos], __value);
    }
    else if (PARAMETER_STRCMP(__name, "preview") == 0)
    {
        __result = preview.SetValue(&__path[__pos], __value);
    }

    return __result;
}

bool FrameSelectionType::GetInfo(
    const CHAR* const           __path,
    PList<ParameterParserInfo>& __info)
{
    constexpr SIZE_T MAX_SIZE = 129;
    CHAR   __name[MAX_SIZE] = "";
    UINT32 __index          = MAX_UINT;
    bool   __result         = false;

    const UINT32 __pos = ParameterUtils::GetVariable(__path, __name, __index, MAX_SIZE);

    // frameType
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("frameType", ParameterParserDataType::Enum, (double)(UINT32)frameType, 0));
    }
    else if (PARAMETER_STRCMP(__name, "frameType") == 0)
    {
        __result = true;
        __info.Add(ParameterParserInfo(nullptr, ParameterParserDataType::Enum, (double)(UINT32)frameType, 0));
    }

    // snapshot
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("snapshot", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "snapshot") == 0)
    {
        __result = snapshot.GetInfo(&__path[__pos], __info);
    }

    // preview
    if (__name[0] == '\0')
    {
        __result = true;
        __info.Add(ParameterParserInfo("preview", ParameterParserDataType::Structure));
    }
    else if (PARAMETER_STRCMP(__name, "preview") == 0)
    {
        __result = preview.GetInfo(&__path[__pos], __info);
    }

    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_AECStatsSiteSelection(
    ParameterFileSymbolTableEntry* const entry,
    AECStatsSiteSelection& enumValue,
    BYTE const alignment)
{
    bool result {false};

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

    if (result)
    {
        switch (uintValue)
        {
        case static_cast<UINT32>(AECStatsSiteSelection::BeforeHDRFusion):
            enumValue = AECStatsSiteSelection::BeforeHDRFusion;
            result    = true;
            break;
        case static_cast<UINT32>(AECStatsSiteSelection::BeforeDemosaic):
            enumValue = AECStatsSiteSelection::BeforeDemosaic;
            result    = true;
            break;
        case static_cast<UINT32>(AECStatsSiteSelection::BeforeGammaLUT):
            enumValue = AECStatsSiteSelection::BeforeGammaLUT;
            result    = true;
            break;
        case static_cast<UINT32>(AECStatsSiteSelection::AfterGammaLUT):
            enumValue = AECStatsSiteSelection::AfterGammaLUT;
            result    = true;
            break;
        case static_cast<UINT32>(AECStatsSiteSelection::InSensor):
            enumValue = AECStatsSiteSelection::InSensor;
            result    = true;
            break;
        default:
            PARAMETER_LOG_ERROR(entry->SetManager, "Invalid value(% u) converting UINT32 to AECStatsSiteSelection", 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_AECStatsHistogramUniformityType(
    ParameterFileSymbolTableEntry* const entry,
    AECStatsHistogramUniformityType& enumValue,
    BYTE const alignment)
{
    bool result {false};

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

    if (result)
    {
        switch (uintValue)
        {
        case static_cast<UINT32>(AECStatsHistogramUniformityType::Even):
            enumValue = AECStatsHistogramUniformityType::Even;
            result    = true;
            break;
        case static_cast<UINT32>(AECStatsHistogramUniformityType::Uneven):
            enumValue = AECStatsHistogramUniformityType::Uneven;
            result    = true;
            break;
        default:
            PARAMETER_LOG_ERROR(entry->SetManager, "Invalid value(% u) converting UINT32 to AECStatsHistogramUniformityType", 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_AECCtrlStatsFormatType(
    ParameterFileSymbolTableEntry* const entry,
    AECCtrlStatsFormatType& enumValue,
    BYTE const alignment)
{
    bool result {false};

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

    if (result)
    {
        switch (uintValue)
        {
        case static_cast<UINT32>(AECCtrlStatsFormatType::AECCtrlStatsTypeBayer):
            enumValue = AECCtrlStatsFormatType::AECCtrlStatsTypeBayer;
            result    = true;
            break;
        case static_cast<UINT32>(AECCtrlStatsFormatType::AECCtrlStatsTypeRGBY):
            enumValue = AECCtrlStatsFormatType::AECCtrlStatsTypeRGBY;
            result    = true;
            break;
        case static_cast<UINT32>(AECCtrlStatsFormatType::AECCtrlStatsTypeYCbCr):
            enumValue = AECCtrlStatsFormatType::AECCtrlStatsTypeYCbCr;
            result    = true;
            break;
        default:
            PARAMETER_LOG_ERROR(entry->SetManager, "Invalid value(% u) converting UINT32 to AECCtrlStatsFormatType", 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_AECStatsPixelExpSelect(
    ParameterFileSymbolTableEntry* const entry,
    AECStatsPixelExpSelect& enumValue,
    BYTE const alignment)
{
    bool result {false};

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

    if (result)
    {
        switch (uintValue)
        {
        case static_cast<UINT32>(AECStatsPixelExpSelect::AllPixels):
            enumValue = AECStatsPixelExpSelect::AllPixels;
            result    = true;
            break;
        case static_cast<UINT32>(AECStatsPixelExpSelect::LongPixels):
            enumValue = AECStatsPixelExpSelect::LongPixels;
            result    = true;
            break;
        case static_cast<UINT32>(AECStatsPixelExpSelect::ShortPixels):
            enumValue = AECStatsPixelExpSelect::ShortPixels;
            result    = true;
            break;
        default:
            PARAMETER_LOG_ERROR(entry->SetManager, "Invalid value(% u) converting UINT32 to AECStatsPixelExpSelect", 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_AECROIConfigControlType(
    ParameterFileSymbolTableEntry* const entry,
    AECROIConfigControlType& enumValue,
    BYTE const alignment)
{
    bool result {false};

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

    if (result)
    {
        switch (uintValue)
        {
        case static_cast<UINT32>(AECROIConfigControlType::AECROIConfigControlTypeCroppedFOV):
            enumValue = AECROIConfigControlType::AECROIConfigControlTypeCroppedFOV;
            result    = true;
            break;
        case static_cast<UINT32>(AECROIConfigControlType::AECROIConfigControlTypeFullFOV):
            enumValue = AECROIConfigControlType::AECROIConfigControlTypeFullFOV;
            result    = true;
            break;
        default:
            PARAMETER_LOG_ERROR(entry->SetManager, "Invalid value(% u) converting UINT32 to AECROIConfigControlType", 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_AECHWStatsInputType(
    ParameterFileSymbolTableEntry* const entry,
    AECHWStatsInputType& enumValue,
    BYTE const alignment)
{
    bool result {false};

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

    if (result)
    {
        switch (uintValue)
        {
        case static_cast<UINT32>(AECHWStatsInputType::AECAlgoInputBayerExposure):
            enumValue = AECHWStatsInputType::AECAlgoInputBayerExposure;
            result    = true;
            break;
        case static_cast<UINT32>(AECHWStatsInputType::AECAlgoInputBFW):
            enumValue = AECHWStatsInputType::AECAlgoInputBFW;
            result    = true;
            break;
        case static_cast<UINT32>(AECHWStatsInputType::AECAlgoInputBayerHist):
            enumValue = AECHWStatsInputType::AECAlgoInputBayerHist;
            result    = true;
            break;
        case static_cast<UINT32>(AECHWStatsInputType::AECAlgoInputHDRBHist):
            enumValue = AECHWStatsInputType::AECAlgoInputHDRBHist;
            result    = true;
            break;
        case static_cast<UINT32>(AECHWStatsInputType::AECAlgoInputIHist):
            enumValue = AECHWStatsInputType::AECAlgoInputIHist;
            result    = true;
            break;
        case static_cast<UINT32>(AECHWStatsInputType::AECAlgoInputHDR3Type1HistL):
            enumValue = AECHWStatsInputType::AECAlgoInputHDR3Type1HistL;
            result    = true;
            break;
        case static_cast<UINT32>(AECHWStatsInputType::AECAlgoInputHDR3Type1HistNL):
            enumValue = AECHWStatsInputType::AECAlgoInputHDR3Type1HistNL;
            result    = true;
            break;
        case static_cast<UINT32>(AECHWStatsInputType::AECAlgoInputCustGrid1):
            enumValue = AECHWStatsInputType::AECAlgoInputCustGrid1;
            result    = true;
            break;
        case static_cast<UINT32>(AECHWStatsInputType::AECAlgoInputCustGrid2):
            enumValue = AECHWStatsInputType::AECAlgoInputCustGrid2;
            result    = true;
            break;
        case static_cast<UINT32>(AECHWStatsInputType::AECAlgoInputCustHist1):
            enumValue = AECHWStatsInputType::AECAlgoInputCustHist1;
            result    = true;
            break;
        case static_cast<UINT32>(AECHWStatsInputType::AECAlgoInputCustHist2):
            enumValue = AECHWStatsInputType::AECAlgoInputCustHist2;
            result    = true;
            break;
        case static_cast<UINT32>(AECHWStatsInputType::AECAlgoInputSFEBayerExposure):
            enumValue = AECHWStatsInputType::AECAlgoInputSFEBayerExposure;
            result    = true;
            break;
        case static_cast<UINT32>(AECHWStatsInputType::AECAlgoInputSFEBayerHist):
            enumValue = AECHWStatsInputType::AECAlgoInputSFEBayerHist;
            result    = true;
            break;
        default:
            PARAMETER_LOG_ERROR(entry->SetManager, "Invalid value(% u) converting UINT32 to AECHWStatsInputType", 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_AECCoreStatsOutType(
    ParameterFileSymbolTableEntry* const entry,
    AECCoreStatsOutType& enumValue,
    BYTE const alignment)
{
    bool result {false};

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

    if (result)
    {
        switch (uintValue)
        {
        case static_cast<UINT32>(AECCoreStatsOutType::AECCoreStatsOutGrid):
            enumValue = AECCoreStatsOutType::AECCoreStatsOutGrid;
            result    = true;
            break;
        case static_cast<UINT32>(AECCoreStatsOutType::AECCoreStatsOutHist):
            enumValue = AECCoreStatsOutType::AECCoreStatsOutHist;
            result    = true;
            break;
        case static_cast<UINT32>(AECCoreStatsOutType::AECCoreStatsOutCust1):
            enumValue = AECCoreStatsOutType::AECCoreStatsOutCust1;
            result    = true;
            break;
        case static_cast<UINT32>(AECCoreStatsOutType::AECCoreStatsOutCust2):
            enumValue = AECCoreStatsOutType::AECCoreStatsOutCust2;
            result    = true;
            break;
        default:
            PARAMETER_LOG_ERROR(entry->SetManager, "Invalid value(% u) converting UINT32 to AECCoreStatsOutType", 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_AECXChromatixEventType(
    ParameterFileSymbolTableEntry* const entry,
    AECXChromatixEventType& enumValue,
    BYTE const alignment)
{
    bool result {false};

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

    if (result)
    {
        switch (uintValue)
        {
        case static_cast<UINT32>(AECXChromatixEventType::AECDefault):
            enumValue = AECXChromatixEventType::AECDefault;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECOpInit):
            enumValue = AECXChromatixEventType::AECOpInit;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECOpStreaming):
            enumValue = AECXChromatixEventType::AECOpStreaming;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECOpPreflash):
            enumValue = AECXChromatixEventType::AECOpPreflash;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECOpFastAEC):
            enumValue = AECXChromatixEventType::AECOpFastAEC;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECOpAggressiveAEC):
            enumValue = AECXChromatixEventType::AECOpAggressiveAEC;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECOpFlashTuning):
            enumValue = AECXChromatixEventType::AECOpFlashTuning;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECOpFlashCalibration):
            enumValue = AECXChromatixEventType::AECOpFlashCalibration;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECHDRTypeDisabled):
            enumValue = AECXChromatixEventType::AECHDRTypeDisabled;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECHDRTypeISPHDR):
            enumValue = AECXChromatixEventType::AECHDRTypeISPHDR;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECHDRTypeSensorHDR):
            enumValue = AECXChromatixEventType::AECHDRTypeSensorHDR;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECHDRTypeSHDR2):
            enumValue = AECXChromatixEventType::AECHDRTypeSHDR2;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECHDRTypeSHDR3):
            enumValue = AECXChromatixEventType::AECHDRTypeSHDR3;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECHDRTypeMFHDR):
            enumValue = AECXChromatixEventType::AECHDRTypeMFHDR;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECManualISO):
            enumValue = AECXChromatixEventType::AECManualISO;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECManualTime):
            enumValue = AECXChromatixEventType::AECManualTime;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECManualFull):
            enumValue = AECXChromatixEventType::AECManualFull;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECLock):
            enumValue = AECXChromatixEventType::AECLock;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECTouch):
            enumValue = AECXChromatixEventType::AECTouch;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECFace):
            enumValue = AECXChromatixEventType::AECFace;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECT2T):
            enumValue = AECXChromatixEventType::AECT2T;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECSaliency):
            enumValue = AECXChromatixEventType::AECSaliency;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECDepth):
            enumValue = AECXChromatixEventType::AECDepth;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECEV):
            enumValue = AECXChromatixEventType::AECEV;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECEVChange):
            enumValue = AECXChromatixEventType::AECEVChange;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECFirstConvergingAfterEvent):
            enumValue = AECXChromatixEventType::AECFirstConvergingAfterEvent;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECCoreSnapshotNormal):
            enumValue = AECXChromatixEventType::AECCoreSnapshotNormal;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECCoreSnapshotLLS):
            enumValue = AECXChromatixEventType::AECCoreSnapshotLLS;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECCoreSnapshotFlash):
            enumValue = AECXChromatixEventType::AECCoreSnapshotFlash;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECCoreSnapshotHDR3):
            enumValue = AECXChromatixEventType::AECCoreSnapshotHDR3;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECCoreSnapshotPrecisionFlash):
            enumValue = AECXChromatixEventType::AECCoreSnapshotPrecisionFlash;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECCoreSnapshotQLLShort):
            enumValue = AECXChromatixEventType::AECCoreSnapshotQLLShort;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECCoreSnapshotQLL):
            enumValue = AECXChromatixEventType::AECCoreSnapshotQLL;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECCoreSnapshotAdvanced):
            enumValue = AECXChromatixEventType::AECCoreSnapshotAdvanced;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECTorch):
            enumValue = AECXChromatixEventType::AECTorch;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECTorchChange):
            enumValue = AECXChromatixEventType::AECTorchChange;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECSettled):
            enumValue = AECXChromatixEventType::AECSettled;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECSlaveRole):
            enumValue = AECXChromatixEventType::AECSlaveRole;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECEVBracketing):
            enumValue = AECXChromatixEventType::AECEVBracketing;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECHybridHDR):
            enumValue = AECXChromatixEventType::AECHybridHDR;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECAuxRole):
            enumValue = AECXChromatixEventType::AECAuxRole;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECCropWindowChange):
            enumValue = AECXChromatixEventType::AECCropWindowChange;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECHDRTypeMFHDR3):
            enumValue = AECXChromatixEventType::AECHDRTypeMFHDR3;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECHDRTypeSFEQHDR):
            enumValue = AECXChromatixEventType::AECHDRTypeSFEQHDR;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECVideo):
            enumValue = AECXChromatixEventType::AECVideo;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECAFLowLumaAlert):
            enumValue = AECXChromatixEventType::AECAFLowLumaAlert;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECIsMonoMotion):
            enumValue = AECXChromatixEventType::AECIsMonoMotion;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECROIActive):
            enumValue = AECXChromatixEventType::AECROIActive;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECCameraSwitches):
            enumValue = AECXChromatixEventType::AECCameraSwitches;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECCustomContext1):
            enumValue = AECXChromatixEventType::AECCustomContext1;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECCustomContext2):
            enumValue = AECXChromatixEventType::AECCustomContext2;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECCustomContext3):
            enumValue = AECXChromatixEventType::AECCustomContext3;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECCustomContext4):
            enumValue = AECXChromatixEventType::AECCustomContext4;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECCustomContext5):
            enumValue = AECXChromatixEventType::AECCustomContext5;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECCustomContext6):
            enumValue = AECXChromatixEventType::AECCustomContext6;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECCustomContext7):
            enumValue = AECXChromatixEventType::AECCustomContext7;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECCustomContext8):
            enumValue = AECXChromatixEventType::AECCustomContext8;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECCustomContext9):
            enumValue = AECXChromatixEventType::AECCustomContext9;
            result    = true;
            break;
        case static_cast<UINT32>(AECXChromatixEventType::AECCustomContext10):
            enumValue = AECXChromatixEventType::AECCustomContext10;
            result    = true;
            break;
        default:
            PARAMETER_LOG_ERROR(entry->SetManager, "Invalid value(% u) converting UINT32 to AECXChromatixEventType", 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_AECXBankIDType(
    ParameterFileSymbolTableEntry* const entry,
    AECXBankIDType& enumValue,
    BYTE const alignment)
{
    bool result {false};

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

    if (result)
    {
        switch (uintValue)
        {
        case static_cast<UINT32>(AECXBankIDType::BankIDROITable):
            enumValue = AECXBankIDType::BankIDROITable;
            result    = true;
            break;
        case static_cast<UINT32>(AECXBankIDType::BankIDMetering2D):
            enumValue = AECXBankIDType::BankIDMetering2D;
            result    = true;
            break;
        case static_cast<UINT32>(AECXBankIDType::BankIDMetering1D):
            enumValue = AECXBankIDType::BankIDMetering1D;
            result    = true;
            break;
        case static_cast<UINT32>(AECXBankIDType::BankIDSceneAnalyzer):
            enumValue = AECXBankIDType::BankIDSceneAnalyzer;
            result    = true;
            break;
        case static_cast<UINT32>(AECXBankIDType::BankIDStatsCalculator):
            enumValue = AECXBankIDType::BankIDStatsCalculator;
            result    = true;
            break;
        case static_cast<UINT32>(AECXBankIDType::BankIDArbitrationTable):
            enumValue = AECXBankIDType::BankIDArbitrationTable;
            result    = true;
            break;
        case static_cast<UINT32>(AECXBankIDType::BankIDArbitrationOrder):
            enumValue = AECXBankIDType::BankIDArbitrationOrder;
            result    = true;
            break;
        case static_cast<UINT32>(AECXBankIDType::BankIDArbitrationLUT):
            enumValue = AECXBankIDType::BankIDArbitrationLUT;
            result    = true;
            break;
        case static_cast<UINT32>(AECXBankIDType::BankIDArbitrationRange):
            enumValue = AECXBankIDType::BankIDArbitrationRange;
            result    = true;
            break;
        case static_cast<UINT32>(AECXBankIDType::BankIDTriggers):
            enumValue = AECXBankIDType::BankIDTriggers;
            result    = true;
            break;
        case static_cast<UINT32>(AECXBankIDType::BankIDActiveAnalyzers):
            enumValue = AECXBankIDType::BankIDActiveAnalyzers;
            result    = true;
            break;
        case static_cast<UINT32>(AECXBankIDType::BankIDConvBase):
            enumValue = AECXBankIDType::BankIDConvBase;
            result    = true;
            break;
        case static_cast<UINT32>(AECXBankIDType::BankIDConvStretch):
            enumValue = AECXBankIDType::BankIDConvStretch;
            result    = true;
            break;
        case static_cast<UINT32>(AECXBankIDType::BankIDConvSettle):
            enumValue = AECXBankIDType::BankIDConvSettle;
            result    = true;
            break;
        case static_cast<UINT32>(AECXBankIDType::BankIDConvActiveSCD):
            enumValue = AECXBankIDType::BankIDConvActiveSCD;
            result    = true;
            break;
        case static_cast<UINT32>(AECXBankIDType::BankIDActiveCalculators):
            enumValue = AECXBankIDType::BankIDActiveCalculators;
            result    = true;
            break;
        case static_cast<UINT32>(AECXBankIDType::BankIDSnapshot):
            enumValue = AECXBankIDType::BankIDSnapshot;
            result    = true;
            break;
        case static_cast<UINT32>(AECXBankIDType::BankIDConvConstraints):
            enumValue = AECXBankIDType::BankIDConvConstraints;
            result    = true;
            break;
        case static_cast<UINT32>(AECXBankIDType::BankIDConvDRC):
            enumValue = AECXBankIDType::BankIDConvDRC;
            result    = true;
            break;
        case static_cast<UINT32>(AECXBankIDType::BankIDMax):
            enumValue = AECXBankIDType::BankIDMax;
            result    = true;
            break;
        case static_cast<UINT32>(AECXBankIDType::BankIDInvalid):
            enumValue = AECXBankIDType::BankIDInvalid;
            result    = true;
            break;
        default:
            PARAMETER_LOG_ERROR(entry->SetManager, "Invalid value(% u) converting UINT32 to AECXBankIDType", 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_AECXModuleIDType(
    ParameterFileSymbolTableEntry* const entry,
    AECXModuleIDType& enumValue,
    BYTE const alignment)
{
    bool result {false};

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

    if (result)
    {
        switch (uintValue)
        {
        case static_cast<UINT32>(AECXModuleIDType::ModuleIDInvalid):
            enumValue = AECXModuleIDType::ModuleIDInvalid;
            result    = true;
            break;
        case static_cast<UINT32>(AECXModuleIDType::ModuleIDStats):
            enumValue = AECXModuleIDType::ModuleIDStats;
            result    = true;
            break;
        case static_cast<UINT32>(AECXModuleIDType::ModuleIDMetering):
            enumValue = AECXModuleIDType::ModuleIDMetering;
            result    = true;
            break;
        case static_cast<UINT32>(AECXModuleIDType::ModuleIDConvergence):
            enumValue = AECXModuleIDType::ModuleIDConvergence;
            result    = true;
            break;
        case static_cast<UINT32>(AECXModuleIDType::ModuleIDArbitration):
            enumValue = AECXModuleIDType::ModuleIDArbitration;
            result    = true;
            break;
        case static_cast<UINT32>(AECXModuleIDType::ModuleIDExtension):
            enumValue = AECXModuleIDType::ModuleIDExtension;
            result    = true;
            break;
        default:
            PARAMETER_LOG_ERROR(entry->SetManager, "Invalid value(% u) converting UINT32 to AECXModuleIDType", 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_AECXSubSamplingType(
    ParameterFileSymbolTableEntry* const entry,
    AECXSubSamplingType& enumValue,
    BYTE const alignment)
{
    bool result {false};

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

    if (result)
    {
        switch (uintValue)
        {
        case static_cast<UINT32>(AECXSubSamplingType::SubSamplingOff):
            enumValue = AECXSubSamplingType::SubSamplingOff;
            result    = true;
            break;
        case static_cast<UINT32>(AECXSubSamplingType::SubSampling_2):
            enumValue = AECXSubSamplingType::SubSampling_2;
            result    = true;
            break;
        case static_cast<UINT32>(AECXSubSamplingType::SubSampling_4):
            enumValue = AECXSubSamplingType::SubSampling_4;
            result    = true;
            break;
        case static_cast<UINT32>(AECXSubSamplingType::SubSampling_6):
            enumValue = AECXSubSamplingType::SubSampling_6;
            result    = true;
            break;
        case static_cast<UINT32>(AECXSubSamplingType::SubSampling_12):
            enumValue = AECXSubSamplingType::SubSampling_12;
            result    = true;
            break;
        case static_cast<UINT32>(AECXSubSamplingType::SubSampling_OneSample):
            enumValue = AECXSubSamplingType::SubSampling_OneSample;
            result    = true;
            break;
        default:
            PARAMETER_LOG_ERROR(entry->SetManager, "Invalid value(% u) converting UINT32 to AECXSubSamplingType", 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_AECXTriggerType(
    ParameterFileSymbolTableEntry* const entry,
    AECXTriggerType& enumValue,
    BYTE const alignment)
{
    bool result {false};

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

    if (result)
    {
        switch (uintValue)
        {
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlNone):
            enumValue = AECXTriggerType::TriggerCtrlNone;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlPrev):
            enumValue = AECXTriggerType::TriggerCtrlPrev;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlTarget):
            enumValue = AECXTriggerType::TriggerCtrlTarget;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlTgtMatchDelta):
            enumValue = AECXTriggerType::TriggerCtrlTgtMatchDelta;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlTgtPrevDelta):
            enumValue = AECXTriggerType::TriggerCtrlTgtPrevDelta;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlDarkRatio):
            enumValue = AECXTriggerType::TriggerCtrlDarkRatio;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlSatRatio):
            enumValue = AECXTriggerType::TriggerCtrlSatRatio;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlDirection):
            enumValue = AECXTriggerType::TriggerCtrlDirection;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlLux):
            enumValue = AECXTriggerType::TriggerCtrlLux;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlFPS):
            enumValue = AECXTriggerType::TriggerCtrlFPS;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlExpTime):
            enumValue = AECXTriggerType::TriggerCtrlExpTime;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlGain):
            enumValue = AECXTriggerType::TriggerCtrlGain;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlSensitivity):
            enumValue = AECXTriggerType::TriggerCtrlSensitivity;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlLuma):
            enumValue = AECXTriggerType::TriggerCtrlLuma;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlGyro):
            enumValue = AECXTriggerType::TriggerCtrlGyro;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlDistance):
            enumValue = AECXTriggerType::TriggerCtrlDistance;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerFlashFlux):
            enumValue = AECXTriggerType::TriggerFlashFlux;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerFlashExpIncrease):
            enumValue = AECXTriggerType::TriggerFlashExpIncrease;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerFlashInfluence):
            enumValue = AECXTriggerType::TriggerFlashInfluence;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerSCDExternal1):
            enumValue = AECXTriggerType::TriggerSCDExternal1;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerSCDExternal2):
            enumValue = AECXTriggerType::TriggerSCDExternal2;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlAWBRedGain):
            enumValue = AECXTriggerType::TriggerCtrlAWBRedGain;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlAWBGreenGain):
            enumValue = AECXTriggerType::TriggerCtrlAWBGreenGain;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlAWBBlueGain):
            enumValue = AECXTriggerType::TriggerCtrlAWBBlueGain;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlHDRDRCGain):
            enumValue = AECXTriggerType::TriggerCtrlHDRDRCGain;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlHDRADRCGain):
            enumValue = AECXTriggerType::TriggerCtrlHDRADRCGain;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlHDRDarkBoostGain):
            enumValue = AECXTriggerType::TriggerCtrlHDRDarkBoostGain;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlAmbientRaw):
            enumValue = AECXTriggerType::TriggerCtrlAmbientRaw;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlShortExp):
            enumValue = AECXTriggerType::TriggerCtrlShortExp;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlLongExp):
            enumValue = AECXTriggerType::TriggerCtrlLongExp;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlSafeExp):
            enumValue = AECXTriggerType::TriggerCtrlSafeExp;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlShortTgt):
            enumValue = AECXTriggerType::TriggerCtrlShortTgt;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlLongTgt):
            enumValue = AECXTriggerType::TriggerCtrlLongTgt;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlSafeTgt):
            enumValue = AECXTriggerType::TriggerCtrlSafeTgt;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlFlashBackGrdPct):
            enumValue = AECXTriggerType::TriggerCtrlFlashBackGrdPct;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlSaliencyValue):
            enumValue = AECXTriggerType::TriggerCtrlSaliencyValue;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlShortExpFLow):
            enumValue = AECXTriggerType::TriggerCtrlShortExpFLow;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlLongExpFLow):
            enumValue = AECXTriggerType::TriggerCtrlLongExpFLow;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlSafeExpFLow):
            enumValue = AECXTriggerType::TriggerCtrlSafeExpFLow;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlFlashForeGrdPct):
            enumValue = AECXTriggerType::TriggerCtrlFlashForeGrdPct;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlPrecisionFlashDelay):
            enumValue = AECXTriggerType::TriggerCtrlPrecisionFlashDelay;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlPrecisionFlashMinTime):
            enumValue = AECXTriggerType::TriggerCtrlPrecisionFlashMinTime;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlPrecisionFlashMaxExpTimeMs):
            enumValue = AECXTriggerType::TriggerCtrlPrecisionFlashMaxExpTimeMs;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlPrecisionFlashE1):
            enumValue = AECXTriggerType::TriggerCtrlPrecisionFlashE1;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlPrecisionFlashE2):
            enumValue = AECXTriggerType::TriggerCtrlPrecisionFlashE2;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlPrecisionFlashOk):
            enumValue = AECXTriggerType::TriggerCtrlPrecisionFlashOk;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlBracketEV):
            enumValue = AECXTriggerType::TriggerCtrlBracketEV;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlEVNegativeOverride):
            enumValue = AECXTriggerType::TriggerCtrlEVNegativeOverride;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlEVPositiveOverride):
            enumValue = AECXTriggerType::TriggerCtrlEVPositiveOverride;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlPreflashLuxIndex):
            enumValue = AECXTriggerType::TriggerCtrlPreflashLuxIndex;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlFullflashLuxIndex):
            enumValue = AECXTriggerType::TriggerCtrlFullflashLuxIndex;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlQLLDynamicRange):
            enumValue = AECXTriggerType::TriggerCtrlQLLDynamicRange;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlExposureRatioReflected):
            enumValue = AECXTriggerType::TriggerCtrlExposureRatioReflected;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlExposureRatioTarget):
            enumValue = AECXTriggerType::TriggerCtrlExposureRatioTarget;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlADRCCap):
            enumValue = AECXTriggerType::TriggerCtrlADRCCap;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrl3HDRBinning):
            enumValue = AECXTriggerType::TriggerCtrl3HDRBinning;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerFlashSatStatsRatio):
            enumValue = AECXTriggerType::TriggerFlashSatStatsRatio;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlMagnetInfoX):
            enumValue = AECXTriggerType::TriggerCtrlMagnetInfoX;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlMagnetInfoY):
            enumValue = AECXTriggerType::TriggerCtrlMagnetInfoY;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlMagnetInfoZ):
            enumValue = AECXTriggerType::TriggerCtrlMagnetInfoZ;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlPrecisionFlashInfluence):
            enumValue = AECXTriggerType::TriggerCtrlPrecisionFlashInfluence;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlPrecisionFlashHistoryL):
            enumValue = AECXTriggerType::TriggerCtrlPrecisionFlashHistoryL;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlPrecisionFlashHistoryH):
            enumValue = AECXTriggerType::TriggerCtrlPrecisionFlashHistoryH;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlInputIlluminance):
            enumValue = AECXTriggerType::TriggerCtrlInputIlluminance;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlIsFlickerDetected):
            enumValue = AECXTriggerType::TriggerCtrlIsFlickerDetected;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlMotionMagnitude):
            enumValue = AECXTriggerType::TriggerCtrlMotionMagnitude;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlDepthPreflashWeight):
            enumValue = AECXTriggerType::TriggerCtrlDepthPreflashWeight;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlDepthPreflashSatPcnt):
            enumValue = AECXTriggerType::TriggerCtrlDepthPreflashSatPcnt;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlSensor1Exp):
            enumValue = AECXTriggerType::TriggerCtrlSensor1Exp;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlSensor2Exp):
            enumValue = AECXTriggerType::TriggerCtrlSensor2Exp;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlSensor3Exp):
            enumValue = AECXTriggerType::TriggerCtrlSensor3Exp;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlSensor4Exp):
            enumValue = AECXTriggerType::TriggerCtrlSensor4Exp;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlShortConvOut):
            enumValue = AECXTriggerType::TriggerCtrlShortConvOut;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlLongConvOut):
            enumValue = AECXTriggerType::TriggerCtrlLongConvOut;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlSafeConvOut):
            enumValue = AECXTriggerType::TriggerCtrlSafeConvOut;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlSensor1ConvOut):
            enumValue = AECXTriggerType::TriggerCtrlSensor1ConvOut;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlSensor2ConvOut):
            enumValue = AECXTriggerType::TriggerCtrlSensor2ConvOut;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlSensor3ConvOut):
            enumValue = AECXTriggerType::TriggerCtrlSensor3ConvOut;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlSensor4ConvOut):
            enumValue = AECXTriggerType::TriggerCtrlSensor4ConvOut;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlADRCGainConvOut):
            enumValue = AECXTriggerType::TriggerCtrlADRCGainConvOut;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlDBGainConvOut):
            enumValue = AECXTriggerType::TriggerCtrlDBGainConvOut;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlArbitraryFlickerPeriod):
            enumValue = AECXTriggerType::TriggerCtrlArbitraryFlickerPeriod;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlExposureCount):
            enumValue = AECXTriggerType::TriggerCtrlExposureCount;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlSensor1ExpFLow):
            enumValue = AECXTriggerType::TriggerCtrlSensor1ExpFLow;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlSensor2ExpFLow):
            enumValue = AECXTriggerType::TriggerCtrlSensor2ExpFLow;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlSensor3ExpFLow):
            enumValue = AECXTriggerType::TriggerCtrlSensor3ExpFLow;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlSensor4ExpFLow):
            enumValue = AECXTriggerType::TriggerCtrlSensor4ExpFLow;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlSensor1Tgt):
            enumValue = AECXTriggerType::TriggerCtrlSensor1Tgt;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlSensor2Tgt):
            enumValue = AECXTriggerType::TriggerCtrlSensor2Tgt;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlSensor3Tgt):
            enumValue = AECXTriggerType::TriggerCtrlSensor3Tgt;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlSensor4Tgt):
            enumValue = AECXTriggerType::TriggerCtrlSensor4Tgt;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlAWBInfoFaceROI):
            enumValue = AECXTriggerType::TriggerCtrlAWBInfoFaceROI;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrl3HDRSeamlessMode):
            enumValue = AECXTriggerType::TriggerCtrl3HDRSeamlessMode;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlExposureCompensationEV):
            enumValue = AECXTriggerType::TriggerCtrlExposureCompensationEV;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlIsStatsValid):
            enumValue = AECXTriggerType::TriggerCtrlIsStatsValid;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlShortBlendRatio):
            enumValue = AECXTriggerType::TriggerCtrlShortBlendRatio;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlQLLUnderExposure):
            enumValue = AECXTriggerType::TriggerCtrlQLLUnderExposure;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlExtraShortExp):
            enumValue = AECXTriggerType::TriggerCtrlExtraShortExp;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlIsExtraShortActive):
            enumValue = AECXTriggerType::TriggerCtrlIsExtraShortActive;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlADRCDelta):
            enumValue = AECXTriggerType::TriggerCtrlADRCDelta;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlFlashOffLuma):
            enumValue = AECXTriggerType::TriggerCtrlFlashOffLuma;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlTofAvgDistance):
            enumValue = AECXTriggerType::TriggerCtrlTofAvgDistance;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlDominantFaceSize):
            enumValue = AECXTriggerType::TriggerCtrlDominantFaceSize;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlDominantFaceLuma):
            enumValue = AECXTriggerType::TriggerCtrlDominantFaceLuma;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlConvSettled):
            enumValue = AECXTriggerType::TriggerCtrlConvSettled;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlReflectedEffShortPG):
            enumValue = AECXTriggerType::TriggerCtrlReflectedEffShortPG;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlAWBFaceTone1):
            enumValue = AECXTriggerType::TriggerCtrlAWBFaceTone1;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlAWBFaceTone2):
            enumValue = AECXTriggerType::TriggerCtrlAWBFaceTone2;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlDominantFaceSpeed):
            enumValue = AECXTriggerType::TriggerCtrlDominantFaceSpeed;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlBrightRatioHold):
            enumValue = AECXTriggerType::TriggerCtrlBrightRatioHold;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlFCGState):
            enumValue = AECXTriggerType::TriggerCtrlFCGState;
            result    = true;
            break;
        case static_cast<UINT32>(AECXTriggerType::TriggerCtrlMax):
            enumValue = AECXTriggerType::TriggerCtrlMax;
            result    = true;
            break;
        default:
            PARAMETER_LOG_ERROR(entry->SetManager, "Invalid value(% u) converting UINT32 to AECXTriggerType", 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_AECXStartUpExpType(
    ParameterFileSymbolTableEntry* const entry,
    AECXStartUpExpType& enumValue,
    BYTE const alignment)
{
    bool result {false};

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

    if (result)
    {
        switch (uintValue)
        {
        case static_cast<UINT32>(AECXStartUpExpType::AECStartUpDefault):
            enumValue = AECXStartUpExpType::AECStartUpDefault;
            result    = true;
            break;
        case static_cast<UINT32>(AECXStartUpExpType::AECStartUpFastAEC):
            enumValue = AECXStartUpExpType::AECStartUpFastAEC;
            result    = true;
            break;
        case static_cast<UINT32>(AECXStartUpExpType::AECStartUpAggressiveAEC):
            enumValue = AECXStartUpExpType::AECStartUpAggressiveAEC;
            result    = true;
            break;
        case static_cast<UINT32>(AECXStartUpExpType::AECStartUpPreflash):
            enumValue = AECXStartUpExpType::AECStartUpPreflash;
            result    = true;
            break;
        case static_cast<UINT32>(AECXStartUpExpType::AECStartUpCustom1):
            enumValue = AECXStartUpExpType::AECStartUpCustom1;
            result    = true;
            break;
        case static_cast<UINT32>(AECXStartUpExpType::AECStartUpCustom2):
            enumValue = AECXStartUpExpType::AECStartUpCustom2;
            result    = true;
            break;
        case static_cast<UINT32>(AECXStartUpExpType::AECStartUpCustom3):
            enumValue = AECXStartUpExpType::AECStartUpCustom3;
            result    = true;
            break;
        case static_cast<UINT32>(AECXStartUpExpType::AECStartUpCustom4):
            enumValue = AECXStartUpExpType::AECStartUpCustom4;
            result    = true;
            break;
        case static_cast<UINT32>(AECXStartUpExpType::AECStartUpCustom5):
            enumValue = AECXStartUpExpType::AECStartUpCustom5;
            result    = true;
            break;
        case static_cast<UINT32>(AECXStartUpExpType::AECStartUpMax):
            enumValue = AECXStartUpExpType::AECStartUpMax;
            result    = true;
            break;
        default:
            PARAMETER_LOG_ERROR(entry->SetManager, "Invalid value(% u) converting UINT32 to AECXStartUpExpType", 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_AECXStatsType(
    ParameterFileSymbolTableEntry* const entry,
    AECXStatsType& enumValue,
    BYTE const alignment)
{
    bool result {false};

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

    if (result)
    {
        switch (uintValue)
        {
        case static_cast<UINT32>(AECXStatsType::AECXStatsGrid):
            enumValue = AECXStatsType::AECXStatsGrid;
            result    = true;
            break;
        case static_cast<UINT32>(AECXStatsType::AECXStatsHist):
            enumValue = AECXStatsType::AECXStatsHist;
            result    = true;
            break;
        case static_cast<UINT32>(AECXStatsType::AECXStatsBFW):
            enumValue = AECXStatsType::AECXStatsBFW;
            result    = true;
            break;
        default:
            PARAMETER_LOG_ERROR(entry->SetManager, "Invalid value(% u) converting UINT32 to AECXStatsType", 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_AECXExposureSelection(
    ParameterFileSymbolTableEntry* const entry,
    AECXExposureSelection& enumValue,
    BYTE const alignment)
{
    bool result {false};

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

    if (result)
    {
        switch (uintValue)
        {
        case static_cast<UINT32>(AECXExposureSelection::ExposureShort):
            enumValue = AECXExposureSelection::ExposureShort;
            result    = true;
            break;
        case static_cast<UINT32>(AECXExposureSelection::ExposureSafe):
            enumValue = AECXExposureSelection::ExposureSafe;
            result    = true;
            break;
        case static_cast<UINT32>(AECXExposureSelection::ExposureLong):
            enumValue = AECXExposureSelection::ExposureLong;
            result    = true;
            break;
        case static_cast<UINT32>(AECXExposureSelection::ExposureExtraShort):
            enumValue = AECXExposureSelection::ExposureExtraShort;
            result    = true;
            break;
        case static_cast<UINT32>(AECXExposureSelection::ExposureSensor1):
            enumValue = AECXExposureSelection::ExposureSensor1;
            result    = true;
            break;
        case static_cast<UINT32>(AECXExposureSelection::ExposureSensor2):
            enumValue = AECXExposureSelection::ExposureSensor2;
            result    = true;
            break;
        case static_cast<UINT32>(AECXExposureSelection::ExposureSensor3):
            enumValue = AECXExposureSelection::ExposureSensor3;
            result    = true;
            break;
        case static_cast<UINT32>(AECXExposureSelection::ExposureSensor4):
            enumValue = AECXExposureSelection::ExposureSensor4;
            result    = true;
            break;
        case static_cast<UINT32>(AECXExposureSelection::ExposureMerged):
            enumValue = AECXExposureSelection::ExposureMerged;
            result    = true;
            break;
        case static_cast<UINT32>(AECXExposureSelection::ExposureNone):
            enumValue = AECXExposureSelection::ExposureNone;
            result    = true;
            break;
        default:
            PARAMETER_LOG_ERROR(entry->SetManager, "Invalid value(% u) converting UINT32 to AECXExposureSelection", 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_FlashStatus(
    ParameterFileSymbolTableEntry* const entry,
    FlashStatus& enumValue,
    BYTE const alignment)
{
    bool result {false};

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

    if (result)
    {
        switch (uintValue)
        {
        case static_cast<UINT32>(FlashStatus::FlashOff):
            enumValue = FlashStatus::FlashOff;
            result    = true;
            break;
        case static_cast<UINT32>(FlashStatus::FlashLow):
            enumValue = FlashStatus::FlashLow;
            result    = true;
            break;
        default:
            PARAMETER_LOG_ERROR(entry->SetManager, "Invalid value(% u) converting UINT32 to FlashStatus", 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_AECSwitchCounterEnumType(
    ParameterFileSymbolTableEntry* const entry,
    AECSwitchCounterEnumType& enumValue,
    BYTE const alignment)
{
    bool result {false};

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

    if (result)
    {
        switch (uintValue)
        {
        case static_cast<UINT32>(AECSwitchCounterEnumType::SwitchCounterSystemDelay):
            enumValue = AECSwitchCounterEnumType::SwitchCounterSystemDelay;
            result    = true;
            break;
        case static_cast<UINT32>(AECSwitchCounterEnumType::SwitchCounterDisable):
            enumValue = AECSwitchCounterEnumType::SwitchCounterDisable;
            result    = true;
            break;
        case static_cast<UINT32>(AECSwitchCounterEnumType::SwitchCounterCustomInteger):
            enumValue = AECSwitchCounterEnumType::SwitchCounterCustomInteger;
            result    = true;
            break;
        case static_cast<UINT32>(AECSwitchCounterEnumType::SwitchCounterAdvanced1):
            enumValue = AECSwitchCounterEnumType::SwitchCounterAdvanced1;
            result    = true;
            break;
        case static_cast<UINT32>(AECSwitchCounterEnumType::SwitchCounterAdvanced2):
            enumValue = AECSwitchCounterEnumType::SwitchCounterAdvanced2;
            result    = true;
            break;
        default:
            PARAMETER_LOG_ERROR(entry->SetManager, "Invalid value(% u) converting UINT32 to AECSwitchCounterEnumType", 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_ArbitrationControl(
    ParameterFileSymbolTableEntry* const entry,
    ArbitrationControl& enumValue,
    BYTE const alignment)
{
    bool result {false};

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

    if (result)
    {
        switch (uintValue)
        {
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlTable):
            enumValue = ArbitrationControl::ArbCtrlTable;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlSensorRange):
            enumValue = ArbitrationControl::ArbCtrlSensorRange;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlTableGainRange):
            enumValue = ArbitrationControl::ArbCtrlTableGainRange;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlTableTimeRange):
            enumValue = ArbitrationControl::ArbCtrlTableTimeRange;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlEVRange):
            enumValue = ArbitrationControl::ArbCtrlEVRange;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlFPS):
            enumValue = ArbitrationControl::ArbCtrlFPS;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlFlicker50LUT):
            enumValue = ArbitrationControl::ArbCtrlFlicker50LUT;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlFlicker60LUT):
            enumValue = ArbitrationControl::ArbCtrlFlicker60LUT;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlFlickerArbitrary):
            enumValue = ArbitrationControl::ArbCtrlFlickerArbitrary;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlManualGain):
            enumValue = ArbitrationControl::ArbCtrlManualGain;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlManualISO):
            enumValue = ArbitrationControl::ArbCtrlManualISO;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlManualTime):
            enumValue = ArbitrationControl::ArbCtrlManualTime;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlManualFull):
            enumValue = ArbitrationControl::ArbCtrlManualFull;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlCustomRange):
            enumValue = ArbitrationControl::ArbCtrlCustomRange;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlCustomLUT):
            enumValue = ArbitrationControl::ArbCtrlCustomLUT;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlGyro):
            enumValue = ArbitrationControl::ArbCtrlGyro;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlTimeRangeShort):
            enumValue = ArbitrationControl::ArbCtrlTimeRangeShort;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlTimeRangeSafe):
            enumValue = ArbitrationControl::ArbCtrlTimeRangeSafe;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlTimeRangeLong):
            enumValue = ArbitrationControl::ArbCtrlTimeRangeLong;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlFlickerMaxTime):
            enumValue = ArbitrationControl::ArbCtrlFlickerMaxTime;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlMasterTime):
            enumValue = ArbitrationControl::ArbCtrlMasterTime;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlSetTimeAsMaxRange):
            enumValue = ArbitrationControl::ArbCtrlSetTimeAsMaxRange;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlSHDRTimeRange):
            enumValue = ArbitrationControl::ArbCtrlSHDRTimeRange;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlGainRangeShort):
            enumValue = ArbitrationControl::ArbCtrlGainRangeShort;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlGainRangeSafe):
            enumValue = ArbitrationControl::ArbCtrlGainRangeSafe;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlGainRangeLong):
            enumValue = ArbitrationControl::ArbCtrlGainRangeLong;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlSnapshotEVLUT):
            enumValue = ArbitrationControl::ArbCtrlSnapshotEVLUT;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlMatchHistory):
            enumValue = ArbitrationControl::ArbCtrlMatchHistory;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlMotion):
            enumValue = ArbitrationControl::ArbCtrlMotion;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlCopyTuning):
            enumValue = ArbitrationControl::ArbCtrlCopyTuning;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlAdvanced01):
            enumValue = ArbitrationControl::ArbCtrlAdvanced01;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlAdvanced02):
            enumValue = ArbitrationControl::ArbCtrlAdvanced02;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlAdvanced03):
            enumValue = ArbitrationControl::ArbCtrlAdvanced03;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlAdvanced04):
            enumValue = ArbitrationControl::ArbCtrlAdvanced04;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlAdvanced05):
            enumValue = ArbitrationControl::ArbCtrlAdvanced05;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlAdvanced06):
            enumValue = ArbitrationControl::ArbCtrlAdvanced06;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlAdvanced07):
            enumValue = ArbitrationControl::ArbCtrlAdvanced07;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlAdvanced08):
            enumValue = ArbitrationControl::ArbCtrlAdvanced08;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlAdvanced09):
            enumValue = ArbitrationControl::ArbCtrlAdvanced09;
            result    = true;
            break;
        case static_cast<UINT32>(ArbitrationControl::ArbCtrlAdvanced10):
            enumValue = ArbitrationControl::ArbCtrlAdvanced10;
            result    = true;
            break;
        default:
            PARAMETER_LOG_ERROR(entry->SetManager, "Invalid value(% u) converting UINT32 to ArbitrationControl", 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_VectorProcessorUsageType(
    ParameterFileSymbolTableEntry* const entry,
    VectorProcessorUsageType& enumValue,
    BYTE const alignment)
{
    bool result {false};

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

    if (result)
    {
        switch (uintValue)
        {
        case static_cast<UINT32>(VectorProcessorUsageType::Default):
            enumValue = VectorProcessorUsageType::Default;
            result    = true;
            break;
        case static_cast<UINT32>(VectorProcessorUsageType::Gyro):
            enumValue = VectorProcessorUsageType::Gyro;
            result    = true;
            break;
        default:
            PARAMETER_LOG_ERROR(entry->SetManager, "Invalid value(% u) converting UINT32 to VectorProcessorUsageType", 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_SnapshotSearchMethod(
    ParameterFileSymbolTableEntry* const entry,
    SnapshotSearchMethod& enumValue,
    BYTE const alignment)
{
    bool result {false};

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

    if (result)
    {
        switch (uintValue)
        {
        case static_cast<UINT32>(SnapshotSearchMethod::SearchEVType):
            enumValue = SnapshotSearchMethod::SearchEVType;
            result    = true;
            break;
        case static_cast<UINT32>(SnapshotSearchMethod::SearchEVUIVal):
            enumValue = SnapshotSearchMethod::SearchEVUIVal;
            result    = true;
            break;
        case static_cast<UINT32>(SnapshotSearchMethod::SearchOffset):
            enumValue = SnapshotSearchMethod::SearchOffset;
            result    = true;
            break;
        default:
            PARAMETER_LOG_ERROR(entry->SetManager, "Invalid value(% u) converting UINT32 to SnapshotSearchMethod", 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_PreviewSearchMethod(
    ParameterFileSymbolTableEntry* const entry,
    PreviewSearchMethod& enumValue,
    BYTE const alignment)
{
    bool result {false};

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

    if (result)
    {
        switch (uintValue)
        {
        case static_cast<UINT32>(PreviewSearchMethod::SearchLastNonSnapshotRequest):
            enumValue = PreviewSearchMethod::SearchLastNonSnapshotRequest;
            result    = true;
            break;
        case static_cast<UINT32>(PreviewSearchMethod::SearchOffset):
            enumValue = PreviewSearchMethod::SearchOffset;
            result    = true;
            break;
        default:
            PARAMETER_LOG_ERROR(entry->SetManager, "Invalid value(% u) converting UINT32 to PreviewSearchMethod", 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_EVOffsetType(
    ParameterFileSymbolTableEntry* const entry,
    EVOffsetType& enumValue,
    BYTE const alignment)
{
    bool result {false};

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

    if (result)
    {
        switch (uintValue)
        {
        case static_cast<UINT32>(EVOffsetType::EVZero):
            enumValue = EVOffsetType::EVZero;
            result    = true;
            break;
        case static_cast<UINT32>(EVOffsetType::EVPlus):
            enumValue = EVOffsetType::EVPlus;
            result    = true;
            break;
        case static_cast<UINT32>(EVOffsetType::EVMinus):
            enumValue = EVOffsetType::EVMinus;
            result    = true;
            break;
        default:
            PARAMETER_LOG_ERROR(entry->SetManager, "Invalid value(% u) converting UINT32 to EVOffsetType", 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_FrameType(
    ParameterFileSymbolTableEntry* const entry,
    FrameType& enumValue,
    BYTE const alignment)
{
    bool result {false};

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

    if (result)
    {
        switch (uintValue)
        {
        case static_cast<UINT32>(FrameType::TypeSnapshot):
            enumValue = FrameType::TypeSnapshot;
            result    = true;
            break;
        case static_cast<UINT32>(FrameType::TypePreview):
            enumValue = FrameType::TypePreview;
            result    = true;
            break;
        default:
            PARAMETER_LOG_ERROR(entry->SetManager, "Invalid value(% u) converting UINT32 to FrameType", 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_ExposureIncPrioType(
    ParameterFileSymbolTableEntry* const entry,
    ExposureIncPrioType& enumValue,
    BYTE const alignment)
{
    bool result {false};

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

    if (result)
    {
        switch (uintValue)
        {
        case static_cast<UINT32>(ExposureIncPrioType::AECExpIncGain):
            enumValue = ExposureIncPrioType::AECExpIncGain;
            result    = true;
            break;
        case static_cast<UINT32>(ExposureIncPrioType::AECExpIncTime):
            enumValue = ExposureIncPrioType::AECExpIncTime;
            result    = true;
            break;
        case static_cast<UINT32>(ExposureIncPrioType::AECExpIncMax):
            enumValue = ExposureIncPrioType::AECExpIncMax;
            result    = true;
            break;
        default:
            PARAMETER_LOG_ERROR(entry->SetManager, "Invalid value(% u) converting UINT32 to ExposureIncPrioType", 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_SensorStatsModeType(
    ParameterFileSymbolTableEntry* const entry,
    SensorStatsModeType& enumValue,
    BYTE const alignment)
{
    bool result {false};

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

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



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

    PARAMETER_INITIALIZE(start);
    PARAMETER_INITIALIZE(end);

    SYMBOL_TABLE_ENTRY_READ(entry, result, start, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, end, alignment)

    return result;
}

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

    PARAMETER_INITIALIZE(start);
    PARAMETER_INITIALIZE(end);

    SYMBOL_TABLE_ENTRY_READ(entry, result, start, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, end, alignment)

    return result;
}

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

    PARAMETER_INITIALIZE(data);

    SYMBOL_TABLE_ENTRY_READ(entry, result, data, alignment)

    return result;
}

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

    PARAMETER_INITIALIZE(triggerPt);
    PARAMETER_INITIALIZE(triggerData);

    result = triggerPt.Load(entry, alignment);
    if (result)
    {
        result = triggerData.Load(entry, alignment);
    }

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Load ModuleVersionType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool ModuleVersionType::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;
}

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

    PARAMETER_INITIALIZE(context);
    PARAMETER_INITIALIZE(priority);
    PARAMETER_INITIALIZE(dataID);


    // Reading Array context from symbol table
    // Do not check result value here because the count value needs to be initialized in this block
    {
        contextCount = 0;
        SYMBOL_TABLE_ENTRY_READ(entry, result, contextCount, alignment)
        constexpr const CHAR* const file {__FILE__};
        constexpr INT32 line {LINE_CONST};
        ParameterFileSymbolTableEntry  pointerEntryCls;
        ParameterFileSymbolTableEntry* const pointerEntry = &pointerEntryCls;
        if (result)
        {
            result = entry->Table->ReadPointerEntry(pointerEntryCls, entry, alignment);
        }

        if (result)
        {
            contextID = pointerEntry->ID;
            DupObjInfo* contextDupInfo = pointerEntry->GetDupObject(contextCount, file, line);
            if (contextDupInfo != nullptr && contextDupInfo->Object != nullptr)
            {
                context = (AECXChromatixEventType*)contextDupInfo->Object;
                if (context == nullptr)
                {
                    if (contextDupInfo->File != nullptr)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "context duplicate found but object is nullptr: %s:%d, RefCount: %d\n",
                            contextDupInfo->File, contextDupInfo->Line, contextDupInfo->RefCount);
                    }
                    else
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "context duplicate found but Object is nullptr: <nullptr file ptr>:%d, RefCount: %d\n",
                            contextDupInfo->Line, contextDupInfo->RefCount);
                    }
                }
            }

            if (context == nullptr)
            {
                if (result && contextCount > 0)
                {
                    context = PARAMETER_NEW AECXChromatixEventType[contextCount];
                    (void)pointerEntry->SetDupObject(context, contextCount, file, line);
                }
                if (!result || context == nullptr)
                {
                    if (contextCount > 0)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "Failed to allocate context\n");
                    }
                    contextCount = 0;
                }
                for (UINT32 i = 0; result && i < contextCount; i++)
                {
                    result = aecxglobalelements::ReadEnum_AECXChromatixEventType(pointerEntry, context[i], alignment);
                }
            }
        }
        if (context == nullptr)
        {
            contextCount = 0;
        }
    }
    SYMBOL_TABLE_ENTRY_READ(entry, result, priority, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, dataID, alignment)

    return result;
}

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

    PARAMETER_INITIALIZE(bankID);
    PARAMETER_INITIALIZE(priorityMap);

    result = aecxglobalelements::ReadEnum_AECXBankIDType(entry, bankID, alignment);

    // Reading Array priorityMap from symbol table
    // Do not check result value here because the count value needs to be initialized in this block
    {
        priorityMapCount = 0;
        SYMBOL_TABLE_ENTRY_READ(entry, result, priorityMapCount, alignment)
        constexpr const CHAR* const file {__FILE__};
        constexpr INT32 line {LINE_CONST};
        ParameterFileSymbolTableEntry  pointerEntryCls;
        ParameterFileSymbolTableEntry* const pointerEntry = &pointerEntryCls;
        if (result)
        {
            result = entry->Table->ReadPointerEntry(pointerEntryCls, entry, alignment);
        }

        if (result)
        {
            priorityMapID = pointerEntry->ID;
            DupObjInfo* priorityMapDupInfo = pointerEntry->GetDupObject(priorityMapCount, file, line);
            if (priorityMapDupInfo != nullptr && priorityMapDupInfo->Object != nullptr)
            {
                priorityMap = (ChromatixBankDataPriorityType*)priorityMapDupInfo->Object;
                if (priorityMap == nullptr)
                {
                    if (priorityMapDupInfo->File != nullptr)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "priorityMap duplicate found but object is nullptr: %s:%d, RefCount: %d\n",
                            priorityMapDupInfo->File, priorityMapDupInfo->Line, priorityMapDupInfo->RefCount);
                    }
                    else
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "priorityMap duplicate found but Object is nullptr: <nullptr file ptr>:%d, RefCount: %d\n",
                            priorityMapDupInfo->Line, priorityMapDupInfo->RefCount);
                    }
                }
            }

            if (priorityMap == nullptr)
            {
                if (result && priorityMapCount > 0)
                {
                    priorityMap = PARAMETER_NEW ChromatixBankDataPriorityType[priorityMapCount];
                    (void)pointerEntry->SetDupObject(priorityMap, priorityMapCount, file, line);
                }
                if (!result || priorityMap == nullptr)
                {
                    if (priorityMapCount > 0)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "Failed to allocate priorityMap\n");
                    }
                    priorityMapCount = 0;
                }
                for (UINT32 i = 0; result && i < priorityMapCount; i++)
                {
                    result = priorityMap[i].Load(pointerEntry, alignment);
                }
            }
        }
        if (priorityMap == nullptr)
        {
            priorityMapCount = 0;
        }
    }

    return result;
}

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

    PARAMETER_INITIALIZE(leftOffset);
    PARAMETER_INITIALIZE(topOffset);
    PARAMETER_INITIALIZE(width);
    PARAMETER_INITIALIZE(height);

    SYMBOL_TABLE_ENTRY_READ(entry, result, leftOffset, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, topOffset, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, width, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, height, alignment)

    return result;
}

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

    PARAMETER_INITIALIZE(dataID);
    PARAMETER_INITIALIZE(value);
    PARAMETER_INITIALIZE(description);

    SYMBOL_TABLE_ENTRY_READ(entry, result, dataID, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, value, alignment)

    // Reading String description from symbol table
    {
        UINT32 count = 0;
        SYMBOL_TABLE_ENTRY_READ(entry, result, count, alignment)
        ParameterFileSymbolTableEntry stringPointerEntryCls;
        ParameterFileSymbolTableEntry* const stringPointerEntry = &stringPointerEntryCls;
        if (result)
        {
            result = entry->Table->ReadPointerEntry(stringPointerEntryCls, entry, alignment);
        }
        SYMBOL_TABLE_ENTRY_READ_STRING(stringPointerEntry, result, description, count, alignment)
    }

    return result;
}

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

    PARAMETER_INITIALIZE(dataID);
    PARAMETER_INITIALIZE(value);
    PARAMETER_INITIALIZE(description);

    SYMBOL_TABLE_ENTRY_READ(entry, result, dataID, alignment)
    if (result)
    {
        result = value.Load(entry, alignment);
    }

    // Reading String description from symbol table
    {
        UINT32 count = 0;
        SYMBOL_TABLE_ENTRY_READ(entry, result, count, alignment)
        ParameterFileSymbolTableEntry stringPointerEntryCls;
        ParameterFileSymbolTableEntry* const stringPointerEntry = &stringPointerEntryCls;
        if (result)
        {
            result = entry->Table->ReadPointerEntry(stringPointerEntryCls, entry, alignment);
        }
        SYMBOL_TABLE_ENTRY_READ_STRING(stringPointerEntry, result, description, count, alignment)
    }

    return result;
}

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

    PARAMETER_INITIALIZE(value);

    SYMBOL_TABLE_ENTRY_READ(entry, result, value, alignment)

    return result;
}

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

    PARAMETER_INITIALIZE(trigger);
    PARAMETER_INITIALIZE(triggerData);

    result = trigger.Load(entry, alignment);
    if (result)
    {
        result = triggerData.Load(entry, alignment);
    }

    return result;
}

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

    PARAMETER_INITIALIZE(trigger1Type);
    PARAMETER_INITIALIZE(trigger1Data);

    result = aecxglobalelements::ReadEnum_AECXTriggerType(entry, trigger1Type, alignment);

    // Reading Array trigger1Data from symbol table
    // Do not check result value here because the count value needs to be initialized in this block
    {
        trigger1DataCount = 0;
        SYMBOL_TABLE_ENTRY_READ(entry, result, trigger1DataCount, alignment)
        constexpr const CHAR* const file {__FILE__};
        constexpr INT32 line {LINE_CONST};
        ParameterFileSymbolTableEntry  pointerEntryCls;
        ParameterFileSymbolTableEntry* const pointerEntry = &pointerEntryCls;
        if (result)
        {
            result = entry->Table->ReadPointerEntry(pointerEntryCls, entry, alignment);
        }

        if (result)
        {
            trigger1DataID = pointerEntry->ID;
            DupObjInfo* trigger1DataDupInfo = pointerEntry->GetDupObject(trigger1DataCount, file, line);
            if (trigger1DataDupInfo != nullptr && trigger1DataDupInfo->Object != nullptr)
            {
                trigger1Data = (TriggerSystemEndLevelType*)trigger1DataDupInfo->Object;
                if (trigger1Data == nullptr)
                {
                    if (trigger1DataDupInfo->File != nullptr)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger1Data duplicate found but object is nullptr: %s:%d, RefCount: %d\n",
                            trigger1DataDupInfo->File, trigger1DataDupInfo->Line, trigger1DataDupInfo->RefCount);
                    }
                    else
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger1Data duplicate found but Object is nullptr: <nullptr file ptr>:%d, RefCount: %d\n",
                            trigger1DataDupInfo->Line, trigger1DataDupInfo->RefCount);
                    }
                }
            }

            if (trigger1Data == nullptr)
            {
                if (result && trigger1DataCount > 0)
                {
                    trigger1Data = PARAMETER_NEW TriggerSystemEndLevelType[trigger1DataCount];
                    (void)pointerEntry->SetDupObject(trigger1Data, trigger1DataCount, file, line);
                }
                if (!result || trigger1Data == nullptr)
                {
                    if (trigger1DataCount > 0)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "Failed to allocate trigger1Data\n");
                    }
                    trigger1DataCount = 0;
                }
                for (UINT32 i = 0; result && i < trigger1DataCount; i++)
                {
                    result = trigger1Data[i].Load(pointerEntry, alignment);
                }
            }
        }
        if (trigger1Data == nullptr)
        {
            trigger1DataCount = 0;
        }
    }

    return result;
}

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

    PARAMETER_INITIALIZE(trigger);
    PARAMETER_INITIALIZE(trigger2Data);

    result = trigger.Load(entry, alignment);

    // Reading Array trigger2Data from symbol table
    // Do not check result value here because the count value needs to be initialized in this block
    {
        trigger2DataCount = 0;
        SYMBOL_TABLE_ENTRY_READ(entry, result, trigger2DataCount, alignment)
        constexpr const CHAR* const file {__FILE__};
        constexpr INT32 line {LINE_CONST};
        ParameterFileSymbolTableEntry  pointerEntryCls;
        ParameterFileSymbolTableEntry* const pointerEntry = &pointerEntryCls;
        if (result)
        {
            result = entry->Table->ReadPointerEntry(pointerEntryCls, entry, alignment);
        }

        if (result)
        {
            trigger2DataID = pointerEntry->ID;
            DupObjInfo* trigger2DataDupInfo = pointerEntry->GetDupObject(trigger2DataCount, file, line);
            if (trigger2DataDupInfo != nullptr && trigger2DataDupInfo->Object != nullptr)
            {
                trigger2Data = (TriggerSystemEndLevelType*)trigger2DataDupInfo->Object;
                if (trigger2Data == nullptr)
                {
                    if (trigger2DataDupInfo->File != nullptr)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger2Data duplicate found but object is nullptr: %s:%d, RefCount: %d\n",
                            trigger2DataDupInfo->File, trigger2DataDupInfo->Line, trigger2DataDupInfo->RefCount);
                    }
                    else
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger2Data duplicate found but Object is nullptr: <nullptr file ptr>:%d, RefCount: %d\n",
                            trigger2DataDupInfo->Line, trigger2DataDupInfo->RefCount);
                    }
                }
            }

            if (trigger2Data == nullptr)
            {
                if (result && trigger2DataCount > 0)
                {
                    trigger2Data = PARAMETER_NEW TriggerSystemEndLevelType[trigger2DataCount];
                    (void)pointerEntry->SetDupObject(trigger2Data, trigger2DataCount, file, line);
                }
                if (!result || trigger2Data == nullptr)
                {
                    if (trigger2DataCount > 0)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "Failed to allocate trigger2Data\n");
                    }
                    trigger2DataCount = 0;
                }
                for (UINT32 i = 0; result && i < trigger2DataCount; i++)
                {
                    result = trigger2Data[i].Load(pointerEntry, alignment);
                }
            }
        }
        if (trigger2Data == nullptr)
        {
            trigger2DataCount = 0;
        }
    }

    return result;
}

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

    PARAMETER_INITIALIZE(trigger1Type);
    PARAMETER_INITIALIZE(trigger2Type);
    PARAMETER_INITIALIZE(trigger1Data);

    result = aecxglobalelements::ReadEnum_AECXTriggerType(entry, trigger1Type, alignment);
    if (result)
    {
        result = aecxglobalelements::ReadEnum_AECXTriggerType(entry, trigger2Type, alignment);
    }

    // Reading Array trigger1Data from symbol table
    // Do not check result value here because the count value needs to be initialized in this block
    {
        trigger1DataCount = 0;
        SYMBOL_TABLE_ENTRY_READ(entry, result, trigger1DataCount, alignment)
        constexpr const CHAR* const file {__FILE__};
        constexpr INT32 line {LINE_CONST};
        ParameterFileSymbolTableEntry  pointerEntryCls;
        ParameterFileSymbolTableEntry* const pointerEntry = &pointerEntryCls;
        if (result)
        {
            result = entry->Table->ReadPointerEntry(pointerEntryCls, entry, alignment);
        }

        if (result)
        {
            trigger1DataID = pointerEntry->ID;
            DupObjInfo* trigger1DataDupInfo = pointerEntry->GetDupObject(trigger1DataCount, file, line);
            if (trigger1DataDupInfo != nullptr && trigger1DataDupInfo->Object != nullptr)
            {
                trigger1Data = (TwoLevelTriggerSystemLevel1Type*)trigger1DataDupInfo->Object;
                if (trigger1Data == nullptr)
                {
                    if (trigger1DataDupInfo->File != nullptr)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger1Data duplicate found but object is nullptr: %s:%d, RefCount: %d\n",
                            trigger1DataDupInfo->File, trigger1DataDupInfo->Line, trigger1DataDupInfo->RefCount);
                    }
                    else
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger1Data duplicate found but Object is nullptr: <nullptr file ptr>:%d, RefCount: %d\n",
                            trigger1DataDupInfo->Line, trigger1DataDupInfo->RefCount);
                    }
                }
            }

            if (trigger1Data == nullptr)
            {
                if (result && trigger1DataCount > 0)
                {
                    trigger1Data = PARAMETER_NEW TwoLevelTriggerSystemLevel1Type[trigger1DataCount];
                    (void)pointerEntry->SetDupObject(trigger1Data, trigger1DataCount, file, line);
                }
                if (!result || trigger1Data == nullptr)
                {
                    if (trigger1DataCount > 0)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "Failed to allocate trigger1Data\n");
                    }
                    trigger1DataCount = 0;
                }
                for (UINT32 i = 0; result && i < trigger1DataCount; i++)
                {
                    result = trigger1Data[i].Load(pointerEntry, alignment);
                }
            }
        }
        if (trigger1Data == nullptr)
        {
            trigger1DataCount = 0;
        }
    }

    return result;
}

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

    PARAMETER_INITIALIZE(trigger);
    PARAMETER_INITIALIZE(trigger3Data);

    result = trigger.Load(entry, alignment);

    // Reading Array trigger3Data from symbol table
    // Do not check result value here because the count value needs to be initialized in this block
    {
        trigger3DataCount = 0;
        SYMBOL_TABLE_ENTRY_READ(entry, result, trigger3DataCount, alignment)
        constexpr const CHAR* const file {__FILE__};
        constexpr INT32 line {LINE_CONST};
        ParameterFileSymbolTableEntry  pointerEntryCls;
        ParameterFileSymbolTableEntry* const pointerEntry = &pointerEntryCls;
        if (result)
        {
            result = entry->Table->ReadPointerEntry(pointerEntryCls, entry, alignment);
        }

        if (result)
        {
            trigger3DataID = pointerEntry->ID;
            DupObjInfo* trigger3DataDupInfo = pointerEntry->GetDupObject(trigger3DataCount, file, line);
            if (trigger3DataDupInfo != nullptr && trigger3DataDupInfo->Object != nullptr)
            {
                trigger3Data = (TriggerSystemEndLevelType*)trigger3DataDupInfo->Object;
                if (trigger3Data == nullptr)
                {
                    if (trigger3DataDupInfo->File != nullptr)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger3Data duplicate found but object is nullptr: %s:%d, RefCount: %d\n",
                            trigger3DataDupInfo->File, trigger3DataDupInfo->Line, trigger3DataDupInfo->RefCount);
                    }
                    else
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger3Data duplicate found but Object is nullptr: <nullptr file ptr>:%d, RefCount: %d\n",
                            trigger3DataDupInfo->Line, trigger3DataDupInfo->RefCount);
                    }
                }
            }

            if (trigger3Data == nullptr)
            {
                if (result && trigger3DataCount > 0)
                {
                    trigger3Data = PARAMETER_NEW TriggerSystemEndLevelType[trigger3DataCount];
                    (void)pointerEntry->SetDupObject(trigger3Data, trigger3DataCount, file, line);
                }
                if (!result || trigger3Data == nullptr)
                {
                    if (trigger3DataCount > 0)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "Failed to allocate trigger3Data\n");
                    }
                    trigger3DataCount = 0;
                }
                for (UINT32 i = 0; result && i < trigger3DataCount; i++)
                {
                    result = trigger3Data[i].Load(pointerEntry, alignment);
                }
            }
        }
        if (trigger3Data == nullptr)
        {
            trigger3DataCount = 0;
        }
    }

    return result;
}

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

    PARAMETER_INITIALIZE(trigger);
    PARAMETER_INITIALIZE(trigger2Data);

    result = trigger.Load(entry, alignment);

    // Reading Array trigger2Data from symbol table
    // Do not check result value here because the count value needs to be initialized in this block
    {
        trigger2DataCount = 0;
        SYMBOL_TABLE_ENTRY_READ(entry, result, trigger2DataCount, alignment)
        constexpr const CHAR* const file {__FILE__};
        constexpr INT32 line {LINE_CONST};
        ParameterFileSymbolTableEntry  pointerEntryCls;
        ParameterFileSymbolTableEntry* const pointerEntry = &pointerEntryCls;
        if (result)
        {
            result = entry->Table->ReadPointerEntry(pointerEntryCls, entry, alignment);
        }

        if (result)
        {
            trigger2DataID = pointerEntry->ID;
            DupObjInfo* trigger2DataDupInfo = pointerEntry->GetDupObject(trigger2DataCount, file, line);
            if (trigger2DataDupInfo != nullptr && trigger2DataDupInfo->Object != nullptr)
            {
                trigger2Data = (ThreeLevelTriggerSystemLevel2Type*)trigger2DataDupInfo->Object;
                if (trigger2Data == nullptr)
                {
                    if (trigger2DataDupInfo->File != nullptr)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger2Data duplicate found but object is nullptr: %s:%d, RefCount: %d\n",
                            trigger2DataDupInfo->File, trigger2DataDupInfo->Line, trigger2DataDupInfo->RefCount);
                    }
                    else
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger2Data duplicate found but Object is nullptr: <nullptr file ptr>:%d, RefCount: %d\n",
                            trigger2DataDupInfo->Line, trigger2DataDupInfo->RefCount);
                    }
                }
            }

            if (trigger2Data == nullptr)
            {
                if (result && trigger2DataCount > 0)
                {
                    trigger2Data = PARAMETER_NEW ThreeLevelTriggerSystemLevel2Type[trigger2DataCount];
                    (void)pointerEntry->SetDupObject(trigger2Data, trigger2DataCount, file, line);
                }
                if (!result || trigger2Data == nullptr)
                {
                    if (trigger2DataCount > 0)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "Failed to allocate trigger2Data\n");
                    }
                    trigger2DataCount = 0;
                }
                for (UINT32 i = 0; result && i < trigger2DataCount; i++)
                {
                    result = trigger2Data[i].Load(pointerEntry, alignment);
                }
            }
        }
        if (trigger2Data == nullptr)
        {
            trigger2DataCount = 0;
        }
    }

    return result;
}

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

    PARAMETER_INITIALIZE(trigger1Type);
    PARAMETER_INITIALIZE(trigger2Type);
    PARAMETER_INITIALIZE(trigger3Type);
    PARAMETER_INITIALIZE(trigger1Data);

    result = aecxglobalelements::ReadEnum_AECXTriggerType(entry, trigger1Type, alignment);
    if (result)
    {
        result = aecxglobalelements::ReadEnum_AECXTriggerType(entry, trigger2Type, alignment);
    }
    if (result)
    {
        result = aecxglobalelements::ReadEnum_AECXTriggerType(entry, trigger3Type, alignment);
    }

    // Reading Array trigger1Data from symbol table
    // Do not check result value here because the count value needs to be initialized in this block
    {
        trigger1DataCount = 0;
        SYMBOL_TABLE_ENTRY_READ(entry, result, trigger1DataCount, alignment)
        constexpr const CHAR* const file {__FILE__};
        constexpr INT32 line {LINE_CONST};
        ParameterFileSymbolTableEntry  pointerEntryCls;
        ParameterFileSymbolTableEntry* const pointerEntry = &pointerEntryCls;
        if (result)
        {
            result = entry->Table->ReadPointerEntry(pointerEntryCls, entry, alignment);
        }

        if (result)
        {
            trigger1DataID = pointerEntry->ID;
            DupObjInfo* trigger1DataDupInfo = pointerEntry->GetDupObject(trigger1DataCount, file, line);
            if (trigger1DataDupInfo != nullptr && trigger1DataDupInfo->Object != nullptr)
            {
                trigger1Data = (ThreeLevelTriggerSystemLevel1Type*)trigger1DataDupInfo->Object;
                if (trigger1Data == nullptr)
                {
                    if (trigger1DataDupInfo->File != nullptr)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger1Data duplicate found but object is nullptr: %s:%d, RefCount: %d\n",
                            trigger1DataDupInfo->File, trigger1DataDupInfo->Line, trigger1DataDupInfo->RefCount);
                    }
                    else
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger1Data duplicate found but Object is nullptr: <nullptr file ptr>:%d, RefCount: %d\n",
                            trigger1DataDupInfo->Line, trigger1DataDupInfo->RefCount);
                    }
                }
            }

            if (trigger1Data == nullptr)
            {
                if (result && trigger1DataCount > 0)
                {
                    trigger1Data = PARAMETER_NEW ThreeLevelTriggerSystemLevel1Type[trigger1DataCount];
                    (void)pointerEntry->SetDupObject(trigger1Data, trigger1DataCount, file, line);
                }
                if (!result || trigger1Data == nullptr)
                {
                    if (trigger1DataCount > 0)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "Failed to allocate trigger1Data\n");
                    }
                    trigger1DataCount = 0;
                }
                for (UINT32 i = 0; result && i < trigger1DataCount; i++)
                {
                    result = trigger1Data[i].Load(pointerEntry, alignment);
                }
            }
        }
        if (trigger1Data == nullptr)
        {
            trigger1DataCount = 0;
        }
    }

    return result;
}

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

    PARAMETER_INITIALIZE(bankID);
    PARAMETER_INITIALIZE(dataID);

    result = aecxglobalelements::ReadEnum_AECXBankIDType(entry, bankID, alignment);
    SYMBOL_TABLE_ENTRY_READ(entry, result, dataID, alignment)

    return result;
}

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

    PARAMETER_INITIALIZE(trigger1DataBank);
    PARAMETER_INITIALIZE(trigger2DataBank);
    PARAMETER_INITIALIZE(trigger1Data);

    result = trigger1DataBank.Load(entry, alignment);
    if (result)
    {
        result = trigger2DataBank.Load(entry, alignment);
    }

    // Reading Array trigger1Data from symbol table
    // Do not check result value here because the count value needs to be initialized in this block
    {
        trigger1DataCount = 0;
        SYMBOL_TABLE_ENTRY_READ(entry, result, trigger1DataCount, alignment)
        constexpr const CHAR* const file {__FILE__};
        constexpr INT32 line {LINE_CONST};
        ParameterFileSymbolTableEntry  pointerEntryCls;
        ParameterFileSymbolTableEntry* const pointerEntry = &pointerEntryCls;
        if (result)
        {
            result = entry->Table->ReadPointerEntry(pointerEntryCls, entry, alignment);
        }

        if (result)
        {
            trigger1DataID = pointerEntry->ID;
            DupObjInfo* trigger1DataDupInfo = pointerEntry->GetDupObject(trigger1DataCount, file, line);
            if (trigger1DataDupInfo != nullptr && trigger1DataDupInfo->Object != nullptr)
            {
                trigger1Data = (TwoLevelTriggerSystemLevel1Type*)trigger1DataDupInfo->Object;
                if (trigger1Data == nullptr)
                {
                    if (trigger1DataDupInfo->File != nullptr)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger1Data duplicate found but object is nullptr: %s:%d, RefCount: %d\n",
                            trigger1DataDupInfo->File, trigger1DataDupInfo->Line, trigger1DataDupInfo->RefCount);
                    }
                    else
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger1Data duplicate found but Object is nullptr: <nullptr file ptr>:%d, RefCount: %d\n",
                            trigger1DataDupInfo->Line, trigger1DataDupInfo->RefCount);
                    }
                }
            }

            if (trigger1Data == nullptr)
            {
                if (result && trigger1DataCount > 0)
                {
                    trigger1Data = PARAMETER_NEW TwoLevelTriggerSystemLevel1Type[trigger1DataCount];
                    (void)pointerEntry->SetDupObject(trigger1Data, trigger1DataCount, file, line);
                }
                if (!result || trigger1Data == nullptr)
                {
                    if (trigger1DataCount > 0)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "Failed to allocate trigger1Data\n");
                    }
                    trigger1DataCount = 0;
                }
                for (UINT32 i = 0; result && i < trigger1DataCount; i++)
                {
                    result = trigger1Data[i].Load(pointerEntry, alignment);
                }
            }
        }
        if (trigger1Data == nullptr)
        {
            trigger1DataCount = 0;
        }
    }

    return result;
}

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

    PARAMETER_INITIALIZE(trigger1DataBank);
    PARAMETER_INITIALIZE(trigger2DataBank);
    PARAMETER_INITIALIZE(trigger3DataBank);
    PARAMETER_INITIALIZE(trigger3Data);

    result = trigger1DataBank.Load(entry, alignment);
    if (result)
    {
        result = trigger2DataBank.Load(entry, alignment);
    }
    if (result)
    {
        result = trigger3DataBank.Load(entry, alignment);
    }

    // Reading Array trigger3Data from symbol table
    // Do not check result value here because the count value needs to be initialized in this block
    {
        trigger3DataCount = 0;
        SYMBOL_TABLE_ENTRY_READ(entry, result, trigger3DataCount, alignment)
        constexpr const CHAR* const file {__FILE__};
        constexpr INT32 line {LINE_CONST};
        ParameterFileSymbolTableEntry  pointerEntryCls;
        ParameterFileSymbolTableEntry* const pointerEntry = &pointerEntryCls;
        if (result)
        {
            result = entry->Table->ReadPointerEntry(pointerEntryCls, entry, alignment);
        }

        if (result)
        {
            trigger3DataID = pointerEntry->ID;
            DupObjInfo* trigger3DataDupInfo = pointerEntry->GetDupObject(trigger3DataCount, file, line);
            if (trigger3DataDupInfo != nullptr && trigger3DataDupInfo->Object != nullptr)
            {
                trigger3Data = (ThreeLevelTriggerSystemLevel1Type*)trigger3DataDupInfo->Object;
                if (trigger3Data == nullptr)
                {
                    if (trigger3DataDupInfo->File != nullptr)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger3Data duplicate found but object is nullptr: %s:%d, RefCount: %d\n",
                            trigger3DataDupInfo->File, trigger3DataDupInfo->Line, trigger3DataDupInfo->RefCount);
                    }
                    else
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger3Data duplicate found but Object is nullptr: <nullptr file ptr>:%d, RefCount: %d\n",
                            trigger3DataDupInfo->Line, trigger3DataDupInfo->RefCount);
                    }
                }
            }

            if (trigger3Data == nullptr)
            {
                if (result && trigger3DataCount > 0)
                {
                    trigger3Data = PARAMETER_NEW ThreeLevelTriggerSystemLevel1Type[trigger3DataCount];
                    (void)pointerEntry->SetDupObject(trigger3Data, trigger3DataCount, file, line);
                }
                if (!result || trigger3Data == nullptr)
                {
                    if (trigger3DataCount > 0)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "Failed to allocate trigger3Data\n");
                    }
                    trigger3DataCount = 0;
                }
                for (UINT32 i = 0; result && i < trigger3DataCount; i++)
                {
                    result = trigger3Data[i].Load(pointerEntry, alignment);
                }
            }
        }
        if (trigger3Data == nullptr)
        {
            trigger3DataCount = 0;
        }
    }

    return result;
}

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

    PARAMETER_INITIALIZE(trigger);
    PARAMETER_INITIALIZE(triggerData);

    result = trigger.Load(entry, alignment);
    if (result)
    {
        result = triggerData.Load(entry, alignment);
    }

    return result;
}

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

    PARAMETER_INITIALIZE(value);

    result = entry->ReadArray(value, 10, alignment);

    return result;
}

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

    PARAMETER_INITIALIZE(trigger);
    PARAMETER_INITIALIZE(triggerData);

    result = trigger.Load(entry, alignment);
    if (result)
    {
        result = triggerData.Load(entry, alignment);
    }

    return result;
}

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

    PARAMETER_INITIALIZE(trigger);
    PARAMETER_INITIALIZE(trigger3Data);

    result = trigger.Load(entry, alignment);

    // Reading Array trigger3Data from symbol table
    // Do not check result value here because the count value needs to be initialized in this block
    {
        trigger3DataCount = 0;
        SYMBOL_TABLE_ENTRY_READ(entry, result, trigger3DataCount, alignment)
        constexpr const CHAR* const file {__FILE__};
        constexpr INT32 line {LINE_CONST};
        ParameterFileSymbolTableEntry  pointerEntryCls;
        ParameterFileSymbolTableEntry* const pointerEntry = &pointerEntryCls;
        if (result)
        {
            result = entry->Table->ReadPointerEntry(pointerEntryCls, entry, alignment);
        }

        if (result)
        {
            trigger3DataID = pointerEntry->ID;
            DupObjInfo* trigger3DataDupInfo = pointerEntry->GetDupObject(trigger3DataCount, file, line);
            if (trigger3DataDupInfo != nullptr && trigger3DataDupInfo->Object != nullptr)
            {
                trigger3Data = (FloatArrayEndLevelType*)trigger3DataDupInfo->Object;
                if (trigger3Data == nullptr)
                {
                    if (trigger3DataDupInfo->File != nullptr)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger3Data duplicate found but object is nullptr: %s:%d, RefCount: %d\n",
                            trigger3DataDupInfo->File, trigger3DataDupInfo->Line, trigger3DataDupInfo->RefCount);
                    }
                    else
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger3Data duplicate found but Object is nullptr: <nullptr file ptr>:%d, RefCount: %d\n",
                            trigger3DataDupInfo->Line, trigger3DataDupInfo->RefCount);
                    }
                }
            }

            if (trigger3Data == nullptr)
            {
                if (result && trigger3DataCount > 0)
                {
                    trigger3Data = PARAMETER_NEW FloatArrayEndLevelType[trigger3DataCount];
                    (void)pointerEntry->SetDupObject(trigger3Data, trigger3DataCount, file, line);
                }
                if (!result || trigger3Data == nullptr)
                {
                    if (trigger3DataCount > 0)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "Failed to allocate trigger3Data\n");
                    }
                    trigger3DataCount = 0;
                }
                for (UINT32 i = 0; result && i < trigger3DataCount; i++)
                {
                    result = trigger3Data[i].Load(pointerEntry, alignment);
                }
            }
        }
        if (trigger3Data == nullptr)
        {
            trigger3DataCount = 0;
        }
    }

    return result;
}

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

    PARAMETER_INITIALIZE(trigger);
    PARAMETER_INITIALIZE(trigger2Data);

    result = trigger.Load(entry, alignment);

    // Reading Array trigger2Data from symbol table
    // Do not check result value here because the count value needs to be initialized in this block
    {
        trigger2DataCount = 0;
        SYMBOL_TABLE_ENTRY_READ(entry, result, trigger2DataCount, alignment)
        constexpr const CHAR* const file {__FILE__};
        constexpr INT32 line {LINE_CONST};
        ParameterFileSymbolTableEntry  pointerEntryCls;
        ParameterFileSymbolTableEntry* const pointerEntry = &pointerEntryCls;
        if (result)
        {
            result = entry->Table->ReadPointerEntry(pointerEntryCls, entry, alignment);
        }

        if (result)
        {
            trigger2DataID = pointerEntry->ID;
            DupObjInfo* trigger2DataDupInfo = pointerEntry->GetDupObject(trigger2DataCount, file, line);
            if (trigger2DataDupInfo != nullptr && trigger2DataDupInfo->Object != nullptr)
            {
                trigger2Data = (ThreeLevelFloatArrayLevel2Type*)trigger2DataDupInfo->Object;
                if (trigger2Data == nullptr)
                {
                    if (trigger2DataDupInfo->File != nullptr)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger2Data duplicate found but object is nullptr: %s:%d, RefCount: %d\n",
                            trigger2DataDupInfo->File, trigger2DataDupInfo->Line, trigger2DataDupInfo->RefCount);
                    }
                    else
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger2Data duplicate found but Object is nullptr: <nullptr file ptr>:%d, RefCount: %d\n",
                            trigger2DataDupInfo->Line, trigger2DataDupInfo->RefCount);
                    }
                }
            }

            if (trigger2Data == nullptr)
            {
                if (result && trigger2DataCount > 0)
                {
                    trigger2Data = PARAMETER_NEW ThreeLevelFloatArrayLevel2Type[trigger2DataCount];
                    (void)pointerEntry->SetDupObject(trigger2Data, trigger2DataCount, file, line);
                }
                if (!result || trigger2Data == nullptr)
                {
                    if (trigger2DataCount > 0)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "Failed to allocate trigger2Data\n");
                    }
                    trigger2DataCount = 0;
                }
                for (UINT32 i = 0; result && i < trigger2DataCount; i++)
                {
                    result = trigger2Data[i].Load(pointerEntry, alignment);
                }
            }
        }
        if (trigger2Data == nullptr)
        {
            trigger2DataCount = 0;
        }
    }

    return result;
}

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

    PARAMETER_INITIALIZE(trigger1DataBank);
    PARAMETER_INITIALIZE(trigger2DataBank);
    PARAMETER_INITIALIZE(trigger3DataBank);
    PARAMETER_INITIALIZE(trigger3Data);

    result = trigger1DataBank.Load(entry, alignment);
    if (result)
    {
        result = trigger2DataBank.Load(entry, alignment);
    }
    if (result)
    {
        result = trigger3DataBank.Load(entry, alignment);
    }

    // Reading Array trigger3Data from symbol table
    // Do not check result value here because the count value needs to be initialized in this block
    {
        trigger3DataCount = 0;
        SYMBOL_TABLE_ENTRY_READ(entry, result, trigger3DataCount, alignment)
        constexpr const CHAR* const file {__FILE__};
        constexpr INT32 line {LINE_CONST};
        ParameterFileSymbolTableEntry  pointerEntryCls;
        ParameterFileSymbolTableEntry* const pointerEntry = &pointerEntryCls;
        if (result)
        {
            result = entry->Table->ReadPointerEntry(pointerEntryCls, entry, alignment);
        }

        if (result)
        {
            trigger3DataID = pointerEntry->ID;
            DupObjInfo* trigger3DataDupInfo = pointerEntry->GetDupObject(trigger3DataCount, file, line);
            if (trigger3DataDupInfo != nullptr && trigger3DataDupInfo->Object != nullptr)
            {
                trigger3Data = (ThreeLevelFloatArrayLevel1Type*)trigger3DataDupInfo->Object;
                if (trigger3Data == nullptr)
                {
                    if (trigger3DataDupInfo->File != nullptr)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger3Data duplicate found but object is nullptr: %s:%d, RefCount: %d\n",
                            trigger3DataDupInfo->File, trigger3DataDupInfo->Line, trigger3DataDupInfo->RefCount);
                    }
                    else
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger3Data duplicate found but Object is nullptr: <nullptr file ptr>:%d, RefCount: %d\n",
                            trigger3DataDupInfo->Line, trigger3DataDupInfo->RefCount);
                    }
                }
            }

            if (trigger3Data == nullptr)
            {
                if (result && trigger3DataCount > 0)
                {
                    trigger3Data = PARAMETER_NEW ThreeLevelFloatArrayLevel1Type[trigger3DataCount];
                    (void)pointerEntry->SetDupObject(trigger3Data, trigger3DataCount, file, line);
                }
                if (!result || trigger3Data == nullptr)
                {
                    if (trigger3DataCount > 0)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "Failed to allocate trigger3Data\n");
                    }
                    trigger3DataCount = 0;
                }
                for (UINT32 i = 0; result && i < trigger3DataCount; i++)
                {
                    result = trigger3Data[i].Load(pointerEntry, alignment);
                }
            }
        }
        if (trigger3Data == nullptr)
        {
            trigger3DataCount = 0;
        }
    }

    return result;
}

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

    PARAMETER_INITIALIZE(underExposureS1);
    PARAMETER_INITIALIZE(underExposureS2);
    PARAMETER_INITIALIZE(underExposureS3);
    PARAMETER_INITIALIZE(underExposureS4);
    PARAMETER_INITIALIZE(exposureCount);
    PARAMETER_INITIALIZE(dropShort);
    PARAMETER_INITIALIZE(reserved1);
    PARAMETER_INITIALIZE(reserved2);
    PARAMETER_INITIALIZE(reserved3);
    PARAMETER_INITIALIZE(reserved4);

    SYMBOL_TABLE_ENTRY_READ(entry, result, underExposureS1, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, underExposureS2, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, underExposureS3, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, underExposureS4, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, exposureCount, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, dropShort, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, reserved1, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, reserved2, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, reserved3, alignment)
    SYMBOL_TABLE_ENTRY_READ(entry, result, reserved4, alignment)

    return result;
}

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

    PARAMETER_INITIALIZE(trigger);
    PARAMETER_INITIALIZE(triggerData);

    result = trigger.Load(entry, alignment);
    if (result)
    {
        result = triggerData.Load(entry, alignment);
    }

    return result;
}

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

    PARAMETER_INITIALIZE(trigger);
    PARAMETER_INITIALIZE(trigger3Data);

    result = trigger.Load(entry, alignment);

    // Reading Array trigger3Data from symbol table
    // Do not check result value here because the count value needs to be initialized in this block
    {
        trigger3DataCount = 0;
        SYMBOL_TABLE_ENTRY_READ(entry, result, trigger3DataCount, alignment)
        constexpr const CHAR* const file {__FILE__};
        constexpr INT32 line {LINE_CONST};
        ParameterFileSymbolTableEntry  pointerEntryCls;
        ParameterFileSymbolTableEntry* const pointerEntry = &pointerEntryCls;
        if (result)
        {
            result = entry->Table->ReadPointerEntry(pointerEntryCls, entry, alignment);
        }

        if (result)
        {
            trigger3DataID = pointerEntry->ID;
            DupObjInfo* trigger3DataDupInfo = pointerEntry->GetDupObject(trigger3DataCount, file, line);
            if (trigger3DataDupInfo != nullptr && trigger3DataDupInfo->Object != nullptr)
            {
                trigger3Data = (AutoHDREndLevelType*)trigger3DataDupInfo->Object;
                if (trigger3Data == nullptr)
                {
                    if (trigger3DataDupInfo->File != nullptr)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger3Data duplicate found but object is nullptr: %s:%d, RefCount: %d\n",
                            trigger3DataDupInfo->File, trigger3DataDupInfo->Line, trigger3DataDupInfo->RefCount);
                    }
                    else
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger3Data duplicate found but Object is nullptr: <nullptr file ptr>:%d, RefCount: %d\n",
                            trigger3DataDupInfo->Line, trigger3DataDupInfo->RefCount);
                    }
                }
            }

            if (trigger3Data == nullptr)
            {
                if (result && trigger3DataCount > 0)
                {
                    trigger3Data = PARAMETER_NEW AutoHDREndLevelType[trigger3DataCount];
                    (void)pointerEntry->SetDupObject(trigger3Data, trigger3DataCount, file, line);
                }
                if (!result || trigger3Data == nullptr)
                {
                    if (trigger3DataCount > 0)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "Failed to allocate trigger3Data\n");
                    }
                    trigger3DataCount = 0;
                }
                for (UINT32 i = 0; result && i < trigger3DataCount; i++)
                {
                    result = trigger3Data[i].Load(pointerEntry, alignment);
                }
            }
        }
        if (trigger3Data == nullptr)
        {
            trigger3DataCount = 0;
        }
    }

    return result;
}

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

    PARAMETER_INITIALIZE(trigger);
    PARAMETER_INITIALIZE(trigger2Data);

    result = trigger.Load(entry, alignment);

    // Reading Array trigger2Data from symbol table
    // Do not check result value here because the count value needs to be initialized in this block
    {
        trigger2DataCount = 0;
        SYMBOL_TABLE_ENTRY_READ(entry, result, trigger2DataCount, alignment)
        constexpr const CHAR* const file {__FILE__};
        constexpr INT32 line {LINE_CONST};
        ParameterFileSymbolTableEntry  pointerEntryCls;
        ParameterFileSymbolTableEntry* const pointerEntry = &pointerEntryCls;
        if (result)
        {
            result = entry->Table->ReadPointerEntry(pointerEntryCls, entry, alignment);
        }

        if (result)
        {
            trigger2DataID = pointerEntry->ID;
            DupObjInfo* trigger2DataDupInfo = pointerEntry->GetDupObject(trigger2DataCount, file, line);
            if (trigger2DataDupInfo != nullptr && trigger2DataDupInfo->Object != nullptr)
            {
                trigger2Data = (ThreeLevelAutoHDRLevel2Type*)trigger2DataDupInfo->Object;
                if (trigger2Data == nullptr)
                {
                    if (trigger2DataDupInfo->File != nullptr)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger2Data duplicate found but object is nullptr: %s:%d, RefCount: %d\n",
                            trigger2DataDupInfo->File, trigger2DataDupInfo->Line, trigger2DataDupInfo->RefCount);
                    }
                    else
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger2Data duplicate found but Object is nullptr: <nullptr file ptr>:%d, RefCount: %d\n",
                            trigger2DataDupInfo->Line, trigger2DataDupInfo->RefCount);
                    }
                }
            }

            if (trigger2Data == nullptr)
            {
                if (result && trigger2DataCount > 0)
                {
                    trigger2Data = PARAMETER_NEW ThreeLevelAutoHDRLevel2Type[trigger2DataCount];
                    (void)pointerEntry->SetDupObject(trigger2Data, trigger2DataCount, file, line);
                }
                if (!result || trigger2Data == nullptr)
                {
                    if (trigger2DataCount > 0)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "Failed to allocate trigger2Data\n");
                    }
                    trigger2DataCount = 0;
                }
                for (UINT32 i = 0; result && i < trigger2DataCount; i++)
                {
                    result = trigger2Data[i].Load(pointerEntry, alignment);
                }
            }
        }
        if (trigger2Data == nullptr)
        {
            trigger2DataCount = 0;
        }
    }

    return result;
}

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

    PARAMETER_INITIALIZE(trigger1DataBank);
    PARAMETER_INITIALIZE(trigger2DataBank);
    PARAMETER_INITIALIZE(trigger3DataBank);
    PARAMETER_INITIALIZE(trigger1Data);

    result = trigger1DataBank.Load(entry, alignment);
    if (result)
    {
        result = trigger2DataBank.Load(entry, alignment);
    }
    if (result)
    {
        result = trigger3DataBank.Load(entry, alignment);
    }

    // Reading Array trigger1Data from symbol table
    // Do not check result value here because the count value needs to be initialized in this block
    {
        trigger1DataCount = 0;
        SYMBOL_TABLE_ENTRY_READ(entry, result, trigger1DataCount, alignment)
        constexpr const CHAR* const file {__FILE__};
        constexpr INT32 line {LINE_CONST};
        ParameterFileSymbolTableEntry  pointerEntryCls;
        ParameterFileSymbolTableEntry* const pointerEntry = &pointerEntryCls;
        if (result)
        {
            result = entry->Table->ReadPointerEntry(pointerEntryCls, entry, alignment);
        }

        if (result)
        {
            trigger1DataID = pointerEntry->ID;
            DupObjInfo* trigger1DataDupInfo = pointerEntry->GetDupObject(trigger1DataCount, file, line);
            if (trigger1DataDupInfo != nullptr && trigger1DataDupInfo->Object != nullptr)
            {
                trigger1Data = (ThreeLevelAutoHDRLevel1Type*)trigger1DataDupInfo->Object;
                if (trigger1Data == nullptr)
                {
                    if (trigger1DataDupInfo->File != nullptr)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger1Data duplicate found but object is nullptr: %s:%d, RefCount: %d\n",
                            trigger1DataDupInfo->File, trigger1DataDupInfo->Line, trigger1DataDupInfo->RefCount);
                    }
                    else
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger1Data duplicate found but Object is nullptr: <nullptr file ptr>:%d, RefCount: %d\n",
                            trigger1DataDupInfo->Line, trigger1DataDupInfo->RefCount);
                    }
                }
            }

            if (trigger1Data == nullptr)
            {
                if (result && trigger1DataCount > 0)
                {
                    trigger1Data = PARAMETER_NEW ThreeLevelAutoHDRLevel1Type[trigger1DataCount];
                    (void)pointerEntry->SetDupObject(trigger1Data, trigger1DataCount, file, line);
                }
                if (!result || trigger1Data == nullptr)
                {
                    if (trigger1DataCount > 0)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "Failed to allocate trigger1Data\n");
                    }
                    trigger1DataCount = 0;
                }
                for (UINT32 i = 0; result && i < trigger1DataCount; i++)
                {
                    result = trigger1Data[i].Load(pointerEntry, alignment);
                }
            }
        }
        if (trigger1Data == nullptr)
        {
            trigger1DataCount = 0;
        }
    }

    return result;
}

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

    PARAMETER_INITIALIZE(value);

    SYMBOL_TABLE_ENTRY_READ(entry, result, value, alignment)

    return result;
}

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

    PARAMETER_INITIALIZE(trigger);
    PARAMETER_INITIALIZE(triggerData);

    result = trigger.Load(entry, alignment);
    if (result)
    {
        result = triggerData.Load(entry, alignment);
    }

    return result;
}

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

    PARAMETER_INITIALIZE(trigger);
    PARAMETER_INITIALIZE(trigger3Data);

    result = trigger.Load(entry, alignment);

    // Reading Array trigger3Data from symbol table
    // Do not check result value here because the count value needs to be initialized in this block
    {
        trigger3DataCount = 0;
        SYMBOL_TABLE_ENTRY_READ(entry, result, trigger3DataCount, alignment)
        constexpr const CHAR* const file {__FILE__};
        constexpr INT32 line {LINE_CONST};
        ParameterFileSymbolTableEntry  pointerEntryCls;
        ParameterFileSymbolTableEntry* const pointerEntry = &pointerEntryCls;
        if (result)
        {
            result = entry->Table->ReadPointerEntry(pointerEntryCls, entry, alignment);
        }

        if (result)
        {
            trigger3DataID = pointerEntry->ID;
            DupObjInfo* trigger3DataDupInfo = pointerEntry->GetDupObject(trigger3DataCount, file, line);
            if (trigger3DataDupInfo != nullptr && trigger3DataDupInfo->Object != nullptr)
            {
                trigger3Data = (AggressivenessThreeLevelTriggerSystemEndLevelType*)trigger3DataDupInfo->Object;
                if (trigger3Data == nullptr)
                {
                    if (trigger3DataDupInfo->File != nullptr)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger3Data duplicate found but object is nullptr: %s:%d, RefCount: %d\n",
                            trigger3DataDupInfo->File, trigger3DataDupInfo->Line, trigger3DataDupInfo->RefCount);
                    }
                    else
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger3Data duplicate found but Object is nullptr: <nullptr file ptr>:%d, RefCount: %d\n",
                            trigger3DataDupInfo->Line, trigger3DataDupInfo->RefCount);
                    }
                }
            }

            if (trigger3Data == nullptr)
            {
                if (result && trigger3DataCount > 0)
                {
                    trigger3Data = PARAMETER_NEW AggressivenessThreeLevelTriggerSystemEndLevelType[trigger3DataCount];
                    (void)pointerEntry->SetDupObject(trigger3Data, trigger3DataCount, file, line);
                }
                if (!result || trigger3Data == nullptr)
                {
                    if (trigger3DataCount > 0)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "Failed to allocate trigger3Data\n");
                    }
                    trigger3DataCount = 0;
                }
                for (UINT32 i = 0; result && i < trigger3DataCount; i++)
                {
                    result = trigger3Data[i].Load(pointerEntry, alignment);
                }
            }
        }
        if (trigger3Data == nullptr)
        {
            trigger3DataCount = 0;
        }
    }

    return result;
}

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

    PARAMETER_INITIALIZE(trigger);
    PARAMETER_INITIALIZE(trigger2Data);

    result = trigger.Load(entry, alignment);

    // Reading Array trigger2Data from symbol table
    // Do not check result value here because the count value needs to be initialized in this block
    {
        trigger2DataCount = 0;
        SYMBOL_TABLE_ENTRY_READ(entry, result, trigger2DataCount, alignment)
        constexpr const CHAR* const file {__FILE__};
        constexpr INT32 line {LINE_CONST};
        ParameterFileSymbolTableEntry  pointerEntryCls;
        ParameterFileSymbolTableEntry* const pointerEntry = &pointerEntryCls;
        if (result)
        {
            result = entry->Table->ReadPointerEntry(pointerEntryCls, entry, alignment);
        }

        if (result)
        {
            trigger2DataID = pointerEntry->ID;
            DupObjInfo* trigger2DataDupInfo = pointerEntry->GetDupObject(trigger2DataCount, file, line);
            if (trigger2DataDupInfo != nullptr && trigger2DataDupInfo->Object != nullptr)
            {
                trigger2Data = (AggressivenessThreeLevelTriggerSystemLevel2Type*)trigger2DataDupInfo->Object;
                if (trigger2Data == nullptr)
                {
                    if (trigger2DataDupInfo->File != nullptr)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger2Data duplicate found but object is nullptr: %s:%d, RefCount: %d\n",
                            trigger2DataDupInfo->File, trigger2DataDupInfo->Line, trigger2DataDupInfo->RefCount);
                    }
                    else
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger2Data duplicate found but Object is nullptr: <nullptr file ptr>:%d, RefCount: %d\n",
                            trigger2DataDupInfo->Line, trigger2DataDupInfo->RefCount);
                    }
                }
            }

            if (trigger2Data == nullptr)
            {
                if (result && trigger2DataCount > 0)
                {
                    trigger2Data = PARAMETER_NEW AggressivenessThreeLevelTriggerSystemLevel2Type[trigger2DataCount];
                    (void)pointerEntry->SetDupObject(trigger2Data, trigger2DataCount, file, line);
                }
                if (!result || trigger2Data == nullptr)
                {
                    if (trigger2DataCount > 0)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "Failed to allocate trigger2Data\n");
                    }
                    trigger2DataCount = 0;
                }
                for (UINT32 i = 0; result && i < trigger2DataCount; i++)
                {
                    result = trigger2Data[i].Load(pointerEntry, alignment);
                }
            }
        }
        if (trigger2Data == nullptr)
        {
            trigger2DataCount = 0;
        }
    }

    return result;
}

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

    PARAMETER_INITIALIZE(trigger1DataBank);
    PARAMETER_INITIALIZE(trigger2DataBank);
    PARAMETER_INITIALIZE(trigger3DataBank);
    PARAMETER_INITIALIZE(trigger1Data);

    result = trigger1DataBank.Load(entry, alignment);
    if (result)
    {
        result = trigger2DataBank.Load(entry, alignment);
    }
    if (result)
    {
        result = trigger3DataBank.Load(entry, alignment);
    }

    // Reading Array trigger1Data from symbol table
    // Do not check result value here because the count value needs to be initialized in this block
    {
        trigger1DataCount = 0;
        SYMBOL_TABLE_ENTRY_READ(entry, result, trigger1DataCount, alignment)
        constexpr const CHAR* const file {__FILE__};
        constexpr INT32 line {LINE_CONST};
        ParameterFileSymbolTableEntry  pointerEntryCls;
        ParameterFileSymbolTableEntry* const pointerEntry = &pointerEntryCls;
        if (result)
        {
            result = entry->Table->ReadPointerEntry(pointerEntryCls, entry, alignment);
        }

        if (result)
        {
            trigger1DataID = pointerEntry->ID;
            DupObjInfo* trigger1DataDupInfo = pointerEntry->GetDupObject(trigger1DataCount, file, line);
            if (trigger1DataDupInfo != nullptr && trigger1DataDupInfo->Object != nullptr)
            {
                trigger1Data = (AggressivenessThreeLevelTriggerSystemLevel1Type*)trigger1DataDupInfo->Object;
                if (trigger1Data == nullptr)
                {
                    if (trigger1DataDupInfo->File != nullptr)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger1Data duplicate found but object is nullptr: %s:%d, RefCount: %d\n",
                            trigger1DataDupInfo->File, trigger1DataDupInfo->Line, trigger1DataDupInfo->RefCount);
                    }
                    else
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "trigger1Data duplicate found but Object is nullptr: <nullptr file ptr>:%d, RefCount: %d\n",
                            trigger1DataDupInfo->Line, trigger1DataDupInfo->RefCount);
                    }
                }
            }

            if (trigger1Data == nullptr)
            {
                if (result && trigger1DataCount > 0)
                {
                    trigger1Data = PARAMETER_NEW AggressivenessThreeLevelTriggerSystemLevel1Type[trigger1DataCount];
                    (void)pointerEntry->SetDupObject(trigger1Data, trigger1DataCount, file, line);
                }
                if (!result || trigger1Data == nullptr)
                {
                    if (trigger1DataCount > 0)
                    {
                        PARAMETER_LOG_ERROR(entry->SetManager, "Failed to allocate trigger1Data\n");
                    }
                    trigger1DataCount = 0;
                }
                for (UINT32 i = 0; result && i < trigger1DataCount; i++)
                {
                    result = trigger1Data[i].Load(pointerEntry, alignment);
                }
            }
        }
        if (trigger1Data == nullptr)
        {
            trigger1DataCount = 0;
        }
    }

    return result;
}

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

    PARAMETER_INITIALIZE(type);
    PARAMETER_INITIALIZE(customInteger);

    result = aecxglobalelements::ReadEnum_AECSwitchCounterEnumType(entry, type, alignment);
    SYMBOL_TABLE_ENTRY_READ(entry, result, customInteger, alignment)

    return result;
}

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

    PARAMETER_INITIALIZE(searchMethod);
    PARAMETER_INITIALIZE(eVType);
    PARAMETER_INITIALIZE(value);

    result = aecxglobalelements::ReadEnum_SnapshotSearchMethod(entry, searchMethod, alignment);
    if (result)
    {
        result = aecxglobalelements::ReadEnum_EVOffsetType(entry, eVType, alignment);
    }
    SYMBOL_TABLE_ENTRY_READ(entry, result, value, alignment)

    return result;
}

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

    PARAMETER_INITIALIZE(searchMethod);
    PARAMETER_INITIALIZE(value);

    result = aecxglobalelements::ReadEnum_PreviewSearchMethod(entry, searchMethod, alignment);
    SYMBOL_TABLE_ENTRY_READ(entry, result, value, alignment)

    return result;
}

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

    PARAMETER_INITIALIZE(frameType);
    PARAMETER_INITIALIZE(snapshot);
    PARAMETER_INITIALIZE(preview);

    result = aecxglobalelements::ReadEnum_FrameType(entry, frameType, alignment);
    if (result)
    {
        result = snapshot.Load(entry, alignment);
    }
    if (result)
    {
        result = preview.Load(entry, alignment);
    }

    return result;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload ChromatixBankDataPriorityType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ChromatixBankDataPriorityType::Unload(ParameterFileSymbolTable* const __table)
{
    if (__table != nullptr && __table->ReleaseDupObject(context))
    {
        PARAMETER_DELETE[] context;
    }
    context = nullptr;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload ChromatixBankDataType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ChromatixBankDataType::Unload(ParameterFileSymbolTable* const __table)
{
    for (UINT32 i = 0; i < priorityMapCount; i++)
    {
        priorityMap[i].Unload(__table);
    }
    if (__table != nullptr && __table->ReleaseDupObject(priorityMap))
    {
        PARAMETER_DELETE[] priorityMap;
    }
    priorityMap = nullptr;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload DBFloatPayload
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void DBFloatPayload::Unload(ParameterFileSymbolTable* const __table)
{
    if (__table != nullptr && __table->ReleaseDupObject(description))
    {
        PARAMETER_DELETE[] description;
    }
    description = nullptr;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload DBStartEndPayload
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void DBStartEndPayload::Unload(ParameterFileSymbolTable* const __table)
{
    if (__table != nullptr && __table->ReleaseDupObject(description))
    {
        PARAMETER_DELETE[] description;
    }
    description = nullptr;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload OneLevelTriggerSystemType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void OneLevelTriggerSystemType::Unload(ParameterFileSymbolTable* const __table)
{
    if (__table != nullptr && __table->ReleaseDupObject(trigger1Data))
    {
        PARAMETER_DELETE[] trigger1Data;
    }
    trigger1Data = nullptr;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload TwoLevelTriggerSystemLevel1Type
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void TwoLevelTriggerSystemLevel1Type::Unload(ParameterFileSymbolTable* const __table)
{
    if (__table != nullptr && __table->ReleaseDupObject(trigger2Data))
    {
        PARAMETER_DELETE[] trigger2Data;
    }
    trigger2Data = nullptr;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload TwoLevelTriggerSystemType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void TwoLevelTriggerSystemType::Unload(ParameterFileSymbolTable* const __table)
{
    for (UINT32 i = 0; i < trigger1DataCount; i++)
    {
        trigger1Data[i].Unload(__table);
    }
    if (__table != nullptr && __table->ReleaseDupObject(trigger1Data))
    {
        PARAMETER_DELETE[] trigger1Data;
    }
    trigger1Data = nullptr;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload ThreeLevelTriggerSystemLevel2Type
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ThreeLevelTriggerSystemLevel2Type::Unload(ParameterFileSymbolTable* const __table)
{
    if (__table != nullptr && __table->ReleaseDupObject(trigger3Data))
    {
        PARAMETER_DELETE[] trigger3Data;
    }
    trigger3Data = nullptr;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload ThreeLevelTriggerSystemLevel1Type
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ThreeLevelTriggerSystemLevel1Type::Unload(ParameterFileSymbolTable* const __table)
{
    for (UINT32 i = 0; i < trigger2DataCount; i++)
    {
        trigger2Data[i].Unload(__table);
    }
    if (__table != nullptr && __table->ReleaseDupObject(trigger2Data))
    {
        PARAMETER_DELETE[] trigger2Data;
    }
    trigger2Data = nullptr;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload ThreeLevelTriggerSystemType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ThreeLevelTriggerSystemType::Unload(ParameterFileSymbolTable* const __table)
{
    for (UINT32 i = 0; i < trigger1DataCount; i++)
    {
        trigger1Data[i].Unload(__table);
    }
    if (__table != nullptr && __table->ReleaseDupObject(trigger1Data))
    {
        PARAMETER_DELETE[] trigger1Data;
    }
    trigger1Data = nullptr;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload TwoLevelDataBankTriggerSystemType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void TwoLevelDataBankTriggerSystemType::Unload(ParameterFileSymbolTable* const __table)
{
    for (UINT32 i = 0; i < trigger1DataCount; i++)
    {
        trigger1Data[i].Unload(__table);
    }
    if (__table != nullptr && __table->ReleaseDupObject(trigger1Data))
    {
        PARAMETER_DELETE[] trigger1Data;
    }
    trigger1Data = nullptr;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload ThreeLevelDataBankTriggerSystemType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ThreeLevelDataBankTriggerSystemType::Unload(ParameterFileSymbolTable* const __table)
{
    for (UINT32 i = 0; i < trigger3DataCount; i++)
    {
        trigger3Data[i].Unload(__table);
    }
    if (__table != nullptr && __table->ReleaseDupObject(trigger3Data))
    {
        PARAMETER_DELETE[] trigger3Data;
    }
    trigger3Data = nullptr;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload ThreeLevelFloatArrayLevel2Type
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ThreeLevelFloatArrayLevel2Type::Unload(ParameterFileSymbolTable* const __table)
{
    if (__table != nullptr && __table->ReleaseDupObject(trigger3Data))
    {
        PARAMETER_DELETE[] trigger3Data;
    }
    trigger3Data = nullptr;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload ThreeLevelFloatArrayLevel1Type
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ThreeLevelFloatArrayLevel1Type::Unload(ParameterFileSymbolTable* const __table)
{
    for (UINT32 i = 0; i < trigger2DataCount; i++)
    {
        trigger2Data[i].Unload(__table);
    }
    if (__table != nullptr && __table->ReleaseDupObject(trigger2Data))
    {
        PARAMETER_DELETE[] trigger2Data;
    }
    trigger2Data = nullptr;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload ThreeLevelFloatArrayType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ThreeLevelFloatArrayType::Unload(ParameterFileSymbolTable* const __table)
{
    for (UINT32 i = 0; i < trigger3DataCount; i++)
    {
        trigger3Data[i].Unload(__table);
    }
    if (__table != nullptr && __table->ReleaseDupObject(trigger3Data))
    {
        PARAMETER_DELETE[] trigger3Data;
    }
    trigger3Data = nullptr;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload ThreeLevelAutoHDRLevel2Type
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ThreeLevelAutoHDRLevel2Type::Unload(ParameterFileSymbolTable* const __table)
{
    if (__table != nullptr && __table->ReleaseDupObject(trigger3Data))
    {
        PARAMETER_DELETE[] trigger3Data;
    }
    trigger3Data = nullptr;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload ThreeLevelAutoHDRLevel1Type
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ThreeLevelAutoHDRLevel1Type::Unload(ParameterFileSymbolTable* const __table)
{
    for (UINT32 i = 0; i < trigger2DataCount; i++)
    {
        trigger2Data[i].Unload(__table);
    }
    if (__table != nullptr && __table->ReleaseDupObject(trigger2Data))
    {
        PARAMETER_DELETE[] trigger2Data;
    }
    trigger2Data = nullptr;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload ThreeLevelAutoHDRType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ThreeLevelAutoHDRType::Unload(ParameterFileSymbolTable* const __table)
{
    for (UINT32 i = 0; i < trigger1DataCount; i++)
    {
        trigger1Data[i].Unload(__table);
    }
    if (__table != nullptr && __table->ReleaseDupObject(trigger1Data))
    {
        PARAMETER_DELETE[] trigger1Data;
    }
    trigger1Data = nullptr;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload AggressivenessThreeLevelTriggerSystemLevel2Type
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void AggressivenessThreeLevelTriggerSystemLevel2Type::Unload(ParameterFileSymbolTable* const __table)
{
    if (__table != nullptr && __table->ReleaseDupObject(trigger3Data))
    {
        PARAMETER_DELETE[] trigger3Data;
    }
    trigger3Data = nullptr;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload AggressivenessThreeLevelTriggerSystemLevel1Type
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void AggressivenessThreeLevelTriggerSystemLevel1Type::Unload(ParameterFileSymbolTable* const __table)
{
    for (UINT32 i = 0; i < trigger2DataCount; i++)
    {
        trigger2Data[i].Unload(__table);
    }
    if (__table != nullptr && __table->ReleaseDupObject(trigger2Data))
    {
        PARAMETER_DELETE[] trigger2Data;
    }
    trigger2Data = nullptr;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Unload AggressivenessThreeLevelTriggerSystemType
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void AggressivenessThreeLevelTriggerSystemType::Unload(ParameterFileSymbolTable* const __table)
{
    for (UINT32 i = 0; i < trigger1DataCount; i++)
    {
        trigger1Data[i].Unload(__table);
    }
    if (__table != nullptr && __table->ReleaseDupObject(trigger1Data))
    {
        PARAMETER_DELETE[] trigger1Data;
    }
    trigger1Data = nullptr;
}
AECXGLOBALELEMENTS_NAMESPACE_END
