mirror of
https://gitlab.eurecom.fr/oai/openairinterface5g.git
synced 2026-07-13 04:30:28 +00:00
Merge remote-tracking branch 'origin/imscope-td-plot' into integration_2024_w40b
This commit is contained in:
@@ -293,7 +293,7 @@ set_property(CACHE KPM_VERSION PROPERTY STRINGS "KPM_V2_03" "KPM_V3_00")
|
||||
message(STATUS "Selected KPM Version: ${KPM_VERSION}")
|
||||
|
||||
|
||||
add_boolean_option(ENABLE_IMSCOPE OFF "Enable phy scope based on imgui" ON)
|
||||
add_boolean_option(ENABLE_IMSCOPE OFF "Enable phy scope based on imgui" OFF)
|
||||
|
||||
##################################################
|
||||
# ASN.1 grammar C code generation & dependencies #
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
#include "LAYER2/nr_pdcp/nr_pdcp_oai_api.h"
|
||||
#include "LAYER2/nr_rlc/nr_rlc_oai_api.h"
|
||||
#include "RRC/NR/MESSAGES/asn1_msg.h"
|
||||
#include "openair1/PHY/TOOLS/phy_scope_interface.h"
|
||||
|
||||
/*
|
||||
* NR SLOT PROCESSING SEQUENCE
|
||||
@@ -706,8 +707,10 @@ void readFrame(PHY_VARS_NR_UE *UE, openair0_timestamp *timestamp, bool toTrash)
|
||||
+ 4 * ((x * fp->samples_per_subframe) + fp->get_samples_slot_timestamp(slot, fp, 0));
|
||||
}
|
||||
|
||||
int tmp = UE->rfdevice.trx_read_func(&UE->rfdevice, timestamp, rxp, fp->get_samples_per_slot(slot, fp), fp->nb_antennas_rx);
|
||||
AssertFatal(fp->get_samples_per_slot(slot, fp) == tmp, "");
|
||||
int read_block_size = fp->get_samples_per_slot(slot, fp);
|
||||
int tmp = UE->rfdevice.trx_read_func(&UE->rfdevice, timestamp, rxp, read_block_size, fp->nb_antennas_rx);
|
||||
UEscopeCopy(UE, ueTimeDomainSamplesBeforeSync, rxp[0], sizeof(c16_t), 1, read_block_size, 0);
|
||||
AssertFatal(read_block_size == tmp, "");
|
||||
|
||||
if (IS_SOFTMODEM_RFSIM)
|
||||
dummyWrite(UE, *timestamp, fp->get_samples_per_slot(slot, fp));
|
||||
@@ -962,6 +965,7 @@ void *UE_thread(void *arg)
|
||||
const int readBlockSize = get_readBlockSize(slot_nr, fp) - iq_shift_to_apply;
|
||||
openair0_timestamp rx_timestamp;
|
||||
int tmp = UE->rfdevice.trx_read_func(&UE->rfdevice, &rx_timestamp, rxp, readBlockSize, fp->nb_antennas_rx);
|
||||
UEscopeCopy(UE, ueTimeDomainSamples, rxp[0], sizeof(c16_t), 1, readBlockSize, 0);
|
||||
AssertFatal(readBlockSize == tmp, "");
|
||||
|
||||
if(slot_nr == (nb_slot_frame - 1)) {
|
||||
|
||||
@@ -279,8 +279,17 @@ class IQHist {
|
||||
}
|
||||
} else if (plot_type == 1) {
|
||||
if (ImPlot::BeginPlot(label.c_str(), {(float)ImGui::GetWindowWidth() * 0.3f, (float)ImGui::GetWindowWidth() * 0.3f})) {
|
||||
// Limit the amount of data plotted with scatterplot (issue with vertices/draw call)
|
||||
ImPlot::PlotScatter(label.c_str(), iq_data->real.data(), iq_data->imag.data(), std::min(16000, iq_data->len));
|
||||
int points_drawn = 0;
|
||||
while (points_drawn < iq_data->len) {
|
||||
// Limit the amount of data plotted with PlotScatter call (issue with vertices/draw call)
|
||||
int points_to_draw = std::min(iq_data->len - points_drawn, 16000);
|
||||
ImPlot::SetNextMarkerStyle(ImPlotMarker_Circle, 1, IMPLOT_AUTO_COL, 1);
|
||||
ImPlot::PlotScatter(label.c_str(),
|
||||
iq_data->real.data() + points_drawn,
|
||||
iq_data->imag.data() + points_drawn,
|
||||
points_to_draw);
|
||||
points_drawn += points_to_draw;
|
||||
}
|
||||
ImPlot::EndPlot();
|
||||
}
|
||||
} else if (plot_type == 2) {
|
||||
@@ -480,6 +489,26 @@ void ShowUeScope(PHY_VARS_NR_UE *ue, float t)
|
||||
pdsch_iq_hist->Draw(iq_data, t, new_data);
|
||||
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[ueTimeDomainSamples], t, time_domain_iq->GetEpsilon());
|
||||
}
|
||||
time_domain_iq->Draw(iq_data, t, new_data);
|
||||
ImGui::TreePop();
|
||||
}
|
||||
if (ImGui::TreeNode("Time domain samples - before sync")) {
|
||||
static auto iq_data = new IQData();
|
||||
static auto time_domain_iq = new IQHist("Time domain samples - before sync");
|
||||
bool new_data = false;
|
||||
if (time_domain_iq->ShouldReadData()) {
|
||||
new_data = iq_data->TryCollect(&scope_array[ueTimeDomainSamplesBeforeSync], t, time_domain_iq->GetEpsilon());
|
||||
}
|
||||
time_domain_iq->Draw(iq_data, t, new_data);
|
||||
ImGui::TreePop();
|
||||
}
|
||||
if (ImGui::TreeNode("Broadcast channel")) {
|
||||
ImGui::Text("RSRP %d", ue->measurements.ssb_rsrp_dBm[ue->frame_parms.ssb_index]);
|
||||
if (ImGui::TreeNode("IQ")) {
|
||||
@@ -552,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)
|
||||
@@ -722,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));
|
||||
|
||||
@@ -73,6 +73,9 @@ enum scopeDataType {
|
||||
MAX_SCOPE_TYPES,
|
||||
gNBPuschRxIq = MAX_SCOPE_TYPES,
|
||||
gNBPuschLlr,
|
||||
ueTimeDomainSamples,
|
||||
ueTimeDomainSamplesBeforeSync,
|
||||
gNbTimeDomainSamples,
|
||||
EXTRA_SCOPE_TYPES
|
||||
};
|
||||
|
||||
@@ -127,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) \
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user