diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 8d8e88455a..80e7af8a74 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -60,6 +60,12 @@ elseif (${RF_BOARD} STREQUAL "OAI_IRIS") LINK_DIRECTORIES("/usr/local/lib") set(option_HW_lib "-lSoapySDR -rdynamic -ldl") +elseif (${RF_BOARD} STREQUAL "OAI_AW2SORI") + include_directories("${OPENAIR_TARGETS}/ARCH/AW2SORI") + set(HW_SOURCE ${HW_SOURCE} + ${OPENAIR_TARGETS}/ARCH/AW2SORI/ARCH/AW2SORI/oaiori.c) + set(openair_HW_lib "-shared -fPIC oaiori.c -msse4 -g -ggdb -lori") + endif (${RF_BOARD} STREQUAL "OAI_USRP") message("RU=${RU}") @@ -916,6 +922,14 @@ add_library(oai_lmssdrdevif MODULE ${HWLIB_LMSSDR_SOURCE} ) target_include_directories(oai_lmssdrdevif PRIVATE /usr/local/include/lime) target_link_libraries(oai_lmssdrdevif LimeSuite ) +include_directories("${OPENAIR_TARGETS}/ARCH/AW2SORI/") + +set(HWLIB_AW2SORI_SOURCE + ${OPENAIR_TARGETS}/ARCH/AW2SORI/oaiori.c + ) +add_library(thirdparty_transpro MODULE ${HWLIB_AW2SORI_SOURCE} ) +target_link_libraries(thirdparty_transpro) + include_directories("${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/") set(TPLIB_ETHERNET_SOURCE ${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai index 279b9489e0..b9f8d21273 100755 --- a/cmake_targets/build_oai +++ b/cmake_targets/build_oai @@ -118,7 +118,7 @@ Options -a | --agent Enables agent for software-defined control of the eNB -w | --hardware - EXMIMO, USRP, BLADERF, LMSSDR, IRIS, ADRV9371_ZC706, SIMU, None (Default) + EXMIMO, USRP, BLADERF, LMSSDR, IRIS, ADRV9371_ZC706, SIMU, AW2SORI, None (Default) Adds this RF board support (in external packages installation and in compilation) -P | --phy_simulators Makes the unitary tests Layer 1 simulators @@ -292,7 +292,7 @@ function main() { "EXMIMO") HW="EXMIMO" ;; - "USRP" | "BLADERF" | "LMSSDR" | "IRIS" | "ADRV9371_ZC706" | "SIMU") + "USRP" | "BLADERF" | "LMSSDR" | "IRIS" | "ADRV9371_ZC706" | "SIMU" | "AW2SORI") HW="OAI_"$2 ;; "None") @@ -944,6 +944,10 @@ function main() { echo_error "== FAILED == Unexpected Kernel $SYRIQ_KMAJ.$SYRIQ_KMIN" fi echo_info "liboai_device.so is linked to ADRV9371_ZC706 device library for Kernel $SYRIQ_KMAJ.$SYRIQ_KMIN" + elif [ "$HW" == "OAI_AW2SORI" ] ; then + compilations \ + $build_dir oai_aw2soridevif + echo_info "build libthirdparty_transpro.so for AW2SORI fronthaul" else echo_info "liboai_device.so is not linked to any device library" fi diff --git a/targets/ARCH/AW2SORI/oaiori.c b/targets/ARCH/AW2SORI/oaiori.c new file mode 100644 index 0000000000..0dbcfd3e71 --- /dev/null +++ b/targets/ARCH/AW2SORI/oaiori.c @@ -0,0 +1,710 @@ +/*! \file oaiori.c + * \brief AW2S ORI API isolator + * \author Raymond Knopp + * \date 2019 + * \version 0.1 + * \company Eurecom + * \maintainer: raymond.knopp@eurecom.fr + * \note + * \warning + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common_lib.h" +#include "ethernet_lib.h" + +#include "ori.h" + + +typedef struct eutra_bandentry_s { + int16_t band; + uint32_t ul_min; + uint32_t ul_max; + uint32_t dl_min; + uint32_t dl_max; + uint32_t N_OFFs_DL; +} eutra_bandentry_t; + +typedef struct band_info_s { + int nbands; + eutra_bandentry_t band_info[100]; +} band_info_t; + + +static const eutra_bandentry_t eutra_bandtable[] = { + {1, 19200, 19800, 21100, 21700, 0 }, + {2, 18500, 19100, 19300, 19900, 6000 }, + {3, 17100, 17850, 18050, 18800, 12000 }, + {4, 17100, 17550, 21100, 21550, 19500 }, + {5, 8240, 8490, 8690, 8940, 24000 }, + {6, 8300, 8400, 8750, 8850, 26500 }, + {7, 25000, 25700, 26200, 26900, 27500 }, + {8, 8800, 9150, 9250, 9600, 34500 }, + {9, 17499, 17849, 18449, 18799, 38000 }, + {10, 17100, 17700, 21100, 21700, 41500 }, + {11, 14279, 14529, 14759, 15009, 47500 }, + {12, 6980, 7160, 7280, 7460, 50100 }, + {13, 7770, 7870, 7460, 7560, 51800 }, + {14, 7880, 7980, 7580, 7680, 52800 }, + {17, 7040, 7160, 7340, 7460, 57300 }, + {18, 8150, 9650, 8600, 10100, 58500 }, + {19, 8300, 8450, 8750, 8900, 60000 }, + {20, 8320, 8620, 7910, 8210, 61500 }, + {21, 14479, 14629, 14959, 15109, 64500 }, + {22, 34100, 34900, 35100, 35900, 66000 }, + {23, 20000, 20200, 21800, 22000, 75000 }, + {24, 16126, 16605, 15250, 15590, 77000 }, + {25, 18500, 19150, 19300, 19950, 80400 }, + {26, 8140, 8490, 8590, 8940, 86900 }, + {27, 8070, 8240, 8520, 8690, 90400 }, + {28, 7030, 7580, 7580, 8130, 92100 }, + {29, 0, 0, 7170, 7280, 96600 }, + {30, 23050, 23250, 23500, 23600, 97700 }, + {31, 45250, 34900, 46250, 35900, 98700 }, + {32, 0, 0, 14520, 14960, 99200 }, + {33, 19000, 19200, 19000, 19200, 360000}, + {34, 20100, 20250, 20100, 20250, 362000}, + {35, 18500, 19100, 18500, 19100, 363500}, + {36, 19300, 19900, 19300, 19900, 369500}, + {37, 19100, 19300, 19100, 19300, 375500}, + {38, 25700, 26200, 25700, 26200, 377500}, + {39, 18800, 19200, 18800, 19200, 382500}, + {40, 23000, 24000, 23000, 24000, 386500}, + {41, 24960, 26900, 24960, 26900, 396500}, + {42, 34000, 36000, 34000, 36000, 415900}, + {43, 36000, 38000, 36000, 38000, 435900}, + {44, 7030, 8030, 7030, 8030, 455900}, + {45, 14470, 14670, 14470, 14670, 465900}, + {46, 51500, 59250, 51500, 59250, 467900}, + {65, 19200, 20100, 21100, 22000, 655360}, + {66, 17100, 18000, 21100, 22000, 664360}, + {67, 0, 0, 7380, 7580, 67336 }, + {68, 6980, 7280, 7530, 7830, 67536 } +}; + + +#define BANDTABLE_SIZE (sizeof(eutra_bandtable)/sizeof(eutra_bandentry_t)) + +uint32_t to_earfcn_DL_aw2s(int eutra_bandP, long long int dl_CarrierFreq, uint32_t bw) { + uint32_t dl_CarrierFreq_by_100k = dl_CarrierFreq / 100000; + int i; + if (eutra_bandP > 68) { printf("eutra_band %d > 68\n", eutra_bandP); exit(-1);} + + for (i = 0; i < BANDTABLE_SIZE && eutra_bandtable[i].band != eutra_bandP; i++); + + printf("AW2S: band %d, index %d\n",eutra_bandP, i); + + if (i >= BANDTABLE_SIZE) { printf(" i = %d , it will trigger out-of-bounds read.\n",i); exit(-1);} + + if (dl_CarrierFreq_by_100k < eutra_bandtable[i].dl_min) { + printf("Band %d, bw %u : DL carrier frequency %u .1 MHz < %u\n", + eutra_bandP, bw, dl_CarrierFreq_by_100k, + eutra_bandtable[i].dl_min); exit(-1);} + + if(dl_CarrierFreq_by_100k > + (eutra_bandtable[i].dl_max - bw)) { + printf("Band %d, bw %u : DL carrier frequency %u .1MHz > %d\n", + eutra_bandP, bw, dl_CarrierFreq_by_100k, + eutra_bandtable[i].dl_max - bw); exit(-1); } + printf("AW2S: dl_CarrierFreq_by_100k %d, dl_min %d\n",dl_CarrierFreq_by_100k,eutra_bandtable[i].dl_min); + + return (dl_CarrierFreq_by_100k - eutra_bandtable[i].dl_min + + (eutra_bandtable[i].N_OFFs_DL / 10)); +} + +uint32_t to_earfcn_UL_aw2s(int eutra_bandP, long long int ul_CarrierFreq, uint32_t bw) { + uint32_t ul_CarrierFreq_by_100k = ul_CarrierFreq / 100000; + int i; + if(eutra_bandP >= 69) { + printf("eutra_band %d > 68\n", eutra_bandP); + exit(-1); + } + + for (i = 0; i < BANDTABLE_SIZE && eutra_bandtable[i].band != eutra_bandP; i++); + + if(i >= BANDTABLE_SIZE) {printf("i = %d , it will trigger out-of-bounds read.\n",i); exit(-1);} + + if(ul_CarrierFreq_by_100k < eutra_bandtable[i].ul_min) { + printf("Band %d, bw %u : UL carrier frequency %u Hz < %u\n", + eutra_bandP, bw, ul_CarrierFreq_by_100k, + eutra_bandtable[i].ul_min); + exit(-1); + } + if(ul_CarrierFreq_by_100k > (eutra_bandtable[i].ul_max - bw)) { + printf("Band %d, bw %u : UL carrier frequency %u Hz > %d\n", + eutra_bandP, bw, ul_CarrierFreq_by_100k, + eutra_bandtable[i].ul_max - bw); + exit(-1); + } + return (ul_CarrierFreq_by_100k - eutra_bandtable[i].ul_min + + ((eutra_bandtable[i].N_OFFs_DL + 180000) / 10)); +} + +int get_mac_addr(const char *iface,unsigned char *mac) + +{ + int fd; + struct ifreq ifr; + int ret=0; + + memset(&ifr, 0, sizeof(ifr)); + fd = socket(AF_INET, SOCK_DGRAM, 0); + ifr.ifr_addr.sa_family = AF_INET; + strncpy(ifr.ifr_name , iface , IFNAMSIZ-1); + if (0 == ioctl(fd, SIOCGIFHWADDR, &ifr)) memcpy((void*)mac,(void *)ifr.ifr_hwaddr.sa_data,6); + else { + printf("No MAC address!\n"); + ret = -1; + } + + printf("%s : %2x:%2x:%2x:%2x:%2x:%2x\n",iface,mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]); + close(fd); + return(ret); +} + + +void cb(void * userData, ORI_IndicationType_e type, ORI_IndicationValue_u value) +{ + printf("============> Got indication %s\n", ORI_IndicationType_Print(type)); + if(type == ORI_IndicationType_ObjectStateChange) + { + ORI_Object_s * obj = value.objectStateChange.object; + printf("State change for %s:%d -> %s : %s\n", ORI_ObjectType_Print(obj->typeRef.type), obj->instanceNumber, + ORI_StateType_Print(value.objectStateChange.stateType), + value.objectStateChange.stateType == ORI_StateType_AST ? ORI_AST_Print(obj->ast) : ORI_FST_Print(obj->fst)); + } + else if(type == ORI_IndicationType_FaultChange) + { + ORI_Object_s * obj = value.faultChange.object; + ORI_Fault_s * fault = value.faultChange.fault; + printf("Fault change for %s:%d -> %s : %s\n", ORI_ObjectType_Print(obj->typeRef.type), obj->instanceNumber, + ORI_FaultType_Print(value.faultChange.faultType), + ORI_FaultState_Print(fault->state)); + if(fault->state == ORI_FaultState_Active) + { + printf("\t Fault severity: %s\n", ORI_FaultSeverity_Print(fault->severity)); + printf("\t Timestamp: %s\n", fault->timestamp); + printf("\t Description: %s\n", fault->desc); + } + } + printf("<============\n"); +} + +int aw2s_oricleanup(openair0_device *device) { + + ORI_s * ori = (ORI_s*)device->thirdparty_priv; + + ORI_Disconnect(ori); + ORI_Free(ori); + +} + +int aw2s_startstreaming(openair0_device *device) { + + ORI_s * ori = (ORI_s*)device->thirdparty_priv; + ORI_Result_e result; + ORI_Result_e RE_result; + char c; + + openair0_config_t *openair0_cfg = device->openair0_cfg; + + ORI_Object_s *tx0= ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ? ORI_ObjectType_TxEUtraFDD :ORI_ObjectType_TxEUtraTDD, 0, NULL); + ORI_Object_s *tx1= (openair0_cfg->tx_num_channels > 1) ? ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ?ORI_ObjectType_TxEUtraFDD : ORI_ObjectType_TxEUtraTDD, 1, NULL) : NULL; + ORI_Object_s *rx0= ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ?ORI_ObjectType_RxEUtraFDD : ORI_ObjectType_RxEUtraTDD, 0, NULL); + ORI_Object_s *rx1= (openair0_cfg->rx_num_channels > 1) ? ORI_FindObject(ori, openair0_cfg->duplex_mode == duplex_mode_FDD ?ORI_ObjectType_RxEUtraFDD : ORI_ObjectType_RxEUtraTDD, 1, NULL) : NULL; + ORI_Object_s *link= ORI_FindObject(ori, ORI_ObjectType_ORILink, 0, NULL); + + if (tx0 == NULL || (tx1 == NULL && openair0_cfg->tx_num_channels > 1) || rx0 == NULL || (rx1 == NULL && openair0_cfg->rx_num_channels > 1) || link == NULL) return (-1); + + /******************************************************************* + * UNLOCK Link + *******************************************************************/ + + + result = ORI_ObjectStateModification(ori, link, ORI_AST_Unlocked, &RE_result); + if(result != ORI_Result_SUCCESS) + { + printf("ORI_ObjectStateModify failed with error: %s\n", ORI_Result_Print(result)); + aw2s_oricleanup(device); + return -1; + } + + /******************************************************************* + * UNLOCK TX0 + *******************************************************************/ + + + /* Put Tx0 into service */ + result = ORI_ObjectStateModification(ori, tx0, ORI_AST_Unlocked, &RE_result); + if(result != ORI_Result_SUCCESS) + { + printf("ORI_ObjectStateModify failed with error: %s\n", ORI_Result_Print(result)); + aw2s_oricleanup(device); + return -1; + } + printf("ORI_ObjectStateModify: %s\n", ORI_Result_Print(RE_result)); + + + + /******************************************************************* + * UNLOCK TX1 + *******************************************************************/ + + if (tx1) { + printf("\n\n\n========================================================\n"); + + /* Put Tx1 into service */ + result = ORI_ObjectStateModification(ori, tx1, ORI_AST_Unlocked, &RE_result); + if(result != ORI_Result_SUCCESS) + { + printf("ORI_ObjectStateModify failed with error: %s\n", ORI_Result_Print(result)); + aw2s_oricleanup(device); + return -1; + } + printf("ORI_ObjectStateModify: %s\n", ORI_Result_Print(RE_result)); + } + /******************************************************************* + * UNLOCK RX0 + *******************************************************************/ + + printf("\n\n\n========================================================\n"); + + /* Put Rx0 into service */ + result = ORI_ObjectStateModification(ori, rx0, ORI_AST_Unlocked, &RE_result); + if(result != ORI_Result_SUCCESS) + { + printf("ORI_ObjectStateModify failed with error: %s\n", ORI_Result_Print(result)); + aw2s_oricleanup(device); + return -1; + } + printf("ORI_ObjectStateModify: %s\n", ORI_Result_Print(RE_result)); + + + + + /******************************************************************* + * UNLOCK RX1 + *******************************************************************/ + if (rx1) { + printf("\n\n\n========================================================\n"); + + /* Put Rx1 into service */ + result = ORI_ObjectStateModification(ori, rx1, ORI_AST_Unlocked, &RE_result); + if(result != ORI_Result_SUCCESS) + { + printf("ORI_ObjectStateModify failed with error: %s\n", ORI_Result_Print(result)); + aw2s_oricleanup(device); + return -1; + } + printf("ORI_ObjectStateModify: %s\n", ORI_Result_Print(RE_result)); + } + + while (rx0->fst != ORI_FST_Operational || + (openair0_cfg->rx_num_channels > 1 && rx1->fst != ORI_FST_Operational) || + tx0->fst != ORI_FST_Operational || + (openair0_cfg->tx_num_channels > 1 && tx1->fst != ORI_FST_Operational)) + {} + + // test RX interface + uint64_t TS; + char temp_rx[1024] __attribute__((aligned(32))); + int aid,r0=0,r1=(openair0_cfg->rx_num_channels > 1) ? 0 : 1; + int i; + int Npackets=1024000; + for (i=0;itrx_read_func2(device, + &TS, + (void*)temp_rx, + 256, + &aid); + if (aid == 0) r0=1; + if (aid == 1) r1=1; + } + if (r0==1 && r1==1) printf("Streaming started, returning to OAI\n"); + else { + printf("Didn't get anything from one antenna port after %d packets %d,%d\n",Npackets,r0,r1); + return(-1); + } + return(0); + +} +int aw2s_oriinit(openair0_device *device) { + + + ORI_s * ori; + ORI_Result_e result; + ORI_Result_e RE_result; + char c; + ORI_Object_s * objects[100]; + uint32_t numObjects; + uint32_t i; + + eth_state_t *eth = (eth_state_t*)device->priv; + eth_params_t *eth_params = device->eth_params; + openair0_config_t *openair0_cfg = device->openair0_cfg; + + + /******************************************************************* + * CREATION AND CONNECTION + *******************************************************************/ + + printf("Initializing the ORI control interface\n"); + + /* Create context */ + ori = ORI_Create(); + if(!ori) + { + printf("Failed to create ORI context\n"); + return -1; + } + device->thirdparty_priv = (void *)ori; + ori->userData = (void *)ori; + ori->indicationCallback = cb; + + /* Connect... */ + printf("Trying to connect to AW2S device on %s : %d\n",eth_params->remote_addr, eth_params->remote_portc); + result = ORI_Connect(ori, eth_params->remote_addr, eth_params->remote_portc, 3000, 0); + if(result != ORI_Result_SUCCESS) + { + printf("ORI_Connect failed with error: %s\n", ORI_Result_Print(result)); + aw2s_oricleanup(device); + return -1; + } + + /* First health check */ + result = ORI_HealthCheck(ori, 6000, &RE_result); + if(result != ORI_Result_SUCCESS) + { + printf("ORI_HealthCheck failed with error: %s\n", ORI_Result_Print(result)); + aw2s_oricleanup(device); + return -1; + } + printf("ORI_HealthCheck: %s\n", ORI_Result_Print(RE_result)); + + /* Set RE time */ + result = ORI_SetTime(ori, &RE_result); + if(result != ORI_Result_SUCCESS) + { + printf("ORI_SetTime failed with error: %s\n", ORI_Result_Print(result)); + aw2s_oricleanup(device); + return -1; + } + printf("ORI_SetTime: %s\n", ORI_Result_Print(RE_result)); + + + + + /******************************************************************* + * SOFTWARE PARAMETERS ALIGNMENT + *******************************************************************/ + + /* Report all current objects parameters */ + result = ORI_ObjectParamReport(ori, NULL, 0, ORI_ObjectParam_All, &RE_result); + if(result != ORI_Result_SUCCESS) + { + printf("ORI_ObjectParamReport failed with error: %s\n", ORI_Result_Print(result)); + aw2s_oricleanup(device); + return -1; + } + + printf("ORI_ObjectParamReport: %s\n", ORI_Result_Print(RE_result)); + + + + + /******************************************************************* + * TX PATHS CREATION + *******************************************************************/ + + /* Prepare parameters */ + ORI_ObjectTypeRef_s txTypeRef = { NULL, openair0_cfg->duplex_mode == duplex_mode_FDD ? ORI_ObjectType_TxEUtraFDD : ORI_ObjectType_TxEUtraTDD}; + ORI_ObjectParams_u txParams; + ORI_ObjectParam_e txParamList[9]; + ORI_Result_e txParamResult[9]; + int num_txparams; + + if (openair0_cfg->duplex_mode == duplex_mode_FDD) { + txParamList[0] = ORI_ObjectParam_SigPath_antPort; + txParamList[1] = ORI_ObjectParam_SigPath_axcW; + txParamList[2] = ORI_ObjectParam_SigPath_axcB; + txParamList[3] = ORI_ObjectParam_SigPath_chanBW; + txParamList[4] = ORI_ObjectParam_SigPath_earfcn; + txParamList[5] = ORI_ObjectParam_TxSigPath_maxTxPwr; + num_txparams = 6; + } + else { + txParamList[0] = ORI_ObjectParam_SigPath_antPort; + txParamList[1] = ORI_ObjectParam_SigPath_axcW; + txParamList[2] = ORI_ObjectParam_SigPath_axcB; + txParamList[3] = ORI_ObjectParam_SigPath_chanBW; + txParamList[4] = ORI_ObjectParam_SigPath_earfcn; + txParamList[5] = ORI_ObjectParam_TxSigPath_maxTxPwr; + txParamList[6] = ORI_ObjectParam_SigPath_tddULDLConfig; + txParamList[7] = ORI_ObjectParam_SigPath_tddSpecialSFConfig; + txParamList[8] = ORI_ObjectParam_TxSigPath_tddCPLengthDL; + num_txparams = 9; + } + + + /* Create tx0 */ + ORI_Object_s * tx0; + printf("AW2S: duplex_mode %d, tx_bw %f, rx_bw %f\n",openair0_cfg->duplex_mode,openair0_cfg->tx_bw,openair0_cfg->rx_bw); + if (openair0_cfg->duplex_mode == duplex_mode_FDD) { + txParams.TxEUtraFDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 0, NULL); + txParams.TxEUtraFDD.axcW = 1; + txParams.TxEUtraFDD.axcB = 0; + txParams.TxEUtraFDD.chanBW = openair0_cfg->tx_bw/100e3; + txParams.TxEUtraFDD.earfcn = 3350; + txParams.TxEUtraFDD.maxTxPwr = -100; + } + else if (openair0_cfg->duplex_mode == duplex_mode_TDD) { + txParams.TxEUtraTDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 0, NULL); + txParams.TxEUtraTDD.axcW = 1; + txParams.TxEUtraTDD.axcB = 0; + txParams.TxEUtraTDD.chanBW = openair0_cfg->tx_bw/100e3; + txParams.TxEUtraTDD.earfcn = to_earfcn_DL_aw2s(38,(long long int)openair0_cfg->tx_freq[0],txParams.TxEUtraTDD.chanBW); + txParams.TxEUtraTDD.maxTxPwr = 430-((int)openair0_cfg->tx_gain[0]*10); + txParams.TxEUtraTDD.tddULDLConfig = 1; + txParams.TxEUtraTDD.tddSpecialSFConfig = 0; + txParams.TxEUtraTDD.tddCPLengthDL = ORI_tddCPLength_Normal; + + printf("AW2S: Configuring for TDD, EARFCN %u, Power %d, BW %d\n", + txParams.TxEUtraTDD.earfcn,txParams.TxEUtraTDD.maxTxPwr,txParams.TxEUtraTDD.chanBW); + } + else { + aw2s_oricleanup(device); + return -1; + } + result = ORI_ObjectCreation(ori, txTypeRef, txParams, txParamList, num_txparams, txParamResult, &tx0, &RE_result); + if(RE_result != ORI_Result_SUCCESS) + { + printf("ORI_ObjectCreation (txParams0.TxEUtraFDD/TDD) failed with error: %s (%s,%s,%s,%s,%s,%s,%s,%s,%s\n", ORI_Result_Print(result), + ORI_Result_Print(txParamResult[0]), + ORI_Result_Print(txParamResult[1]), + ORI_Result_Print(txParamResult[2]), + ORI_Result_Print(txParamResult[3]), + ORI_Result_Print(txParamResult[4]), + ORI_Result_Print(txParamResult[5]), + ORI_Result_Print(txParamResult[6]), + ORI_Result_Print(txParamResult[7]), + ORI_Result_Print(txParamResult[8])); + aw2s_oricleanup(device); + return -1; + } + printf("ORI_ObjectCreation (txParams0.TxEUtraFDD/TDD): %s\n", ORI_Result_Print(RE_result)); + + + /* Create tx1 */ + if (openair0_cfg->tx_num_channels > 1) { + ORI_Object_s * tx1; + if (openair0_cfg->duplex_mode ==duplex_mode_FDD) txParams.TxEUtraFDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 1, NULL); + else txParams.TxEUtraTDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 1, NULL); + result = ORI_ObjectCreation(ori, txTypeRef, txParams, txParamList, num_txparams, txParamResult, &tx1, &RE_result); + if(RE_result != ORI_Result_SUCCESS) + { + printf("ORI_ObjectCreation (txParams1.TxEUtraFDD/TDD) failed with error: %s\n", ORI_Result_Print(result)); + aw2s_oricleanup(device); + return -1; + } + printf("ORI_ObjectCreation (txParams1.TxEUtraFDD/TDD): %s\n", ORI_Result_Print(RE_result)); + } + + + + /******************************************************************* + * RX PATHS CREATION + *******************************************************************/ + + /* Prepare parameters */ + ORI_ObjectTypeRef_s rxTypeRef = { NULL, openair0_cfg->duplex_mode == duplex_mode_FDD ? ORI_ObjectType_RxEUtraFDD : ORI_ObjectType_RxEUtraTDD}; + ORI_ObjectParams_u rxParams,rxParams1; + ORI_ObjectParam_e rxParamList[8] = { ORI_ObjectParam_SigPath_antPort, ORI_ObjectParam_SigPath_axcW, ORI_ObjectParam_SigPath_axcB, + ORI_ObjectParam_SigPath_chanBW, ORI_ObjectParam_SigPath_earfcn }; + ORI_Result_e rxParamResult[8]; + int num_rxparams = 5; + if (openair0_cfg->duplex_mode == duplex_mode_TDD) { + rxParamList[5] = ORI_ObjectParam_SigPath_tddULDLConfig; + rxParamList[6] = ORI_ObjectParam_SigPath_tddSpecialSFConfig; + rxParamList[7] = ORI_ObjectParam_RxSigPath_tddCPLengthUL; + num_rxparams = 8; + } + /* Create rx0 */ + ORI_Object_s * rx0; + if (openair0_cfg->duplex_mode == duplex_mode_FDD) { + rxParams.RxEUtraFDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 0, NULL); + rxParams.RxEUtraFDD.axcW = 1; + rxParams.RxEUtraFDD.axcB = 0; + rxParams.RxEUtraFDD.chanBW = 200; + rxParams.RxEUtraFDD.earfcn = 21350; + result = ORI_ObjectCreation(ori, rxTypeRef, rxParams, rxParamList, num_rxparams, rxParamResult, &rx0, &RE_result); + } + else { + rxParams.RxEUtraTDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 0, NULL); + rxParams.RxEUtraTDD.axcW = 1; + rxParams.RxEUtraTDD.axcB = 0; + rxParams.RxEUtraTDD.chanBW = txParams.TxEUtraTDD.chanBW; + rxParams.RxEUtraTDD.earfcn = txParams.TxEUtraTDD.earfcn; + rxParams.RxEUtraTDD.tddULDLConfig = 1; + rxParams.RxEUtraTDD.tddSpecialSFConfig = 1; + rxParams.RxEUtraTDD.tddCPLengthUL = ORI_tddCPLength_Normal; + + printf("AW2S: Creating RX0 for EARFCN %d\n",rxParams.RxEUtraTDD.earfcn); + + result = ORI_ObjectCreation(ori, rxTypeRef, rxParams, rxParamList, num_rxparams, rxParamResult, &rx0, &RE_result); + + } + + if(result != ORI_Result_SUCCESS) + { + printf("ORI_ObjectCreation (rxParams0.RxEUtraFDD/TDD) failed with error: %s\n", ORI_Result_Print(result)); + aw2s_oricleanup(device); + return -1; + } + printf("ORI_ObjectCreation (rxParams0.RxEUtraFDD/TDD): %s\n", ORI_Result_Print(RE_result)); + + if (openair0_cfg->rx_num_channels > 1) { + /* Create rx1 */ + ORI_Object_s * rx1; + memcpy((void*)&rxParams1,(void*)&rxParams,sizeof(rxParams)); + if (openair0_cfg->duplex_mode == duplex_mode_FDD) rxParams1.RxEUtraFDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 1, NULL); + else rxParams1.RxEUtraTDD.antPort = ORI_FindObject(ori, ORI_ObjectType_AntennaPort, 1, NULL); + + result = ORI_ObjectCreation(ori, rxTypeRef, rxParams1, rxParamList, num_rxparams, rxParamResult, &rx1, &RE_result); + + + if(result != ORI_Result_SUCCESS) + { + printf("ORI_ObjectCreation (rxParams1.RxEUtraFDD/TDD) failed with error: %s\n", ORI_Result_Print(result)); + aw2s_oricleanup(device); + return -1; + } + printf("ORI_ObjectCreation (rxParams1.RxEUtraFDD/TDD): %s\n", ORI_Result_Print(RE_result)); + } + + /* Create link */ + + ORI_ObjectParams_u linkParams; + ORI_ObjectParam_e linkParamList[3] = {ORI_ObjectParam_ORILink_AWS_remoteMAC, ORI_ObjectParam_ORILink_AWS_remoteIP,ORI_ObjectParam_ORILink_AWS_remoteUdpPort}; + ORI_Result_e linkParamResult[3]; + + ORI_Object_s *link= ORI_FindObject(ori, ORI_ObjectType_ORILink, 0, NULL); + linkParams.ORILink.AWS_remoteUdpPort = eth_params->my_portd; + + + if (get_mac_addr(eth_params->local_if_name,linkParams.ORILink.AWS_remoteMAC) < 0) return(-1); + inet_pton(AF_INET,eth_params->my_addr,(struct in_addr*)linkParams.ORILink.AWS_remoteIP); + result = ORI_ObjectParamModify(ori,link,linkParams,linkParamList,3,linkParamResult,&RE_result); + if(result != ORI_Result_SUCCESS) + { + printf("ORI_ObjectParamModify (linkParams) failed with error: %s\n", ORI_Result_Print(result)); + aw2s_oricleanup(device); + return -1; + } + result = ORI_ObjectStateModification(ori, link, ORI_AST_Locked, &RE_result); + if(result != ORI_Result_SUCCESS) + { + printf("ORI_ObjectStateModify failed with error: %s\n", ORI_Result_Print(result)); + aw2s_oricleanup(device); + return -1; + } + + printf("ORI_ObjectParamModify (linkParams): %s (%d,%d,%d)\n", ORI_Result_Print(RE_result),linkParamResult[0],linkParamResult[1],linkParamResult[2]); + + /******************************************************************* + * FULL OBJECT PARAMETERS UPDATE + *******************************************************************/ + + printf("\n\n\n========================================================\n"); + + result = ORI_ObjectParamReport(ori, NULL, 0, ORI_ObjectParam_All, &RE_result); + if(result != ORI_Result_SUCCESS) + { + printf("ORI_ObjectParamReport failed with error: %s\n", ORI_Result_Print(result)); + aw2s_oricleanup(device); + return -1; + } + printf("ORI_ObjectParamReport: %s\n", ORI_Result_Print(RE_result)); + + + + + + /******************************************************************* + * FULL OBJECT STATES UPDATE + *******************************************************************/ + + printf("\n\n\n========================================================\n"); + + result = ORI_ObjectStateReport(ori, NULL, 0, ORI_StateType_All, ORI_EventDrivenReport_True, &RE_result); + if(result != ORI_Result_SUCCESS) + { + printf("ORI_ObjectStateReport failed with error: %s\n", ORI_Result_Print(result)); + aw2s_oricleanup(device); + return -1; + } + printf("ORI_ObjectStateReport: %s\n", ORI_Result_Print(RE_result)); + + /* Print reported states for all objects (some objects have non-applicable states though) */ + numObjects = ORI_GetAllObjects(ori, objects, 100, NULL); + for(i=0; i %s / %s\n", ORI_ObjectType_Print(objects[i]->typeRef.type), objects[i]->instanceNumber, ORI_AST_Print(objects[i]->ast), ORI_FST_Print(objects[i]->fst)); + + + + + + /******************************************************************* + * FULL OBJECT FAULTS UPDATE + *******************************************************************/ + + printf("\n\n\n========================================================\n"); + + result = ORI_ObjectFaultReport(ori, NULL, 0, ORI_EventDrivenReport_True, &RE_result); + if(result != ORI_Result_SUCCESS) + { + printf("ORI_ObjectFaultReport failed with error: %s\n", ORI_Result_Print(result)); + aw2s_oricleanup(device); + return -1; + } + printf("ORI_ObjectFaultReport: %s\n", ORI_Result_Print(RE_result)); + + + /******************************************************************* + * PRINT STATES + *******************************************************************/ + + printf("\n\n\n========================================================\n"); + + /* Due to event driven reporting set to "true", the states modifications of the objects should be reflected back into the model. Print states for all objects (some objects have non-applicable states though) */ + numObjects = ORI_GetAllObjects(ori, objects, 100, NULL); + for(i=0; i %s / %s\n", ORI_ObjectType_Print(objects[i]->typeRef.type), objects[i]->instanceNumber, ORI_AST_Print(objects[i]->ast), ORI_FST_Print(objects[i]->fst)); + + + + + + return 0; +} + + +int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth_params_t * eth_params ) { + + + device->thirdparty_init = aw2s_oriinit; + device->thirdparty_cleanup = aw2s_oricleanup; + device->thirdparty_startstreaming = aw2s_startstreaming; +} diff --git a/targets/ARCH/AW2SORI/ori.h b/targets/ARCH/AW2SORI/ori.h new file mode 100644 index 0000000000..d4a4f2cbbf --- /dev/null +++ b/targets/ARCH/AW2SORI/ori.h @@ -0,0 +1,2381 @@ +/** +* @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 + +/*----------------------------------------------------------------------------------------- + * 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.
+ * 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.
+ * 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.
+ * The indication callback passes in its arguments the @p type describing the type of the indication, such as file transfer completion, RE fault, etc.
+ * 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.
+ * Those objects represent and define the resource model of the RE, of which an image is present in the REC (via this library).
+ * 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.
+ * To update the parameters of the object, see ORI_ObjectParamReport().
+ * To modify the parameters of the object, see ORI_ObjectParamModify().
+ * To create an object, see ORI_ObjectCreation().
+ * To delete an object, see ORI_ObjectDeletion().
+ * To update the state of the object, see ORI_ObjectStateReport().
+ * To modify the state of the object, see ORI_ObjectStateModify().
+ * To update the faults of the object, see ORI_ObjectFaultReport().
+ * To find an object in the model, see ORI_FindObject().
+ * 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.
+ * The @p opaque field is a library specific field and must not be modified by the user application.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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).
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * 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.
+ * The Software file format is RE vendor specific.
+ * After download, the RE will store this new software package in non-volatile memory as the passive image.
+ * 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.
+ * 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.
+ * The target object or set of objects is specified by the arguments @p object and @p wildcard:
+ * - @p object is not @c NULL and @p wildcard is 0 : the targeted object is @p object.
+ * - @p object is not @c NULL and @p wildcard is not 0 : the targeted objects are all the children of @p object.
+ * - @p object is @c NULL : the targeted objects are all the objects in the model.
+ * + * 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.
+ * On success, the parameters of the targeted objects are updated in the model.
+ * 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.
+ * The object for which the parameter(s) is(are) to be modified is given by @p object.
+ * 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.
+ * 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.
+ * The object type to create is given by @p typeRef.
+ * 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.
+ * The created object is added in the model.
+ * 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.
+ * 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.
+ * The target object or set of objects is specified by the arguments @p object and @p wildcard:
+ * - @p object is not @c NULL and @p wildcard is 0 : the targeted object is @p object.
+ * - @p object is not @c NULL and @p wildcard is not 0 : the targeted objects are all the children of @p object.
+ * - @p object is @c NULL : the targeted objects are all the objects in the model.
+ * + * 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.
+ * On success, the states of the targeted objects are updated in the model.
+ * 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.
+ * 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.
+ * The target object or set of objects is specified by the arguments @p object and @p wildcard:
+ * - @p object is not @c NULL and @p wildcard is 0 : the targeted object is @p object.
+ * - @p object is not @c NULL and @p wildcard is not 0 : the targeted objects are all the children of @p object.
+ * - @p object is @c NULL : the targeted objects are all the objects in the model.
+ * + * On success, the faults of the targeted objects are updated in the model.
+ * 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.
+ * If successful, a File Upload should be initiated.
+ * 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.
+ * 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.
+ * 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.
+ * The maximum size of the @p objects array shall be given in @p maxObjects.
+ * + * @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.
+ * The maximum size of the @p objects array shall be given in @p maxObjects.
+ * 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_ */