NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
LTENR_RadioMeasurements.c
1/************************************************************************************
2* Copyright (C) 2023 *
3* TETCOS, Bangalore. India *
4* *
5* Tetcos owns the intellectual property rights in the Product and its content. *
6* The copying, redistribution, reselling or publication of any or all of the *
7* Product or its content without express prior written consent of Tetcos is *
8* prohibited. Ownership and / or any other right relating to the software and all *
9* intellectual property rights therein shall remain at all times with Tetcos. *
10* *
11* This source code is licensed per the NetSim license agreement. *
12* *
13* No portion of this source code may be used as the basis for a derivative work, *
14* or used, for any purpose other than its intended use per the NetSim license *
15* agreement. *
16* *
17* This source code and the algorithms contained within it are confidential trade *
18* secrets of TETCOS and may not be used as the basis for any other software, *
19* hardware, product or service. *
20* *
21* Author: Kanak *
22* *
23* ----------------------------------------------------------------------------------*/
24
25#include "stdafx.h"
26#include "LTENR_MAC.h"
27#include "LTENR_PHY.h"
28#include "Stack.h"
29
30static FILE* fpRMlog = NULL;
31
32UINT UE_ID_LIST[] = { 0 };//When { 0 } log is written for all UE's. Specific UE ID's can be defined
33//for example {1,2,3} log will be written only for UE ID's 1, 2 and 3
34
35static bool validate_log(NETSIM_ID UE_ID)
36{
37 int count = sizeof(UE_ID_LIST) / sizeof(int);
38 if (count == 1 && UE_ID_LIST[0] == 0) return true;
39 else
40 {
41 for (int i = 0; i < count; i++)
42 {
43 if (UE_ID_LIST[i] == DEVICE_CONFIGID(UE_ID))
44 return true;
45 }
46 }
47 return false;
48}
49
50static void init_radio_measurements_log()
51{
52 if (get_protocol_log_status("LTENR_Radio_Measurements_Log"))
53 {
54 char s[BUFSIZ];
55 sprintf(s, "%s\\%s", pszIOLogPath, "LTENR_Radio_Measurements_Log.csv");
56 fpRMlog = fopen(s, "w");
57 if (!fpRMlog)
58 {
59 fnSystemError("Unable to open %s file", s);
60 perror(s);
61 }
62 else
63 {
64 fprintf(fpRMlog, "%s,%s,%s,%s,",
65 "Time(ms)", "gNB or eNB Name", "UE Name", "Distance(m)");
66
67 fprintf(fpRMlog, "%s,%s,%s,%s,%s,%s,%s,",
68 "isAssociated", "CC_ID", "Band", "Channel","Rank","Layer ID", "Tx_Power(dBm)");
69
70 fprintf(fpRMlog, "%s,%s,%s,%s,",
71 "LoS State", "TotalLoss(dB)", "PathLoss(dB)", "ShadowFadingLoss(dB)");
72
73 fprintf(fpRMlog, "%s,%s,%s,%s,%s,",
74 "O2I_Loss(dBm)", "Additional_Loss(dB)", "Antenna Gain(dB)", "Rx_Power(dBm)", "SNR(dB)");
75
76 fprintf(fpRMlog, "%s,%s,%s,",
77 "SINR(dB)", "ThermalNoise(dBm)","InterferencePower(dBm)");
78
79 fprintf(fpRMlog, "%s,",
80 "BeamFormingGain(dB)");
81
82 fprintf(fpRMlog, "%s,%s,",
83 "CQI Index", "MCS Index");
84
85 fprintf(fpRMlog, "\n");
86 if (nDbgFlag) fflush(fpRMlog);
87 }
88 }
89}
90
91static void close_radio_measurements_log()
92{
93 if (fpRMlog)
94 fclose(fpRMlog);
95}
96
97void LTENR_RadioMeasurements_Init()
98{
99 init_radio_measurements_log();
100}
101
102void LTENR_RadioMeasurements_Finish()
103{
104 close_radio_measurements_log();
105}
106
107void LTENR_RadioMeasurements_PDSCH_Log(ptrLTENR_GNBPHY phy, int CA_ID,
108 ptrLTENR_ASSOCIATEDUEPHYINFO info)
109{
110 if (fpRMlog == NULL || !validate_log(info->ueId)) return;
111
112 UINT layerCount;
113 ptrLTENR_PROPAGATIONCONFIG propagation = phy->propagationConfig;
114 ptrLTENR_PROPAGATIONINFO pinfo = info->propagationInfo[CA_ID];
115 string pszassoc_status = info->isAssociated ? "true" : "false";
116 ptrLTENR_CA ca = phy->spectrumConfig->CA[CA_ID];
117 LTENR_LOS_NLOS_STATE los_state = pinfo->propagationConfig->state;
118
119 if (!info->isAssociated || (ca->configSlotType == SLOT_UPLINK)) return;
120 layerCount = pinfo->downlink.layerCount;
121 for (UINT i = 0; i < layerCount; i++)
122 {
123 fprintf(fpRMlog, "%.2lf,%s,%s,%lf,",
124 ldEventTime / MILLISECOND, DEVICE_NAME(phy->gnbId),
125 DEVICE_NAME(info->ueId),
126 DEVICE_DISTANCE(phy->gnbId, info->ueId));
127
128 fprintf(fpRMlog, "%s,%d,%s,%s,%d,%d,%lf,",
129 pszassoc_status, CA_ID + 1, ca->operatingBand, "PDSCH", pinfo->downlink.layerCount,
130 i + 1, pinfo->downlink.txPower_dbm);
131
132 if (propagation->pathLossModel == LTENR_PATHLOSS_MODEL_LOG_DISTANCE)
133 fprintf(fpRMlog, "%s,%lf,%lf,",
134 "N/A", pinfo->dTotalLoss, pinfo->dPathLoss);
135 else
136 fprintf(fpRMlog, "%s,%lf,%lf,",
137 strLTENR_STATE[los_state], pinfo->dTotalLoss, pinfo->dPathLoss);
138
139 if (pinfo->propagationConfig->isShadowFadingEnabled)
140 fprintf(fpRMlog, "%lf,",
141 pinfo->dShadowFadingLoss);
142 else
143 fprintf(fpRMlog, "%s,",
144 "N/A");
145
146 fprintf(fpRMlog, "%lf,%lf,%lf,%lf,%lf,",
147 pinfo->dO2ILoss, pinfo->dAdditionalLoss, pinfo->downlink.antennaGain, pinfo->downlink.rxPower_dbm[i], pinfo->downlink.SNR_db[i]);
148
149 fprintf(fpRMlog, "%lf,%lf,%lf,",
150 pinfo->downlink.SINR_db[i],pinfo->downlink.thermalNoise, pinfo->downlink.InterferencePower_dbm[i]);
151
152 if (propagation->fastFadingModel == LTENR_FASTFADING_MODEL_AWGN_WITH_RAYLEIGH_FADING ||
153 propagation->fastFadingModel == LTENR_FASTFADING_MODEL_AWGN_WITH_RICIAN_FADING)
154 fprintf(fpRMlog, "%lf,",
155 pinfo->downlink.beamFormingGain[i]);
156 else if (propagation->fastFadingModel == LTENR_FASTFADING_MODEL_NO_FADING_MIMO_ARRAY_GAIN)
157 fprintf(fpRMlog, "%lf,",
158 pinfo->downlink.ArrayGain);
159 else
160 fprintf(fpRMlog, "%s,",
161 "N/A");
162
163 fprintf(fpRMlog, "%d,%d,",
164 info->downlinkAMCInfo[CA_ID][i]->cqiTable.CQIIndex,
165 info->downlinkAMCInfo[CA_ID][i]->mcsTable.mcsIndex);
166
167 fprintf(fpRMlog, "\n");
168 if (nDbgFlag) fflush(fpRMlog);
169 }
170}
171
172void LTENR_RadioMeasurements_PUSCH_Log(ptrLTENR_GNBPHY phy, int CA_ID,
173 ptrLTENR_ASSOCIATEDUEPHYINFO info)
174{
175 if (fpRMlog == NULL || !validate_log(info->ueId)) return;
176
177 UINT layerCount;
178 ptrLTENR_PROPAGATIONCONFIG propagation = phy->propagationConfig;
179 ptrLTENR_PROPAGATIONINFO pinfo = info->propagationInfo[CA_ID];
180 string pszassoc_status = info->isAssociated ? "true" : "false";
181 ptrLTENR_CA ca = phy->spectrumConfig->CA[CA_ID];
182 LTENR_LOS_NLOS_STATE los_state = pinfo->propagationConfig->state;
183
184 if (!info->isAssociated || (ca->configSlotType == SLOT_DOWNLINK)) return;
185 layerCount = pinfo->uplink.layerCount;
186 for (UINT i = 0; i < layerCount; i++)
187 {
188 fprintf(fpRMlog, "%.2lf,%s,%s,%lf,",
189 ldEventTime / MILLISECOND, DEVICE_NAME(phy->gnbId),
190 DEVICE_NAME(info->ueId),
191 DEVICE_DISTANCE(phy->gnbId, info->ueId));
192
193 fprintf(fpRMlog, "%s,%d,%s,%s,%d,%d,%lf,",
194 pszassoc_status, CA_ID + 1, ca->operatingBand, "PUSCH", pinfo->uplink.layerCount,
195 i + 1, pinfo->uplink.txPower_dbm);
196 if (propagation->pathLossModel == LTENR_PATHLOSS_MODEL_LOG_DISTANCE)
197 fprintf(fpRMlog, "%s,%lf,%lf,",
198 "N/A", pinfo->dTotalLoss, pinfo->dPathLoss);
199 else
200 fprintf(fpRMlog, "%s,%lf,%lf,",
201 strLTENR_STATE[los_state], pinfo->dTotalLoss, pinfo->dPathLoss);
202
203 if (pinfo->propagationConfig->isShadowFadingEnabled)
204 fprintf(fpRMlog, "%lf,",
205 pinfo->dShadowFadingLoss);
206 else
207 fprintf(fpRMlog, "%s,",
208 "N/A");
209
210 fprintf(fpRMlog, "%lf,%lf,%lf,%lf,%lf,",
211 pinfo->dO2ILoss, pinfo->dAdditionalLoss, pinfo->uplink.antennaGain, pinfo->uplink.rxPower_dbm[i], pinfo->uplink.SNR_db[i]);
212
213 fprintf(fpRMlog, "%lf,%lf,%lf,",
214 pinfo->uplink.SINR_db[i],pinfo->uplink.thermalNoise, pinfo->uplink.InterferencePower_dbm[i]);
215
216 if (propagation->fastFadingModel == LTENR_FASTFADING_MODEL_AWGN_WITH_RAYLEIGH_FADING||
217 propagation->fastFadingModel == LTENR_FASTFADING_MODEL_AWGN_WITH_RICIAN_FADING)
218 fprintf(fpRMlog, "%lf,",
219 pinfo->uplink.beamFormingGain[i]);
220 else if (propagation->fastFadingModel == LTENR_FASTFADING_MODEL_NO_FADING_MIMO_ARRAY_GAIN)
221 fprintf(fpRMlog, "%lf,",
222 pinfo->uplink.ArrayGain);
223 else
224 fprintf(fpRMlog, "%s,",
225 "N/A");
226
227 fprintf(fpRMlog, "%d,%d,",
228 info->uplinkAMCInfo[CA_ID][i]->cqiTable.CQIIndex,
229 info->uplinkAMCInfo[CA_ID][i]->mcsTable.mcsIndex);
230
231 fprintf(fpRMlog, "\n");
232 if (nDbgFlag) fflush(fpRMlog);
233 }
234}
235
236void LTENR_RadioMeasurements_PBSCH_Log(ptrLTENR_GNBPHY phy, int CA_ID,
237 ptrLTENR_ASSOCIATEDUEPHYINFO info)
238{
239 if (fpRMlog == NULL || !validate_log(info->ueId)) return;
240
241 ptrLTENR_PROPAGATIONCONFIG propagation = phy->propagationConfig;
242 ptrLTENR_PROPAGATIONINFO pinfo = info->propagationInfo[CA_ID];
243 string pszassoc_status = info->isAssociated ? "true" : "false";
244 ptrLTENR_CA ca = phy->spectrumConfig->CA[CA_ID];
245 LTENR_LOS_NLOS_STATE los_state = pinfo->propagationConfig->state;
246
247 if ((ca->configSlotType == SLOT_UPLINK)) return;
248
249 fprintf(fpRMlog, "%.2lf,%s,%s,%lf,",
250 ldEventTime / MILLISECOND, DEVICE_NAME(phy->gnbId),
251 DEVICE_NAME(info->ueId),
252 DEVICE_DISTANCE(phy->gnbId, info->ueId));
253
254 fprintf(fpRMlog, "%s,%d,%s,%s,%s,%s,%lf,",
255 pszassoc_status, CA_ID + 1, ca->operatingBand, "SSB","N/A",
256 "N/A", pinfo->downlink.totaltxpower_dbm);
257
258 if (propagation->pathLossModel == LTENR_PATHLOSS_MODEL_LOG_DISTANCE)
259 fprintf(fpRMlog, "%s,%lf,%lf,",
260 "N/A", pinfo->dTotalLoss, pinfo->dPathLoss);
261 else
262 fprintf(fpRMlog, "%s,%lf,%lf,",
263 strLTENR_STATE[los_state], pinfo->dTotalLoss, pinfo->dPathLoss);
264
265 if (pinfo->propagationConfig->isShadowFadingEnabled)
266 fprintf(fpRMlog, "%lf,",
267 pinfo->dShadowFadingLoss);
268 else
269 fprintf(fpRMlog, "%s,",
270 "N/A");
271
272 fprintf(fpRMlog, "%lf,%lf,%lf,%lf,%lf,",
273 pinfo->dO2ILoss, pinfo->dAdditionalLoss, pinfo->downlink.antennaGain, pinfo->downlink.SSB_rxPower_dBm, pinfo->downlink.SSB_SNR_dB);
274
275 fprintf(fpRMlog, "%s,%s,%s,",
276 "N/A","N/A", "N/A");
277
278 fprintf(fpRMlog, "%lf,",
279 pinfo->downlink.SSB_AnalogBeamformingGain_dB);
280
281 fprintf(fpRMlog, "%s,%s,",
282 "N/A", "N/A");
283
284 fprintf(fpRMlog, "\n");
285 if (nDbgFlag) fflush(fpRMlog);
286}