/*
 * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The OpenAirInterface Software Alliance licenses this file to You under
 * the OAI Public License, Version 1.1  (the "License"); you may not use this file
 * except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.openairinterface.org/?page_id=698
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *-------------------------------------------------------------------------------
 * For more information about the OpenAirInterface (OAI) Software Alliance:
 *      contact@openairinterface.org
 */

/*! \file openair2/ENB_APP/enb_paramdef_nbiot.h
 * \brief definition of configuration parameters for NB-IoT eNodeB modules
 * \author Raymond KNOPP
 * \date 2019
 * \version 0.1
 * \company EURECOM France
 * \email: raymond.knopp@eurecom.fr
 * \note
 * \warning
 */

#include "common/config/config_paramdesc.h"
#include "RRC_paramsvalues.h"
#include <libconfig.h>

#define ENB_CONFIG_STRING_NB_IoT_PARAMETERS                                "NBparameters"
//RRC parameters in the config file of merge branch
#define ENB_CONFIG_STRING_RACH_POWERRAMPINGSTEP_NB_IOT                     "rach_powerRampingStep_NB"
#define ENB_CONFIG_STRING_RACH_PREAMBLEINITIALRECEIVEDTARGETPOWER_NB_IOT   "rach_preambleInitialReceivedTargetPower_NB"
#define ENB_CONFIG_STRING_RACH_PREAMBLETRANSMAX_CE_NB_IOT                  "rach_preambleTransMax_CE_NB"
#define ENB_CONFIG_STRING_RACH_RARESPONSEWINDOWSIZE_NB_IOT                 "rach_raResponseWindowSize_NB"
#define ENB_CONFIG_STRING_RACH_MACCONTENTIONRESOLUTIONTIMER_NB_IOT         "rach_macContentionResolutionTimer_NB"

#define ENB_CONFIG_STRING_BCCH_MODIFICATIONPERIODCOEFF_NB_IOT              "bcch_modificationPeriodCoeff_NB"
#define ENB_CONFIG_STRING_PCCH_DEFAULT_PAGING_CYCLE_NB_IOT                 "pcch_defaultPagingCycle_NB"
#define ENB_CONFIG_STRING_NPRACH_CP_LENGTH_NB_IOT                          "nprach_CP_Length"
#define ENB_CONFIG_STRING_NPRACH_RSRP_RANGE_NB_IOT                         "nprach_rsrp_range"
#define ENB_CONFIG_STRING_NPDSCH_NRS_POWER_NB_IOT                          "npdsch_nrs_Power"
#define ENB_CONFIG_STRING_NPUSCH_ACK_NACK_NUMREPETITIONS_NB_IOT            "npusch_ack_nack_numRepetitions_NB"
#define ENB_CONFIG_STRING_NPUSCH_SRS_SUBFRAMECONFIG_NB_IOT                 "npusch_srs_SubframeConfig_NB"
#define ENB_CONFIG_STRING_NPUSCH_THREETONE_CYCLICSHIFT_R13_NB_IOT          "npusch_threeTone_CyclicShift_r13"
#define ENB_CONFIG_STRING_NPUSCH_SIXTONE_CYCLICSHIFT_R13_NB_IOT            "npusch_sixTone_CyclicShift_r13"
#define ENB_CONFIG_STRING_NPUSCH_GROUP_HOPPING_EN_NB_IOT                   "npusch_groupHoppingEnabled"
#define ENB_CONFIG_STRING_NPUSCH_GROUPASSIGNMENTNPUSH_R13_NB_IOT           "npusch_groupAssignmentNPUSCH_r13"
#define ENB_CONFIG_STRING_DL_GAPTHRESHOLD_NB_IOT                           "dl_GapThreshold_NB"
#define ENB_CONFIG_STRING_DL_GAPPERIODICITY_NB_IOT                         "dl_GapPeriodicity_NB"
#define ENB_CONFIG_STRING_DL_GAPDURATIONCOEFF_NB_IOT                       "dl_GapDurationCoeff_NB"
#define ENB_CONFIG_STRING_NPUSCH_P0NOMINALPUSH_NB_IOT                      "npusch_p0_NominalNPUSCH"
#define ENB_CONFIG_STRING_NPUSCH_ALPHA_NB_IOT                              "npusch_alpha"
#define ENB_CONFIG_STRING_DELTAPREAMBLEMSG3_NB_IOT                         "deltaPreambleMsg3"

#define ENB_CONFIG_STRING_UETIMERS_T300_NB_IOT                             "ue_TimersAndConstants_t300_NB"
#define ENB_CONFIG_STRING_UETIMERS_T301_NB_IOT                             "ue_TimersAndConstants_t301_NB"
#define ENB_CONFIG_STRING_UETIMERS_T310_NB_IOT                             "ue_TimersAndConstants_t310_NB"
#define ENB_CONFIG_STRING_UETIMERS_T311_NB_IOT                             "ue_TimersAndConstants_t311_NB"
#define ENB_CONFIG_STRING_UETIMERS_N310_NB_IOT                             "ue_TimersAndConstants_n310_NB"
#define ENB_CONFIG_STRING_UETIMERS_N311_NB_IOT                             "ue_TimersAndConstants_n311_NB"
// #define ENB_CONFIG_STRING_UE_TRANSMISSION_MODE_NB_IoT                   "ue_TransmissionMode_NB"

// NPRACH parameters 
#define ENB_CONFIG_STRING_NPRACH_PERIODICITY_NB_IOT                        "nprach_Periodicity"
#define ENB_CONFIG_STRING_NPRACH_STARTTIME_NB_IOT                          "nprach_StartTime"
#define ENB_CONFIG_STRING_NPRACH_SUBCARRIEROFFSET_NB_IOT                   "nprach_SubcarrierOffset"
#define ENB_CONFIG_STRING_NPRACH_NUMSUBCARRIERS_NB_IOT                     "nprach_NumSubcarriers"
#define ENB_CONFIG_STRING_NPRACH_SUBCARRIERMSG3_RANGESTART_NB_IOT          "nprach_SubcarrierMSG3_RangeStart"
#define ENB_CONFIG_STRING_MAXNUM_PREAMBLE_ATTEMPT_CE_NB_IOT                "maxNumPreambleAttemptCE_NB"
#define ENB_CONFIG_STRING_NUMREPETITIONSPERPREAMBLEATTEMPT_NB_IOT          "numRepetitionsPerPreambleAttempt"
#define ENB_CONFIG_STRING_NPDCCH_NUMREPETITIONS_RA_NB_IOT                  "npdcch_NumRepetitions_RA"
#define ENB_CONFIG_STRING_NPDCCH_STARTSF_CSS_RA_NB_IOT                     "npdcch_StartSF_CSS_RA"
#define ENB_CONFIG_STRING_NPDCCH_OFFSET_RA_NB_IOT                          "npdcch_Offset_RA"


/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
/*                                     component carriers configuration parameters                                                                                                     */
/*   optname                                                   helpstr   paramflags    XXXptr                                        defXXXval                    type         numelt  */
/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
/* init for checkedparam_t structure */

typedef struct ccparams_NB_IoT_s {
	  int32_t 			NB_IoT_configured;
	  //RRC parameters in the config file of merge branch
	  libconfig_int     rach_raResponseWindowSize_NB;                 
  	libconfig_int     rach_macContentionResolutionTimer_NB;       
  	libconfig_int     rach_powerRampingStep_NB;                     
  	libconfig_int     rach_preambleInitialReceivedTargetPower_NB;   
  	libconfig_int     rach_preambleTransMax_CE_NB;                  
  	libconfig_int     bcch_modificationPeriodCoeff_NB;              
  	libconfig_int     pcch_defaultPagingCycle_NB;                   
  	libconfig_int     nprach_CP_Length;                             
  	libconfig_int     nprach_rsrp_range;                            
  	libconfig_int     npdsch_nrs_Power;                             
  	libconfig_int     npusch_ack_nack_numRepetitions_NB;            
  	libconfig_int     npusch_srs_SubframeConfig_NB;                 
  	libconfig_int     npusch_threeTone_CyclicShift_r13;             
  	libconfig_int     npusch_sixTone_CyclicShift_r13;            
  	const char*       npusch_groupHoppingEnabled;
  	libconfig_int     npusch_groupAssignmentNPUSCH_r13;             
  	libconfig_int     dl_GapThreshold_NB;                           
  	libconfig_int     dl_GapPeriodicity_NB;                         
  	const char*       dl_GapDurationCoeff_NB;
  	libconfig_int     npusch_p0_NominalNPUSCH;                      
  	const char*       npusch_alpha;
  	libconfig_int     deltaPreambleMsg3;                            

  	libconfig_int     ue_TimersAndConstants_t300_NB;     
  	libconfig_int     ue_TimersAndConstants_t301_NB;     
  	libconfig_int     ue_TimersAndConstants_t310_NB;      
  	libconfig_int     ue_TimersAndConstants_t311_NB;      
  	libconfig_int     ue_TimersAndConstants_n310_NB;      
  	libconfig_int     ue_TimersAndConstants_n311_NB;      

  	libconfig_int     nprach_Periodicity;                 
  	libconfig_int     nprach_StartTime;                   
  	libconfig_int     nprach_SubcarrierOffset;            
  	libconfig_int     nprach_NumSubcarriers;              
  	const char*       nprach_SubcarrierMSG3_RangeStart;
  	libconfig_int     maxNumPreambleAttemptCE_NB;         
  	libconfig_int     numRepetitionsPerPreambleAttempt;   
  	libconfig_int     npdcch_NumRepetitions_RA;           
  	libconfig_int     npdcch_StartSF_CSS_RA;              
  	const char*       npdcch_Offset_RA;
} ccparams_NB_IoT_t;


#define CCPARAMS_NB_IOT_DESC(NBconfig) {				\
{"NB_IoT_configured",                                            		  NULL, 0,      iptr:&NBconfig->NB_IoT_configured,                 			     defintval:0,				      TYPE_UINT,    0},  \
{ENB_CONFIG_STRING_RACH_POWERRAMPINGSTEP_NB_IOT,                 		  NULL, 0,      iptr:&NBconfig->rach_powerRampingStep_NB,          			     defintval:0,				      TYPE_UINT,    0},  \
{ENB_CONFIG_STRING_RACH_PREAMBLEINITIALRECEIVEDTARGETPOWER_NB_IOT	    NULL,	0,			iptr:&NBconfig->rach_preambleInitialReceivedTargetPower_NB 	 defintval:0,				      TYPE_UINT,		0},  \
{ENB_CONFIG_STRING_RACH_PREAMBLETRANSMAX_CE_NB_IOT						        NULL,	0,			iptr:&NBconfig->rach_preambleTransMax_CE_NB 				         defintval:0,				      TYPE_UINT,		0},  \
{ENB_CONFIG_STRING_RACH_RARESPONSEWINDOWSIZE_NB_IOT						        NULL,	0,			iptr:&NBconfig->rach_raResponseWindowSize_NB 				         defintval:0,				      TYPE_UINT,		0},  \
{ENB_CONFIG_STRING_RACH_MACCONTENTIONRESOLUTIONTIMER_NB_IOT				    NULL,	0,			iptr:&NBconfig->rach_macContentionResolutionTimer_NB 		     defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_BCCH_MODIFICATIONPERIODCOEFF_NB_IOT					      NULL,	0,			iptr:&NBconfig->bcch_modificationPeriodCoeff_NB 			       defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_PCCH_DEFAULT_PAGING_CYCLE_NB_IOT						        NULL,	0,			iptr:&NBconfig->pcch_defaultPagingCycle_NB 					         defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_NPRACH_CP_LENGTH_NB_IOT    							          NULL,	0,			iptr:&NBconfig->nprach_CP_Length 							               defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_NPRACH_RSRP_RANGE_NB_IOT               				    NULL,	0,			iptr:&NBconfig->nprach_rsrp_range 							             defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_NPDSCH_NRS_POWER_NB_IOT                				    NULL,	0,			iptr:&NBconfig->npdsch_nrs_Power 							               defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_NPUSCH_ACK_NACK_NUMREPETITIONS_NB_IOT  				    NULL,	0,			iptr:&NBconfig->npusch_ack_nack_numRepetitions_NB 			     defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_NPUSCH_SRS_SUBFRAMECONFIG_NB_IOT       				    NULL,	0,			iptr:&NBconfig->npusch_srs_SubframeConfig_NB 				         defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_NPUSCH_THREETONE_CYCLICSHIFT_R13_NB_IOT				    NULL,	0,			iptr:&NBconfig->npusch_threeTone_CyclicShift_r13 			       defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_NPUSCH_SIXTONE_CYCLICSHIFT_R13_NB_IOT  				    NULL,	0,			iptr:&NBconfig->npusch_sixTone_CyclicShift_r13 		 		       defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_NPUSCH_GROUP_HOPPING_EN_NB_IOT         				    NULL,	0,			strptr:&NBconfig->npusch_groupHoppingEnabled 				         defintval:"DISABLE",		  TYPE_STRING,	0},	 \
{ENB_CONFIG_STRING_NPUSCH_GROUPASSIGNMENTNPUSH_R13_NB_IOT 				    NULL,	0,			iptr:&NBconfig->npusch_groupAssignmentNPUSCH_r13 			       defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_DL_GAPTHRESHOLD_NB_IOT                 				    NULL,	0,			iptr:&NBconfig->dl_GapThreshold_NB 							             defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_DL_GAPPERIODICITY_NB_IOT               				    NULL,	0,			iptr:&NBconfig->dl_GapPeriodicity_NB 						             defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_DL_GAPDURATIONCOEFF_NB_IOT             				    NULL,	0,			strptr:&NBconfig->dl_GapDurationCoeff_NB 					           defintval:"oneEighth",		TYPE_STRING,	0},	 \
{ENB_CONFIG_STRING_NPUSCH_P0NOMINALPUSH_NB_IOT            				    NULL,	0,			iptr:&NBconfig->npusch_p0_NominalNPUSCH 					           defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_NPUSCH_ALPHA_NB_IOT                    				    NULL,	0,			strptr:&NBconfig->npusch_alpha 								               defintval:"AL0",		      TYPE_STRING,	0},	 \
{ENB_CONFIG_STRING_DELTAPREAMBLEMSG3_NB_IOT               				    NULL,	0,			iptr:&NBconfig->deltaPreambleMsg3 							             defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_UETIMERS_T300_NB_IOT                   				    NULL,	0,			iptr:&NBconfig->ue_TimersAndConstants_t300_NB 				       defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_UETIMERS_T301_NB_IOT                   				    NULL,	0,			iptr:&NBconfig->ue_TimersAndConstants_t301_NB 				       defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_UETIMERS_T310_NB_IOT                   				    NULL,	0,			iptr:&NBconfig->ue_TimersAndConstants_t310_NB 				       defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_UETIMERS_T311_NB_IOT                   				    NULL,	0,			iptr:&NBconfig->ue_TimersAndConstants_t311_NB 				       defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_UETIMERS_N310_NB_IOT                   				    NULL,	0,			iptr:&NBconfig->ue_TimersAndConstants_n310_NB 				       defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_UETIMERS_N311_NB_IOT                   				    NULL,	0,			iptr:&NBconfig->ue_TimersAndConstants_n311_NB 				       defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_NPRACH_PERIODICITY_NB_IOT              				    NULL,	0,			iptr:&NBconfig->nprach_Periodicity 							             defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_NPRACH_STARTTIME_NB_IOT                				    NULL,	0,			iptr:&NBconfig->nprach_StartTime 							               defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_NPRACH_SUBCARRIEROFFSET_NB_IOT         				    NULL,	0,			iptr:&NBconfig->nprach_SubcarrierOffset 					           defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_NPRACH_NUMSUBCARRIERS_NB_IOT           				    NULL,	0,			iptr:&NBconfig->nprach_NumSubcarriers 						           defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_NPRACH_SUBCARRIERMSG3_RANGESTART_NB_IOT				    NULL,	0,			strptr:&NBconfig->nprach_SubcarrierMSG3_RangeStart 			     defintval:"one",		      TYPE_STRING,	0},	 \
{ENB_CONFIG_STRING_MAXNUM_PREAMBLE_ATTEMPT_CE_NB_IOT      				    NULL,	0,			iptr:&NBconfig->maxNumPreambleAttemptCE_NB 					         defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_NUMREPETITIONSPERPREAMBLEATTEMPT_NB_IOT				    NULL,	0,			iptr:&NBconfig->numRepetitionsPerPreambleAttempt 			       defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_NPDCCH_NUMREPETITIONS_RA_NB_IOT        				    NULL,	0,			iptr:&NBconfig->npdcch_NumRepetitions_RA 					           defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_NPDCCH_STARTSF_CSS_RA_NB_IOT           				    NULL,	0,			iptr:&NBconfig->npdcch_StartSF_CSS_RA 						           defintval:0,				      TYPE_UINT,		0},	 \
{ENB_CONFIG_STRING_NPDCCH_OFFSET_RA_NB_IOT                				    NULL,	0,			strptr:&NBconfig->npdcch_Offset_RA 							             defintval:"zero",	      TYPE_STRING,	0},	 \
}