From f458287a4d317dd2565981d4164d809a423e0b1f Mon Sep 17 00:00:00 2001
From: ISIP CS/NCTU <tyhsu@cs.nctu.edu.tw>
Date: Thu, 9 Aug 2018 15:47:56 +0200
Subject: [PATCH] Replace ru_procedures.c

---
 openair1/SCHED/ru_procedures.c | 113 +++++++++++++++++++++++++++++++--
 1 file changed, 107 insertions(+), 6 deletions(-)

diff --git a/openair1/SCHED/ru_procedures.c b/openair1/SCHED/ru_procedures.c
index 43a94fced9..689dfeed84 100644
--- a/openair1/SCHED/ru_procedures.c
+++ b/openair1/SCHED/ru_procedures.c
@@ -41,6 +41,7 @@
  * \warning
  */
 
+
 #include "PHY/defs_eNB.h"
 #include "PHY/phy_extern.h"
 #include "SCHED/sched_eNB.h"
@@ -384,14 +385,117 @@ void feptx_ofdm(RU_t *ru) {
 }
 
 void feptx_prec(RU_t *ru) {
+	
+  // Theoni's
+  int l,i,aa,rb,p;
+  int subframe = ru->proc.subframe_tx;
+  PHY_VARS_eNB **eNB_list = ru->eNB_list,*eNB; 
+  LTE_DL_FRAME_PARMS *fp;
+  int32_t ***bw;
+  RU_proc_t *proc  = &ru->proc;
 
+  /* fdragon
   int l,i,aa;
   PHY_VARS_eNB **eNB_list = ru->eNB_list,*eNB;
   LTE_DL_FRAME_PARMS *fp;
   int32_t ***bw;
   int subframe = ru->proc.subframe_tx;
+  */
 
   if (ru->num_eNB == 1) {
+	  // Theoni's part ////////////////////////////////////
+	  eNB = eNB_list[0];
+    fp  = &eNB->frame_parms;
+    LTE_eNB_PDCCH *pdcch_vars = &eNB->pdcch_vars[subframe&1]; 
+    //int bf_mask_pdcch = 1;
+ 
+    //int bf_mask[15][fp->N_RB_DL];
+    /*for (p=0;p<15;p++) { 
+       for (int j=0;j<fp->N_RB_DL;j++){
+         // set p=5 to bfmask=2 (beamforming) except in subframes 0 and 5
+         // p=0,1 bf_mask=0 for subframes different than 0,5 and to  
+         if (subframe != 0 && subframe != 5) 
+	    if (p<fp->nb_antenna_ports_eNB || p!=5) bf_mask[p][j]=0; else bf_mask[p][j]=2;
+         else
+            if (p<fp->nb_antenna_ports_eNB) bf_mask[p][j]=1; else bf_mask[p][j]=0;
+       }
+
+       //printf("subframe %d : bf_mask[%d][0] %d\n",subframe,p,bf_mask[p][0]);
+    }*/
+    
+    //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_PREC , 1);
+    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RU_FEPTX_PREC+ru->idx,1);
+
+	printf("///////////*******ru id %d:executing Theoni's beamforming\n",ru->idx);
+	
+    for (aa=0;aa<ru->nb_tx;aa++) {
+	memset(ru->common.txdataF_BF[aa],0,sizeof(int32_t)*(fp->ofdm_symbol_size));
+	for (p=0;p<NB_ANTENNA_PORTS_ENB;p++) {
+           if (p<fp->nb_antenna_ports_eNB) {				
+// pdcch region, copy entire signal from txdataF->txdataF_BF (bf_mask = 1)
+// else do beamforming for pdcch according to beam_weights
+// to be updated for eMBMS (p=4)
+
+            /* AssertFatal(bf_mask[p][0]>=0 && bf_mask[p][0] < 3,
+                         "Illegal bf_mask[%d][0] %d\n",p,bf_mask[p][0]);
+            */
+             /*if (bf_mask_pdcch == 1)
+                memcpy((void*)ru->common.txdataF_BF[aa],
+                       (void*)&eNB->common_vars.txdataF[p][0],
+                       pdcch_vars->num_pdcch_symbols*fp->ofdm_symbol_size*sizeof(int32_t));
+             else if (bf_mask_pdcch == 2) {*/
+                for (l=0;l<pdcch_vars->num_pdcch_symbols;l++)
+                 // for (rb=0;rb<fp->N_RB_DL;rb++)
+                      beam_precoding(eNB->common_vars.txdataF,
+                                     ru->common.txdataF_BF,
+                                     fp,
+                                     ru->beam_weights,
+                                     l,
+                                     aa,
+                                     p);
+             //} // else if (bf_mask_pdcch == 2)
+           } //if (p<fp->nb_antenna_ports_eNB)
+
+// PDSCH region
+           if (p<fp->nb_antenna_ports_eNB || p==5 || p==7 || p==8) {
+		for (l=pdcch_vars->num_pdcch_symbols;l<fp->symbols_per_tti;l++) {
+			beam_precoding(eNB->common_vars.txdataF,
+                             	       ru->common.txdataF_BF,
+                                       fp,
+                                       ru->beam_weights,
+                                       l,
+                                       aa,
+                                       p);			
+	/*for (rb=0;rb<fp->N_RB_DL;rb++) {
+                                        AssertFatal(bf_mask[p][rb]>=0 && bf_mask[p][rb] < 3,
+                                                    "Illegal bf_mask[%d][%d] %d\n",p,rb,bf_mask[p][rb]);
+					if (bf_mask[p][rb]==1) {
+						memcpy((void*)&ru->common.txdataF_BF[aa][l*fp->ofdm_symbol_size],
+							(void*)&eNB->common_vars.txdataF[p][l*fp->ofdm_symbol_size],
+							fp->ofdm_symbol_size*sizeof(int32_t));
+					} else if (bf_mask[p][rb]==2) {
+						beam_precoding(eNB->common_vars.txdataF,
+								ru->common.txdataF_BF,
+								fp,
+								ru->beam_weights,
+								l,
+								aa,
+								p,
+								rb,
+								0);
+				        } // else if (bf_mask[p][rb]==1)
+				}// for (rb=0;rb<...)*/ 
+			} // for (l=pdcch_vars ....)			
+	   } // if (p<fp->nb_antenna_ports_eNB) ...
+	} // for (p=0...)
+    } // for (aa=0 ...)
+  
+    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RU_FEPTX_PREC+ru->idx,0);
+	
+	///////////////////////////////////////////////////	  
+	  
+	  
+	  /* fdragon
     eNB = eNB_list[0];
 	bw  = ru->beam_weights[0];
     fp  = &eNB->frame_parms;
@@ -399,12 +503,6 @@ void feptx_prec(RU_t *ru) {
     
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_PREC+ru->idx , 1);
 
-	/*
-    for (aa=0;aa<ru->nb_tx;aa++)
-      memcpy((void*)ru->common.txdataF_BF[aa],
-	     (void*)&eNB->common_vars.txdataF[aa][subframe*fp->symbols_per_tti*fp->ofdm_symbol_size],
-	     fp->symbols_per_tti*fp->ofdm_symbol_size*sizeof(int32_t));
-	*/
 printf("///////////*******ru id %d:executing beam_precoding_one_eNB\n",ru->idx);
 	
 	beam_precoding_one_eNB(eNB->common_vars.txdataF,
@@ -416,6 +514,9 @@ printf("///////////*******ru id %d:executing beam_precoding_one_eNB\n",ru->idx);
 						   fp);
 
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_PREC+ru->idx , 0);
+	
+	
+	*/
   }
   else {
     for (i=0;i<ru->num_eNB;i++) {
-- 
2.26.2