/*
 * 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.0  (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 PHY/LTE_TRANSPORT/proto.h
 * \brief Function prototypes for PHY physical/transport channel processing and generation V8.6 2009-03
 * \author R. Knopp, F. Kaltenberger
 * \date 2011
 * \version 0.1
 * \company Eurecom
 * \email: knopp@eurecom.fr
 * \note
 * \warning
 */
#ifndef __LTE_TRANSPORT_PROTO_NB_IOT__H__
#define __LTE_TRANSPORT_PROTO_NB_IOT__H__
#include "PHY/defs_nb_iot.h"
#include <math.h>

//NPSS

int generate_npss_NB_IoT(int32_t **txdataF,
                  short amp,
                  LTE_DL_FRAME_PARMS *frame_parms,
                  unsigned short symbol_offset,          // symbol_offset should equal to 3 for NB-IoT 
                  unsigned short slot_offset,
                  unsigned short RB_IoT_ID);             // new attribute (values are between 0.. Max_RB_number-1), it does not exist for LTE

//NSSS

int generate_sss_NB_IoT(int32_t **txdataF,
                  int16_t amp,
                  LTE_DL_FRAME_PARMS *frame_parms, 
                  uint16_t symbol_offset,             // symbol_offset = 3 for NB-IoT 
                  uint16_t slot_offset, 
                  unsigned short frame_number,        // new attribute (Get value from higher layer), it does not exist for LTE
                  unsigned short RB_IoT_ID);          // new attribute (values are between 0.. Max_RB_number-1), it does not exist for LTE

//NRS

void generate_pilots_NB_IoT(PHY_VARS_eNB *phy_vars_eNB,
                     int32_t **txdataF,
                     int16_t amp,
                     uint16_t Ntti,                // Ntti = 10
                unsigned short RB_IoT_ID,       // RB reserved for NB-IoT
                unsigned short With_NSSS);      // With_NSSS = 1; if the frame include a sub-Frame with NSSS signal


//NPBCH

int allocate_npbch_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
                            int32_t **txdataF,
                            uint32_t *jj,
                            uint32_t symbol_offset,
                            uint8_t *x0,
                            uint8_t pilots,
                            int16_t amp,
                     unsigned short id_offset,
                            uint32_t *re_allocated);

int generate_npbch(NB_IoT_eNB_NPBCH_t *eNB_npbch,
                  int32_t **txdataF,
                  int amp,
                  LTE_DL_FRAME_PARMS *frame_parms,
                  uint8_t *npbch_pdu,
                  uint8_t frame_mod64,
              unsigned short NB_IoT_RB_ID);

void npbch_scrambling(LTE_DL_FRAME_PARMS *frame_parms,
                     uint8_t *npbch_e,
                     uint32_t length);

// Functions below implement 36-211 and 36-212

/*Function to pack the DCI*/
void NB_add_dci(DCI_PDU_NB *DCI_pdu,void *pdu,rnti_t rnti,unsigned char dci_size_bytes,unsigned char aggregation,unsigned char dci_size_bits,unsigned char dci_fmt, uint8_t npdcch_start_symbol);

/*Use the UL DCI Information to configure PHY and also Pack the DCI*/
int NB_generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB,
                                       eNB_rxtx_proc_t *proc,
                                       DCI_CONTENT *DCI_Content,
                                       uint16_t rnti,
                                       DCI_format_NB_t dci_format,
                                       uint8_t UE_id,
                                       uint8_t aggregation,
									   uint8_t npdcch_start_symbol
                                      );
/*Use the DL DCI Information to configure PHY and also Pack the DCI*/
int NB_generate_eNB_dlsch_params_from_dci(PHY_VARS_eNB *eNB,
                                        int frame,
                                       uint8_t subframe,
                                       DCI_CONTENT *DCI_Content,
                                       uint16_t rnti,
                                       DCI_format_NB_t dci_format,
                                       NB_IoT_eNB_NDLSCH_t *ndlsch,
                                       NB_DL_FRAME_PARMS *frame_parms,
                                       uint8_t aggregation,
									   uint8_t npdcch_start_symbol
                                       );

/*Function for DCI encoding, scrambling, modulation*/
uint8_t generate_dci_top_NB_IoT(
						 NB_IoT_eNB_NPDCCH_t* npdcch,
						 uint8_t Num_dci,
                         DCI_ALLOC_NB_t *dci_alloc,
                         int16_t amp,
                         NB_DL_FRAME_PARMS *fp,
                         int32_t **txdataF,
                         uint32_t subframe,
						 uint8_t npdcch_start_symbol);



#endif