Commit 616477a5 authored by Sakthivel Velumani's avatar Sakthivel Velumani

Option to run UE without stopping

when signal quality drops. when cmd line option used ue goes back to sync mode
parent 2473ed0a
...@@ -395,31 +395,11 @@ void processSlotRX(void *arg) { ...@@ -395,31 +395,11 @@ void processSlotRX(void *arg) {
res = pullTpool(UE->txFifo,&(get_nrUE_params()->Tpool)); res = pullTpool(UE->txFifo,&(get_nrUE_params()->Tpool));
processingData_t *curMsg=(processingData_t *)NotifiedFifoData(res); processingData_t *curMsg=(processingData_t *)NotifiedFifoData(res);
*curMsg = *rxtxD; *curMsg = *rxtxD;
res->key = proc->nr_slot_rx; res->key = 1;
pushTpool(&(get_nrUE_params()->Tpool), res); pushTpool(&(get_nrUE_params()->Tpool), res);
} }
/*!
* \brief This is the UE thread for RX subframe n and TX subframe n+4.
* This thread performs the phy_procedures_UE_RX() on every received slot.
* then, if TX is enabled it performs TX for n+4.
* \param arg is a pointer to a \ref PHY_VARS_NR_UE structure.
* \returns a pointer to an int. The storage is not on the heap and must not be freed.
*/
//void UE_processing(void *arg) {
// processingData_t *rxtxD = (processingData_t *) arg;
// UE_nr_rxtx_proc_t *proc = &rxtxD->proc;
// PHY_VARS_NR_UE *UE = rxtxD->UE;
// int slot_tx = proc->nr_slot_tx;
// int frame_tx = proc->frame_tx;
//
// processSlotRX(UE, proc);
// processSlotTX(UE, proc);
//
//}
void dummyWrite(PHY_VARS_NR_UE *UE,openair0_timestamp timestamp, int writeBlockSize) { void dummyWrite(PHY_VARS_NR_UE *UE,openair0_timestamp timestamp, int writeBlockSize) {
void *dummy_tx[UE->frame_parms.nb_antennas_tx]; void *dummy_tx[UE->frame_parms.nb_antennas_tx];
...@@ -534,6 +514,8 @@ void *UE_thread(void *arg) { ...@@ -534,6 +514,8 @@ void *UE_thread(void *arg) {
int start_rx_stream = 0; int start_rx_stream = 0;
AssertFatal(0== openair0_device_load(&(UE->rfdevice), &openair0_cfg[0]), ""); AssertFatal(0== openair0_device_load(&(UE->rfdevice), &openair0_cfg[0]), "");
UE->rfdevice.host_type = RAU_HOST; UE->rfdevice.host_type = RAU_HOST;
UE->lost_sync = 0;
UE->is_synchronized = 0;
AssertFatal(UE->rfdevice.trx_start_func(&UE->rfdevice) == 0, "Could not start the device\n"); AssertFatal(UE->rfdevice.trx_start_func(&UE->rfdevice) == 0, "Could not start the device\n");
notifiedFIFO_t nf; notifiedFIFO_t nf;
...@@ -542,12 +524,12 @@ void *UE_thread(void *arg) { ...@@ -542,12 +524,12 @@ void *UE_thread(void *arg) {
notifiedFIFO_t rxFifo; notifiedFIFO_t rxFifo;
UE->rxFifo = &rxFifo; UE->rxFifo = &rxFifo;
initNotifiedFIFO(&rxFifo); initNotifiedFIFO(&rxFifo);
pushNotifiedFIFO_nothreadSafe(&rxFifo, newNotifiedFIFO_elt(sizeof(processingData_t), 0,&rxFifo,processSlotRX)); pushNotifiedFIFO_nothreadSafe(&rxFifo, newNotifiedFIFO_elt(sizeof(processingData_t), 1,&rxFifo,processSlotRX));
notifiedFIFO_t txFifo; notifiedFIFO_t txFifo;
UE->txFifo = &txFifo; UE->txFifo = &txFifo;
initNotifiedFIFO(&txFifo); initNotifiedFIFO(&txFifo);
pushNotifiedFIFO_nothreadSafe(&txFifo, newNotifiedFIFO_elt(sizeof(processingData_t), 0,&txFifo,processSlotTX)); pushNotifiedFIFO_nothreadSafe(&txFifo, newNotifiedFIFO_elt(sizeof(processingData_t), 1,&txFifo,processSlotTX));
int nbSlotProcessing=0; int nbSlotProcessing=0;
int thread_idx=0; int thread_idx=0;
...@@ -559,6 +541,12 @@ void *UE_thread(void *arg) { ...@@ -559,6 +541,12 @@ void *UE_thread(void *arg) {
int absolute_slot=0, decoded_frame_rx=INT_MAX, trashed_frames=0; int absolute_slot=0, decoded_frame_rx=INT_MAX, trashed_frames=0;
while (!oai_exit) { while (!oai_exit) {
if (UE->lost_sync) {
abortTpool(&(get_nrUE_params()->Tpool),0);
UE->is_synchronized = 0;
UE->lost_sync = 0;
}
if (syncRunning) { if (syncRunning) {
notifiedFIFO_elt_t *res=tryPullTpool(&nf,&(get_nrUE_params()->Tpool)); notifiedFIFO_elt_t *res=tryPullTpool(&nf,&(get_nrUE_params()->Tpool));
...@@ -571,6 +559,7 @@ void *UE_thread(void *arg) { ...@@ -571,6 +559,7 @@ void *UE_thread(void *arg) {
decoded_frame_rx=(decoded_frame_rx + (!UE->init_sync_frame) + trashed_frames) % MAX_FRAME_NUMBER; decoded_frame_rx=(decoded_frame_rx + (!UE->init_sync_frame) + trashed_frames) % MAX_FRAME_NUMBER;
} }
delNotifiedFIFO_elt(res); delNotifiedFIFO_elt(res);
start_rx_stream=0;
} else { } else {
readFrame(UE, &timestamp, true); readFrame(UE, &timestamp, true);
trashed_frames+=2; trashed_frames+=2;
...@@ -734,7 +723,7 @@ void *UE_thread(void *arg) { ...@@ -734,7 +723,7 @@ void *UE_thread(void *arg) {
memset(txp[i], 0, writeBlockSize); memset(txp[i], 0, writeBlockSize);
nbSlotProcessing++; nbSlotProcessing++;
msgToPush->key=slot_nr; msgToPush->key=1;
pushTpool(&(get_nrUE_params()->Tpool), msgToPush); pushTpool(&(get_nrUE_params()->Tpool), msgToPush);
} // while !oai_exit } // while !oai_exit
......
...@@ -73,6 +73,7 @@ extern "C" ...@@ -73,6 +73,7 @@ extern "C"
#define CONFIG_HLP_STMON "Enable processing timing measurement of lte softmodem on per subframe basis \n" #define CONFIG_HLP_STMON "Enable processing timing measurement of lte softmodem on per subframe basis \n"
#define CONFIG_HLP_256QAM "Use the 256 QAM mcs table for PDSCH\n" #define CONFIG_HLP_256QAM "Use the 256 QAM mcs table for PDSCH\n"
#define CONFIG_HLP_NONSTOP "Go back to frame sync mode after 100 consecutive PBCH failures\n"
//#define CONFIG_HLP_NUMUES "Set the number of UEs for the emulation" //#define CONFIG_HLP_NUMUES "Set the number of UEs for the emulation"
#define CONFIG_HLP_MSLOTS "Skip the missed slots/subframes \n" #define CONFIG_HLP_MSLOTS "Skip the missed slots/subframes \n"
#define CONFIG_HLP_ULMCS "Set the maximum uplink MCS\n" #define CONFIG_HLP_ULMCS "Set the maximum uplink MCS\n"
...@@ -114,6 +115,7 @@ extern "C" ...@@ -114,6 +115,7 @@ extern "C"
#define USIM_TEST softmodem_params.usim_test #define USIM_TEST softmodem_params.usim_test
#define USE_256QAM_TABLE softmodem_params.use_256qam_table #define USE_256QAM_TABLE softmodem_params.use_256qam_table
#define NFAPI softmodem_params.nfapi #define NFAPI softmodem_params.nfapi
#define NON_STOP softmodem_params.non_stop
#define DEFAULT_RFCONFIG_FILE "/usr/local/etc/syriq/ue.band7.tm1.PRB100.NR40.dat"; #define DEFAULT_RFCONFIG_FILE "/usr/local/etc/syriq/ue.band7.tm1.PRB100.NR40.dat";
...@@ -145,6 +147,7 @@ extern "C" ...@@ -145,6 +147,7 @@ extern "C"
{"nbiot-disable", CONFIG_HLP_DISABLNBIOT, PARAMFLAG_BOOL, uptr:&nonbiot, defuintval:0, TYPE_INT, 0}, \ {"nbiot-disable", CONFIG_HLP_DISABLNBIOT, PARAMFLAG_BOOL, uptr:&nonbiot, defuintval:0, TYPE_INT, 0}, \
{"use-256qam-table", CONFIG_HLP_256QAM, PARAMFLAG_BOOL, iptr:&USE_256QAM_TABLE, defintval:0, TYPE_INT, 0}, \ {"use-256qam-table", CONFIG_HLP_256QAM, PARAMFLAG_BOOL, iptr:&USE_256QAM_TABLE, defintval:0, TYPE_INT, 0}, \
{"nfapi", CONFIG_HLP_NFAPI, 0, u8ptr:&nfapi_mode, defintval:0, TYPE_UINT8, 0}, \ {"nfapi", CONFIG_HLP_NFAPI, 0, u8ptr:&nfapi_mode, defintval:0, TYPE_UINT8, 0}, \
{"non-stop", CONFIG_HLP_NONSTOP, PARAMFLAG_BOOL, iptr:&NON_STOP, defintval:0, TYPE_INT, 0}, \
} }
...@@ -233,6 +236,7 @@ typedef struct { ...@@ -233,6 +236,7 @@ typedef struct {
uint32_t send_dmrs_sync; uint32_t send_dmrs_sync;
int use_256qam_table; int use_256qam_table;
uint8_t nfapi; uint8_t nfapi;
int non_stop;
} softmodem_params_t; } softmodem_params_t;
extern uint64_t get_softmodem_optmask(void); extern uint64_t get_softmodem_optmask(void);
......
...@@ -764,6 +764,8 @@ typedef struct { ...@@ -764,6 +764,8 @@ typedef struct {
int is_synchronized; int is_synchronized;
/// \brief Indicates on which frame is synchronized in a two frame synchronization /// \brief Indicates on which frame is synchronized in a two frame synchronization
int is_synchronized_on_frame; int is_synchronized_on_frame;
/// \brief Indicator that UE lost frame synchronization
int lost_sync;
/// Data structure for UE process scheduling /// Data structure for UE process scheduling
UE_nr_proc_t proc; UE_nr_proc_t proc;
/// Flag to indicate the UE shouldn't do timing correction at all /// Flag to indicate the UE shouldn't do timing correction at all
......
...@@ -459,10 +459,15 @@ void nr_ue_pbch_procedures(uint8_t gNB_id, ...@@ -459,10 +459,15 @@ void nr_ue_pbch_procedures(uint8_t gNB_id,
ue->pbch_vars[gNB_id]->pdu_errors++; ue->pbch_vars[gNB_id]->pdu_errors++;
if (ue->pbch_vars[gNB_id]->pdu_errors_conseq>=100) { if (ue->pbch_vars[gNB_id]->pdu_errors_conseq>=100) {
if (get_softmodem_params()->non_stop) {
LOG_E(PHY,"More that 100 consecutive PBCH errors! Going back to Sync mode!\n");
ue->lost_sync = 1;
} else {
LOG_E(PHY,"More that 100 consecutive PBCH errors! Exiting!\n"); LOG_E(PHY,"More that 100 consecutive PBCH errors! Exiting!\n");
exit_fun("More that 100 consecutive PBCH errors! Exiting!\n"); exit_fun("More that 100 consecutive PBCH errors! Exiting!\n");
} }
} }
}
if (frame_rx % 100 == 0) { if (frame_rx % 100 == 0) {
ue->pbch_vars[gNB_id]->pdu_fer = ue->pbch_vars[gNB_id]->pdu_errors - ue->pbch_vars[gNB_id]->pdu_errors_last; ue->pbch_vars[gNB_id]->pdu_fer = ue->pbch_vars[gNB_id]->pdu_errors - ue->pbch_vars[gNB_id]->pdu_errors_last;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment