/**
* @file ori.h
* @brief Open Radio Interface (ORI) C library header file.
* @author AW2S (http://www.aw2s.com)
* @version 1.6
* @date July 29, 2019
*
* This file is the AW2S REC ORI C library header, and contains all necessary
* functions prototypes, enumerations, data structures and type definitions
* to implement the ORI shared library in an user application.
*/

#ifndef ORI_H_
#define ORI_H_

#define ORILIB_VERSION_MAJOR 1
#define ORILIB_VERSION_MINOR 6

#include <stdint.h>

/*-----------------------------------------------------------------------------------------
 * ORI_RESULT ENUMERATION
 *-----------------------------------------------------------------------------------------*/

/**
 * @enum ORI_Result_e
 * @brief ORI result codes enumeration.
 */
typedef enum
{
	ORI_Result_SUCCESS = 0,								/**< */
	ORI_Result_FAIL_SYNTAX_ERROR,						/**< */
	ORI_Result_FAIL_UNRECOGNIZED_MESSAGE,				/**< */
	ORI_Result_FAIL_RE_BUSY,							/**< */
	ORI_Result_FAIL_MISSING_PARAMETER,					/**< */
	ORI_Result_FAIL_PARAMETER_ERROR,					/**< */
	ORI_Result_FAIL_FRAME_ERROR,						/**< */
	ORI_Result_FAIL_INVALID_TIMEDATA,					/**< */
	ORI_Result_SUCCESS_SOFTWARE_ALREADY_EXISTING,		/**< */
	ORI_Result_FAIL_FTP_ERROR,							/**< */
	ORI_Result_FAIL_BROKEN_IMAGE,						/**< */
	ORI_Result_FAIL_NO_COMPATIBLE_IMAGE,				/**< */
	ORI_Result_FAIL_CANNOT_STORE,						/**< */
	ORI_Result_FAIL_NOSUCH_IMAGE,						/**< */
	ORI_Result_FAIL_UNKNOWN_OBJECT,						/**< */
	ORI_Result_FAIL_UNKNOWN_PARAM,						/**< */
	ORI_Result_FAIL_PARAMETER_FAIL,						/**< */
	ORI_Result_FAIL_NOSUCH_RESOURCE,					/**< */
	ORI_Result_FAIL_PARAM_READONLY,						/**< */
	ORI_Result_FAIL_PARAM_LOCKREQUIRED,					/**< */
	ORI_Result_FAIL_VALUE_OUTOF_RANGE,					/**< */
	ORI_Result_FAIL_VALUE_TYPE_ERROR,					/**< */
	ORI_Result_FAIL_UNKNOWN_OBJTYPE,					/**< */
	ORI_Result_FAIL_STATIC_OBJTYPE,						/**< */
	ORI_Result_FAIL_CHILD_NOTALLOWED,					/**< */
	ORI_Result_FAIL_OUTOF_RESOURCES,					/**< */
	ORI_Result_FAIL_LOCKREQUIRED,						/**< */
	ORI_Result_FAIL_UNKNOWN_STATETYPE,					/**< */
	ORI_Result_FAIL_UNKNOWN_STATEVALUE,					/**< */
	ORI_Result_FAIL_STATE_READONLY,						/**< */
	ORI_Result_FAIL_RESOURCE_UNAVAILABLE,				/**< */
	ORI_Result_FAIL_RESOURCE_INUSE,						/**< */
	ORI_Result_FAIL_PARENT_CHILD_CONFLICT,				/**< */
	ORI_Result_FAIL_PRECONDITION_NOTMET,				/**< */
	ORI_Result_FAIL_NOSUCH_FILE,						/**< */
	ORI_Result_FAIL_SIZE_LIMIT,							/**< */
	ORI_Result_FAIL_ACTIVATION_ERROR,					/**< */
	ORI_Result_FAIL_ALD_UNAVAILABLE,					/**< */
	ORI_Result_FAIL_BUS_UNAVAILABLE,					/**< */
	ORI_Result_OsError,									/**< */
	ORI_Result_BadParameter,							/**< */
	ORI_Result_InvalidIpAddress,						/**< */
	ORI_Result_ConnectionFailed,						/**< */
	ORI_Result_ConnectionTimedOut,						/**< */
	ORI_Result_NotConnected,							/**< */
	ORI_Result_Unknown,									/**< */
} ORI_Result_e;

/**
 * @brief Get a string describing an ::ORI_Result_e.
 * @param result The ::ORI_Result_e.
 * @return The describing string.
 */
const char * 					ORI_Result_Print(ORI_Result_e result);

/**
 * @brief Get an ::ORI_Result_e from a string.
 * @param resultString The string to match.
 * @return The matched ::ORI_Result_e, or ::ORI_Result_Unknown if failure.
 */
ORI_Result_e 					ORI_Result_Enum(const char * resultString);



/*-----------------------------------------------------------------------------------------
 * ORI_INDICATIONTYPE ENUMERATION
 *-----------------------------------------------------------------------------------------*/

/**
 * @enum ORI_IndicationType_e
 * @brief ORI indication type enumeration.
 */
typedef enum
{
	ORI_IndicationType_FileTransferComplete = 0,		/**< */
	ORI_IndicationType_ObjectStateChange,				/**< */
	ORI_IndicationType_FaultChange,						/**< */
	ORI_IndicationType_FileAvailable,					/**< */
	ORI_IndicationType_UploadFileCmpl,					/**< */
	ORI_IndicationType_AisgScanDeviceCompl,				/**< */
	ORI_IndicationType_AisgAldRx,						/**< */
	ORI_IndicationType_Unknown,							/**< */
} ORI_IndicationType_e;

/**
 * @brief Get a string describing an ::ORI_IndicationType_e.
 * @param indicationType The ::ORI_IndicationType_e.
 * @return The describing string.
 */
const char * 					ORI_IndicationType_Print(ORI_IndicationType_e indicationType);

/**
 * @brief Get an ::ORI_IndicationType_e from a string.
 * @param indicationTypeString The string to match.
 * @return The matched ::ORI_IndicationType_e, or ::ORI_IndicationType_Unknown if failure.
 */
ORI_IndicationType_e 			ORI_IndicationType_Enum(const char * indicationTypeString);



/*-----------------------------------------------------------------------------------------
 * ORI_OBJECTTYPE ENUMERATION
 *-----------------------------------------------------------------------------------------*/

/**
 * @enum ORI_ObjectType_e
 * @brief ORI object type enumeration.
 */
typedef enum
{
	ORI_ObjectType_RE = 0,								/**< */
	ORI_ObjectType_AntennaPort,							/**< */
	ORI_ObjectType_TxUtra,								/**< */
	ORI_ObjectType_TxEUtraFDD,							/**< */
	ORI_ObjectType_TxEUtraTDD,							/**< */
	ORI_ObjectType_TxGSM,								/**< */
	ORI_ObjectType_RxUtra,								/**< */
	ORI_ObjectType_RxEUtraFDD,							/**< */
	ORI_ObjectType_RxEUtraTDD,							/**< */
	ORI_ObjectType_RxGSM,								/**< */
	ORI_ObjectType_ORILink,								/**< */
	ORI_ObjectType_ExternalEventPort,					/**< */
	ORI_ObjectType_AISGPort,							/**< */
	ORI_ObjectType_AISGALD,								/**< */
	ORI_ObjectType_Log,									/**< */
	ORI_ObjectType_DLRoutedIQData,						/**< */
	ORI_ObjectType_ULRoutedIQData,						/**< */
	ORI_ObjectType_DLRoutedCWBlock,						/**< */
	ORI_ObjectType_ULRoutedCWBlock,						/**< */
	ORI_ObjectType_Invalid,								/**< */
} ORI_ObjectType_e;

/**
 * @brief Get a string describing an ::ORI_ObjectType_e.
 * @param objectType The ::ORI_ObjectType_e.
 * @return The describing string.
 */
const char * 					ORI_ObjectType_Print(ORI_ObjectType_e objectType);

/**
 * @brief Get an ::ORI_ObjectType_e from a string.
 * @param objectTypeString The string to match.
 * @return The matched ::ORI_ObjectType_e, or ::ORI_ObjectType_Invalid if failure.
 */
ORI_ObjectType_e 				ORI_ObjectType_Enum(const char * objectTypeString);



/*-----------------------------------------------------------------------------------------
 * ORI_OBJECTPARAM ENUMERATION
 *-----------------------------------------------------------------------------------------*/

/**
 * @enum ORI_ObjectParam_e
 * @brief ORI object parameter enumeration.
 *
 * All the parameters of all objects are in this list, but only once
 * (therefore some parameters will be used by several object types).
 */
typedef enum
{
	ORI_ObjectParam_RE_VendorID = 0,					/**< */
	ORI_ObjectParam_RE_ProductID,						/**< */
	ORI_ObjectParam_RE_ProductRevision,					/**< */
	ORI_ObjectParam_RE_SerialNumber,					/**< */
	ORI_ObjectParam_RE_ProtocolVer,						/**< */
	ORI_ObjectParam_RE_AGCTargetLevCfgGran,				/**< */
	ORI_ObjectParam_RE_AGCSettlingTimeCfgGran,			/**< */
	ORI_ObjectParam_RE_AGCSettlingTimeCap,				/**< */
	ORI_ObjectParam_RE_AWS_uptime,						/**< */
	ORI_ObjectParam_RE_AWS_inputVoltage,				/**< */
	ORI_ObjectParam_RE_AWS_inputCurrent,				/**< */
	ORI_ObjectParam_RE_AWS_productTemp,					/**< */
	ORI_ObjectParam_RE_AWS_cpuTemp,						/**< */
	ORI_ObjectParam_RE_AWS_paTemp,						/**< */
	ORI_ObjectParam_RE_AWS_rxPwrOffset,					/**< */
	ORI_ObjectParam_Port_portLabel,						/**< */
	ORI_ObjectParam_Port_AWS_outputPwr,					/**< */
	ORI_ObjectParam_Port_AWS_inputPwr,					/**< */
	ORI_ObjectParam_Port_AWS_returnLoss,				/**< */
	ORI_ObjectParam_SigPath_axcW,						/**< */
	ORI_ObjectParam_SigPath_axcB,						/**< */
	ORI_ObjectParam_SigPath_oriLink,					/**< */
	ORI_ObjectParam_SigPath_uarfcn,						/**< */
	ORI_ObjectParam_SigPath_antPort,					/**< */
	ORI_ObjectParam_SigPath_chanBW,						/**< */
	ORI_ObjectParam_SigPath_tddSpecialSFConfig,			/**< */
	ORI_ObjectParam_SigPath_tddULDLConfig,				/**< */
	ORI_ObjectParam_SigPath_earfcn,						/**< */
	ORI_ObjectParam_SigPath_freqBandInd,				/**< */
	ORI_ObjectParam_SigPath_sigmaIQ,					/**< */
	ORI_ObjectParam_SigPath_AWS_enableCompRateChange,	/**< */
	ORI_ObjectParam_SigPath_AWS_enableCompBitChange,	/**< */
	ORI_ObjectParam_SigPath_AWS_measuredPwr,			/**< */
	ORI_ObjectParam_SigPath_AWS_axcIncr,				/**< */
	ORI_ObjectParam_TxSigPath_t2a,						/**< */
	ORI_ObjectParam_TxSigPath_maxTxPwr,					/**< */
	ORI_ObjectParam_TxSigPath_dlCalRE,					/**< */
	ORI_ObjectParam_TxSigPath_tddCPLengthDL,			/**< */
	ORI_ObjectParam_TxSigPath_dlCalREMax,				/**< */
	ORI_ObjectParam_TxSigPath_enableIQDLComp,			/**< */
	ORI_ObjectParam_TxSigPath_AWS_enPeakCancel,			/**< */
	ORI_ObjectParam_RxSigPath_ulCalREMax,				/**< */
	ORI_ObjectParam_RxSigPath_ta3,						/**< */
	ORI_ObjectParam_RxSigPath_ulCalRE,					/**< */
	ORI_ObjectParam_RxSigPath_rtwpGroup,				/**< */
	ORI_ObjectParam_RxSigPath_tddCPLengthUL,			/**< */
	ORI_ObjectParam_RxSigPath_ulFeedAdj,				/**< */
	ORI_ObjectParam_RxSigPath_ulTgtRMSLvl,				/**< */
	ORI_ObjectParam_RxSigPath_ulAGCSetlgTime,			/**< */
	ORI_ObjectParam_RxSigPath_TxSigPath,				/**< */
	ORI_ObjectParam_RxSigPath_enableIQULComp,			/**< */
	ORI_ObjectParam_ORILink_portRoleCapability,			/**< */
	ORI_ObjectParam_ORILink_portRole,					/**< */
	ORI_ObjectParam_ORILink_bitRateSupport,				/**< */
	ORI_ObjectParam_ORILink_bitRateRequested,			/**< */
	ORI_ObjectParam_ORILink_bitRateOperational,			/**< */
	ORI_ObjectParam_ORILink_localPortID,				/**< */
	ORI_ObjectParam_ORILink_remotePortID,				/**< */
	ORI_ObjectParam_ORILink_toffset,					/**< */
	ORI_ObjectParam_ORILink_oriLinkType,				/**< */
	ORI_ObjectParam_ORILink_AWS_localMAC,				/**< */
	ORI_ObjectParam_ORILink_AWS_remoteMAC,				/**< */
	ORI_ObjectParam_ORILink_AWS_t14,					/**< */
	ORI_ObjectParam_ORILink_AWS_remoteIP,				/**< */
	ORI_ObjectParam_ORILink_AWS_localIP,				/**< */
	ORI_ObjectParam_ORILink_AWS_remoteUdpPort,			/**< */
	ORI_ObjectParam_ORILink_AWS_localUdpPort,			/**< */
	ORI_ObjectParam_ORILink_AWS_sfpTxPow,				/**< */
	ORI_ObjectParam_ORILink_AWS_sfpRxPow,				/**< */
	ORI_ObjectParam_AISGPort_busPowerEnable,			/**< */
	ORI_ObjectParam_AISGALD_deviceType,					/**< */
	ORI_ObjectParam_AISGALD_UID,						/**< */
	ORI_ObjectParam_AISGALD_releaseID,					/**< */
	ORI_ObjectParam_AISGALD_aisgVersion,				/**< */
	ORI_ObjectParam_AISGALD_deviceTypeVersion,			/**< */
	ORI_ObjectParam_AISGALD_frameLength,				/**< */
	ORI_ObjectParam_AISGALD_hdlcAdress,					/**< */
	ORI_ObjectParam_Log_logTypeID,						/**< */
	ORI_ObjectParam_Log_description,					/**< */
	ORI_ObjectParam_Log_logCategory,					/**< */
	ORI_ObjectParam_Log_maxREfileSize,					/**< */
	ORI_ObjectParam_Log_maxRECfileSize,					/**< */
	ORI_ObjectParam_Log_enableNotification,				/**< */
	ORI_ObjectParam_Log_fileAvailable,					/**< */
	ORI_ObjectParam_Log_overflowBehaviour,				/**< */
	ORI_ObjectParam_Log_recordingEnabled,				/**< */
	ORI_ObjectParam_Log_logPeriod,						/**< */
	ORI_ObjectParam_Log_timerType,						/**< */
	ORI_ObjectParam_Routed_MasterPortOriLink,			/**< */
	ORI_ObjectParam_Routed_SlavePortOriLink,			/**< */
	ORI_ObjectParam_RoutedIQData_IQsubBlockSize,		/**< */
	ORI_ObjectParam_RoutedIQData_MasterPortIQblkW,		/**< */
	ORI_ObjectParam_RoutedIQData_MasterPortIQblkB,		/**< */
	ORI_ObjectParam_RoutedIQData_SlavePortIQW,			/**< */
	ORI_ObjectParam_RoutedIQData_SlavePortIQB,			/**< */
	ORI_ObjectParam_RoutedIQData_TBDelayDL,				/**< */
	ORI_ObjectParam_RoutedIQData_TBDelayUL,				/**< */
	ORI_ObjectParam_RoutedCWBlock_CtrlBlockSize,		/**< */
	ORI_ObjectParam_RoutedCWBlock_SubChannelStart,		/**< */
	ORI_ObjectParam_RoutedCWBlock_Ydepth,				/**< */
	ORI_ObjectParam_RoutedCWBlock_SlavePortYoffset,		/**< */
	ORI_ObjectParam_RoutedCWBlock_MasterPortYoffset,	/**< */
	ORI_ObjectParam_All,								/**< */
	ORI_ObjectParam_Invalid,							/**< */
} ORI_ObjectParam_e;

/**
 * @brief Get a string describing an ::ORI_ObjectParam_e.
 * @param objectParam The ::ORI_ObjectParam_e.
 * @return The describing string.
 */
const char * 					ORI_ObjectParam_Print(ORI_ObjectParam_e objectParam);

/**
 * @brief Get an ::ORI_ObjectParam_e from a string.
 * @param objectParamString The string to match.
 * @return The matched ::ORI_ObjectParam_e, or ::ORI_ObjectParam_Invalid if failure.
 */
ORI_ObjectParam_e 				ORI_ObjectParam_Enum(const char * objectParamString);



/*-----------------------------------------------------------------------------------------
 * ORI_STATETYPE ENUMERATION
 *-----------------------------------------------------------------------------------------*/

/**
 * @enum ORI_StateType_e
 * @brief ORI state type enumeration.
 */
typedef enum
{
	ORI_StateType_AST = 0,								/**< */
	ORI_StateType_FST,									/**< */
	ORI_StateType_All,									/**< */
	ORI_StateType_Invalid,								/**< */
} ORI_StateType_e;

/**
 * @brief Get a string describing an ::ORI_StateType_e.
 * @param stateType The ::ORI_StateType_e.
 * @return The describing string.
 */
const char * 					ORI_StateType_Print(ORI_StateType_e stateType);

/**
 * @brief Get an ::ORI_StateType_e from a string.
 * @param stateTypeString The string to match.
 * @return The matched ::ORI_StateType_e, or ::ORI_StateType_Invalid if failure.
 */
ORI_StateType_e 				ORI_StateType_Enum(const char * stateTypeString);



/*-----------------------------------------------------------------------------------------
 * ORI_AST ENUMERATION
 *-----------------------------------------------------------------------------------------*/

/**
 * @enum ORI_AST_e
 * @brief ORI AST enumeration.
 */
typedef enum
{
	ORI_AST_Locked = 0,									/**< */
	ORI_AST_Unlocked,									/**< */
	ORI_AST_Invalid,									/**< */
} ORI_AST_e;

/**
 * @brief Get a string describing an ::ORI_AST_e.
 * @param ast The ::ORI_AST_e.
 * @return The describing string.
 */
const char * 					ORI_AST_Print(ORI_AST_e ast);

/**
 * @brief Get an ::ORI_AST_e from a string.
 * @param astString The string to match.
 * @return The matched ::ORI_AST_e, or ::ORI_AST_Invalid if failure.
 */
ORI_AST_e 						ORI_AST_Enum(const char * astString);



/*-----------------------------------------------------------------------------------------
 * ORI_FST ENUMERATION
 *-----------------------------------------------------------------------------------------*/

/**
 * @enum ORI_FST_e
 * @brief ORI FST enumeration.
 */
typedef enum
{
	ORI_FST_PreOperational = 0,							/**< */
	ORI_FST_Operational,								/**< */
	ORI_FST_Degraded,									/**< */
	ORI_FST_Failed,										/**< */
	ORI_FST_NotOperational,								/**< */
	ORI_FST_Disabled,									/**< */
	ORI_FST_Invalid,									/**< */
} ORI_FST_e;

/**
 * @brief Get a string describing an ::ORI_FST_e.
 * @param fst The ::ORI_FST_e.
 * @return The describing string.
 */
const char * 					ORI_FST_Print(ORI_FST_e fst);

/**
 * @brief Get an ::ORI_FST_e from a string.
 * @param fstString The string to match.
 * @return The matched ::ORI_FST_e, or ::ORI_FST_Invalid if failure.
 */
ORI_FST_e 						ORI_FST_Enum(const char * fstString);



/*-----------------------------------------------------------------------------------------
 * ORI_AGCGRANULARITY ENUMERATION
 *-----------------------------------------------------------------------------------------*/

/**
 * @enum ORI_agcGranularity_e
 * @brief AGC granularity capability enumeration.
 */
typedef enum
{
	ORI_agcGranularity_RxSigPath = 0,					/**< */
	ORI_agcGranularity_RE,								/**< */
	ORI_agcGranularity_Invalid,							/**< */
} ORI_agcGranularity_e;

/**
 * @brief Get a string describing an ::ORI_agcGranularity_e.
 * @param agcGranularity The ::ORI_agcGranularity_e.
 * @return The describing string.
 */
const char * 					ORI_agcGranularity_Print(ORI_agcGranularity_e agcGranularity);

/**
 * @brief Get an ::ORI_agcGranularity_e from a string.
 * @param agcGranularityString The string to match.
 * @return The matched ::ORI_agcGranularity_e, or ::ORI_agcGranularity_Invalid if failure.
 */
ORI_agcGranularity_e 			ORI_agcGranularity_Enum(const char * agcGranularityString);



/*-----------------------------------------------------------------------------------------
 * ORI_TDDCPLENGTH ENUMERATION
 *-----------------------------------------------------------------------------------------*/

/**
 * @enum ORI_tddCPLength_e
 * @brief TDD cyclic prefix length enumeration.
 */
typedef enum
{
	ORI_tddCPLength_Normal = 0,							/**< */
	ORI_tddCPLength_Extended,							/**< */
	ORI_tddCPLength_Invalid,							/**< */
} ORI_tddCPLength_e;

/**
 * @brief Get a string describing an ::ORI_tddCPLength_e.
 * @param tddCPLength The ::ORI_tddCPLength_e.
 * @return The describing string.
 */
const char * 					ORI_tddCPLength_Print(ORI_tddCPLength_e tddCPLength);

/**
 * @brief Get a ::ORI_tddCPLength_e from a string.
 * @param tddCPLengthString The string to match.
 * @return The matched ::ORI_tddCPLength_e, or ::ORI_tddCPLength_Invalid if failure.
 */
ORI_tddCPLength_e 				ORI_tddCPLength_Enum(const char * tddCPLengthString);



/*-----------------------------------------------------------------------------------------
 * ORI_FREQBAND ENUMERATION
 *-----------------------------------------------------------------------------------------*/

/**
 * @enum ORI_freqBand_e
 * @brief GSM frequency band enumeration.
 */
typedef enum
{
	ORI_freqBand_GSM850 = 0,							/**< */
	ORI_freqBand_PGSM900,								/**< */
	ORI_freqBand_DCS1800,								/**< */
	ORI_freqBand_PCS1900,								/**< */
	ORI_freqBand_Invalid,								/**< */
} ORI_freqBand_e;

/**
 * @brief Get a string describing an ::ORI_freqBand_e.
 * @param freqBand The ::ORI_freqBand_e.
 * @return The describing string.
 */
const char * 					ORI_freqBand_Print(ORI_freqBand_e freqBand);

/**
 * @brief Get a ::ORI_freqBand_e from a string.
 * @param freqBandString The string to match.
 * @return The matched ::ORI_freqBand_e, or ::ORI_freqBand_Invalid if failure.
 */
ORI_freqBand_e 					ORI_freqBand_Enum(const char * freqBandString);



/*-----------------------------------------------------------------------------------------
 * ORI_PORTROLE ENUMERATION
 *-----------------------------------------------------------------------------------------*/

/**
 * @enum ORI_portRole_e
 * @brief ORI link port role enumeration.
 */
typedef enum
{
	ORI_portRole_Master = 0,							/**< */
	ORI_portRole_Slave,									/**< */
	ORI_portRole_Invalid,								/**< */
} ORI_portRole_e;

/**
 * @brief Get a string describing an ::ORI_portRole_e.
 * @param portRole The ::ORI_portRole_e.
 * @return The describing string.
 */
const char * 					ORI_portRole_Print(ORI_portRole_e portRole);

/**
 * @brief Get a ::ORI_portRole_e from a string.
 * @param portRoleString The string to match.
 * @return The matched ::ORI_portRole_e, or ::ORI_portRole_Invalid if failure.
 */
ORI_portRole_e 					ORI_portRole_Enum(const char * portRoleString);



/*-----------------------------------------------------------------------------------------
 * ORI_PORTROLECAPABILITY ENUMERATION
 *-----------------------------------------------------------------------------------------*/

/**
 * @enum ORI_portRoleCapability_e
 * @brief ORI Link port role capability enumeration.
 */
typedef enum
{
	ORI_portRoleCapability_MO = 0,						/**< */
	ORI_portRoleCapability_SO,							/**< */
	ORI_portRoleCapability_MS,							/**< */
	ORI_portRoleCapability_Invalid,						/**< */
} ORI_portRoleCapability_e;

/**
 * @brief Get a string describing an ::ORI_portRoleCapability_e.
 * @param portRoleCapability The ::ORI_portRoleCapability_e.
 * @return The describing string.
 */
const char * 					ORI_portRoleCapability_Print(ORI_portRoleCapability_e portRoleCapability);

/**
 * @brief Get an ::ORI_portRoleCapability_e from a string.
 * @param portRoleCapabilityString The string to match.
 * @return The matched ::ORI_portRoleCapability_e, or ::ORI_portRoleCapability_Invalid if failure.
 */
ORI_portRoleCapability_e 		ORI_portRoleCapability_Enum(const char * portRoleCapabilityString);



/*-----------------------------------------------------------------------------------------
 * ORI_LINKTYPE ENUMERATION
 *-----------------------------------------------------------------------------------------*/

/**
 * @enum ORI_linkType_e
 * @brief ORI Link type enumeration.
 */
typedef enum
{
	ORI_linkType_Active = 0,							/**< */
	ORI_linkType_Passive,								/**< */
	ORI_linkType_Invalid,								/**< */
} ORI_linkType_e;


/**
 * @brief Get a string describing an ::ORI_linkType_e.
 * @param linkType The ::ORI_linkType_e.
 * @return The describing string.
 */
const char * 					ORI_linkType_Print(ORI_linkType_e linkType);

/**
 * @brief Get an ::ORI_linkType_e from a string.
 * @param linkTypeString The string to match.
 * @return The matched ::ORI_linkType_e, or ::ORI_linkType_Invalid if failure.
 */
ORI_linkType_e 					ORI_linkType_Enum(const char * linkTypeString);



/*-----------------------------------------------------------------------------------------
 * ORI_BOOLEAN ENUMERATION
 *-----------------------------------------------------------------------------------------*/

/**
 * @enum ORI_Boolean_e
 * @brief ORI boolean enumeration.
 */
typedef enum
{
	ORI_Boolean_False = 0,								/**< */
	ORI_Boolean_True,									/**< */
	ORI_Boolean_Invalid,								/**< */
} ORI_Boolean_e;

/**
 * @brief Get a string describing an ::ORI_Boolean_e.
 * @param boolean The ::ORI_Boolean_e.
 * @return The describing string.
 */
const char * 					ORI_Boolean_Print(ORI_Boolean_e boolean);

/**
 * @brief Get an ::ORI_Boolean_e from a string.
 * @param booleanString The string to match.
 * @return The matched ::ORI_Boolean_e, or ::ORI_Boolean_Invalid if failure.
 */
ORI_Boolean_e 					ORI_Boolean_Enum(const char * booleanString);



/*-----------------------------------------------------------------------------------------
 * ORI_LOGCATEGORY ENUMERATION
 *-----------------------------------------------------------------------------------------*/

/**
 * @enum ORI_logCategory_e
 * @brief Log category enumeration.
 *
 */
typedef enum
{
	ORI_logCategory_Fault = 0,							/**< */
	ORI_logCategory_Perf,								/**< */
	ORI_logCategory_System,								/**< */
	ORI_logCategory_Crash,								/**< */
	ORI_logCategory_Application,						/**< */
	ORI_logCategory_Debug,								/**< */
	ORI_logCategory_Other,								/**< */
	ORI_logCategory_Invalid,							/**< */
} ORI_logCategory_e;

/**
 * @brief Get a string describing an ::ORI_logCategory_e.
 * @param logCategory The ::ORI_logCategory_e.
 * @return The describing string.
 */
const char * 					ORI_logCategory_Print(ORI_logCategory_e logCategory);

/**
 * @brief Get an ::ORI_logCategory_e from a string.
 * @param logCategoryString The string to match.
 * @return The matched ::ORI_logCategory_e, or ::ORI_logCategory_Invalid if failure.
 */
ORI_logCategory_e 				ORI_logCategory_Enum(const char * logCategoryString);



/*-----------------------------------------------------------------------------------------
 * ORI_OVERFLOWBEHAVIOUR ENUMERATION
 *-----------------------------------------------------------------------------------------*/

/**
 * @enum ORI_overflowBehaviour_e
 * @brief Log overflow behaviour enumeration.
 *
 */
typedef enum
{
	ORI_overflowBehaviour_Stop = 0,						/**< */
	ORI_overflowBehaviour_Fifo,							/**< */
	ORI_overflowBehaviour_Invalid,						/**< */
} ORI_overflowBehaviour_e;

/**
 * @brief Get a string describing an ::ORI_overflowBehaviour_e.
 * @param overflowBehaviour The ::ORI_overflowBehaviour_e.
 * @return The describing string.
 */
const char * 					ORI_overflowBehaviour_Print(ORI_overflowBehaviour_e overflowBehaviour);

/**
 * @brief Get an ::ORI_overflowBehaviour_e from a string.
 * @param overflowBehaviourString The string to match.
 * @return The matched ::ORI_overflowBehaviour_e, or ::ORI_overflowBehaviour_Invalid if failure.
 */
ORI_overflowBehaviour_e 		ORI_overflowBehaviour_Enum(const char * overflowBehaviourString);



/*-----------------------------------------------------------------------------------------
 * ORI_TIMERTYPE ENUMERATION
 *-----------------------------------------------------------------------------------------*/

/**
 * @enum ORI_timerType_e
 * @brief Log timer type enumeration.
 */
typedef enum
{
	ORI_timerType_OneShot = 0,							/**< */
	ORI_timerType_Periodic,								/**< */
	ORI_timerType_Invalid,								/**< */
} ORI_timerType_e;

/**
 * @brief Get a string describing an ::ORI_timerType_e.
 * @param timerType The ::ORI_timerType_e.
 * @return The describing string.
 */
const char * 					ORI_timerType_Print(ORI_timerType_e timerType);

/**
 * @brief Get an ::ORI_timerType_e from a string.
 * @param timerTypeString The string to match.
 * @return The matched ::ORI_timerType_e, or ::ORI_timerType_Invalid if failure.
 */
ORI_timerType_e 				ORI_timerType_Enum(const char * timerTypeString);



/*-----------------------------------------------------------------------------------------
 *	ORI_FAULTTYPE ENUMERATION
 *-----------------------------------------------------------------------------------------*/

/**
 * @enum ORI_FaultType_e
 * @brief ORI fault types enumeration.
 */
typedef enum
{
	ORI_FaultType_RE_ExtSupplyUnderVolt = 0,			/**< */
	ORI_FaultType_RE_OverTemp,							/**< */
	ORI_FaultType_RE_DigInOverdrive,					/**< */
	ORI_FaultType_RE_RFOutOverdrive,					/**< */
	ORI_FaultType_RE_TXGainFail,						/**< */
	ORI_FaultType_RE_RXGainFail,						/**< */
	ORI_FaultType_AntennaPort_VSWROutOfRange,			/**< */
	ORI_FaultType_AntennaPort_NonAisgTmaMalfct,			/**< */
	ORI_FaultType_ORILink_LinkFail,						/**< */
	ORI_FaultType_ORILink_PortFail,						/**< */
	ORI_FaultType_ORILink_SyncFail,						/**< */
	ORI_FaultType_AISGPort_AisgMalfct,					/**< */
	ORI_FaultType_Invalid,
} ORI_FaultType_e;

/**
 * @brief Get a string describing an ::ORI_FaultType_e.
 * @param faultType The ::ORI_FaultType_e.
 * @return The describing string.
 */
const char * 					ORI_FaultType_Print(ORI_FaultType_e faultType);

/**
 * @brief Get an ::ORI_FaultType_e from a string.
 * @param faultTypeString The string to match.
 * @return The matched ::ORI_FaultType_e, or ::ORI_FaultType_Invalid if failure.
 */
ORI_FaultType_e 				ORI_FaultType_Enum(const char * faultTypeString);



/*-----------------------------------------------------------------------------------------
 * ORI_FAULTSTATE ENUMERATION
 *-----------------------------------------------------------------------------------------*/

/**
 * @enum ORI_FaultState_e
 * @brief ORI RE fault state enumeration.
 */
typedef enum
{
    ORI_FaultState_Cleared = 0,							/**< */
    ORI_FaultState_Active,								/**< */
    ORI_FaultState_Unknown,								/**< */
} ORI_FaultState_e;

/**
 * @brief Get a string describing an ::ORI_FaultState_e.
 * @param faultState The ::ORI_FaultState_e.
 * @return The describing string.
 */
const char * 					ORI_FaultState_Print(ORI_FaultState_e faultState);

/**
 * @brief Get an ::ORI_FaultState_e from a string.
 * @param faultStateString The string to match.
 * @return The matched ::ORI_FaultState_e, or ::ORI_FaultState_Unknown if failure.
 */
ORI_FaultState_e 				ORI_FaultState_Enum(const char * faultStateString);



/*-----------------------------------------------------------------------------------------
 * ORI_FAULTSEVERITY ENUMERATION
 *-----------------------------------------------------------------------------------------*/

/**
 * @enum ORI_FaultSeverity_e
 * @brief ORI RE fault severity enumeration.
 */
typedef enum
{
	ORI_FaultSeverity_Failed = 0,						/**< */
	ORI_FaultSeverity_Degraded,							/**< */
	ORI_FaultSeverity_Warning,							/**< */
	ORI_FaultSeverity_Unknown,							/**< */
} ORI_FaultSeverity_e;

/**
 * @brief Get a string describing an ::ORI_FaultSeverity_e.
 * @param faultSeverity The ::ORI_FaultSeverity_e.
 * @return The describing string.
 */
const char * 					ORI_FaultSeverity_Print(ORI_FaultSeverity_e faultSeverity);

/**
 * @brief Get an ::ORI_FaultSeverity_e from a string.
 * @param faultSeverityString The string to match.
 * @return The matched ::ORI_FaultSeverity_e, or ::ORI_FaultSeverity_Unknown if failure.
 */
ORI_FaultSeverity_e 			ORI_FaultSeverity_Enum(const char * faultSeverityString);



/*-----------------------------------------------------------------------------------------
 * ORI_EVENTDRIVENREPORT ENUMERATION
 *-----------------------------------------------------------------------------------------*/

/**
 * @enum ORI_EventDrivenReport_e
 * @brief Event driven reporting enumeration.
 */
typedef enum
{
	ORI_EventDrivenReport_NoModify = 0,					/**< */
	ORI_EventDrivenReport_True,							/**< */
	ORI_EventDrivenReport_False,						/**< */
	ORI_EventDrivenReport_Invalid,						/**< */
} ORI_EventDrivenReport_e;



/*-----------------------------------------------------------------------------------------
 * ORI_AISGLAYER7COMMAND ENUMERATION
 *-----------------------------------------------------------------------------------------*/

/**
 * @enum ORI_AisgLayer7Command_e
 * @brief Aisg Layer7 commands byte code enumeration.
 */
typedef enum
{
	ORI_AisgLayer7Command_Unknown 					= 0,			/**< */
	/* Common procedures */
	ORI_AisgLayer7Command_Reset						= 0x03,			/**< */
	ORI_AisgLayer7Command_GetAlarmStatus			= 0x04,			/**< */
	ORI_AisgLayer7Command_GetInfo 					= 0x05,			/**< */
	ORI_AisgLayer7Command_ClearActiveAlarms			= 0x06,			/**< */
	ORI_AisgLayer7Command_SelfTest					= 0x0A,			/**< */
	ORI_AisgLayer7Command_ReadUserData				= 0x10,			/**< */
	ORI_AisgLayer7Command_WriteUserData				= 0x11,			/**< */
	ORI_AisgLayer7Command_AlarmSubscribe			= 0x12,			/**< */
	ORI_AisgLayer7Command_DownloadStart				= 0x40,			/**< */
	ORI_AisgLayer7Command_DownloadApplication		= 0x41,			/**< */
	ORI_AisgLayer7Command_DownloadEnd				= 0x42,			/**< */
	/* Single Antenna RET procedures */
	ORI_AisgLayer7Command_RetSingle_AlarmIndication	= 0x07,			/**< */
	ORI_AisgLayer7Command_RetSingle_SetDeviceData	= 0x0E,			/**< */
	ORI_AisgLayer7Command_RetSingle_GetDeviceData	= 0x0F,			/**< */
	ORI_AisgLayer7Command_RetSingle_Calibrate 		= 0x31,			/**< */
	ORI_AisgLayer7Command_RetSingle_SendConfigData	= 0x32,			/**< */
	ORI_AisgLayer7Command_RetSingle_SetTilt 		= 0x33,			/**< */
	ORI_AisgLayer7Command_RetSingle_GetTilt 		= 0x34,			/**< */
	/* Multi Antenna RET procedures */
	ORI_AisgLayer7Command_RetMulti_Calibrate 		= 0x80,			/**< */
	ORI_AisgLayer7Command_RetMulti_SetTilt 			= 0x81,			/**< */
	ORI_AisgLayer7Command_RetMulti_GetTilt 			= 0x82,			/**< */
	ORI_AisgLayer7Command_RetMulti_SetDeviceData	= 0x83,			/**< */
	ORI_AisgLayer7Command_RetMulti_GetDeviceData	= 0x84,			/**< */
	ORI_AisgLayer7Command_RetMulti_AlarmIndication	= 0x85,			/**< */
	ORI_AisgLayer7Command_RetMulti_ClearActiveAlarms= 0x86,			/**< */
	ORI_AisgLayer7Command_RetMulti_GetAlarmStatus	= 0x87,			/**< */
	ORI_AisgLayer7Command_RetMulti_GetNbrAntenna	= 0x88,			/**< */
	ORI_AisgLayer7Command_RetMulti_SendConfigData	= 0x89,			/**< */
	/* added specific command to check the existence of the aisg port from the model (this is not a real aisg command!) */
	ORI_AisgLayer7Command_CheckAisgPortExist		= 0xFE,			/**< */
	/* added specific command to get the aisg ALD device type from the model (this is not a real aisg command!) */
	ORI_AisgLayer7Command_GetDeviceType				= 0xFF,			/**< */
} ORI_AisgLayer7Command_e;


/*-----------------------------------------------------------------------------------------
 * ORI_AISGRETURNCODE ENUMERATION
 *-----------------------------------------------------------------------------------------*/

/**
 * @enum ORI_AisgReturnCode_e
 * @brief Aisg return code enumeration.
 */
typedef enum
{
	ORI_AisgReturnCode_OK 					= 0,			/**< */
	ORI_AisgReturnCode_MotorJam				= 0x02,			/**< */
	ORI_AisgReturnCode_ActuatorJam			= 0x03,			/**< */
	ORI_AisgReturnCode_Busy 				= 0x05,			/**< */
	ORI_AisgReturnCode_Checksum 			= 0x06,			/**< */
	ORI_AisgReturnCode_FAIL 				= 0x0B,			/**< */
	ORI_AisgReturnCode_NotCalibrated		= 0x0E,			/**< */
	ORI_AisgReturnCode_NotConfigured		= 0x0F,			/**< */
	ORI_AisgReturnCode_Hardware				= 0x11,			/**< */
	ORI_AisgReturnCode_OutOfRange			= 0x13,			/**< */
	ORI_AisgReturnCode_UnknownProcedure		= 0x19,			/**< */
	ORI_AisgReturnCode_ReadOnly 			= 0x1D,			/**< */
	ORI_AisgReturnCode_UnknownParameter		= 0x1E,			/**< */
	ORI_AisgReturnCode_WorkingSWMissing		= 0x21,			/**< */
	ORI_AisgReturnCode_InvalidFileContent	= 0x22,			/**< */
	ORI_AisgReturnCode_FormatError 			= 0x24,			/**< */
	ORI_AisgReturnCode_UnsupportedProcedure	= 0x25,			/**< */
	ORI_AisgReturnCode_InvalidProcedureSeq	= 0x26,			/**< */
	ORI_AisgReturnCode_ActuatorInterference	= 0x27,			/**< */
	ORI_AisgReturnCode_Unknown,
} ORI_AisgReturnCode_e;

/**
 * @brief Get a string describing an ::ORI_AisgReturnCode_e.
 * @param returnCode The ::ORI_AisgReturnCode_e.
 * @return The describing string.
 */
const char * 					ORI_AisgReturnCode_Print(ORI_AisgReturnCode_e returnCode);

/**
 * @brief Get an ::ORI_AisgReturnCode_e from a string.
 * @param returnCodeString The string to match.
 * @return The matched ::ORI_AisgReturnCode_e, or ::ORI_AisgReturnCode_Unknown if failure.
 */
ORI_AisgReturnCode_e 			ORI_AisgReturnCode_Enum(const char * returnCodeString);


/*-----------------------------------------------------------------------------------------
 * ORI_AISGDEVICEDATA ENUMERATION
 *-----------------------------------------------------------------------------------------*/

/**
 * @enum ORI_AisgDeviceData_e
 * @brief Aisg device data fields enumeration.
 */
typedef enum
{
	ORI_AisgDeviceData_AntennaModelNbr		= 1,			/**< */
	ORI_AisgDeviceData_AntennaSerialNbr		= 2,			/**< */
	ORI_AisgDeviceData_AntennaFreqBand		= 3,			/**< */
	ORI_AisgDeviceData_BeamwidthBand		= 4,			/**< */
	ORI_AisgDeviceData_GainBand				= 5,			/**< */
	ORI_AisgDeviceData_MaxTilt				= 6,			/**< */
	ORI_AisgDeviceData_MinTilt				= 7,			/**< */
	ORI_AisgDeviceData_InstallationDate		= 0x21,			/**< */
	ORI_AisgDeviceData_InstallerID			= 0x22,			/**< */
	ORI_AisgDeviceData_BasestationID		= 0x23,			/**< */
	ORI_AisgDeviceData_SectorID				= 0x24,			/**< */
	ORI_AisgDeviceData_AntennaBearing		= 0x25,			/**< */
	ORI_AisgDeviceData_MechanicalTilt		= 0x26,			/**< */
	ORI_AisgDeviceData_Unknown,
} ORI_AisgDeviceData_e;

/**
 * @brief Get a string describing an ::ORI_AisgDeviceData_e.
 * @param field The ::ORI_AisgDeviceData_e.
 * @return The describing string.
 */
const char * 					ORI_AisgDeviceDataField_Print(ORI_AisgDeviceData_e field);

/**
 * @brief Get an ::ORI_AisgDeviceData_e from a string.
 * @param fieldString The string to match.
 * @return The matched ::ORI_AisgDeviceData_e, or ::ORI_AisgDeviceData_Unknown if failure.
 */
ORI_AisgDeviceData_e 			ORI_AisgDeviceDataField_Enum(const char * fieldString);



/*-----------------------------------------------------------------------------------------
 * OBJECT TYPE REFERENCE
 *-----------------------------------------------------------------------------------------*/

/* Forward declaration of the ORI_Object_s structure. */
typedef struct ORI_Object_s ORI_Object_s;

/**
 * @struct ORI_ObjectTypeRef_s
 * @brief Object type reference structure.
 *
 * This structure represents an ORI ObjectTypeRef, which does not fully describe an ORI object
 * because it is not associated to an instance number.
 */
 typedef struct
{
	ORI_Object_s *		parent;							/**< Parent object reference, may be NULL if no parent. */
	ORI_ObjectType_e	type;							/**< Object type. */
} ORI_ObjectTypeRef_s;





/*-----------------------------------------------------------------------------------------
 * OBJECT PARAMETERS
 *-----------------------------------------------------------------------------------------*/

/**
 * @struct ORI_ObjectParams_RE_s
 * @brief Structure containing the parameters of a RE object.
 */
typedef struct
{
	char 					vendorID[4];				/**< RO. Vendor ID as signaled in DHCP code 201, normally 3 characters */
	char 					productID[81];				/**< RO. RE product ID.*/
	char 					productRev[81];				/**< RO. RE product revision. */
	char 					serialNumber[41];			/**< RO. RE serial number. */
	char 					protocolVer[11];			/**< RO. OCP protocol supported. */
	ORI_agcGranularity_e	agcTargetLevCfgGran;		/**< RO. UL AGC target RMS level config granularity. */
	ORI_agcGranularity_e 	agcSettlTimeCfgGran;		/**< RO. UL AGC settling time config granularity. */
	uint16_t				agcSettlTimeCap;			/**< RO. UL AGC settling time capability. */
	uint32_t				AWS_uptime;					/**< RO. AW2S Vendor specific: Uptime since boot in seconds. */
	int32_t					AWS_inputVoltage;			/**< RO. AW2S Vendor specific: RE input voltage in mV. */
	int32_t					AWS_inputCurrent;			/**< RO. AW2S Vendor specific: RE input current in mA. */
	int16_t					AWS_productTemp;			/**< RO. AW2S Vendor specific: RE temperature in degC. */
	int16_t					AWS_cpuTemp;				/**< RO. AW2S Vendor specific: CPU temperature in degC. */
	int16_t					AWS_paTemp;					/**< RO. AW2S Vendor specific: Power amplifier temperature in degC. */
	int16_t					AWS_rxPwrOffset;			/**< RO. AW2S Vendor specific: Receiver dBFS to dBm power conversion offset, unit is dB/10 (e.g. -340 for -34 dB). */
} ORI_ObjectParams_RE_s;

/**
 * @struct ORI_ObjectParams_AntennaPort_s
 * @brief Structure containing the parameters of an Antenna Port object.
 */
typedef struct
{
	char 		portLabel[81];							/**< RO. Physical antenna port label.*/
	int16_t 	AWS_outputPwr;							/**< RO. AW2S Vendor specific: Measured output power for this antenna, unit is dBm/10 (e.g. 400 for 40 dBm). */
	int16_t 	AWS_inputPwr;							/**< RO. AW2S Vendor specific: Measured input power for this antenna, unit is dBm/10 (e.g. -650 for -65 dBm). */
	int16_t 	AWS_returnLoss;							/**< RO. AW2S Vendor specific: Measured return loss for this antenna, unit is dB/10 (e.g. 50 for 5 dB). */
} ORI_ObjectParams_AntennaPort_s;

/**
 * @struct ORI_ObjectParams_TxSigPathUtra_s
 * @brief Structure containing the parameters of a TxSigPath UTRAFDD object.
 */
typedef struct
{
	uint16_t			dlCalREMax;						/**< RO. Max possible buffer in RE for DL timing calibration in Tc/16.*/
	uint32_t			t2a;							/**< RO. RE time delay. */
	uint16_t			dlCalRE;						/**< RW-Locked. Time delay to enable DL timing calibration in Tc/16. */
	int16_t 			maxTxPwr;						/**< RW. Max tx power for this path, unit is dBm/10 (e.g. 400 for 40 dBm). */
	uint8_t 			axcW;							/**< RW-Locked. AxC W parameter. */
	uint8_t				axcB;							/**< RW-Locked. AxC B parameter. */
	ORI_Object_s *		oriLink;						/**< RW-Locked. ORI Link on which the AxC is mapped. */
	uint32_t			uarfcn;							/**< RW-Locked. Downlink UARFCN. */
	ORI_Object_s *		antPort;						/**< RW-Locked. Reference Antenna port for this signal. */
	int16_t 			AWS_measuredPwr;				/**< RO. AW2S Vendor specific: Measured Tx power for this path, unit is dBm/10 (e.g. 400 for 40 dBm). */
	uint16_t 			AWS_axcIncr;					/**< RW-Locked. AW2S Vendor specific: AxC increment for each sample, 0 means auto (= packed, no interleaving). */
	ORI_Boolean_e 		AWS_enPeakCancel;				/**< RW-Locked. AW2S Vendor specific: Peak-Cancellation CFR enablement. */
} ORI_ObjectParams_TxSigPathUtra_s;

/**
 * @struct ORI_ObjectParams_TxSigPathEUtraFDD_s
 * @brief Structure containing the parameters of a TxSigPath EUTRAFDD object.
 */
typedef struct
{
	uint16_t 			chanBW;							/**< RW-Locked. Channel bandwith in MHz/10 (14 / 30 / 50 / 100 / 150 / 200). */
	uint16_t			dlCalREMax;						/**< RO. Max possible buffer in RE for DL timing calibration in Tc/16.*/
	uint32_t			t2a;							/**< RO. RE time delay. */
	uint16_t 			dlCalRE;						/**< RW-Locked. Time delay to enable DL timing calibration in Tc/16. */
	int16_t 			maxTxPwr;						/**< RW. Max tx power for this path, unit is dBm/10 (e.g. 400 for 40 dBm). */
	uint8_t 			axcW;							/**< RW-Locked. AxC W parameter. */
	uint8_t 			axcB;							/**< RW-Locked. AxC B parameter. */
	ORI_Object_s * 		oriLink;						/**< RW-Locked. ORI Link on which the AxC is mapped. */
	uint32_t 			earfcn;							/**< RW-Locked. Downlink EARFCN. */
	ORI_Object_s *		antPort;						/**< RW-Locked. Reference Antenna port for this signal. */
	ORI_Boolean_e		enableIQDLComp;					/**< RW-Locked. IQ data compression enablement. */
	uint32_t			sigmaIQ;						/**< RW-Locked. Sigma IQ value for IQ data compression. */
	ORI_Boolean_e		AWS_enableCompRateChange;		/**< RW-Locked. AW2S Vendor specific: Enable IQ data compression sample rate change. */
	ORI_Boolean_e		AWS_enableCompBitChange;		/**< RW-Locked. AW2S Vendor specific: Enable IQ data compression bit width change. */
	int16_t 			AWS_measuredPwr;				/**< RO. AW2S Vendor specific: Measured Tx power for this path, unit is dBm/10 (e.g. 400 for 40 dBm). */
	uint16_t 			AWS_axcIncr;					/**< RW-Locked. AW2S Vendor specific: AxC increment for each sample, 0 means auto (= packed, no interleaving). */
	ORI_Boolean_e 		AWS_enPeakCancel;				/**< RW-Locked. AW2S Vendor specific: Peak-Cancellation CFR enablement. */
} ORI_ObjectParams_TxSigPathEUtraFDD_s;

/**
 * @struct ORI_ObjectParams_TxSigPathEUtraTDD_s
 * @brief Structure containing the parameters of a TxSigPath EUTRATDD object.
 */
typedef struct
{
	uint16_t 			chanBW;							/**< RW-Locked. Channel bandwith in MHz/10 (14 / 30 / 50 / 100 / 150 / 200). */
	uint8_t				tddULDLConfig;					/**< RW-Locked. TDD UL/DL config. */
	uint8_t				tddSpecialSFConfig;				/**< RW-Locked. TDD SSF config. */
	ORI_tddCPLength_e	tddCPLengthDL;					/**< RW-Locked. TDD Cyclic prefix length. */
	uint16_t 			dlCalREMax;						/**< RO. Max possible buffer in RE for DL timing calibration in Tc/16.*/
	uint32_t 			t2a;							/**< RO. RE time delay. */
	uint16_t 			dlCalRE;						/**< RW-Locked. Time delay to enable DL timing calibration in Tc/16. */
	int16_t 			maxTxPwr;						/**< RW. Max tx power for this path, unit is dBm/10 (e.g. 400 for 40 dBm). */
	uint8_t 			axcW;							/**< RW-Locked. AxC W parameter. */
	uint8_t 			axcB;							/**< RW-Locked. AxC B parameter. */
	ORI_Object_s * 		oriLink;						/**< RW-Locked. ORI Link on which the AxC is mapped. */
	uint32_t 			earfcn;							/**< RW-Locked. Downlink EARFCN. */
	ORI_Object_s *		antPort;						/**< RW-Locked. Reference Antenna port for this signal. */
	ORI_Boolean_e		enableIQDLComp;					/**< RW-Locked. IQ data compression enablement. */
	uint32_t			sigmaIQ;						/**< RW-Locked. Sigma IQ value for IQ data compression. */
	ORI_Boolean_e		AWS_enableCompRateChange;		/**< RW-Locked. AW2S Vendor specific: Enable IQ data compression sample rate change. */
	ORI_Boolean_e		AWS_enableCompBitChange;		/**< RW-Locked. AW2S Vendor specific: Enable IQ data compression bit width change. */
	int16_t 			AWS_measuredPwr;				/**< RO. AW2S Vendor specific: Measured Tx power for this path, unit is dBm/10 (e.g. 400 for 40 dBm). */
	uint16_t 			AWS_axcIncr;					/**< RW-Locked. AW2S Vendor specific: AxC increment for each sample, 0 means auto (= packed, no interleaving). */
	ORI_Boolean_e 		AWS_enPeakCancel;				/**< RW-Locked. AW2S Vendor specific: Peak-Cancellation CFR enablement. */
} ORI_ObjectParams_TxSigPathEUtraTDD_s;

/**
 * @struct ORI_ObjectParams_TxSigPathGSM_s
 * @brief Structure containing the parameters of a TxSigPath GSM object.
 */
typedef struct
{
	uint16_t 			dlCalREMax;						/**< RO. Max possible buffer in RE for DL timing calibration in Tc/16.*/
	ORI_freqBand_e 		freqBandInd;					/**< GSM frequency band indicator. */
	uint32_t 			t2a;							/**< RO. RE time delay. */
	uint16_t 			dlCalRE;						/**< RW-Locked. Time delay to enable DL timing calibration in Tc/16. */
	int16_t 			maxTxPwr;						/**< RW. Max tx power for this path, unit is dBm/10 (e.g. 400 for 40 dBm). */
	uint8_t 			axcW;							/**< RW-Locked. AxC W parameter. */
	uint8_t 			axcB;							/**< RW-Locked. AxC B parameter. */
	ORI_Object_s * 		oriLink;						/**< RW-Locked. ORI Link on which the AxC is mapped. */
	ORI_Object_s *		antPort;						/**< RW-Locked. Reference Antenna port for this signal. */
	int16_t 			AWS_measuredPwr;				/**< RO. AW2S Vendor specific: Measured Tx power for this path, unit is dBm/10 (e.g. 400 for 40 dBm). */
	uint16_t 			AWS_axcIncr;					/**< RW-Locked. AW2S Vendor specific: AxC increment for each sample, 0 means auto (= packed, no interleaving). */
	ORI_Boolean_e 		AWS_enPeakCancel;				/**< RW-Locked. AW2S Vendor specific: Peak-Cancellation CFR enablement. */
} ORI_ObjectParams_TxSigPathGSM_s;

/**
 * @struct ORI_ObjectParams_RxSigPathUtra_s
 * @brief Structure containing the parameters of a RxSigPath UTRAFDD object.
 */
typedef struct
{
	uint16_t			ulCalREMax;						/**< RO. Max possible buffer in RE for UL timing calibration in Tc/2.*/
	uint32_t 			ta3;							/**< RO. RE time delay. */
	uint16_t 			ulCalRE;						/**< RW-Locked. Time delay to enable UL timing calibration in Tc/2. */
	uint8_t 			axcW;							/**< RW-Locked. AxC W parameter. */
	uint8_t 			axcB;							/**< RW-Locked. AxC B parameter. */
	uint8_t 			rtwpGroup;						/**< RW-Locked. Location of the RTWP measurements for this AxC. */
	ORI_Object_s * 		oriLink;						/**< RW-Locked. ORI Link on which the AxC is mapped. */
	ORI_Object_s *		antPort;						/**< RW-Locked. Reference Antenna port for this signal. */
	uint32_t			uarfcn;							/**< RW-Locked. Uplink UARFCN. */
	int16_t 			ulFeedAdj;						/**< RW. Uplink feeder adjustment in dB/10 (e.g. 200 for 20 dB). */
	uint8_t				ulTgtRMSLvl;					/**< RW-Locked. Uplink target RMS level. */
	uint8_t				ulAGCSetlgTime;					/**< RW-Locked. Uplink AGC settling time. */
	int16_t 			AWS_measuredPwr;				/**< RO. AW2S Vendor specific: Measured Rx power for this path, unit is dBm/10 (e.g. -650 for -65 dBm). */
	uint16_t 			AWS_axcIncr;					/**< RW-Locked. AW2S Vendor specific: AxC increment for each sample, 0 means auto (= packed, no interleaving). */
} ORI_ObjectParams_RxSigPathUtra_s;

/**
 * @struct ORI_ObjectParams_RxSigPathEUtraFDD_s
 * @brief Structure containing the parameters of a RxSigPath EUTRAFDD object.
 *
 */
typedef struct
{
	uint16_t 			chanBW;							/**< RW-Locked. Channel bandwith in MHz/10 (14 / 30 / 50 / 100 / 150 / 200). */
	uint16_t			ulCalREMax;						/**< RO. Max possible buffer in RE for UL timing calibration in Tc/2.*/
	uint32_t  			ta3;							/**< RO. RE time delay. */
	uint16_t 			ulCalRE;						/**< RW-Locked. Time delay to enable UL timing calibration in Tc/2. */
	uint8_t 			axcW;							/**< RW-Locked. AxC W parameter. */
	uint8_t 			axcB;							/**< RW-Locked. AxC B parameter. */
	ORI_Object_s * 		oriLink;						/**< RW-Locked. ORI Link on which the AxC is mapped. */
	ORI_Object_s *		antPort;						/**< RW-Locked. Reference Antenna port for this signal. */
	uint32_t 			earfcn;							/**< RW-Locked. Uplink EARFCN. */
	ORI_Boolean_e		enableIQULComp;					/**< RW-Locked. IQ data compression enablement. */
	uint32_t			sigmaIQ;						/**< RW-Locked. Sigma IQ value for IQ data compression. */
	ORI_Boolean_e		AWS_enableCompRateChange;		/**< RW-Locked. AW2S Vendor specific: Enable IQ data compression sample rate change. */
	ORI_Boolean_e		AWS_enableCompBitChange;		/**< RW-Locked. AW2S Vendor specific: Enable IQ data compression bit width change. */
	int16_t 			AWS_measuredPwr;				/**< RO. AW2S Vendor specific: Measured Rx power for this path, unit is dBm/10 (e.g. -650 for -65 dBm). */
	uint16_t 			AWS_axcIncr;					/**< RW-Locked. AW2S Vendor specific: AxC increment for each sample, 0 means auto (= packed, no interleaving). */
} ORI_ObjectParams_RxSigPathEUtraFDD_s;

/**
 * @struct ORI_ObjectParams_RxSigPathEUtraTDD_s
 * @brief Structure containing the parameters of a RxSigPath EUTRATDD object.
 *
 */
typedef struct
{
	uint16_t 			chanBW;							/**< RW-Locked. Channel bandwith in MHz/10 (14 / 30 / 50 / 100 / 150 / 200). */
	uint8_t				tddULDLConfig;					/**< RW-Locked. TDD UL/DL config. */
	uint8_t				tddSpecialSFConfig;				/**< RW-Locked. TDD SSF config. */
	ORI_tddCPLength_e	tddCPLengthUL;					/**< RW-Locked. TDD Cyclic prefix length. */
	uint16_t			ulCalREMax;						/**< RO. Max possible buffer in RE for UL timing calibration in Tc/2.*/
	uint32_t  			ta3;							/**< RO. RE time delay. */
	uint16_t 			ulCalRE;						/**< RW-Locked. Time delay to enable UL timing calibration in Tc/2. */
	uint8_t 			axcW;							/**< RW-Locked. AxC W parameter. */
	uint8_t 			axcB;							/**< RW-Locked. AxC B parameter. */
	ORI_Object_s * 		oriLink;						/**< RW-Locked. ORI Link on which the AxC is mapped. */
	ORI_Object_s *		antPort;						/**< RW-Locked. Reference Antenna port for this signal. */
	uint32_t 			earfcn;							/**< RW-Locked. Uplink EARFCN. */
	ORI_Boolean_e		enableIQULComp;					/**< RW-Locked. IQ data compression enablement. */
	uint32_t			sigmaIQ;						/**< RW-Locked. Sigma IQ value for IQ data compression. */
	ORI_Boolean_e		AWS_enableCompRateChange;		/**< RW-Locked. AW2S Vendor specific: Enable IQ data compression sample rate change. */
	ORI_Boolean_e		AWS_enableCompBitChange;		/**< RW-Locked. AW2S Vendor specific: Enable IQ data compression bit width change. */
	int16_t 			AWS_measuredPwr;				/**< RO. AW2S Vendor specific: Measured Rx power for this path, unit is dBm/10 (e.g. -650 for -65 dBm). */
	uint16_t 			AWS_axcIncr;					/**< RW-Locked. AW2S Vendor specific: AxC increment for each sample, 0 means auto (= packed, no interleaving). */
} ORI_ObjectParams_RxSigPathEUtraTDD_s;

/**
 * @struct ORI_ObjectParams_RxSigPathGSM_s
 * @brief Structure containing the parameters of a RxSigPath GSM object.
 */
typedef struct
{
	uint16_t			ulCalREMax;						/**< RO. Max possible buffer in RE for UL timing calibration in Tc/2.*/
	ORI_freqBand_e 		freqBandInd;					/**< GSM frequency band indicator. */
	uint32_t  			ta3;							/**< RO. RE time delay. */
	uint16_t 			ulCalRE;						/**< RW-Locked. Time delay to enable UL timing calibration in Tc/2. */
	uint8_t 			axcW;							/**< RW-Locked. AxC W parameter. */
	uint8_t 			axcB;							/**< RW-Locked. AxC B parameter. */
	ORI_Object_s * 		oriLink;						/**< RW-Locked. ORI Link on which the AxC is mapped. */
	ORI_Object_s *		antPort;						/**< RW-Locked. Reference Antenna port for this signal. */
	int16_t 			ulFeedAdj;						/**< RW. Uplink feeder adjustment in dB/10 (e.g. 200 for 20 dB). */
	ORI_Object_s *		TxSigPath;						/**< RW-Locked. Associated TxSigPath for frequency hopping information. */
	int16_t 			AWS_measuredPwr;				/**< RO. AW2S Vendor specific: Measured Rx power for this path, unit is dBm/10 (e.g. -650 for -65 dBm). */
	uint16_t 			AWS_axcIncr;					/**< RW-Locked. AW2S Vendor specific: AxC increment for each sample, 0 means auto (= packed, no interleaving). */
} ORI_ObjectParams_RxSigPathGSM_s;

/**
 * @struct ORI_ObjectParams_ORILink_s
 * @brief Structure containing the parameters of an ORI Link object.
 */
typedef struct
{
	char 						portLabel[81];			/**< RO. Physical ORI link port label. */
	ORI_portRoleCapability_e	portRoleCapability;		/**< RO. Port role capability. */
	ORI_portRole_e 				portRole;				/**< RW-Locked. Port role. */
	int16_t						bitRateSupport;			/**< RO. Supported line bit rate. */
	uint8_t 					bitRateRequested;		/**< RW-Locked. Requested line bit rate. 0 for auto-negotitation. */
	uint8_t 					bitRateOperational;		/**< RO. Current line bit rate. 0 for link down. */
	uint64_t 					localPortID;			/**< RO. Local end port ID. */
	uint64_t 					remotePortID;			/**< RO. Remote end port ID. */
	uint32_t 					toffset;				/**< RO. CPRI time delay component. */
	ORI_linkType_e				oriLinkType;			/**< RW-Locked. ORI Link type. */
	uint8_t						AWS_localMAC[6];		/**< R0. AW2S Vendor specific: Local MAC address of the ORI link. */
	uint8_t						AWS_remoteMAC[6];		/**< RW. AW2S Vendor specific: Remote MAC address of the ORI link. */
	uint32_t 					AWS_t14;				/**< RO. AW2S Vendor specific: CPRI time delay component. */
	uint8_t						AWS_remoteIP[4];		/**< RW. AW2S Vendor specific: REC IP for ECPRI Ethernet frame */
	uint8_t						AWS_localIP[4];			/**< R0. AW2S Vendor specific: RE IP for ECPRI Ethernet frame */
	uint16_t					AWS_remoteUdpPort;		/**< RW. AW2S Vendor specific: REC Udp Port for ECPRI Ethernet frame */
	uint16_t					AWS_localUdpPort;		/**< R0. AW2S Vendor specific: RE Udp Port for ECPRI Ethernet frame */
	uint32_t 					AWS_sfpTxPow;			/**< RO. AW2S Vendor specific: SFP Tx power. */
	uint32_t 					AWS_sfpRxPow;			/**< RO. AW2S Vendor specific: SFP Rx power. */
} ORI_ObjectParams_ORILink_s;

/**
 * @struct ORI_ObjectParams_ExternalEventPort_s
 * @brief Structure containing the parameters of an External Event Port object.
 */
typedef struct
{
	char 				portLabel[81];					/**< RO. External event port label. */
} ORI_ObjectParams_ExternalEventPort_s;

/**
 * @struct ORI_ObjectParams_AISGPort_s
 * @brief Structure containing the parameters of an AISG Port object.
 */
typedef struct
{
	char 						portLabel[81];			/**< RO. AISG port label. */
	ORI_Boolean_e 				busPowerEnable;			/**< RW-Locked. Bus power enablement. */
} ORI_ObjectParams_AISGPort_s;

/**
 * @struct ORI_ObjectParams_AISGALD_s
 * @brief Structure containing the parameters of an AISG ALD object.
 */
typedef struct
{
	uint8_t 				deviceType;					/**< RW-Locked. Device type of the ALD. */
	uint8_t 				UID[20];					/**< RW-Locked. Unique ID array. */
	uint8_t					releaseID;					/**< RO. 3GPP protocol release. */
	uint8_t					aisgVersion;				/**< RO. AISG protocol version. */
	uint8_t					deviceTypeVersion[3];		/**< RO. Device type substance version. */
	uint16_t				frameLength;				/**< RO. Maximum frame length for AISG Layer 7 message payload. */
	uint8_t					hdlcAdress;					/**< RO. Actual HLDC address. */
} ORI_ObjectParams_AISGALD_s;

/**
 * @struct ORI_ObjectParams_Log_s
 * @brief Structure containing the parameters of a Log object.
 */
typedef struct
{
	char 						logTypeID[41];			/**< RO. Log type identifier. */
	char 						description[81];		/**< RO. Log description. */
	ORI_logCategory_e			logCategory;			/**< RO. Log category. */
	uint32_t 					maxREfileSize;			/**< RO. Max RE file size in kB. */
	uint32_t 					maxRECfileSize;			/**< RW. Max REC file size in kB. */
	ORI_Boolean_e 				enableNotification;		/**< RW. Enable REC notification on file transfer availability. */
	ORI_Boolean_e 				fileAvailable;			/**< RO. File is available. */
	ORI_overflowBehaviour_e		overflowBehaviour;		/**< RW. Behaviour on overflow. */
	ORI_Boolean_e				recordingEnabled;		/**< RW. Recording enablement. */
	uint64_t					logPeriod;				/**< RW. Log expiration period in seconds. */
	ORI_timerType_e				timerType;				/**< RW. Log expiration behaviour. */
} ORI_ObjectParams_Log_s;

/**
 * @struct ORI_ObjectParams_DLRoutedIQData_s
 * @brief Structure containing the parameters of a DL Routed IQ Data object.
 */
typedef struct
{
	uint16_t 			IQsubBlockSize;					/**< RW-Locked. Number of bits contained in the IQ data sub-block. */
	ORI_Object_s *		MasterPortOriLink;				/**< RW-Locked. Reference to the master port ORI Link. */
	uint8_t 			MasterPortIQblkW;				/**< RW-Locked. Sub-block start W parameter for master port. */
	uint16_t 			MasterPortIQblkB;				/**< RW-Locked. Sub-block start B parameter for master port. */
	ORI_Object_s *		SlavePortOriLink;				/**< RW-Locked. Reference to the slave port ORI Link. */
	uint8_t				SlavePortIQW;					/**< RW-Locked. Sub-block start W parameter for slave port. */
	uint16_t			SlavePortIQB;					/**< RW-Locked. Sub-block start B parameter for slave port. */
	uint16_t			TBDelayDL;						/**< RO. Internal RE delay from slave port to master port. */
} ORI_ObjectParams_DLRoutedIQData_s;

/**
 * @struct ORI_ObjectParams_ULRoutedIQData_s
 * @brief Structure containing the parameters of a UL Routed IQ Data object.
 */
typedef struct
{
	uint16_t 			IQsubBlockSize;					/**< RW-Locked. Number of bits contained in the IQ data sub-block. */
	ORI_Object_s *		MasterPortOriLink;				/**< RW-Locked. Reference to the master port ORI Link. */
	uint8_t				MasterPortIQblkW;				/**< RW-Locked. Sub-block start W parameter for master port. */
	uint16_t 			MasterPortIQblkB;				/**< RW-Locked. Sub-block start B parameter for master port. */
	ORI_Object_s *		SlavePortOriLink;				/**< RW-Locked. Reference to the slave port ORI Link. */
	uint8_t				SlavePortIQW;					/**< RW-Locked. Sub-block start W parameter for slave port. */
	uint16_t			SlavePortIQB;					/**< RW-Locked. Sub-block start B parameter for slave port. */
	uint16_t			TBDelayUL;						/**< RO. Internal RE delay from master port to slave port. */
} ORI_ObjectParams_ULRoutedIQData_s;

/**
 * @struct ORI_ObjectParams_DLRoutedCWBlock_s
 * @brief Structure containing the parameters of a DL Routed CW Block object.
 */
typedef struct
{
	uint8_t				CtrlBlockSize;					/**< RW-Locked. Number of consecutive sub-channels in the CW block. */
	uint8_t				SubChannelStart;				/**< RW-Locked. Lowest sub-channel of the CW block. */
	uint8_t				Ydepth;							/**< RW-Locked. Number of consecutive Y locations of the sub-channels in the CW block. */
	uint8_t				SlavePortYoffset;				/**< RW-Locked. Lowest Y location of the sub-channel(s) at the slave port. */
	uint8_t				MasterPortYoffset;				/**< RW-Locked. Lowest Y location of the sub-channel(s) at the master port. */
	ORI_Object_s *		SlavePortOriLink;				/**< RW-Locked. Reference to the slave port ORI Link. */
	ORI_Object_s *		MasterPortOriLink;				/**< RW-Locked. Reference to the master port ORI Link. */
} ORI_ObjectParams_DLRoutedCWBlock_s;

/**
 * @struct ORI_ObjectParams_ULRoutedCWBlock_s
 * @brief Structure containing the parameters of a UL Routed CW Block object.
 */
typedef struct
{
	uint8_t				CtrlBlockSize;					/**< RW-Locked. Number of consecutive sub-channels in the CW block. */
	uint8_t				SubChannelStart;				/**< RW-Locked. Lowest sub-channel of the CW block. */
	uint8_t				Ydepth;							/**< RW-Locked. Number of consecutive Y locations of the sub-channels in the CW block. */
	uint8_t				SlavePortYoffset;				/**< RW-Locked. Lowest Y location of the sub-channel(s) at the slave port. */
	uint8_t				MasterPortYoffset;				/**< RW-Locked. Lowest Y location of the sub-channel(s) at the master port. */
	ORI_Object_s *		SlavePortOriLink;				/**< RW-Locked. Reference to the slave port ORI Link. */
	ORI_Object_s *		MasterPortOriLink;				/**< RW-Locked. Reference to the master port ORI Link. */
} ORI_ObjectParams_ULRoutedCWBlock_s;

/**
 * @union ORI_ObjectParams_u
 * @brief Union of all the parameters of the ORI objects. Access each field based on the object type.
 */
typedef union
{
	ORI_ObjectParams_RE_s						RE;						/**< Parameters for ::ORI_ObjectType_RE. */
	ORI_ObjectParams_AntennaPort_s				AntPort;				/**< Parameters for ::ORI_ObjectType_AntennaPort. */
	ORI_ObjectParams_TxSigPathUtra_s	  		TxUtra;					/**< Parameters for ::ORI_ObjectType_TxUtra. */
	ORI_ObjectParams_TxSigPathEUtraFDD_s		TxEUtraFDD;				/**< Parameters for ::ORI_ObjectType_TxEUtraFDD. */
	ORI_ObjectParams_TxSigPathEUtraTDD_s		TxEUtraTDD;				/**< Parameters for ::ORI_ObjectType_TxEUtraTDD. */
	ORI_ObjectParams_TxSigPathGSM_s				TxGSM;					/**< Parameters for ::ORI_ObjectType_TxGSM. */
	ORI_ObjectParams_RxSigPathUtra_s	  		RxUtra;					/**< Parameters for ::ORI_ObjectType_RxUtra. */
	ORI_ObjectParams_RxSigPathEUtraFDD_s		RxEUtraFDD;				/**< Parameters for ::ORI_ObjectType_RxEUtraFDD. */
	ORI_ObjectParams_RxSigPathEUtraTDD_s		RxEUtraTDD;				/**< Parameters for ::ORI_ObjectType_RxEUtraTDD. */
	ORI_ObjectParams_RxSigPathGSM_s				RxGSM;					/**< Parameters for ::ORI_ObjectType_RxGSM. */
	ORI_ObjectParams_ORILink_s					ORILink;				/**< Parameters for ::ORI_ObjectType_ORILink. */
	ORI_ObjectParams_ExternalEventPort_s		ExternalEventPort;		/**< Parameters for ::ORI_ObjectType_ExternalEventPort. */
	ORI_ObjectParams_AISGPort_s					AISGPort;				/**< Parameters for ::ORI_ObjectType_AISGPort. */
	ORI_ObjectParams_AISGALD_s					AISGALD;				/**< Parameters for ::ORI_ObjectType_AISGALD. */
	ORI_ObjectParams_Log_s						Log;					/**< Parameters for ::ORI_ObjectType_Log. */
	ORI_ObjectParams_DLRoutedIQData_s			DLRoutedIQData;			/**< Parameters for ::ORI_ObjectType_DLRoutedIQData. */
	ORI_ObjectParams_ULRoutedIQData_s			ULRoutedIQData;			/**< Parameters for ::ORI_ObjectType_ULRoutedIQData. */
	ORI_ObjectParams_DLRoutedCWBlock_s			DLRoutedCWBlock;		/**< Parameters for ::ORI_ObjectType_DLRoutedCWBlock. */
	ORI_ObjectParams_ULRoutedCWBlock_s			ULRoutedCWBlock;		/**< Parameters for ::ORI_ObjectType_ULRoutedCWBlock. */
} ORI_ObjectParams_u;



/*-----------------------------------------------------------------------------------------
 * OBJECT FAULTS
 *-----------------------------------------------------------------------------------------*/

#define FAULT_MAX_AFFECTED_OBJ		20

/**
 * @struct ORI_Fault_s
 * @brief Structure detailing a fault, its state, severity, description and affected objects.
 */
typedef struct
{
	ORI_FaultState_e		state;										/**< Current state of the fault. */
	ORI_FaultSeverity_e		severity;									/**< Severity of the fault. */
	char 					timestamp[256];								/**< Time stamp string of the fault (RE time reference). */
	char					desc[256];									/**< Short text description associated to the fault. */
	uint32_t				numAffectedObjects;							/**< Number of additional objects affected by the fault. */
	ORI_Object_s *			affectedObjects[FAULT_MAX_AFFECTED_OBJ];	/**< List of additional objects affected by the fault. */
} ORI_Fault_s;

/**
 * @struct ORI_ObjectFaults_RE_s
 * @brief Structure containing the faults of a RE object.
 */
typedef struct
{
	ORI_Fault_s			extSuplyUndervolt;				/**< Power supply under voltage. FaultType is ::ORI_FaultType_RE_ExtSupplyUnderVolt */
	ORI_Fault_s			overTemp;						/**< Over temperature. FaultType is ::ORI_FaultType_RE_OverTemp */
	ORI_Fault_s			digInOverdrive;					/**< Input digital signal level overdrive. FaultType is ::ORI_FaultType_RE_DigInOverdrive */
	ORI_Fault_s			rfOutOverdrive;					/**< RF output power overdrive. FaultType is ::ORI_FaultType_RE_RFOutOverdrive */
	ORI_Fault_s			txGainFail;						/**< Tx gain control failure. FaultType is ::ORI_FaultType_RE_TXGainFail */
	ORI_Fault_s			rxGainFail;						/**< Rx gain control failure. FaultType is ::ORI_FaultType_RE_RXGainFail */
} ORI_ObjectFaults_RE_s;

/**
 * @struct ORI_ObjectFaults_AntennaPort_s
 * @brief Structure containing the faults of an Antenna Port object.
 */
typedef struct
{
	ORI_Fault_s			vswrOutOfRange;					/**< VSWR at the antenna port exceeded limit. FaultType is ::ORI_FaultType_AntennaPort_VSWROutOfRange */
	ORI_Fault_s			nonAisgTmaMalfct;				/**< Non AISG TMA malfunction. FaultType is ::ORI_FaultType_AntennaPort_NonAisgTmaMalfct */
} ORI_ObjectFaults_AntennaPort_s;

/**
 * @struct ORI_ObjectFaults_ORILink_s
 * @brief Structure containing the faults of an ORI Link object.
 */
typedef struct
{
	ORI_Fault_s			linkFailure;					/**< LOS, LOF, SDI or RAI received on the ORI Link. FaultType is ::ORI_FaultType_ORILink_LinkFail */
	ORI_Fault_s			portFailure;					/**< Local ORI slave port failure. FaultType is ::ORI_FaultType_ORILink_PortFail */
	ORI_Fault_s			syncFailure;					/**< Synchronization lost on slave port. FaultType is ::ORI_FaultType_ORILink_SyncFail */
} ORI_ObjectFaults_ORILink_s;

/**
 * @struct ORI_ObjectFaults_AISGPort_s
 * @brief Structure containing the faults of an AISG Port object.
 */
typedef struct
{
	ORI_Fault_s			aisgMalfct;						/**< Hardware malfunction on AISG port. FaultType is ::ORI_FaultType_AISGPort_AisgMalfct */
} ORI_ObjectFaults_AISGPort_s;

/**
 * @union ORI_ObjectFaults_u
 * @brief Union of all the faults of the ORI objects. Access each field based on the object type.
 */
typedef union
{
	ORI_ObjectFaults_RE_s						RE;						/**< Faults for ::ORI_ObjectType_RE. */
	ORI_ObjectFaults_AntennaPort_s				AntPort;				/**< Faults for ::ORI_ObjectType_AntennaPort. */
	ORI_ObjectFaults_ORILink_s					ORILink;				/**< Faults for ::ORI_ObjectType_ORILink. */
	ORI_ObjectFaults_AISGPort_s					AISGPort;				/**< Faults for ::ORI_ObjectType_AISGPort. */
} ORI_ObjectFaults_u;



/*-----------------------------------------------------------------------------------------
 * INDICATION DATA STRUCTURES
 *-----------------------------------------------------------------------------------------*/

/**
 * @struct ORI_Ind_TransferFileCmplt_s
 * @brief ORI file transfer complete indication structure.
 *
 * This structure is passed on a file transfer complete indication and gives the result
 * of a file transfer completion.
 */
typedef struct
{
	ORI_Result_e 			result;						/**< Result of the file transfer. */
	char 					failInfo[256];				/**< String indicating the file transfer failure reason, if applicable. */
} ORI_Ind_TransferFileCmplt_s;

/**
 * @struct ORI_Ind_ObjectStateChange_s
 * @brief ORI object state change indication structure.
 *
 * This structure is passed on an object state change indication and gives the affected object and the type of the
 * state that changed. <br>
 * The new state value is updated in the model and can be accessed directly in the object.
 */
typedef struct
{
	ORI_Object_s *			object;						/**< Object for which the state changed. */
	ORI_StateType_e			stateType;					/**< Type of the state that changed. */
} ORI_Ind_ObjectStateChange_s;

/**
 * @struct ORI_Ind_FaultChange_s
 * @brief ORI fault change indication structure.
 *
 * This structure is passed on a fault change indication (activated or cleared) and gives the primary affected object, the fault type and the actual fault structure. <br>
 * The new fault structure is updated in the model and can be accessed directly in the object based on the fault type.
 */
typedef struct
{
	ORI_Object_s *			object;						/**< Primary object affected by the fault. */
	ORI_FaultType_e			faultType;					/**< Type of the fault that changed. */
	ORI_Fault_s *			fault;						/**< Reference to the object's fault structure for the given fault type. */
} ORI_Ind_FaultChange_s;

/**
 * @struct ORI_Ind_FileAvailable_s
 * @brief ORI File Available indication structure.
 *
 * This structure is passed on a file available indication and gives the object concerned by the file available.
 */
typedef struct
{
	ORI_Object_s *			object;						/**< Object concerned by file availability. Valid objects : Log:X. */
} ORI_Ind_FileAvailable_s;

/**
 * @struct ORI_Ind_UploadFileCmpl_s
 * @brief ORI Upload File Complete indication structure.
 *
 * This structure is passed on an upload file complete indication and gives the result and the object concerned by the file upload.
 */
typedef struct
{
	ORI_Result_e			result;						/**< Result of the file transfer. */
	ORI_Object_s *			object;						/**< Object concerned by the file upload. Valid objects : RE:0 or Log:X. */
	char 					failInfo[256];				/**< String indicating the file transfer failure reason, if applicable. */
} ORI_Ind_UploadFileCmpl_s;

/**
 * @struct ORI_Ind_DeviceScanCmpl_s
 * @brief ORI AISG Device Scan Complete indication structure.
 *
 * This structure is passed on an aisg device scan complete indication and gives the result and the object concerned by the device scan.
 */
typedef struct
{
	ORI_Object_s *			object;						/**< Object concerned by the device scan. Valid objects : aisgPort:X. */
	int 					numAlds;					/**< integer indicating the number of ALDs found by the device scan. */
} ORI_Ind_DeviceScanCmpl_s;

/**
 * @struct ORI_Ind_L7respGetAlarm_s
 * @brief ORI AISG Transmit L7 message indication with command Get Alarm Status.
 *
 * This structure is passed on an aisg ALD receive indication and gives layer 7 message Get Alarm Status fields.
 */
typedef struct
{
	unsigned char			returnCode[16];	// returnCode, until 16 values supported
}ORI_Ind_L7respGetAlarm_s;

/**
 * @struct ORI_Ind_L7respGetInfo_s
 * @brief ORI AISG Transmit L7 message indication with command Get Info.
 *
 * This structure is passed on an aisg ALD receive indication and gives layer 7 message Get Info fields.
 */
typedef struct
{
	int 					PNlen;		// Product Number's length
	char 					PN[64];		// Product Number
	int 					SNlen;		// Serial Number's length
	char					SN[64];		// Serial Number
	int						HWverLen;	// Hardware Version's length
	char					HWver[64];	// Hardware Version
	int						SWverLen;	// Software Version's length
	char					SWver[64];	// Software Version
}ORI_Ind_L7respGetInfo_s;

typedef struct
{
	unsigned char			data[80];
}ORI_Ind_L7respReadUserData_s;

/**
* @struct ORI_Ind_L7respGetAlarm_s
* @brief ORI AISG Transmit L7 message indication with command Get Alarm Status.
*
* This structure is passed on an aisg ALD receive indication and gives layer 7 message Get Alarm Status fields.
*/
typedef struct
{
	unsigned char			alarmCode[16];	// alarmCode, until 16 values supported
}ORI_Ind_L7respSelfTest_s;


/**
 * @struct ORI_Ind_L7respGetTilt_s
 * @brief ORI AISG Transmit L7 message indication with command Get Tilt.
 *
 * This structure is passed on an aisg ALD receive indication and gives layer 7 message Get Tilt fields.
 */
typedef struct
{
	int 					Tilt;		// tilt value
}ORI_Ind_L7respGetTilt_s;

/**
 * @struct ORI_Ind_L7respGetDeviceData_s
 * @brief ORI AISG Transmit L7 message indication with command Get Device Data.
 *
 * This structure is passed on an aisg ALD receive indication and gives layer 7 message Get Device Data fields.
 */
typedef struct
{
	unsigned char			fieldNbr;
	char 					antModelNbr[32];		// Antenna Model Number
	char 					antSerialNbr[32];		// Antenna Serial Number
	unsigned short			antFreqBand;			// Antenna Frequency Band
	unsigned short			beamwidthBand[4];		// Beamwidth for each Band
	unsigned char			gainBand[4];			// Gain for each Band
	short					maxTilt;				// Maximum Supported Tilt
	short					minTilt;				// Minimum Supported Tilt
	char 					installationDate[32];	// Installation Date
	char 					installerID[32];		// Installer ID
	char 					basestationID[32];		// BaseStation ID
	char 					sectorID[32];			// sector ID
	unsigned short			antBearing;				// Antenna Bearing
	short					mechanicalTilt;			// Mechanical Tilt
}ORI_Ind_L7respGetDeviceData_s;

/**
 * @struct ORI_Ind_L7indAlarmIndication_s
 * @brief ORI AISG Transmit L7 message indication with alarm indication.
 *
 * This structure is passed on an aisg ALD receive indication and gives layer 7 message Alarm Indication Data fields.
 */
typedef struct
{
	unsigned char			returnCode;
	unsigned char			stateFlag;
}ret_alarm_s;
typedef struct
{
	ret_alarm_s				alarm[32];
}ORI_Ind_L7indAlarmIndication_s;

/**
 * @struct ORI_Ind_L7respAntGetNbr_s
 * @brief ORI AISG Transmit L7 message indication with command Antenna Get Number Of Antennas.
 *
 * This structure is passed on an aisg ALD receive indication and gives layer 7 message Antenna Get Number Of Antennas Data fields.
 */
typedef struct
{
	unsigned char			nbr;
}ORI_Ind_L7respAntGetNbr_s;

/**
 * @struct ORI_Ind_respGetParam_s
 * @brief ORI AISG getParam message indication .
 *
 * This structure is passed on a getParam command to obtain the ALD's deviceType.
 */
typedef struct
{
	unsigned char 			deviceType;
}ORI_Ind_respGetParam_s;

/**
 * @struct ORI_Ind_respCheckPortExist_s
 * @brief ORI AISG check AISG Port existence .
 *
 * This structure is passed on a check aisg port exist command to know if there is an aisg port in this product or not.
 */
typedef struct
{
	ORI_Boolean_e			exist;
}ORI_Ind_respCheckPortExist_s;

/**
 * @struct ORI_Ind_L7msg_s
 * @brief ORI AISG Transmit L7 message indication struct.
 *
 * This struct is passed on an aisg ALD receive indication and gives a layer 7 message.
 */
typedef struct
{
	char							raw[256];
	ORI_AisgLayer7Command_e			command;
	ORI_AisgReturnCode_e			returnCode;
	unsigned char					multiAntennaNbr;
	ORI_Ind_L7respGetAlarm_s		getAlarm;
	ORI_Ind_L7respGetInfo_s			getInfo;
	ORI_Ind_L7respReadUserData_s	readUserData;
	ORI_Ind_L7respSelfTest_s		selfTest;
	ORI_Ind_L7respGetTilt_s			getTilt;
	ORI_Ind_L7respGetDeviceData_s	getDeviceData;
	ORI_Ind_L7indAlarmIndication_s	alarmIndication;
	ORI_Ind_L7respAntGetNbr_s		getNbrAntennas;
	ORI_Ind_respGetParam_s			getParam;
	ORI_Ind_respCheckPortExist_s	checkAisgPortExist;
}ORI_Ind_L7msg_s;

/**
 * @struct ORI_Ind_AisgALDRx_s
 * @brief ORI AISG ALD receive indication structure.
 *
 * This structure is passed on an aisg ALD receive indication and gives a layer 7 message and the object concerned.
 */
typedef struct
{
	ORI_Object_s *			object;						/**< Object concerned by the device scan. Valid objects : aisgPort:X/aisgALD:Y. */
	ORI_Ind_L7msg_s			L7message;					/**< string of a layer7 message sent by the ALD. */
} ORI_Ind_AisgALDRx_s;

/**
 * @union ORI_IndicationValue_u
 * @brief ORI indication value union.
 *
 * This union can be accessed based on the indication type. Its members give details on the received indication.
 */
typedef union
{
	ORI_Ind_TransferFileCmplt_s transferFileCmplt;		/**< File transfer complete structure, access it on an ::ORI_IndicationType_FileTransferComplete. */
	ORI_Ind_ObjectStateChange_s	objectStateChange;		/**< Object state change structure, access it on an ::ORI_IndicationType_ObjectStateChange. */
	ORI_Ind_FaultChange_s		faultChange;			/**< Fault change structure, access it on an ::ORI_IndicationType_FaultChange. */
	ORI_Ind_FileAvailable_s		fileAvailable;			/**< File available structure, access it on an ::ORI_IndicationType_FileAvailable. */
	ORI_Ind_UploadFileCmpl_s	uploadFileCmpl;			/**< Upload file complete structure, access it on an ::ORI_IndicationType_UploadFileCmpl. */
	ORI_Ind_DeviceScanCmpl_s	deviceScanCmpl;			/**< AISG device scan complete structure, access it on an ::ORI_IndicationType_AisgScanDeviceCompl. */
	ORI_Ind_AisgALDRx_s			aisgALDRx;				/**< AISG ALD receive structure, access it on an ::ORI_IndicationType_AisgAldRx. */
} ORI_IndicationValue_u;

/**
 * @typedef ORI_IndCallback_f
 * @brief ORI indication callback function prototype.
 *
 * This is the prototype of the user callback function that is called when an indication has been received on the ORI Link. <br>
 * The indication callback passes in its arguments the @p type describing the type of the indication, such as file transfer completion, RE fault, etc. <br>
 * The @p value parameter shall be used to obtain more details on the indication.
 *
 * @param userData The user data that is from the ORI context structure.
 * @param type An ::ORI_IndicationType_e.
 * @param value An ::ORI_IndicationValue_u.
 * @return Void.
 *
 * @warning The indication callback is called in a separate thread.
 * @warning The state of the model is guaranteed to stay constant during the indication callback.
 * @warning ORI functions (except for ORI MODEL functions) must not be called during the indication callback.
 */
typedef void (ORI_IndCallback_f) (void * userData, ORI_IndicationType_e type, ORI_IndicationValue_u value);





/*-----------------------------------------------------------------------------------------
 * RE VERSION STRUCTURE
 *-----------------------------------------------------------------------------------------*/

/**
 * @struct ORI_REVersion_s
 * @brief ORI RE version query information structure.
 *
 * This structure contains the RE vendor specific version information obtained during a ORI_VersionQuery() procedure.
 */
typedef struct
{
	char 		vendorID[64];							/**< Vendor ID as signaled in DHCP code 201, normally 3 characters */
	char 		productID[64];							/**< */
	char 		productRev[64];							/**< */
	char 		serialNumber[64];						/**< */
	char 		hardwareVer[64];						/**< */
	char 		activeSwUpgradePkgVer[64];				/**< */
	char 		activeSwImgVer[64];						/**< */
	char 		passiveSwUpgradePkgVer[64];				/**< */
	char 		passiveSwImgVer[64];					/**< */
} ORI_REVersion_s;




/*-----------------------------------------------------------------------------------------
 * ORI OBJECT STRUCTURE
 *-----------------------------------------------------------------------------------------*/

/**
 * @struct ORI_Object_s
 * @brief Structure of an ORI Object.
 *
 * ORI Objects are internally created by the ORI library and represent an object present in the RE. <br>
 * Those objects represent and define the resource model of the RE, of which an image is present in the REC (via this library). <br>
 * Such objects can be accessed (for reading and navigating) by the user but must not be modified, created or deleted directly
 * as they are an 'image' of the RE objects. <br>
 * To update the parameters of the object, see ORI_ObjectParamReport(). <br>
 * To modify the parameters of the object, see ORI_ObjectParamModify(). <br>
 * To create an object, see ORI_ObjectCreation(). <br>
 * To delete an object, see ORI_ObjectDeletion(). <br>
 * To update the state of the object, see ORI_ObjectStateReport(). <br>
 * To modify the state of the object, see ORI_ObjectStateModify(). <br>
 * To update the faults of the object, see ORI_ObjectFaultReport(). <br>
 * To find an object in the model, see ORI_FindObject(). <br>
 * To retrieve a specific fault of an object, see ORI_ObjectFault().
 */
struct ORI_Object_s
{
	ORI_ObjectTypeRef_s	typeRef;					/**< Type reference of the object. */
	uint8_t				instanceNumber;				/**< Instance number of the object. */
	ORI_Object_s *		prev;						/**< Previous sibling. */
	ORI_Object_s *		next;						/**< Next sibling. */
	ORI_Object_s *		children;					/**< First child reference. */
	ORI_ObjectParams_u	params;						/**< Parameters union of this object. */
	ORI_AST_e			ast;						/**< Administrative state. */
	ORI_FST_e			fst;						/**< Functional state. */
	ORI_ObjectFaults_u	faults;						/**< Faults union of this object. */
};





/*-----------------------------------------------------------------------------------------
 * CONTEXT
 *-----------------------------------------------------------------------------------------*/

/**
 * @struct ORI_Version_s
 * @brief ORI version structure.
 *
 * This structure contains ORI library version information.
 */
typedef struct
{
	uint8_t					major;					/**< Version major number. */
	uint8_t					minor;					/**< Version minor number. */
} ORI_Version_s;

/**
 * @struct ORI_s
 * @brief ORI context data structure.
 *
 * This structure represents the context data for the ORI C library and shall be passed in ORI function calls. <br>
 * The @p opaque field is a library specific field and must not be modified by the user application. <br>
 * Other fields may be set (and changed) at run-time by the user application.
 *
 * @warning The indication callback is called in a separate thread.
 * @warning The state of the model is guaranteed to stay constant during the indication callback.
 * @warning ORI functions (except for ORI MODEL functions) must not be called during the indication callback.
 */
typedef struct
{
	void * 					opaque; 				/**< Set by the library, DO NOT MODIFY. */
	ORI_IndCallback_f *		indicationCallback;		/**< Pointer to user set ORI indication callback, this function is called when an indication is received on the ORI Link. If @c NULL (default), indications are discarded. */
	void *					userData;				/**< User data for passing into the ORI indication callback */
} ORI_s;



/*-----------------------------------------------------------------------------------------
 * ORI CREATION / DELETION / (DIS)CONNECTION
 *-----------------------------------------------------------------------------------------*/

/**
 * @brief Retrieve ORI library version structure.
 *
 * This functions returns the ORI library version structure (constant).
 *
 * @return Version structure.
 */
ORI_Version_s ORI_LibVersion(void);

/**
 * @brief Create an ORI context.
 *
 * This function creates and initializes an ORI context structure that is to be used when calling
 * other ORI library functions. This function also starts threads for data receiving and callbacks handling.
 *
 * @return The ORI context if creation successful, else @c NULL.
 *
 * @warning The returned ORI context must be free'd with a call to ORI_Free() when the user application is done with ORI.
 */
ORI_s *	ORI_Create(void);

/**
 * @brief Delete an ORI context.
 *
 * This function disconnects from the remote host (if connected), destroys the ORI threads and releases all associated ORI resources.
 *
 * @param ori The ORI context to delete.
 * @return Void.
 */
void ORI_Free(ORI_s * ori);

/**
 * @brief Enable ORI debug outputs.
 *
 * This function enables the ORI debug prints to stdout.
 *
 * @param ori The ORI context.
 * @return Void.
 */
void ORI_EnableDebug(ORI_s * ori);

/**
 * @brief Disable ORI debug outputs.
 *
 * This function disables the ORI debug prints to stdout.
 *
 * @param ori The ORI context.
 * @return Void.
 */
void ORI_DisableDebug(ORI_s * ori);

/**
 * @brief Connect to an ORI remote host (RE).
 *
 * This functions tries to connect the ORI context to a RE for C&M. The IP address @p serverIP of the RE and the network port @p port
 * indicates with which host form the TCP link. The @p timeout_ms specifies the timeout (in milliseconds) of the connection attempt. <br>
 * Once connected, callbacks from the ORI context may be called at any time, and the TCP Link monitoring timer shall be started on both RE and REC side. <br>
 * The REC side TCP link monitoring timer is integrated in the ORI library and is managed by the ORI_HealthCheck() function.
 *
 * @param ori The ORI context.
 * @param serverIP The IP address of the RE in string format (e.g. "192.168.100.1").
 * @param port The port to use for TCP connection.
 * @param timeout_ms The timeout in milliseconds of the connection attempt.
 * @param retry_timer_s Request retry timer in seconds when no response has been received from RE, until TCP link times-out, 0 means no retries will happen.
 * @return The result of the connection, ::ORI_Result_SUCCESS is returned if the connection is established.
 */
ORI_Result_e ORI_Connect(ORI_s * ori, const char * serverIP, int port, unsigned int timeout_ms, uint16_t retry_timer_s);

/**
 * @brief Disconnect from an ORI remote host (RE).
 *
 * This function disconnects the ORI context from the RE. This function does nothing if not currently connected. <br>
 * At disconnection, all buffered ORI response and indication messages are discarded, if any are still waiting to be processed.
 *
 * @param ori The ORI context.
 * @return Void.
 */
void ORI_Disconnect(ORI_s * ori);

/**
 * @brief Retrieve which Ethernet interface is used by the ORI TCP link.
 *
 * Returns the name of the currently (or last before disconnection) Ethernet interface used by the ORI TCP Link.
 *
 * @param ori The ORI context.
 * @return Name of the Ethernet interface (e.g. "eth2").
 */
const char * ORI_InterfaceName(ORI_s * ori);


/*-----------------------------------------------------------------------------------------
 * DEVICE MANAGEMENT
 *-----------------------------------------------------------------------------------------*/

/**
 * @brief Perform a RE Health Check procedure.
 *
 * This function performs the Health Check procedure with the RE to verify that the OCP layer is functioning correctly. <br>
 * A successful health check will update and re-start the TCP link timeout using the new @p tcpLinkMonTimeout parameter
 * of the RE and the ORI library (REC side). <br>
 * It is the application's responsibility to re-call this function within the specified Health Check Idle Timer which should
 * be at least 5 seconds lower than the timeout value of @p tcpLinkMonTimeout.
 *
 * @param ori The ORI context.
 * @param tcpLinkMonTimeout The new TCP Link Monitoring timeout value in seconds to store in the RE. Minimum value: 30 except special value 0 which means no timeout.
 * @param RE_result The RE response result of the procedure.
 * @return The result of the procedure.
 */
ORI_Result_e ORI_HealthCheck(ORI_s * ori, uint16_t tcpLinkMonTimeout, ORI_Result_e * RE_result);

/**
 * @brief Perform a RE Set Time procedure.
 *
 * This function performs the Set Time procedure with the RE to set the absolute time reference used by the RE. <br>
 * The time reference is obtained from the calling application's local time reference.
 *
 * @param ori The ORI context.
 * @param RE_result The RE response result of the procedure.
 * @return The result of the procedure.
 */
ORI_Result_e ORI_SetTime(ORI_s * ori, ORI_Result_e * RE_result);

/**
 * @brief Perform a RE Reset procedure.
 *
 * This function performs the Reset procedure with the RE. <br>
 * If successful, the RE shall close the TCP Link and reset itself.
 *
 * @param ori The ORI context.
 * @param RE_result The RE response result of the procedure.
 * @return The result of the procedure.
 */
ORI_Result_e ORI_Reset(ORI_s * ori, ORI_Result_e * RE_result);



/*-----------------------------------------------------------------------------------------
 * SOFTWARE MANAGEMENT
 *-----------------------------------------------------------------------------------------*/

/**
 * @brief Perform a RE Version Query procedure.
 *
 * This function performs the Version Query procedure with the RE. <br>
 * If successful, the @p REVersion structure shall be filled with all the vendor specific RE version information,
 * containing the product information, hardware version and software images stored in the RE.
 *
 * @param ori The ORI context.
 * @param REVersion The RE version information structure.
 * @param RE_result The RE response result of the procedure.
 * @return The result of the procedure.
 */
ORI_Result_e ORI_VersionQuery(ORI_s * ori, ORI_REVersion_s * REVersion, ORI_Result_e * RE_result);


/**
 * @brief Perform a RE Software Update Preparation procedure.
 *
 * This function performs the Software Update Preparation procedure with the RE. <br>
 * If successful, the RE shall start downloading the specified Software Upgrade Package @p SwUpgradePkgVer file from the specified
 * FTP server using the login credentials @p ftpSrvIpAddress, @p ftpSrvUserName and @p ftpSrvPassword. <br>
 * The Software file format is RE vendor specific. <br>
 * After download, the RE will store this new software package in non-volatile memory as the passive image. <br>
 * On completion of the process, the RE shall send a message indicating file transfer completion. If a callback is specified in the ORI context,
 * the callback ::ORI_IndCallback_f will be called with the enum ::ORI_IndicationType_FileTransferComplete
 * passed as parameter, as well as the file transfer completion result (success, or failure, with additional information).
 *
 * @param ori The ORI context.
 * @param ftpSrvIpAddress The FTP server address as a decimal point notation (e.g. "192.168.1.1").
 * @param ftpSrvUserName The FTP server login used by the RE.
 * @param ftpSrvPassword The FTP server password used by the RE.
 * @param ftpSrvSwPkgDirPath The FTP server directory location of the software package file.
 * @param SwUpgradePkgVer The name of the software package file.
 * @param RE_result The RE response result of the procedure.
 * @return The result of the procedure.
 */
ORI_Result_e ORI_SoftwareUpdatePrep(ORI_s * ori, const char * ftpSrvIpAddress, const char * ftpSrvUserName, const char * ftpSrvPassword,
											const char * ftpSrvSwPkgDirPath, const char * SwUpgradePkgVer, ORI_Result_e * RE_result);

/**
 * @brief Perform a RE Software Activation procedure.
 *
 * This function performs the Software Activation procedure with the RE. <br>
 * If successful, the RE shall activate its passive software image, set its previous active image as passive, close the TCP Link then reset itself.
 *
 * @param ori The ORI context.
 * @param RE_result The RE response result of the procedure.
 * @return The result of the procedure.
 */
ORI_Result_e ORI_SoftwareActivation(ORI_s * ori, ORI_Result_e * RE_result);



/*-----------------------------------------------------------------------------------------
 * CONFIGURATION MANAGEMENT
 *-----------------------------------------------------------------------------------------*/

/**
 * @brief Perform a RE Object Parameter Reporting procedure.
 *
 * This function performs the Object Parameter Reporting procedure with the RE. <br>
 * The target object or set of objects is specified by the arguments @p object and @p wildcard: <br>
 * - @p object is not @c NULL and @p wildcard is 0 : the targeted object is @p object. <br>
 * - @p object is not @c NULL and @p wildcard is not 0 : the targeted objects are all the children of @p object. <br>
 * - @p object is @c NULL : the targeted objects are all the objects in the model. <br>
 *
 * The parameter to report is defined by @p param. If @p param is ::ORI_ObjectParam_All, then all the parameters of the targeted
 * object(s) shall be reported. <br>
 * On success, the parameters of the targeted objects are updated in the model. <br>
 * If the RE reported parameters for objects not present in the model image in the REC, the model is internally updated and
 * the new objects created (this will be the case at initial software alignment, as the ORI GS specifies
 * a Parameter Reporting "ALL objects" and "ALL parameters" shall be done at start-up).
 *
 * @param ori The ORI context.
 * @param object The target object, or parent object, or @c NULL if no specific object; depending on @p wildcard.
 * @param wildcard Wildcard for targeting all objects, or all children objects; depending on @p object being @c NULL.
 * @param param The parameter to report, or all if ::ORI_ObjectParam_All.
 * @param RE_result The RE response result of the procedure.
 * @return The result of the procedure.
 */
ORI_Result_e ORI_ObjectParamReport(ORI_s * ori, ORI_Object_s * object, int wildcard, ORI_ObjectParam_e param, ORI_Result_e * RE_result);

/**
 * @brief Perform a RE Object Parameter Modify procedure.
 *
 * This function performs the Object Parameter Modify procedure with the RE. <br>
 * The object for which the parameter(s) is(are) to be modified is given by @p object. <br>
 * The members of the @p params union for the specified target object type shall be set prior to calling this function, and each of the
 * parameter to modify must be specified in the @p paramList array. The number of parameters to set must be given by @p numParams. <br>
 * On procedure completion, the @p paramResult[] array will be filled with the results of each independent parameter modify attempt.
 *
 * @param ori The ORI context.
 * @param object The target object.
 * @param params The parameters union with values set for the parameters to modify.
 * @param paramList The array of enumerated parameters to modify. ::ORI_ObjectParam_All is not a valid enumeration for this procedure.
 * @param numParams The number of parameters to modify, must be > 0.
 * @param paramResult The return array for the individual result response for each parameter to modify.
 * @param RE_globalResult The RE response global result of the procedure.
 * @return The result of the procedure.
 */
ORI_Result_e ORI_ObjectParamModify(ORI_s * ori, ORI_Object_s * object, ORI_ObjectParams_u params, ORI_ObjectParam_e paramList[],
										uint32_t numParams, ORI_Result_e paramResult[], ORI_Result_e * RE_globalResult);



/*-----------------------------------------------------------------------------------------
 * OBJECT LIFECYCLE
 *-----------------------------------------------------------------------------------------*/

/**
 * @brief Perform a RE Object Creation procedure.
 *
 * This function performs the Object Creation procedure with the RE. <br>
 * The object type to create is given by @p typeRef. <br>
 * The parameters @p params, @p paramList, @p numParams and @p paramResult function in the same maner as in the ORI_ObjectParamModify() procedure
 * and can be used to set default parameters for the newly created object. @p numParams can be set to 0, in which case no parameter is applied
 * to the new object. <br>
 * The created object is added in the model. <br>
 * This function also returns in @p newObject a reference in the model of the newly created object.
 *
 * @param ori The ORI context.
 * @param typeRef The type reference of the object to create.
 * @param params The parameters union with values set for the parameters to set.
 * @param paramList The array of enumerated parameters to set. ::ORI_ObjectParam_All is not a valid enumeration for this procedure.
 * @param numParams The number of parameters to set, can be 0.
 * @param paramResult The return array for the individual result response for each parameter to set.
 * @param newObject Reference to the newly created object.
 * @param RE_globalResult The RE response global result of the procedure.
 * @return The result of the procedure.
 */
ORI_Result_e ORI_ObjectCreation(ORI_s * ori, ORI_ObjectTypeRef_s typeRef, ORI_ObjectParams_u params, ORI_ObjectParam_e paramList[],
										uint32_t numParams, ORI_Result_e paramResult[], ORI_Object_s ** newObject, ORI_Result_e * RE_globalResult);

/**
 * @brief Perform a RE Object Deletion procedure.
 *
 * This function performs the Object Deletion procedure with the RE. <br>
 * If successful, the object specified by @p object shall be deleted from the RE and removed from the library model.
 *
 * @param ori The ORI context.
 * @param object The object to delete.
 * @param RE_result The RE response result of the procedure.
 * @return The result of the procedure.
 */
ORI_Result_e ORI_ObjectDeletion(ORI_s * ori, ORI_Object_s * object, ORI_Result_e * RE_result);



/*-----------------------------------------------------------------------------------------
 * OBJECT STATE MANAGEMENT
 *-----------------------------------------------------------------------------------------*/

/**
 * @brief Perform a RE Object State Reporting procedure.
 *
 * This function performs the Object State Reporting procedure with the RE. <br>
 * The target object or set of objects is specified by the arguments @p object and @p wildcard: <br>
 * - @p object is not @c NULL and @p wildcard is 0 : the targeted object is @p object. <br>
 * - @p object is not @c NULL and @p wildcard is not 0 : the targeted objects are all the children of @p object. <br>
 * - @p object is @c NULL : the targeted objects are all the objects in the model. <br>
 *
 * The state type to report is defined by @p stateType. If @p stateType is ::ORI_StateType_All, then all the states of the targeted
 * object(s) shall be reported. <br>
 * On success, the states of the targeted objects are updated in the model. <br>
 * If the RE reported states for objects not present in the model image in the REC, the model is internally updated and
 * the new objects created (this will be the case at initial software alignment, as the ORI GS specifies a State
 * Reporting "ALL objects" and "ALL states" shall be done at start-up).
 * If @p eventDrivenReport is set to ::ORI_EventDrivenReport_True or ::ORI_EventDrivenReport_False the event driven state reporting of the object is enabled
 * or disabled. Pass ::ORI_EventDrivenReport_NoModify to keep the event driven state reporting as is.
 *
 * @param ori The ORI context.
 * @param object The target object, or parent object, or @c NULL if no specific object; depending on @p wildcard.
 * @param wildcard Wildcard for targeting all objects, or all children objects; depending on @p object being @c NULL.
 * @param stateType The parameter to report, or all if ::ORI_StateType_All.
 * @param eventDrivenReport Set event driven state reporting of the object if applicable.
 * @param RE_result The RE response result of the procedure.
 * @return The result of the procedure.
 */
ORI_Result_e ORI_ObjectStateReport(ORI_s * ori, ORI_Object_s * object, int wildcard, ORI_StateType_e stateType,
											ORI_EventDrivenReport_e eventDrivenReport, ORI_Result_e * RE_result);

/**
 * @brief Perform a RE Object State Modification procedure.
 *
 * This function performs the Object State Modification procedure with the RE. <br>
 * If successful, the administrative state (AST) of the target object will be set to @p ast.
 *
 * @param ori The ORI context.
 * @param object The object on which to set the state.
 * @param ast The administrative state to set.
 * @param RE_result The RE response result of the procedure.
 * @return The result of the procedure.
 */
ORI_Result_e ORI_ObjectStateModification(ORI_s * ori, ORI_Object_s * object, ORI_AST_e ast, ORI_Result_e * RE_result);



/*-----------------------------------------------------------------------------------------
 * FAULT MANAGEMENT
 *-----------------------------------------------------------------------------------------*/

/**
 * @brief Perform a RE Object Fault Reporting procedure.
 *
 * This function performs the Object Fault Reporting procedure with the RE. <br>
 * The target object or set of objects is specified by the arguments @p object and @p wildcard: <br>
 * - @p object is not @c NULL and @p wildcard is 0 : the targeted object is @p object. <br>
 * - @p object is not @c NULL and @p wildcard is not 0 : the targeted objects are all the children of @p object. <br>
 * - @p object is @c NULL : the targeted objects are all the objects in the model. <br>
 *
 * On success, the faults of the targeted objects are updated in the model. <br>
 * If the RE reported faults for objects not present in the model image in the REC, the model is internally updated and
 * the new objects created (this will be the case at initial software alignment, as the ORI GS specifies a Fault
 * Reporting "ALL objects" shall be done at start-up).
 * If @p eventDrivenReport is set to ::ORI_EventDrivenReport_True or ::ORI_EventDrivenReport_False the event driven fault reporting of the object is enabled
 * or disabled. Pass ::ORI_EventDrivenReport_NoModify to keep the event driven fault reporting as is.
 *
 * @param ori The ORI context.
 * @param object The target object, or parent object, or @c NULL if no specific object; depending on @p wildcard.
 * @param wildcard Wildcard for targeting all objects, or all children objects; depending on @p object being @c NULL.
 * @param eventDrivenReport Set event driven fault reporting of the object if applicable.
 * @param RE_result The RE response result of the procedure.
 * @return The result of the procedure.
 */
ORI_Result_e ORI_ObjectFaultReport(ORI_s * ori, ORI_Object_s * object, int wildcard, ORI_EventDrivenReport_e eventDrivenReport, ORI_Result_e * RE_result);


/*-----------------------------------------------------------------------------------------
 * LOGGING
 *-----------------------------------------------------------------------------------------*/

/**
 * @brief Perform a File Upload procedure.
 *
 * This function performs a File Upload procedure with the RE or with a Log Object. <br>
 * If successful, a File Upload should be initiated. <br>
 * On completion of the process, the RE shall send a message indicating file upload completion. If a callback is specified in the ORI context,
 * the callback ::ORI_IndCallback_f will be called with the enum ::ORI_IndicationType_UploadFileCmpl
 * passed as parameter, as well as the file upload completion result.
 *
 * @param ori The ORI context.
 * @param object The object targeted for the file upload. Must be a RE or Log object.
 * @param ftpSrvIpAddress The FTP server address as a decimal point notation (e.g. "192.168.1.1").
 * @param ftpSrvUserName The FTP server login used by the RE.
 * @param ftpSrvPassword The FTP server password used by the RE.
 * @param ftpSrvFilePath The FTP server path to the file to upload.
 * @param REFilePath The RE file path for a generic file upload. Used only in the case of a RE object.
 * @param maxUploadFileSize The maximum size in kBytes accepted for uploading the file. Pass 0 for no size limit.
 * @param RE_result The RE response result of the procedure.
 * @return The result of the procedure.
 */
ORI_Result_e ORI_FileUpload(ORI_s * ori, ORI_Object_s * object, const char * ftpSrvIpAddress, const char * ftpSrvUserName, const char * ftpSrvPassword,
										const char * ftpSrvFilePath, const char * REFilePath,  uint16_t maxUploadFileSize, ORI_Result_e * RE_result);


/*-----------------------------------------------------------------------------------------
 * AISG
 *-----------------------------------------------------------------------------------------*/

/**
 * @brief Perform an AISG Device Scan procedure.
 *
 * This function performs an AISG Scan Device procedure with an AISG Port Object. <br>
 * On completion of the process, the RE shall send a message indicating scan device completion.
 *
 * @param ori The ORI context.
 * @param object The object targeted for the device scan. Must be an AISG Port object.
 * @param RE_result The RE response result of the procedure.
 * @return The result of the procedure.
 */
ORI_Result_e ORI_DeviceScan(ORI_s * ori, ORI_Object_s * object, ORI_Result_e * RE_result);

/**
 * @brief Transfer an AISG layer7 message to an ALD.
 *
 * This function transfers an AISG layer7 message to an ALD.
 * On completion of the transfer, the RE shall send a message indicating the ALD's layer7 response.
 *
 * @param ori The ORI context.
 * @param object The object targeted for the layer7 message. Must be an AISG ALD object.
 * @param msgLayer7 The AISG layer7 message.
 * @param deviceDataFieldNbr The field number to store for GetDeviceData message (used in indication parsing).
 * @param RE_result The RE response result of the procedure.
 * @return The result of the procedure.
 */
ORI_Result_e ORI_MsgTransfer(ORI_s * ori, ORI_Object_s * object, const char * msgLayer7, uint8_t deviceDataFieldNbr, ORI_Result_e * RE_result);



/*-----------------------------------------------------------------------------------------
 * ORI MODEL
 *-----------------------------------------------------------------------------------------*/

/**
 * @brief Find an object in the model.
 *
 * This function seeks in the model an object that matches the object type @p type
 * and the instance number @p instanceNumber. <br>
 * If @p parent is @c NULL, only parent-less objects will be in the search. Else, the object
 * to find shall be a direct descendant of @p parent.
 *
 * @param ori The ORI context.
 * @param type The object type of the object to find.
 * @param instanceNumber The instance number of the object to find.
 * @param parent The parent of the object to find, or @c NULL if no parent is expected.
 * @return The found object if any, or @c NULL if none.
 */
ORI_Object_s * ORI_FindObject(ORI_s * ori, ORI_ObjectType_e type, uint8_t instanceNumber, ORI_Object_s * parent);

/**
 * @brief Gets all objects in the model
 *
 * This function fills the array @p objects with reference of all the objects in the model that are a child of @p parent. If @p parent is @c NULL,
 * all the objects in the model are retrieved. <br>
 * The maximum size of the @p objects array shall be given in @p maxObjects. <br>
 *
 * @param ori The ORI context.
 * @param objects The object array to fill.
 * @param maxObjects The maximum number of objects that the array can contain.
 * @param parent If not @c NULL, specifies the parent of the objects to get.
 * @return The number of objects found.
 */
uint32_t ORI_GetAllObjects(ORI_s * ori, ORI_Object_s * objects[], uint32_t maxObjects, ORI_Object_s * parent);

/**
 * @brief Gets all objects of a given type in the model
 *
 * This function fills the array @p objects with reference of all the objects of type @p type in the model that are a child of @p parent. If @p parent is @c NULL,
 * all the objects of type @p type in the model are retrieved. <br>
 * The maximum size of the @p objects array shall be given in @p maxObjects. <br>
 * This functions is the same as ORI_GetAllObjects() but with a type filter.
 *
 * @param ori The ORI context.
 * @param type The type filter of the objects to find.
 * @param objects The object array to fill.
 * @param maxObjects The maximum number of objects that the array can contain.
 * @param parent If not @c NULL, specifies the parent of the objects to get.
 * @return The number of objects found.
 */
uint32_t ORI_GetAllObjectsOfType(ORI_s * ori, ORI_ObjectType_e type, ORI_Object_s * objects[], uint32_t maxObjects, ORI_Object_s * parent);

/**
 * @brief Return the fault structure of an object based on a fault type.
 *
 * This function is a helper function that returns a pointer to a fault structure of an object based on a fault type.
 * If the fault type and the object type does not match (as faults are specific to some objects), @c NULL is returned.
 *
 * @param ori The ORI context.
 * @param object The object to delete.
 * @param faultType The type of the fault structure to return.
 * @return The found fault structure, or @c NULL if none.
 */
ORI_Fault_s * ORI_ObjectFault(ORI_s * ori, ORI_Object_s * object, ORI_FaultType_e faultType);




#endif /* ORI_H_ */
