NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
NTN.c
1#include "NTN.h"
2#include "NTN_PropagationModel.h"
3#include "stdafx.h"
4#include "LTENR_Spectrum.h"
5#include "LTENR_AMCTable.h"
6#include "LTENR_MAC.h"
7#include "LTENR_PHY.h"
8#include "LTENR_Multiplexing.h"
9#include "LTENR_Spectrum.h"
10#include "LTENR_HARQ.h"
11#include <stdarg.h>
12
13void SendToNTNReceiver(NETSIM_ID gnbId, NETSIM_ID gnbIf, ptrLTENR_ASSOCIATEDUEPHYINFO info, bool isUplink, NetSim_PACKET* packet)
14{
15 ptrLTENR_GNBPHY phy = LTENR_GNBPHY_GET(gnbId, gnbIf);
16 double slotTime = LTENR_PHY_GetSlotTime(gnbId, gnbIf);
17
18 NetSim_EVENTDETAILS pevent;
19 memset(&pevent, 0, sizeof pevent);
20 pevent.dEventTime = phy->currentFrameInfo->slotEndTime;
21 pevent.dPacketSize = packet->pstruMacData->dPacketSize;
22 if (packet->pstruAppData)
23 {
24 pevent.nApplicationId = packet->pstruAppData->nApplicationId;
25 pevent.nSegmentId = packet->pstruAppData->nSegmentId;
26 }
27 if (isUplink)
28 {
29 pevent.nDeviceId = gnbId;
30 pevent.nInterfaceId = gnbIf;
31 pevent.nDeviceType = DEVICE_TYPE(gnbId);
32 }
33 else
34 {
35 pevent.nDeviceId = info->ueId;
36 pevent.nInterfaceId = info->ueIf;
37 pevent.nDeviceType = DEVICE_TYPE(info->ueId);
38 }
39
40 pevent.dEventTime = phy->currentFrameInfo->slotEndTime + calculateRoundTripPD(gnbId, info->ueId, slotTime);
41 pevent.nEventType = MAC_IN_EVENT;
42 pevent.nPacketId = packet->nPacketId;
43 pevent.nProtocolId = LTENR_PROTODATA_GET(gnbId, gnbIf)->macProtocol;
44 pevent.pPacket = packet;
45 fnpAddEvent(&pevent);
46}
47
48double calculateRoundTripPD(NETSIM_ID gnbId, NETSIM_ID ueId, double slotTime)
49{
50 ptrNTN_PROPAGATIONCONFIG ntnInfo = getNTN_PropInfo();
51 double gnbSatDelay, ueSatDelay;
52
53 gnbSatDelay = calculatePropagationDelay(gnbId, ntnInfo->ntnId);
54 gnbSatDelay = quantizeDelay(gnbSatDelay, slotTime);
55
56 ueSatDelay = calculatePropagationDelay(ueId, ntnInfo->ntnId);
57 ueSatDelay = quantizeDelay(ueSatDelay, slotTime);
58
59 return (gnbSatDelay+ueSatDelay);
60}
61
62double quantizeDelay(double delay,double slotTime)
63{
64 double qunatizedDelay = ceil(delay / slotTime) * slotTime;
65 return qunatizedDelay;
66}
67
68double calculatePropagationDelay(NETSIM_ID d1, NETSIM_ID d2)
69{
70 double x1 = DEVICE_POSITION(d1)->X;
71 double y1 = DEVICE_POSITION(d1)->Y;
72 double z1 = DEVICE_POSITION(d1)->Z;
73
74 double x2 = DEVICE_POSITION(d2)->X;
75 double y2 = DEVICE_POSITION(d2)->Y;
76 double z2 = DEVICE_POSITION(d2)->Z;
77
78
79 double distance_m = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2) + pow(z2 - z1, 2));
80
81 double delay = distance_m/300; // The delay calculated is in microsecond
82
83 return delay;
84}
85
86void LTENR_NTN_PhyOut_HandleBroadCast() {
87 NetSim_PACKET* packet = pstruEventDetails->pPacket;
88 NETSIM_ID d = pstruEventDetails->nDeviceId;
89 NETSIM_ID in = pstruEventDetails->nInterfaceId;
90 NETSIM_ID r = packet->nReceiverId;
91 double slotTime;
92 for (r = 0; r < NETWORK->nDeviceCount; r++)
93 {
94 if (d == r + 1)
95 continue;
96
97 for (NETSIM_ID rin = 0; rin < DEVICE(r + 1)->nNumOfInterface; rin++)
98 {
99 if (!isLTE_NRInterface(r + 1, rin + 1))
100 continue;
101
102 ptrLTENR_PROTODATA data = LTENR_PROTODATA_GET(r + 1, rin + 1);
103 if (data->isDCEnable) {
104 if (data->MasterCellType == MMWAVE_CELL_TYPE) {
105 if (fn_NetSim_isDeviceLTENR(r + 1, rin + 1)) {
106 if (!fn_NetSim_isDeviceLTENR(d, in))
107 continue;
108 }
109 else {
110 continue;
111 }
112 }
113 else {
114 if (!fn_NetSim_isDeviceLTENR(r + 1, rin + 1)) {
115 if (fn_NetSim_isDeviceLTENR(d, in))
116 continue;
117 }
118 else {
119 continue;
120 }
121 }
122 }
123 switch (data->deviceType)
124 {
125 case LTENR_DEVICETYPE_UE:
126 {
127 double endTime = LTENR_PHY_GetSlotEndTime(d, in);
128 NetSim_PACKET* p = fn_NetSim_Packet_CopyPacket(packet);
129
130 p->pstruPhyData->dArrivalTime = pstruEventDetails->dEventTime;
131 p->pstruPhyData->dEndTime = endTime - 1;
132 p->pstruPhyData->dPacketSize = p->pstruMacData->dPacketSize;
133 p->pstruPhyData->dPayload = p->pstruMacData->dPacketSize;
134 p->pstruPhyData->dStartTime = pstruEventDetails->dEventTime;
135 p->pstruMacData->Packet_MACProtocol = NULL;
136 p->pstruMacData->Packet_MACProtocol = LTENR_MSG_COPY(packet);
137
138 pstruEventDetails->pPacket = p;
139 slotTime = LTENR_PHY_GetSlotTime(d, in);
140 // check how to add propagation info
141 pstruEventDetails->dEventTime = endTime - 1 + calculateRoundTripPD(d, r+1, slotTime);
142 pstruEventDetails->nEventType = PHYSICAL_IN_EVENT;
143 pstruEventDetails->nDeviceId = r + 1;
144 pstruEventDetails->nDeviceType = DEVICE_TYPE(r + 1);
145 pstruEventDetails->nInterfaceId = rin + 1;
146 pstruEventDetails->pPacket->nTransmitterId = d;
147 pstruEventDetails->pPacket->nReceiverId = r + 1;
148
149 fnpAddEvent(pstruEventDetails);
150 }
151 break;
152 default:
153 break;
154 }
155 }
156 }
157
158 fn_NetSim_Packet_FreePacket(packet);
159 pstruEventDetails->pPacket = NULL;
160}
161
162void LTENR_NTN_PhyOut_HandleUnicast() {
163
164 NetSim_PACKET* packet = pstruEventDetails->pPacket;
165 NETSIM_ID d = pstruEventDetails->nDeviceId;
166 NETSIM_ID in = pstruEventDetails->nInterfaceId;
167 NETSIM_ID r = packet->nReceiverId;
168 NETSIM_ID rin = LTENR_FIND_ASSOCIATEINTERFACE(d, in, r);
169
170 if (rin == 0)
171 {
172 fn_NetSim_Packet_FreePacket(packet);
173 return;
174 }
175
176 double endTime = LTENR_PHY_GetSlotEndTime(d, in);
177 double slotTime = LTENR_PHY_GetSlotTime(d, in);
178 packet->pstruPhyData->dArrivalTime = pstruEventDetails->dEventTime;
179 packet->pstruPhyData->dEndTime = endTime - 1;
180 packet->pstruPhyData->dPacketSize = packet->pstruMacData->dPacketSize;
181 packet->pstruPhyData->dPayload = packet->pstruMacData->dPacketSize;
182 packet->pstruPhyData->dStartTime = pstruEventDetails->dEventTime;
183
184 pstruEventDetails->dEventTime = endTime - 1 + calculateRoundTripPD(d,r,slotTime);
185 pstruEventDetails->nEventType = PHYSICAL_IN_EVENT;
186 pstruEventDetails->nDeviceId = r;
187 pstruEventDetails->nDeviceType = DEVICE_TYPE(r);
188 pstruEventDetails->nInterfaceId = rin;
189 fnpAddEvent(pstruEventDetails);
190}
191
192double LTENR_PHY_GetSlotTime(NETSIM_ID d, NETSIM_ID in)
193{
194 double slotTime;
195 if (isGNB(d, in))
196 {
197 ptrLTENR_FRAMEINFO fi = ((ptrLTENR_GNBPHY)LTENR_GNBPHY_GET(d, in))->currentFrameInfo;
198 slotTime = fi->slotEndTime - fi->slotStartTime;
199 return slotTime;
200 }
201 else
202 {
203 ptrLTENR_UEPHY phy = LTENR_UEPHY_GET(d, in);
204 return LTENR_PHY_GetSlotTime(phy->gnBId, phy->gnbIf);
205 }
206}