16#include "Aloha_enum.h"
17#include "../UWAN/UWAN.h"
18#include "AdvancedPlots.h"
19#pragma comment(lib,"AdvancedPlots.lib")
20#include "../BatteryModel/BatteryModel.h"
26}PACKETLIST, *ptrPACKETLIST;
28PACKETLIST txPacketList;
30static void add_packet_to_txList(NetSim_PACKET* packet)
32 if (txPacketList.head)
34 txPacketList.tail->pstruNextPacket = packet;
35 txPacketList.tail = packet;
39 txPacketList.head = packet;
40 txPacketList.tail = packet;
43static bool check_packet_in_txList(NETSIM_ID tx)
46 NetSim_PACKET* t = txPacketList.head;
49 if (t->nTransmitterId == tx)
51 t = t->pstruNextPacket;
56static void remove_packet_from_txList(NetSim_PACKET* packet)
58 NetSim_PACKET* t = txPacketList.head;
59 NetSim_PACKET* p = NULL;
64 if (t == txPacketList.head)
66 txPacketList.head = t->pstruNextPacket;
67 if (!txPacketList.head)
68 txPacketList.tail = NULL;
72 p->pstruNextPacket = t->pstruNextPacket;
73 if (!t->pstruNextPacket)
74 txPacketList.tail = p;
76 packet->pstruNextPacket = NULL;
80 t = t->pstruNextPacket;
84static void mark_packet_for_collision()
86 NetSim_PACKET* p = txPacketList.head;
89 PALOHA_PHY_VAR phy = ALOHA_PHY(p->nReceiverId, 1);
91 double power = get_received_power(p->nTransmitterId, p->nReceiverId, p->pstruPhyData->dArrivalTime);
92 double interference = substract_power_in_dbm(phy->dInterferencePower, power);
94 if ( interference > phy->rx_sensitivity)
95 p->nPacketStatus = PacketStatus_Collided;
97 p = p->pstruNextPacket;
101static void update_interference_power(NETSIM_ID tx,
109 for (i = 0; i < NETWORK->nDeviceCount; i++)
114 phy = ALOHA_PHY(i + 1, 1);
115 double p = phy->dInterferencePower;
117 phy->dInterferencePower = add_power_in_dbm(p,
118 get_received_power(tx, i + 1, time));
120 phy->dInterferencePower = substract_power_in_dbm(p,
121 get_received_power(tx, i + 1, time));
125static double calulate_transmission_time(NetSim_PACKET* packet)
127 double size=fnGetPacketSize(packet);
128 NETSIM_ID source=packet->nTransmitterId;
129 PALOHA_PHY_VAR phy = ALOHA_PHY(source,1);
130 double dDataRate=phy->data_rate;
131 double dTxTime= size*8.0/dDataRate;
135static double calculate_propagation_delay(NetSim_PACKET* packet)
137 NETSIM_ID source = packet->nTransmitterId;
138 NETSIM_ID destination = packet->nReceiverId;
139 double dPropagationDelay = UWAN_calculate_propagation_delay(source, 1,
141 get_aloha_propagation_info(source, destination));
142 return dPropagationDelay;
145static void transmit_packet(NetSim_PACKET* packet,
bool* flag)
147 PALOHA_PHY_VAR phy = ALOHA_PHY(packet->nReceiverId,1);
148 PALOHA_PHY_VAR phyt = ALOHA_PHY(packet->nTransmitterId,1);
149 double power = get_received_power(packet->nTransmitterId, packet->nReceiverId,
150 packet->pstruPhyData->dArrivalTime);
152 ptrBATTERY battery = phyt->battery;
154 if(power < phy->rx_sensitivity)
156 set_radio_state(pstruEventDetails->nDeviceId, 1, RX_ON_IDLE);
157 packet->nPacketStatus=PacketStatus_Error;
161 if (phyt->transmitter_status == RX_OFF)
164 set_radio_state(pstruEventDetails->nDeviceId, 1, TRX_ON_BUSY);
166 set_radio_state(packet->nReceiverId, 1, RX_ON_BUSY);
168 pstruEventDetails->dEventTime=packet->pstruPhyData->dEndTime;
169 packet->pstruPhyData->dEndTime = pstruEventDetails->dEventTime;
170 pstruEventDetails->dPacketSize=packet->pstruPhyData->dPacketSize;
171 pstruEventDetails->nDeviceId=packet->nReceiverId;
172 pstruEventDetails->nDeviceType=DEVICE_TYPE(packet->nReceiverId);
173 pstruEventDetails->nEventType=PHYSICAL_IN_EVENT;
174 pstruEventDetails->nInterfaceId=1;
175 pstruEventDetails->pPacket=packet;
176 fnpAddEvent(pstruEventDetails);
178 add_packet_to_txList(packet);
180 update_interference_power(packet->nTransmitterId,
182 packet->pstruPhyData->dArrivalTime,
185 mark_packet_for_collision();
188int fn_NetSim_Aloha_PhyOut()
191 double dPropagationDelay;
192 double receptionTime;
193 NetSim_PACKET* packet= pstruEventDetails->pPacket;
194 packet->pstruPhyData->dArrivalTime=pstruEventDetails->dEventTime;
195 packet->pstruPhyData->dPayload=packet->pstruMacData->dPacketSize;
196 packet->pstruPhyData->dOverhead=ALOHA_PHY_OVERHEAD;
197 packet->pstruPhyData->dPacketSize=packet->pstruPhyData->dOverhead+packet->pstruPhyData->dPayload;
198 packet->pstruPhyData->dStartTime=pstruEventDetails->dEventTime;
201 if(packet->nReceiverId)
203 dTxTime = calulate_transmission_time(packet);
204 dPropagationDelay = calculate_propagation_delay(packet);
205 packet->pstruPhyData->dStartTime = packet->pstruPhyData->dArrivalTime + dTxTime;
206 packet->pstruPhyData->dEndTime = packet->pstruPhyData->dStartTime + dPropagationDelay;
207 receptionTime = packet->pstruPhyData->dEndTime - packet->pstruPhyData->dArrivalTime;
208 PALOHA_MAC_VAR mac = ALOHA_CURR_MAC;
211 if (receptionTime > mac->slotlength)
213 fnNetSimError(
"The slot length for the scenario has not been set properly, it should be greater than %lf.\n", receptionTime);
217 transmit_packet(packet, &flag);
223 for(loop=0;loop<NETWORK->nDeviceCount;loop++)
225 if(loop+1!=packet->nTransmitterId)
227 NetSim_PACKET* p = fn_NetSim_Packet_CopyPacket(packet);
229 p->nReceiverId=loop+1;
230 dTxTime = calulate_transmission_time(p);
231 dPropagationDelay = calculate_propagation_delay(p);
232 p->pstruPhyData->dStartTime = p->pstruPhyData->dArrivalTime + dTxTime;
233 p->pstruPhyData->dEndTime = p->pstruPhyData->dStartTime + dPropagationDelay;
234 receptionTime = p->pstruPhyData->dEndTime - p->pstruPhyData->dArrivalTime;
235 PALOHA_MAC_VAR mac = ALOHA_CURR_MAC;
238 if (receptionTime > mac->slotlength)
240 fnNetSimError(
"The slot length for the scenario has not been set properly, it should be greater than %lf.\n", receptionTime);
244 transmit_packet(p, &flag);
247 fn_NetSim_Packet_FreePacket(packet);
252static void notify_src(NETSIM_ID tx,
256 NetSim_EVENTDETAILS pevent;
257 memset(&pevent, 0,
sizeof pevent);
258 pevent.dEventTime = pstruEventDetails->dEventTime + acktime;
259 pevent.nDeviceId = tx;
260 pevent.nDeviceType = DEVICE_TYPE(tx);
261 pevent.nEventType = MAC_OUT_EVENT;
262 pevent.nInterfaceId = 1;
263 pevent.nProtocolId = MAC_PROTOCOL_ALOHA;
264 pevent.nSubEventType = isError ? ALOHA_PACKET_ERROR : ALOHA_PACKET_SUCCESS;
265 fnpAddEvent(&pevent);
268void fn_NetSim_Aloha_PhyIn()
270 PALOHA_PHY_VAR phy = ALOHA_CURR_PHY;
272 NetSim_PACKET* packet = pstruEventDetails->pPacket;
273 NETSIM_ID tx = packet->nTransmitterId;
274 NETSIM_ID rx = packet->nReceiverId;
276 if (isBroadcastPacket(packet))
278 if ((tx == 1 && rx == 2) ||
280 update_interference_power(tx, rx,
281 packet->pstruPhyData->dArrivalTime,
false);
285 update_interference_power(tx, rx,
286 packet->pstruPhyData->dArrivalTime,
false);
289 remove_packet_from_txList(packet);
291 set_radio_state(packet->nTransmitterId, 1, RX_ON_IDLE);
292 set_radio_state(packet->nReceiverId, 1, RX_ON_IDLE);
295 if(pstruEventDetails->pPacket->nPacketStatus == PacketStatus_Collided)
298 ber = UWAN_Calculate_ber(tx, rx,
299 get_aloha_propagation_info(tx, rx),
300 get_received_power(tx, rx, packet->pstruPhyData->dArrivalTime),
302 phy->data_rate * 1000,
303 phy->bandwidth * 1000);
305 packet->nPacketStatus = fn_NetSim_Packet_DecideError(ber, packet->pstruPhyData->dPacketSize);
307 if(packet->nPacketStatus == PacketStatus_Error)
310 pstruEventDetails->nEventType = MAC_IN_EVENT;
311 fnpAddEvent(pstruEventDetails);
314 fn_NetSim_WritePacketTrace(packet);
315 fn_NetSim_Metrics_Add(packet);
317 if (pstruEventDetails->pPacket->nPacketStatus != PacketStatus_NoError)
319 if(!check_packet_in_txList(tx))
320 notify_src(tx,
true);
321 fn_NetSim_Packet_FreePacket(packet);
325 if (!check_packet_in_txList(tx))
326 notify_src(tx,
false);