diff --git a/executables/nr-ru.c b/executables/nr-ru.c index 8a29e6ac2f..ee78346cf4 100644 --- a/executables/nr-ru.c +++ b/executables/nr-ru.c @@ -622,6 +622,7 @@ static void rx_rf(RU_t *ru, int *frame, int *slot) rxp, samples_per_slot, ru->nb_rx); + gNBscopeCopy(ru, gNbTimeDomainSamples, rxp[0], sizeof(c16_t), 1, samples_per_slot, 0); } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); diff --git a/openair1/PHY/TOOLS/imscope/imscope.cpp b/openair1/PHY/TOOLS/imscope/imscope.cpp index de555332bc..054fcdad79 100644 --- a/openair1/PHY/TOOLS/imscope/imscope.cpp +++ b/openair1/PHY/TOOLS/imscope/imscope.cpp @@ -581,6 +581,16 @@ void ShowGnbScope(PHY_VARS_gNB *gNB, float t) pusch_llr_plot->Draw(t, gNBPuschLlr, "PUSCH LLR"); ImGui::TreePop(); } + if (ImGui::TreeNode("Time domain samples")) { + static auto iq_data = new IQData(); + static auto time_domain_iq = new IQHist("Time domain samples"); + bool new_data = false; + if (time_domain_iq->ShouldReadData()) { + new_data = iq_data->TryCollect(&scope_array[gNbTimeDomainSamples], t, time_domain_iq->GetEpsilon()); + } + time_domain_iq->Draw(iq_data, t, new_data); + ImGui::TreePop(); + } } void *imscope_thread(void *data_void_ptr) @@ -751,6 +761,7 @@ extern "C" void imscope_autoinit(void *dataptr) scope->copyDataUnsafeWithOffset = copyDataUnsafeWithOffset; scope->unlockScopeData = unlockScopeData; scope_params->gNB->scopeData = scope; + scope_params->ru->scopeData = scope; } else { PHY_VARS_NR_UE *ue = (PHY_VARS_NR_UE *)dataptr; scopeData_t *scope = (scopeData_t *)calloc(1, sizeof(scopeData_t)); diff --git a/openair1/PHY/TOOLS/phy_scope_interface.h b/openair1/PHY/TOOLS/phy_scope_interface.h index 5602ed40de..2fa97880b4 100644 --- a/openair1/PHY/TOOLS/phy_scope_interface.h +++ b/openair1/PHY/TOOLS/phy_scope_interface.h @@ -75,6 +75,7 @@ enum scopeDataType { gNBPuschLlr, ueTimeDomainSamples, ueTimeDomainSamplesBeforeSync, + gNbTimeDomainSamples, EXTRA_SCOPE_TYPES }; @@ -129,12 +130,12 @@ void copyData(void *, enum scopeDataType type, void *dataIn, int elementSz, int } #define gNBscopeCopyWithMetadata(gnb, type, ...) \ if (gnb->scopeData) { \ - ((scopeData_t *)gnb->scopeData)->copyData((scopeData_t *)gNB->scopeData, type, ##__VA_ARGS__); \ + ((scopeData_t *)gnb->scopeData)->copyData((scopeData_t *)gnb->scopeData, type, ##__VA_ARGS__); \ } #define gNBscopeCopy(gnb, type, ...) \ if (gnb->scopeData) { \ metadata mt = {.slot = -1, .frame = -1}; \ - ((scopeData_t *)gnb->scopeData)->copyData((scopeData_t *)gNB->scopeData, type, ##__VA_ARGS__, &mt); \ + ((scopeData_t *)gnb->scopeData)->copyData((scopeData_t *)gnb->scopeData, type, ##__VA_ARGS__, &mt); \ } #define GnbScopeUpdate(gnb, type, numElt) \ if (gnb->scopeData) \ diff --git a/openair1/PHY/defs_RU.h b/openair1/PHY/defs_RU.h index 2f564eac6b..3b7b7f2ba0 100644 --- a/openair1/PHY/defs_RU.h +++ b/openair1/PHY/defs_RU.h @@ -661,7 +661,8 @@ typedef struct RU_t_s { /// number of cores for RU ThreadPool int num_tpcores; /// structure for analyzing high-level RT measurements - rt_ru_profiling_t rt_ru_profiling; + rt_ru_profiling_t rt_ru_profiling; + void* scopeData; } RU_t;