2#include "NTN_PropagationModel.h"
4#include "LTENR_Spectrum.h"
5#include "LTENR_AMCTable.h"
8#include "LTENR_Multiplexing.h"
9#include "LTENR_Spectrum.h"
10#include "LTENR_HARQ.h"
13void SendToNTNReceiver(NETSIM_ID gnbId, NETSIM_ID gnbIf, ptrLTENR_ASSOCIATEDUEPHYINFO info,
bool isUplink, NetSim_PACKET* packet)
15 ptrLTENR_GNBPHY phy = LTENR_GNBPHY_GET(gnbId, gnbIf);
16 double slotTime = LTENR_PHY_GetSlotTime(gnbId, gnbIf);
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)
24 pevent.nApplicationId = packet->pstruAppData->nApplicationId;
25 pevent.nSegmentId = packet->pstruAppData->nSegmentId;
29 pevent.nDeviceId = gnbId;
30 pevent.nInterfaceId = gnbIf;
31 pevent.nDeviceType = DEVICE_TYPE(gnbId);
35 pevent.nDeviceId = info->ueId;
36 pevent.nInterfaceId = info->ueIf;
37 pevent.nDeviceType = DEVICE_TYPE(info->ueId);
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;
48double calculateRoundTripPD(NETSIM_ID gnbId, NETSIM_ID ueId,
double slotTime)
50 ptrNTN_PROPAGATIONCONFIG ntnInfo = getNTN_PropInfo();
51 double gnbSatDelay, ueSatDelay;
53 gnbSatDelay = calculatePropagationDelay(gnbId, ntnInfo->ntnId);
54 gnbSatDelay = quantizeDelay(gnbSatDelay, slotTime);
56 ueSatDelay = calculatePropagationDelay(ueId, ntnInfo->ntnId);
57 ueSatDelay = quantizeDelay(ueSatDelay, slotTime);
59 return (gnbSatDelay+ueSatDelay);
62double quantizeDelay(
double delay,
double slotTime)
64 double qunatizedDelay = ceil(delay / slotTime) * slotTime;
65 return qunatizedDelay;
68double calculatePropagationDelay(NETSIM_ID d1, NETSIM_ID d2)
70 double x1 = DEVICE_POSITION(d1)->X;
71 double y1 = DEVICE_POSITION(d1)->Y;
72 double z1 = DEVICE_POSITION(d1)->Z;
74 double x2 = DEVICE_POSITION(d2)->X;
75 double y2 = DEVICE_POSITION(d2)->Y;
76 double z2 = DEVICE_POSITION(d2)->Z;
79 double distance_m = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2) + pow(z2 - z1, 2));
81 double delay = distance_m/300;
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;
92 for (r = 0; r < NETWORK->nDeviceCount; r++)
97 for (NETSIM_ID rin = 0; rin < DEVICE(r + 1)->nNumOfInterface; rin++)
99 if (!isLTE_NRInterface(r + 1, rin + 1))
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))
114 if (!fn_NetSim_isDeviceLTENR(r + 1, rin + 1)) {
115 if (fn_NetSim_isDeviceLTENR(d, in))
123 switch (data->deviceType)
125 case LTENR_DEVICETYPE_UE:
127 double endTime = LTENR_PHY_GetSlotEndTime(d, in);
128 NetSim_PACKET* p = fn_NetSim_Packet_CopyPacket(packet);
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);
138 pstruEventDetails->pPacket = p;
139 slotTime = LTENR_PHY_GetSlotTime(d, in);
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;
149 fnpAddEvent(pstruEventDetails);
158 fn_NetSim_Packet_FreePacket(packet);
159 pstruEventDetails->pPacket = NULL;
162void LTENR_NTN_PhyOut_HandleUnicast() {
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);
172 fn_NetSim_Packet_FreePacket(packet);
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;
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);
192double LTENR_PHY_GetSlotTime(NETSIM_ID d, NETSIM_ID in)
197 ptrLTENR_FRAMEINFO fi = ((ptrLTENR_GNBPHY)LTENR_GNBPHY_GET(d, in))->currentFrameInfo;
198 slotTime = fi->slotEndTime - fi->slotStartTime;
203 ptrLTENR_UEPHY phy = LTENR_UEPHY_GET(d, in);
204 return LTENR_PHY_GetSlotTime(phy->gnBId, phy->gnbIf);