From 97fd45d65be314ff47330415f06ef9bf621b44b9 Mon Sep 17 00:00:00 2001
From: Florian Kaltenberger <florian.kaltenberger@eurecom.fr>
Date: Wed, 7 Nov 2018 12:00:52 +0100
Subject: [PATCH] nr-uesoftmodem: moving phy_procedures_nrUE into main thread
 when --loop-memory is used.

---
 openair1/SCHED_NR_UE/phy_procedures_nr_ue.c |  6 +--
 targets/RT/USER/nr-ue.c                     | 57 ++++++++++++++++-----
 2 files changed, 47 insertions(+), 16 deletions(-)

diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index eee5cbae95..32beb92009 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -5913,8 +5913,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
 #endif
 
   //nr_gold_pdcch(ue,0, 2);
-/*
-  for (l=0; l<2; l++) {
+
+  for (int l=0; l<2; l++) {
     if (abstraction_flag == 0) {
 #if UE_TIMING_TRACE
         start_meas(&ue->ofdm_demod_stats);
@@ -5933,7 +5933,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
       stop_meas(&ue->ofdm_demod_stats);
 #endif
     }
-  }*/
+  }
     //ue_measurement_procedures(l-1,ue,proc,eNB_id,(nr_tti_rx<<1),abstraction_flag,mode);
 
     //if (do_pdcch_flag) {
diff --git a/targets/RT/USER/nr-ue.c b/targets/RT/USER/nr-ue.c
index adefa661b2..41b20710e9 100644
--- a/targets/RT/USER/nr-ue.c
+++ b/targets/RT/USER/nr-ue.c
@@ -956,7 +956,7 @@ void *UE_thread(void *arg) {
 #if BASIC_SIMULATOR
                 {
                   int t;
-                  for (t = 0; t < 2; t++) {
+                  for (t = 0; t < RX_NB_TH; t++) {
                         UE_rxtx_proc_t *proc = &UE->proc.proc_rxtx[t];
                         pthread_mutex_lock(&proc->mutex_rxtx);
                         while (proc->instance_cnt_rxtx >= 0) pthread_cond_wait( &proc->cond_rxtx, &proc->mutex_rxtx );
@@ -964,13 +964,13 @@ void *UE_thread(void *arg) {
                   }
                 }
 #endif
+
                 LOG_D(PHY,"Process subframe %d thread Idx %d \n", subframe_nr, UE->current_thread_id[subframe_nr]);
 
                 thread_idx++;
                 if(thread_idx>=RX_NB_TH)
                     thread_idx = 0;
 
-
                 if (UE->mode != loop_through_memory) {
                     for (i=0; i<UE->frame_parms.nb_antennas_rx; i++)
                         rxp[i] = (void*)&UE->common_vars.rxdata[i][UE->frame_parms.ofdm_symbol_size+
@@ -1033,9 +1033,6 @@ void *UE_thread(void *arg) {
                         if ( first_symbols <0 )
                             LOG_E(PHY,"can't compensate: diff =%d\n", first_symbols);
                     }
-                } //UE->mode != loop_through_memory
-                else
-                    rt_sleep_ns(1000*1000);
 
                     pickTime(gotIQs);
                     // operate on thread sf mod 2
@@ -1047,13 +1044,13 @@ void *UE_thread(void *arg) {
                             UE->proc.proc_rxtx[th_id].frame_rx++;
                         }
 #ifdef SAIF_ENABLED
-						if (!(proc->frame_rx%4000))
-						{
-							printf("frame_rx=%d rx_thread_busy=%ld - rate %8.3f\n",
-								proc->frame_rx, g_ue_rx_thread_busy,
-								(float)g_ue_rx_thread_busy/(proc->frame_rx*10+1)*100.0);
-							fflush(stdout);
-						}
+			if (!(proc->frame_rx%4000))
+			  {
+			    printf("frame_rx=%d rx_thread_busy=%ld - rate %8.3f\n",
+				   proc->frame_rx, g_ue_rx_thread_busy,
+				   (float)g_ue_rx_thread_busy/(proc->frame_rx*10+1)*100.0);
+			    fflush(stdout);
+			  }
 #endif
                     }
                     //UE->proc.proc_rxtx[0].gotIQs=readTime(gotIQs);
@@ -1071,7 +1068,7 @@ void *UE_thread(void *arg) {
                       proc->frame_tx = (proc->frame_tx + 1)%MAX_FRAME_NUMBER;
                       proc->nr_tti_tx %= NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
                     }
-                    proc->subframe_tx=subframe_nr + DURATION_RX_TO_TX;
+                    proc->subframe_tx=proc->nr_tti_rx;
                     proc->timestamp_tx = timestamp+
                                          (DURATION_RX_TO_TX*UE->frame_parms.samples_per_subframe)-
                                          UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0;
@@ -1107,7 +1104,41 @@ void *UE_thread(void *arg) {
 //                    initStaticTime(lastTime);
 //                    updateTimes(lastTime, &t1, 20000, "Delay between two IQ acquisitions (case 1)");
 //                    pickStaticTime(lastTime);
+                } //UE->mode != loop_through_memory
+                else {
+                    proc->nr_tti_rx=subframe_nr;
+                    proc->subframe_rx=subframe_nr;
+		    if(subframe_nr == 0) {
+		      for (th_id=0; th_id < RX_NB_TH; th_id++) {
+			UE->proc.proc_rxtx[th_id].frame_rx++;
+		      }
+		    }
+                    proc->frame_tx = proc->frame_rx;
+                    proc->nr_tti_tx= subframe_nr + DURATION_RX_TO_TX;
+                    if (proc->nr_tti_tx > NR_NUMBER_OF_SUBFRAMES_PER_FRAME) {
+                      proc->frame_tx = (proc->frame_tx + 1)%MAX_FRAME_NUMBER;
+                      proc->nr_tti_tx %= NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
+                    }
+                    proc->subframe_tx=proc->nr_tti_tx;
+
+                    printf("Processing subframe %d\n",proc->subframe_rx);
+
+		    if(UE->if_inst != NULL && UE->if_inst->ul_indication != NULL){
+		      UE->ul_indication.module_id = 0;
+		      UE->ul_indication.gNB_index = 0;
+		      UE->ul_indication.cc_id = 0;
+		      UE->ul_indication.slot = 0;     //  to be fill
+		      UE->ul_indication.frame = 0;    //  to be fill
+		      //  [TODO] mapping right after NR initial sync
+		      UE->ul_indication.frame = proc->frame_rx; 
+		      UE->ul_indication.slot = proc->nr_tti_rx;
+		      
+		      UE->if_inst->ul_indication(&UE->ul_indication);
+		    }
 
+		    phy_procedures_nrUE_RX( UE, proc, 0, 0, 1, UE->mode, no_relay);
+		    getchar();
+		} // else loop_through_memory
             } // start_rx_stream==1
         } // UE->is_synchronized==1
 
-- 
2.26.2