26#include "Satellite_PHY.h"
27#include "Satellite_MAC.h"
28#include "Satellite_Frame.h"
30#pragma region FUNCTIONPROTOTYPE
32static FILE* fpRMlog = NULL;
34static void create_tx_info_for_ut(NETSIM_ID d, NETSIM_ID in,
35 PTX_INFO info, LINKTYPE linkType);
36static void create_tx_info_for_gw(NETSIM_ID d, NETSIM_ID in,
37 PTX_INFO info, LINKTYPE linkType);
38static void fill_propagation_from_link(NETSIM_ID d, NETSIM_ID in,
42#pragma region PROPAGATIONMODEL_INIT
43void satellite_propgation_ut_init(NETSIM_ID d, NETSIM_ID in)
45 ptrSATELLITE_UT_PHY phy = SATELLITE_UTPHY_GET(d, in);
46 ptrSATELLITE_UT_MAC mac = SATELLITE_UTMAC_GET(d, in);
49 create_tx_info_for_ut(d, in, &txInfo, LINKTYPE_RETURN);
52 fill_propagation_from_link(d, in, &prop);
54 phy->txPropagationInfo = propagation_create_propagation_info(d, in,
55 mac->satelliteId, mac->satelliteIf,
56 NULL, &txInfo, &prop);
58 create_tx_info_for_ut(d, in, &txInfo, LINKTYPE_FORWARD);
59 phy->rxPropagationInfo = propagation_create_propagation_info(mac->satelliteId, mac->satelliteIf,
61 NULL, &txInfo, &prop);
64void satellite_propgation_gw_init(NETSIM_ID d, NETSIM_ID in)
66 ptrSATELLITE_GW_PHY phy = SATELLITE_GWPHY_GET(d, in);
67 ptrSATELLITE_GW_MAC mac = SATELLITE_GWMAC_GET(d, in);
70 create_tx_info_for_gw(d, in, &txInfo, LINKTYPE_FORWARD);
73 fill_propagation_from_link(d, in, &prop);
75 phy->txPropagationInfo = propagation_create_propagation_info(d, in,
76 mac->satelliteId, mac->satelliteIf,
77 NULL, &txInfo, &prop);
79 create_tx_info_for_gw(d, in, &txInfo, LINKTYPE_RETURN);
80 phy->rxPropagationInfo = propagation_create_propagation_info(mac->satelliteId, mac->satelliteIf,
82 NULL, &txInfo, &prop);
86#pragma region PROPAGATIONMODEL_HELPER
87static void create_tx_info_for_ut(NETSIM_ID d, NETSIM_ID in,
88 PTX_INFO info, LINKTYPE linkType)
90 memset(info, 0,
sizeof * info);
91 ptrSATELLITE_UT_PHY phy = SATELLITE_UTPHY_GET(d, in);
92 ptrSATELLITE_UT_MAC mac = SATELLITE_UTMAC_GET(d, in);
94 NETSIM_ID s = mac->satelliteId;
95 NETSIM_ID sin = mac->satelliteIf;
96 ptrSATELLITE_MAC smac = SATELLITE_MAC_GET(s, sin);
97 ptrSATELLITE_PHY sphy = SATELLITE_PHY_GET(s, sin);
99 if (linkType == LINKTYPE_FORWARD)
101 ptrSUPERFRAME sf = smac->forwardFLinkSuperFrame;
102 info->dRxGain = phy->rxAntennaGain_db;
103 info->dTxGain = sphy->txAntennaGain_db;
104 info->dTxPower_dbm = sphy->txPower_dbm;
105 info->dTxPower_mw = sphy->txPower_mw;
106 info->dCentralFrequency = sf->centralFrequency_Hz / MHZ;
108 else if (linkType == LINKTYPE_RETURN)
110 ptrSUPERFRAME sf = smac->returnLinkSuperFrame;
111 info->dTxGain = phy->txAntennaGain_db;
112 info->dRxGain = sphy->rxAntennaGain_db;
113 info->dTxPower_dbm = phy->txPower_dbm;
114 info->dTxPower_mw = phy->txPower_mw;
115 info->dCentralFrequency = sf->centralFrequency_Hz / MHZ;
119 info->dTx_Rx_Distance = DEVICE_DISTANCE(d, s);
122static void fill_propagation_from_link(NETSIM_ID d, NETSIM_ID in,
125 memset(prop, 0,
sizeof * prop);
126 NetSim_LINKS* link = DEVICE_PHYLAYER(d, in)->pstruNetSimLinks;
127 memcpy(prop, link->puniMedProp.pstruWirelessLink.propagation,
sizeof * prop);
128 prop->pathlossVar.d0 = 1;
131static void create_tx_info_for_gw(NETSIM_ID d, NETSIM_ID in,
132 PTX_INFO info, LINKTYPE linkType)
134 memset(info, 0,
sizeof * info);
135 ptrSATELLITE_GW_PHY phy = SATELLITE_GWPHY_GET(d, in);
136 ptrSATELLITE_GW_MAC mac = SATELLITE_GWMAC_GET(d, in);
138 NETSIM_ID s = mac->satelliteId;
139 NETSIM_ID sin = mac->satelliteIf;
140 ptrSATELLITE_MAC smac = SATELLITE_MAC_GET(s, sin);
141 ptrSATELLITE_PHY sphy = SATELLITE_PHY_GET(s, sin);
143 if (linkType == LINKTYPE_FORWARD)
145 ptrSUPERFRAME sf = smac->forwardFLinkSuperFrame;
146 info->dTxGain = phy->txAntennaGain_db;
147 info->dRxGain = sphy->rxAntennaGain_db;
148 info->dTxPower_dbm = phy->txPower_dbm;
149 info->dTxPower_mw = phy->txPower_mw;
150 info->dCentralFrequency = sf->centralFrequency_Hz / MHZ;
152 else if (linkType == LINKTYPE_RETURN)
154 ptrSUPERFRAME sf = smac->returnLinkSuperFrame;
155 info->dRxGain = phy->rxAntennaGain_db;
156 info->dTxGain = sphy->txAntennaGain_db;
157 info->dTxPower_dbm = sphy->txPower_dbm;
158 info->dTxPower_mw = sphy->txPower_mw;
159 info->dCentralFrequency = sf->centralFrequency_Hz / MHZ;
163 info->dTx_Rx_Distance = DEVICE_DISTANCE(d, s);
167#pragma region PROPAGATIONMODEL_CALCULATE
168void satellite_propagation_ut_calculate_rxpower(NETSIM_ID d, NETSIM_ID in,
double time)
170 ptrSATELLITE_UT_PHY phy = SATELLITE_UTPHY_GET(d, in);
171 _propagation_calculate_received_power(phy->txPropagationInfo, time);
172 _propagation_calculate_received_power(phy->rxPropagationInfo, time);
175void satellite_propagation_gw_calculate_rxpower(NETSIM_ID d, NETSIM_ID in,
double time)
177 ptrSATELLITE_GW_PHY phy = SATELLITE_GWPHY_GET(d, in);
178 _propagation_calculate_received_power(phy->txPropagationInfo, time);
179 _propagation_calculate_received_power(phy->rxPropagationInfo, time);
183#pragma region SATELLITE_PACKET_ERROR
184static double satellite_get_rx_power_dbm(NETSIM_ID t, NETSIM_ID ti, NETSIM_ID r, NETSIM_ID ri)
188 ptrSATELLITE_UT_PHY phy = SATELLITE_UTPHY_GET(t, ti);
189 return _propagation_get_received_power_dbm(phy->txPropagationInfo, 0);
191 else if (isGW(t, ti))
193 ptrSATELLITE_GW_PHY phy = SATELLITE_GWPHY_GET(t, ti);
194 return _propagation_get_received_power_dbm(phy->txPropagationInfo, 0);
200 ptrSATELLITE_UT_PHY phy = SATELLITE_UTPHY_GET(r, ri);
201 return _propagation_get_received_power_dbm(phy->rxPropagationInfo, 0);
203 else if (isGW(r, ri))
205 ptrSATELLITE_GW_PHY phy = SATELLITE_GWPHY_GET(r, ri);
206 return _propagation_get_received_power_dbm(phy->rxPropagationInfo, 0);
212static double satellite_get_tx_power_db(NETSIM_ID t, NETSIM_ID ti)
216 ptrSATELLITE_UT_PHY phy = SATELLITE_UTPHY_GET(t, ti);
217 return phy->txPower_dbm;
219 else if (isGW(t, ti))
221 ptrSATELLITE_GW_PHY phy = SATELLITE_GWPHY_GET(t, ti);
222 return phy->txPower_dbm;
224 else if (isSATELLITE(t, ti))
226 ptrSATELLITE_PHY phy = SATELLITE_PHY_GET(t, ti);
227 return phy->txPower_dbm;
232static double satellite_get_totalloss_db(NETSIM_ID t, NETSIM_ID ti, NETSIM_ID r, NETSIM_ID ri,
double Time)
236 ptrSATELLITE_UT_PHY phy = SATELLITE_UTPHY_GET(t, ti);
237 return propagation_get_Totalloss(phy->txPropagationInfo, Time);
239 else if (isGW(t, ti))
241 ptrSATELLITE_GW_PHY phy = SATELLITE_GWPHY_GET(t, ti);
242 return propagation_get_Totalloss(phy->txPropagationInfo, Time);
248 ptrSATELLITE_UT_PHY phy = SATELLITE_UTPHY_GET(r, ri);
249 return propagation_get_Totalloss(phy->rxPropagationInfo, Time);
251 else if (isGW(r, ri))
253 ptrSATELLITE_GW_PHY phy = SATELLITE_GWPHY_GET(r, ri);
254 return propagation_get_Totalloss(phy->rxPropagationInfo, Time);
260static double satellite_get_pathloss_db(NETSIM_ID t, NETSIM_ID ti, NETSIM_ID r, NETSIM_ID ri,
double Time)
264 ptrSATELLITE_UT_PHY phy = SATELLITE_UTPHY_GET(t, ti);
265 return propagation_get_Pathloss(phy->txPropagationInfo, Time);
267 else if (isGW(t, ti))
269 ptrSATELLITE_GW_PHY phy = SATELLITE_GWPHY_GET(t, ti);
270 return propagation_get_Pathloss(phy->txPropagationInfo, Time);
276 ptrSATELLITE_UT_PHY phy = SATELLITE_UTPHY_GET(r, ri);
277 return propagation_get_Pathloss(phy->rxPropagationInfo, Time);
279 else if (isGW(r, ri))
281 ptrSATELLITE_GW_PHY phy = SATELLITE_GWPHY_GET(r, ri);
282 return propagation_get_Pathloss(phy->rxPropagationInfo, Time);
288static double satellite_get_fading_loss_db(NETSIM_ID t, NETSIM_ID ti, NETSIM_ID r, NETSIM_ID ri)
292 ptrSATELLITE_UT_PHY phy = SATELLITE_UTPHY_GET(t, ti);
293 return _propagation_calculate_fadingloss(phy->txPropagationInfo);
295 else if (isGW(t, ti))
297 ptrSATELLITE_GW_PHY phy = SATELLITE_GWPHY_GET(t, ti);
298 return _propagation_calculate_fadingloss(phy->txPropagationInfo);
304 ptrSATELLITE_UT_PHY phy = SATELLITE_UTPHY_GET(r, ri);
305 return _propagation_calculate_fadingloss(phy->rxPropagationInfo);
307 else if (isGW(r, ri))
309 ptrSATELLITE_GW_PHY phy = SATELLITE_GWPHY_GET(r, ri);
310 return _propagation_calculate_fadingloss(phy->rxPropagationInfo);
316#define BOLTZMAAN_CONSTANT 1.38064852e-23
317static double satellite_calculate_noise(NETSIM_ID t, NETSIM_ID ti, NETSIM_ID r, NETSIM_ID ri)
322 ptrSATELLITE_UT_PHY phy = SATELLITE_UTPHY_GET(t, ti);
323 ptrSATELLITE_PHY sphy = SATELLITE_PHY_GET(r, ri);
324 noise_w = BOLTZMAAN_CONSTANT * phy->tempeature_k * sphy->returnLinkSuperFrame->carrierConfig->allocatedBandwidth_Hz;
326 else if (isGW(t, ti))
328 ptrSATELLITE_GW_PHY phy = SATELLITE_GWPHY_GET(t, ti);
329 ptrSATELLITE_PHY sphy = SATELLITE_PHY_GET(r, ri);
330 noise_w = BOLTZMAAN_CONSTANT * phy->tempeature_k * sphy->forwardLinkSuperFrame->carrierConfig->allocatedBandwidth_Hz;
336 ptrSATELLITE_UT_PHY phy = SATELLITE_UTPHY_GET(r, ri);
337 ptrSATELLITE_PHY sphy = SATELLITE_PHY_GET(t, ti);
338 noise_w = BOLTZMAAN_CONSTANT * phy->tempeature_k * sphy->forwardLinkSuperFrame->carrierConfig->allocatedBandwidth_Hz;
340 else if (isGW(r, ri))
342 ptrSATELLITE_GW_PHY phy = SATELLITE_GWPHY_GET(r, ri);
343 ptrSATELLITE_PHY sphy = SATELLITE_PHY_GET(t, ti);
344 noise_w = BOLTZMAAN_CONSTANT * phy->tempeature_k * sphy->returnLinkSuperFrame->carrierConfig->allocatedBandwidth_Hz;
348 return MW_TO_DBM(noise_w * 1000);
351static double satellite_calculate_snr(
double pdbm,
double ndbm)
353 return MW_TO_DBM(DBM_TO_MW(pdbm) / DBM_TO_MW(ndbm));
356static ptrSUPERFRAME find_superframe(NETSIM_ID t, NETSIM_ID ti, NETSIM_ID r, NETSIM_ID ri)
360 ptrSATELLITE_PHY phy = SATELLITE_PHY_GET(r, ri);
361 return phy->returnLinkSuperFrame;
363 else if (isGW(t, ti))
365 ptrSATELLITE_PHY phy = SATELLITE_PHY_GET(r, ri);
366 return phy->forwardLinkSuperFrame;
372 ptrSATELLITE_PHY phy = SATELLITE_PHY_GET(t, ti);
373 return phy->forwardLinkSuperFrame;
375 else if (isGW(r, ri))
377 ptrSATELLITE_PHY phy = SATELLITE_PHY_GET(t, ti);
378 return phy->returnLinkSuperFrame;
384static double satellite_calculate_ber(ptrSUPERFRAME sf,
double snr)
386 ptrCARRIERCONF cc = sf->carrierConfig;
387 if (cc->berModel == BERMODEL_Fixed)
389 else if (cc->berModel == BERMODEL_File)
390 return calculate_ber(snr, cc->berTable, cc->berTableLen);
391 else if (cc->berModel == BERMODEL_Model)
393 double dataRate = sf->slotConfig->bitsPerSlot / sf->slotConfig->slotLength_us;
394 return Calculate_ber_by_calculation(snr, cc->modulation, dataRate, cc->allocatedBandwidth_Hz / MHZ);
399static PACKET_STATUS satellite_isPacketErrored(ptrSUPERFRAME sf,
double bytes,
double snr)
401 double ber = satellite_calculate_ber(sf, snr);
402 return fn_NetSim_Packet_DecideError(ber, bytes);
405static void init_radio_measurements_log()
407 if (get_protocol_log_status(
"SATELLITE_PROPAGATION_LOG"))
410 sprintf(s,
"%s/log/Satellite_Radio_Measurements_Log.csv",
412 fpRMlog = fopen(s,
"w");
415 fnSystemError(
"Unable to open %s\n", s);
419 fprintf(fpRMlog,
"Time(ms),Transmitter Name,Receiver Name,Tx_Power(dBm),PathLoss(dB),FadingLoss(dB),TotalLoss(dB),Rx_Power(dBm),Noise(dBm),SNR(dB)\n");
420 if (nDbgFlag) fflush(fpRMlog);
424static void log_radio_measurements(NETSIM_ID t, NETSIM_ID ti, NETSIM_ID r, NETSIM_ID ri,
double tx_power,
double pathloss,
double f,
double n,
425 double totalloss,
double p,
double snr)
427 if (fpRMlog == NULL)
return;
429 fprintf(fpRMlog,
"%lf,%s,%s,%lf,%lf,%lf,%lf,%lf,%lf,%lf,\n",
430 (ldEventTime/MILLISECOND), DEVICE_NAME(t), DEVICE_NAME(r), tx_power, pathloss, f, totalloss, p, n, snr);
431 if (nDbgFlag) fflush(fpRMlog);
434static void close_radio_measurements_log()
440void Satellite_RadioMeasurements_Init()
442 init_radio_measurements_log();
445void Satellite_RadioMeasurements_Finish()
447 close_radio_measurements_log();
450void satellite_check_for_packet_error(NETSIM_ID t, NETSIM_ID ti, NETSIM_ID r, NETSIM_ID ri,
451 NetSim_PACKET* packet)
453 double pdbm = satellite_get_rx_power_dbm(t, ti, r, ri);
454 double fdb = satellite_get_fading_loss_db(t, ti, r, ri);
457 double ndbm = satellite_calculate_noise(t, ti, r, ri);
458 double snr = satellite_calculate_snr(pdbm, ndbm);
460 double pathloss = satellite_get_pathloss_db(t, ti, r, ri, ldEventTime);
461 double tx_power = satellite_get_tx_power_db(t, ti);
462 double totalloss = satellite_get_totalloss_db(t, ti, r, ri, ldEventTime);
464 log_radio_measurements(t, ti, r, ri, tx_power, pathloss, fdb, ndbm, totalloss, pdbm + fdb, snr);
466 double bytes = packet->pstruPhyData->dPacketSize;
468 ptrSUPERFRAME sf = find_superframe(t, ti, r, ri);
469 packet->nPacketStatus = satellite_isPacketErrored(sf, bytes, snr);