17#include "NetSim_utility.h"
18#include "AdvancedPlots.h"
19#pragma comment(lib,"AdvancedPlots.lib")
21int fn_NetSim_Zigbee_FreePacket_F(NetSim_PACKET* pstruPacket);
23static double zigbee_get_link_quality(NETSIM_ID trx, NETSIM_ID tri,
24 NETSIM_ID rx, NETSIM_ID ri)
26 double p = _propagation_get_received_power_dbm(find_propagation_info(
28 rx, ri), ldEventTime);
30 double rs = MW_TO_DBM(WSN_PHY(trx)->dReceiverSensivity);
39 return (1.0 - (1.0 / rs) * p);
45_declspec(dllexport)
int fn_NetSim_Zigbee_Run()
48 NETSIM_ID nDeviceId, nInterfaceId;
49 nEventType = pstruEventDetails->nEventType;
50 nSub_Event_Type = pstruEventDetails->nSubEventType;
51 nDeviceId = pstruEventDetails->nDeviceId;
52 nInterfaceId = pstruEventDetails->nInterfaceId;
59 NetSim_PACKET* pstruPacket = NULL;
61 dEventTime = pstruEventDetails->dEventTime;
63 if (WSN_MAC(nDeviceId)->pstruBuffer)
65 pstruPacket = WSN_MAC(nDeviceId)->pstruBuffer;
67 else if (fn_NetSim_GetBufferStatus(DEVICE_MAC_NW_INTERFACE(nDeviceId, nInterfaceId)->pstruAccessBuffer))
69 pstruPacket = fn_NetSim_Packet_GetPacketFromBuffer(DEVICE_MAC_NW_INTERFACE(nDeviceId, nInterfaceId)->pstruAccessBuffer, 0);
75 pstruEventDetails->nPacketId = pstruPacket->nPacketId;
76 if (pstruPacket->pstruAppData)
77 pstruEventDetails->nApplicationId = pstruPacket->pstruAppData->nApplicationId;
79 if (pstruPacket->nControlDataType / 100 != MAC_PROTOCOL_IEEE802_15_4)
81 if (WSN_MAC(nDeviceId))
83 if (WSN_MAC(nGlobalPANCoordinatorId)->nBeaconMode == BEACON_ENABLE && WSN_MAC(nGlobalPANCoordinatorId)->nMacBeaconOrder <= 14)
85 if (pstruSuperFrame->nSuperFrameStatus == CAPMODE)
107 NetSim_PACKET* pstruPacket;
109 WSN_MAC(nDeviceId)->nNodeStatus = IDLE;
110 pstruPacket = pstruEventDetails->pPacket;
111 pstruPacket->pstruMacData->dArrivalTime = pstruEventDetails->dEventTime;
112 pstruPacket->pstruMacData->dStartTime = pstruEventDetails->dEventTime;
113 pstruPacket->pstruMacData->dEndTime = pstruEventDetails->dEventTime;
115 if (WSN_MAC_HEADER(pstruPacket)->nAckRequestFlag)
117 NetSim_PACKET* pstruAckPacket;
118 IEEE802_15_4_HEADER* pstruHeader;
120 if (!ZIGBEE_CHANGERADIOSTATE(nDeviceId, WSN_PHY(nDeviceId)->nRadioState, TRX_ON_BUSY))
125 WSN_MAC(nDeviceId)->nNodeStatus = TX_MODE;
127 pstruAckPacket = fn_NetSim_Packet_CreatePacket(MAC_LAYER);
128 pstruAckPacket->dEventTime = pstruEventDetails->dEventTime;
129 pstruAckPacket->nControlDataType = ACK_FRAME;
130 pstruAckPacket->nPacketType = PacketType_Control;
131 pstruAckPacket->nTransmitterId = pstruPacket->nReceiverId;
132 pstruAckPacket->nReceiverId = pstruPacket->nTransmitterId;
133 pstruAckPacket->nSourceId = pstruAckPacket->nTransmitterId;
134 add_dest_to_packet(pstruAckPacket, pstruAckPacket->nReceiverId);
135 pstruAckPacket->pstruMacData->dArrivalTime = pstruAckPacket->dEventTime;
136 pstruAckPacket->pstruMacData->dStartTime = pstruAckPacket->dEventTime;
137 pstruAckPacket->pstruMacData->dEndTime = pstruAckPacket->dEventTime;
138 pstruAckPacket->pstruMacData->szSourceMac = (pstruPacket->pstruMacData->szDestMac);
139 pstruAckPacket->pstruMacData->szDestMac = (pstruPacket->pstruMacData->szSourceMac);
140 pstruAckPacket->pstruMacData->nMACProtocol = MAC_PROTOCOL_IEEE802_15_4;
142 pstruAckPacket->pstruMacData->dOverhead = 5;
143 pstruAckPacket->pstruMacData->dPacketSize = pstruAckPacket->pstruMacData->dPayload + pstruPacket->pstruMacData->dOverhead;
144 pstruEventDetails->dPacketSize = pstruAckPacket->pstruMacData->dPacketSize;
146 pstruHeader = fnpAllocateMemory(1,
sizeof(IEEE802_15_4_HEADER));
147 pstruAckPacket->pstruMacData->Packet_MACProtocol = pstruHeader;
149 pstruEventDetails->pPacket = pstruAckPacket;
151 pstruEventDetails->nPacketId = 0;
152 pstruEventDetails->dEventTime = ldEventTime + 12 * dUnitSymbolTime;
153 pstruAckPacket->nPacketId = 0;
155 pstruEventDetails->nEventType = PHYSICAL_OUT_EVENT;
156 pstruEventDetails->nSubEventType = 0;
157 fnpAddEvent(pstruEventDetails);
158 pstruEventDetails->dEventTime = ldEventTime;
160 if (pstruPacket->nControlDataType != ACK_FRAME && pstruPacket->nControlDataType / 100 != MAC_PROTOCOL_IEEE802_15_4)
162 pstruMetrics[pstruEventDetails->nDeviceId - 1]->pstruIEEE802_15_4_Metrics->nPacketReceived++;
164 if (pstruPacket->nControlDataType / 100 != MAC_PROTOCOL_IEEE802_15_4)
167 pstruPacket->pstruMacData->dOverhead -= 5;
168 pstruPacket->pstruMacData->dPacketSize = pstruPacket->pstruMacData->dPayload + pstruPacket->pstruMacData->dOverhead;
169 pstruEventDetails->dPacketSize = pstruPacket->pstruMacData->dPacketSize;
170 pstruEventDetails->pPacket = pstruPacket;
171 pstruEventDetails->nEventType = NETWORK_IN_EVENT;
172 pstruEventDetails->nSubEventType = 0;
173 pstruEventDetails->nPacketId = pstruPacket->nPacketId;
174 if (pstruPacket->pstruAppData)
176 pstruEventDetails->nSegmentId = pstruPacket->pstruAppData->nSegmentId;
177 pstruEventDetails->nApplicationId = pstruPacket->pstruAppData->nApplicationId;
179 fn_NetSim_Zigbee_FreePacket(pstruPacket);
180 pstruEventDetails->nProtocolId = fn_NetSim_Stack_GetNWProtocol(pstruEventDetails->nDeviceId);
182 fnpAddEvent(pstruEventDetails);
184 else if (pstruPacket->nControlDataType == BEACON_FRAME)
186 BEACONFRAME* pstruBeaconFrame;
187 pstruMetrics[pstruEventDetails->nDeviceId - 1]->pstruIEEE802_15_4_Metrics->nBeaconReceived++;
188 pstruBeaconFrame = WSN_MAC_HEADER(pstruPacket)->pstruBeaconFrame;
189 if (WSN_MAC(pstruEventDetails->nDeviceId)->nBeaconReceivedFlag == 0 && WSN_MAC(pstruEventDetails->nDeviceId)->nLastBeaconId < pstruBeaconFrame->nBeaconId)
191 WSN_MAC(pstruEventDetails->nDeviceId)->nLastBeaconId = pstruBeaconFrame->nBeaconId;
192 pstruEventDetails->nEventType = PHYSICAL_OUT_EVENT;
193 pstruEventDetails->pPacket->nTransmitterId = pstruEventDetails->nDeviceId;
194 pstruEventDetails->pPacket->nReceiverId = 0;
196 pstruMetrics[pstruEventDetails->nDeviceId - 1]->pstruIEEE802_15_4_Metrics->nBeaconForwarded++;
200 fn_NetSim_Packet_FreePacket(pstruEventDetails->pPacket);
203 else if (pstruPacket->nControlDataType == ACK_FRAME)
205 pstruMetrics[pstruEventDetails->nDeviceId - 1]->pstruIEEE802_15_4_Metrics->nAckReceived++;
207 WSN_MAC(pstruEventDetails->nDeviceId)->nRetryCount = 0;
208 if (WSN_MAC(pstruEventDetails->nDeviceId)->pstruBuffer)
210 if (WSN_MAC(pstruEventDetails->nDeviceId)->pstruBuffer->ReceiveAckNotification)
212 WSN_MAC(pstruEventDetails->nDeviceId)->pstruBuffer->ReceiveAckNotification(pstruPacket);
214 fn_NetSim_Packet_FreePacket(WSN_MAC(pstruEventDetails->nDeviceId)->pstruBuffer);
215 WSN_MAC(pstruEventDetails->nDeviceId)->pstruBuffer = NULL;
218 if (fn_NetSim_GetBufferStatus(NETWORK->ppstruDeviceList[pstruEventDetails->nDeviceId - 1]->ppstruInterfaceList[pstruEventDetails->nInterfaceId - 1]->pstruAccessInterface->pstruAccessBuffer))
220 NetSim_PACKET* packet = fn_NetSim_Packet_GetPacketFromBuffer(NETWORK->ppstruDeviceList[pstruEventDetails->nDeviceId - 1]->ppstruInterfaceList[pstruEventDetails->nInterfaceId - 1]->pstruAccessInterface->pstruAccessBuffer, 0);
221 WSN_MAC(pstruEventDetails->nDeviceId)->nNodeStatus = IDLE;
223 pstruEventDetails->dEventTime += 40 * dUnitSymbolTime;
224 pstruEventDetails->pPacket = NULL;
225 if (packet->pstruAppData)
227 pstruEventDetails->nApplicationId = packet->pstruAppData->nApplicationId;
228 pstruEventDetails->nSegmentId = packet->pstruAppData->nSegmentId;
232 pstruEventDetails->nApplicationId = 0;
233 pstruEventDetails->nSegmentId = 0;
235 pstruEventDetails->dPacketSize = fnGetPacketSize(packet);
236 pstruEventDetails->nPacketId = packet->nPacketId;
238 pstruEventDetails->nEventType = MAC_OUT_EVENT;
239 pstruEventDetails->nSubEventType = 0;
240 pstruEventDetails->nProtocolId = MAC_PROTOCOL_IEEE802_15_4;
242 fnpAddEvent(pstruEventDetails);
245 fn_NetSim_Packet_FreePacket(pstruPacket);
249 case PHYSICAL_OUT_EVENT:
251 NetSim_EVENTDETAILS pevent;
253 NetSim_PACKET* pstruPacket;
255 NETSIM_ID nDevice_Id;
257 NETSIM_ID nDevice_PortId;
258 double dTxTime = 0.0f;
262 memcpy(&pevent, pstruEventDetails,
sizeof pevent);
264 nDevice_Type = pstruEventDetails->nDeviceType;
266 nDevice_Id = pstruEventDetails->nDeviceId;
268 nDevice_PortId = pstruEventDetails->nInterfaceId;
270 nLink_Id = DEVICE_PHYLAYER(nDevice_Id, nDevice_PortId)->nLinkId;
272 pstruPacket = pstruEventDetails->pPacket;
273 pstruPacket->pstruPhyData->dArrivalTime = pstruEventDetails->dEventTime;
274 pstruPacket->pstruPhyData->dPayload = pstruPacket->pstruMacData->dPacketSize;
276 if (pstruPacket->nControlDataType == ACK_FRAME)
277 pstruPacket->pstruPhyData->dOverhead = 1;
279 pstruPacket->pstruPhyData->dOverhead = 6;
280 pstruPacket->pstruPhyData->dPacketSize = pstruPacket->pstruPhyData->dPayload + pstruPacket->pstruPhyData->dOverhead;
281 pstruEventDetails->dPacketSize = pstruPacket->pstruPhyData->dPacketSize;
283 if (NETWORK->ppstruNetSimLinks[nLink_Id - 1]->puniMedProp.pstruWirelessLink.dDataRateUp)
284 dDataRate = NETWORK->ppstruNetSimLinks[nLink_Id - 1]->puniMedProp.pstruWirelessLink.dDataRateUp;
288 dTxTime = pstruPacket->pstruPhyData->dPacketSize * 8 / dDataRate;
290 if (pstruPacket->pstruPhyData->dArrivalTime <= NETWORK->ppstruDeviceList[nDevice_Id - 1]->ppstruInterfaceList[nDevice_PortId - 1]->pstruPhysicalLayer->dLastPacketEndTime)
292 pstruPacket->pstruPhyData->dStartTime = NETWORK->ppstruDeviceList[nDevice_Id - 1]->ppstruInterfaceList[nDevice_PortId - 1]->pstruPhysicalLayer->dLastPacketEndTime;
295 pstruPacket->pstruPhyData->dStartTime = pstruPacket->pstruPhyData->dArrivalTime;
297 pstruPacket->pstruPhyData->dEndTime = pstruPacket->pstruPhyData->dStartTime + dTxTime;
298 NETWORK->ppstruDeviceList[nDevice_Id - 1]->ppstruInterfaceList[nDevice_PortId - 1]->pstruPhysicalLayer->dLastPacketEndTime = pstruPacket->pstruPhyData->dEndTime;
300 for (nLoop = 1; nLoop <= NETWORK->ppstruNetSimLinks[nLink_Id - 1]->puniDevList.pstruMP2MP.nConnectedDeviceCount; nLoop++)
302 NETSIM_ID ncon = NETWORK->ppstruNetSimLinks[nLink_Id - 1]->puniDevList.pstruMP2MP.anDevIds[nLoop - 1];
303 if (ncon == pstruPacket->nTransmitterId)
306 WSN_PHY(ncon)->dTotalReceivedPower += GET_RX_POWER_mw(pstruPacket->nTransmitterId, ncon, pstruEventDetails->dEventTime);
308 if (ncon == pstruPacket->nReceiverId || pstruPacket->nReceiverId == 0)
310 NetSim_PACKET* packet = pstruPacket;
311 if (pstruPacket->nReceiverId == 0)
313 packet = fn_NetSim_Packet_CopyPacket(pstruPacket);
316 if (WSN_PHY(ncon)->dTotalReceivedPower - GET_RX_POWER_mw(pstruPacket->nTransmitterId, ncon, pstruEventDetails->dEventTime) >= WSN_PHY(ncon)->dReceiverSensivity)
317 packet->nPacketStatus = PacketStatus_Collided;
319 if (GET_RX_POWER_dbm(pstruPacket->nTransmitterId, ncon, pstruEventDetails->dEventTime) > MW_TO_DBM(WSN_PHY(ncon)->dReceiverSensivity))
321 if (WSN_PHY(ncon)->nRadioState == RX_ON_IDLE)
323 if (!ZIGBEE_CHANGERADIOSTATE(ncon, WSN_PHY(ncon)->nRadioState, RX_ON_BUSY))
325 if (isBroadcastPacket(packet) ||
326 isMulticastPacket(packet))
332 WSN_MAC(ncon)->nNodeStatus = RX_MODE;
334 pstruEventDetails->dEventTime = packet->pstruPhyData->dEndTime;
335 pstruEventDetails->dPacketSize = packet->pstruPhyData->dPacketSize;
336 pstruEventDetails->nDeviceId = ncon;
337 packet->nReceiverId = pstruEventDetails->nDeviceId;
338 pstruEventDetails->nDeviceType = NETWORK->ppstruDeviceList[ncon - 1]->nDeviceType;
339 pstruEventDetails->nInterfaceId = fn_NetSim_Stack_GetWirelessInterface(nLink_Id, ncon);
340 pstruEventDetails->pPacket = packet;
341 pstruEventDetails->nEventType = PHYSICAL_IN_EVENT;
342 fnpAddEvent(pstruEventDetails);
347 if (WSN_MAC_HEADER(pstruPacket)->nAckRequestFlag)
349 pevent.nEventType = TIMER_EVENT;
350 pevent.nSubEventType = ACK_TIMEOUT;
351 pevent.dEventTime = pstruPacket->pstruPhyData->dEndTime + WSN_PHY(nDevice_Id)->macAckWaitDuration * 4 / dDataRate;
352 pevent.pPacket = NULL;
353 fnpAddEvent(&pevent);
356 if (pstruPacket->nControlDataType != ACK_FRAME && pstruPacket->nControlDataType / 100 != MAC_PROTOCOL_IEEE802_15_4 && txFlag ==
true)
358 pstruMetrics[nDevice_Id - 1]->pstruIEEE802_15_4_Metrics->nPacketTransmitted++;
360 if (pstruPacket->nControlDataType == ACK_FRAME && txFlag ==
true)
362 pstruMetrics[nDevice_Id - 1]->pstruIEEE802_15_4_Metrics->nAckTransmitted++;
366 NETWORK->ppstruDeviceList[nDevice_Id - 1]->ppstruInterfaceList[nDevice_PortId - 1]->pstruPhysicalLayer->dLastPacketEndTime = pstruPacket->pstruPhyData->dEndTime;
367 if (!pstruPacket->nReceiverId || txFlag ==
false)
368 fn_NetSim_Packet_FreePacket(pstruPacket);
370 pstruEventDetails->dEventTime = NETWORK->ppstruDeviceList[nDevice_Id - 1]->ppstruInterfaceList[nDevice_PortId - 1]->pstruPhysicalLayer->dLastPacketEndTime + 1;
371 pstruEventDetails->nDeviceId = nDevice_Id;
372 pstruEventDetails->nEventType = TIMER_EVENT;
373 pstruEventDetails->nSubEventType = UPDATE_MEDIUM;
374 pstruEventDetails->pPacket = NULL;
376 fnpAddEvent(pstruEventDetails);
379 case PHYSICAL_IN_EVENT:
381 NetSim_PACKET* pstruPacket;
382 PACKET_STATUS nPacketStatus;
383 double dFadingPower = 0;
388 pstruPacket = pstruEventDetails->pPacket;
389 if (pstruPacket->nReceiverId && pstruPacket->nReceiverId != pstruEventDetails->nDeviceId)
391 fnNetSimError(
"Different device packet received..");
396 if (!ZIGBEE_CHANGERADIOSTATE(pstruEventDetails->nDeviceId, WSN_PHY(pstruEventDetails->nDeviceId)->nRadioState, RX_ON_IDLE))
399 if (WSN_PHY(pstruEventDetails->nDeviceId)->dTotalReceivedPower - GET_RX_POWER_mw(pstruPacket->nTransmitterId, pstruPacket->nReceiverId, pstruEventDetails->dEventTime) >= WSN_PHY(pstruEventDetails->nDeviceId)->dReceiverSensivity)
400 pstruPacket->nPacketStatus = PacketStatus_Collided;
402 nPacketStatus = pstruPacket->nPacketStatus;
404 double pdbm = GET_RX_POWER_dbm(pstruPacket->nTransmitterId,
405 pstruPacket->nReceiverId,
406 pstruEventDetails->dEventTime);
409 ifid = fn_NetSim_Stack_GetConnectedInterface(pstruEventDetails->nDeviceId,
410 pstruEventDetails->nInterfaceId,
411 pstruPacket->nTransmitterId);
414 dFadingPower = _propagation_calculate_fadingloss(
415 find_propagation_info(pstruPacket->nTransmitterId, ifid,
416 pstruEventDetails->nDeviceId, pstruEventDetails->nInterfaceId));
418 pdbm -= dFadingPower;
419 ZIGBEE_SINR(&SNR, WSN_PHY(pstruEventDetails->nDeviceId)->dTotalReceivedPower, DBM_TO_MW(pdbm));
421 dBER = fn_NetSim_Zigbee_CalculateBER(SNR);
423 RadioMeasurements_802_15_4_Log(pstruPacket, pstruPacket->nTransmitterId, ifid,
424 pstruEventDetails->nDeviceId, pstruEventDetails->nInterfaceId);
426 if (fn_NetSim_Packet_DecideError(dBER, pstruEventDetails->dPacketSize))
428 pstruPacket->nPacketStatus = PacketStatus_Error;
429 nPacketStatus = PacketStatus_Error;
432 fn_NetSim_WritePacketTrace(pstruPacket);
434 if (pstruPacket->nControlDataType == ACK_FRAME)
435 pstruPacket->pstruPhyData->dOverhead -= 1;
437 pstruPacket->pstruPhyData->dOverhead -= 6;
439 pstruPacket->pstruPhyData->dPacketSize = pstruPacket->pstruPhyData->dPayload + pstruPacket->pstruPhyData->dOverhead;
440 pstruEventDetails->dPacketSize = pstruPacket->pstruPhyData->dPacketSize;
442 if ((nPacketStatus == PacketStatus_Error) || (nPacketStatus == PacketStatus_Collided))
444 fn_NetSim_Metrics_Add(pstruPacket);
445 fn_NetSim_Packet_FreePacket(pstruPacket);
446 WSN_MAC(pstruEventDetails->nDeviceId)->nNodeStatus = IDLE;
450 pstruPacket->pstruPhyData->dArrivalTime = pstruEventDetails->dEventTime;
451 pstruPacket->pstruPhyData->dStartTime = pstruEventDetails->dEventTime;
452 pstruPacket->pstruPhyData->dEndTime = pstruEventDetails->dEventTime;
454 fn_NetSim_Metrics_Add(pstruPacket);
457 pstruEventDetails->nEventType = MAC_IN_EVENT;
459 fnpAddEvent(pstruEventDetails);
465 switch (nSub_Event_Type)
467 case CARRIERSENSE_START:
469 if (WSN_MAC(nGlobalPANCoordinatorId)->nBeaconMode == BEACON_ENABLE && WSN_MAC(nGlobalPANCoordinatorId)->nMacBeaconOrder <= 14)
471 if (pstruSuperFrame->nSuperFrameStatus == CAPMODE)
486 case CARRIERSENSE_END:
488 if (WSN_MAC(nGlobalPANCoordinatorId)->nBeaconMode == BEACON_ENABLE && WSN_MAC(nGlobalPANCoordinatorId)->nMacBeaconOrder <= 14)
490 if (pstruSuperFrame->nSuperFrameStatus == CAPMODE)
507 double dtime = pstruEventDetails->dEventTime;
508 NETSIM_ID nLink_Id, nConnectionID, nConnectionPortID, nLoop;
509 NETSIM_ID nTransmitterID;
511 nTransmitterID = pstruEventDetails->nDeviceId;
513 ZIGBEE_CHANGERADIOSTATE(nTransmitterID, WSN_PHY(nTransmitterID)->nRadioState, RX_ON_IDLE);
514 if (WSN_PHY(nTransmitterID)->nRadioState != RX_OFF)
515 WSN_MAC(nTransmitterID)->nNodeStatus = IDLE;
516 nLink_Id = fn_NetSim_Stack_GetConnectedDevice(pstruEventDetails->nDeviceId, pstruEventDetails->nInterfaceId, &nConnectionID, &nConnectionPortID);
518 for (nLoop = 1; nLoop <= NETWORK->ppstruNetSimLinks[nLink_Id - 1]->puniDevList.pstruMP2MP.nConnectedDeviceCount; nLoop++)
520 NETSIM_ID ncon = NETWORK->ppstruNetSimLinks[nLink_Id - 1]->puniDevList.pstruMP2MP.anDevIds[nLoop - 1];
521 if (ncon != pstruEventDetails->nDeviceId)
523 WSN_PHY(ncon)->dTotalReceivedPower -= GET_RX_POWER_mw(nTransmitterID, ncon, pstruEventDetails->dEventTime);
525 if (WSN_PHY(ncon)->dTotalReceivedPower < WSN_PHY(ncon)->dReceiverSensivity)
526 WSN_PHY(ncon)->dTotalReceivedPower = 0;
530 for (nLoop = 1; nLoop <= NETWORK->ppstruNetSimLinks[nLink_Id - 1]->puniDevList.pstruMP2MP.nConnectedDeviceCount; nLoop++)
532 nDeviceId = NETWORK->ppstruNetSimLinks[nLink_Id - 1]->puniDevList.pstruMP2MP.anDevIds[nLoop - 1];
533 IEEE802_15_4_MAC_VAR* macVar = WSN_MAC(nDeviceId);
534 IEEE802_15_4_PHY_VAR* phyVar = WSN_PHY(nDeviceId);
536 (macVar->nNodeStatus == IDLE) && (phyVar->nRadioState == RX_ON_IDLE) &&
537 fn_NetSim_GetBufferStatus(NETWORK->ppstruDeviceList[nDeviceId - 1]->ppstruInterfaceList[0]->pstruAccessInterface->pstruAccessBuffer))
539 NetSim_PACKET* packet = fn_NetSim_Packet_GetPacketFromBuffer(NETWORK->ppstruDeviceList[nDeviceId - 1]->ppstruInterfaceList[0]->pstruAccessInterface->pstruAccessBuffer, 0);
542 if (nDeviceId == nTransmitterID)
543 pstruEventDetails->dEventTime += 40 * dUnitSymbolTime;
545 pstruEventDetails->dEventTime = dtime;
546 pstruEventDetails->nDeviceId = nDeviceId;
547 pstruEventDetails->nEventType = MAC_OUT_EVENT;
548 pstruEventDetails->nSubEventType = 0;
549 pstruEventDetails->pPacket = NULL;
550 pstruEventDetails->dPacketSize = fnGetPacketSize(packet);
551 pstruEventDetails->nPacketId = packet->nPacketId;
552 if (packet->pstruAppData)
554 pstruEventDetails->nApplicationId = packet->pstruAppData->nApplicationId;
555 pstruEventDetails->nSegmentId = packet->pstruAppData->nSegmentId;
559 pstruEventDetails->nApplicationId = 0;
560 pstruEventDetails->nSegmentId = 0;
562 fnpAddEvent(pstruEventDetails);
569 if (WSN_MAC(nDeviceId)->pstruBuffer)
571 WSN_MAC(nDeviceId)->nRetryCount++;
572 if (WSN_MAC(nDeviceId)->nRetryCount <= WSN_MAC(nDeviceId)->nMacMaxFrameRetries)
574 pstruEventDetails->nEventType = MAC_OUT_EVENT;
575 pstruEventDetails->nSubEventType = 0;
576 fnpAddEvent(pstruEventDetails);
580 WSN_MAC(nDeviceId)->nRetryCount = 0;
581 if (WSN_MAC(nDeviceId)->pstruBuffer->DropNotification)
582 WSN_MAC(nDeviceId)->pstruBuffer->DropNotification(WSN_MAC(nDeviceId)->pstruBuffer);
584 WSN_MAC(nDeviceId)->pstruBuffer->nPacketStatus = PacketStatus_Buffer_Dropped;
585 fn_NetSim_WritePacketTrace(WSN_MAC(nDeviceId)->pstruBuffer);
586 fn_NetSim_Packet_FreePacket(WSN_MAC(nDeviceId)->pstruBuffer);
587 WSN_MAC(nDeviceId)->pstruBuffer = NULL;
589 if (WSN_MAC(nDeviceId)->nNodeStatus == IDLE)
590 if (fn_NetSim_GetBufferStatus(NETWORK->ppstruDeviceList[pstruEventDetails->nDeviceId - 1]->ppstruInterfaceList[pstruEventDetails->nInterfaceId - 1]->pstruAccessInterface->pstruAccessBuffer))
592 NetSim_PACKET* packet = fn_NetSim_Packet_GetPacketFromBuffer(NETWORK->ppstruDeviceList[pstruEventDetails->nDeviceId - 1]->ppstruInterfaceList[pstruEventDetails->nInterfaceId - 1]->pstruAccessInterface->pstruAccessBuffer, 0);
594 pstruEventDetails->dEventTime += (double)40 * dUnitSymbolTime;
595 pstruEventDetails->pPacket = NULL;
596 if (packet->pstruAppData)
598 pstruEventDetails->nApplicationId = packet->pstruAppData->nApplicationId;
599 pstruEventDetails->nSegmentId = packet->pstruAppData->nSegmentId;
603 pstruEventDetails->nApplicationId = 0;
604 pstruEventDetails->nSegmentId = 0;
606 pstruEventDetails->dPacketSize = fnGetPacketSize(packet);
607 pstruEventDetails->nPacketId = packet->nPacketId;
609 pstruEventDetails->nEventType = MAC_OUT_EVENT;
610 pstruEventDetails->nSubEventType = 0;
611 pstruEventDetails->nProtocolId = MAC_PROTOCOL_IEEE802_15_4;
613 fnpAddEvent(pstruEventDetails);
619 case SUPERFRAME_EVENT:
624 case BEACON_TRANSMISSION_END:
628 for (nLoop = 0; nLoop < NETWORK->nDeviceCount; nLoop++)
630 if (fn_NetSim_GetBufferStatus(DEVICE_INTERFACE(nLoop + 1, 1)->pstruAccessInterface->pstruAccessBuffer))
632 WSN_MAC(nLoop + 1)->nNodeStatus = IDLE;
633 WSN_MAC(nLoop + 1)->nRetryCount = 0;
634 WSN_MAC(nLoop + 1)->nNoOfBackOff = 0;
636 pstruEventDetails->nDeviceId = (NETSIM_ID)nLoop + 1;
637 pstruEventDetails->nInterfaceId = 1;
638 pstruEventDetails->pPacket = fn_NetSim_Packet_GetPacketFromBuffer(DEVICE_MAC_NW_INTERFACE(pstruEventDetails->nDeviceId, pstruEventDetails->nInterfaceId)->pstruAccessBuffer, 1);
639 pstruEventDetails->dPacketSize = pstruEventDetails->pPacket->pstruNetworkData->dPacketSize;
640 pstruEventDetails->nEventType = MAC_OUT_EVENT;
641 pstruEventDetails->nSubEventType = 0;
642 pstruEventDetails->nProtocolId = MAC_PROTOCOL_IEEE802_15_4;
643 fnpAddEvent(pstruEventDetails);
647 pstruSuperFrame->nSuperFrameStatus = CAPMODE;
648 pstruEventDetails->dEventTime = pstruEventDetails->dEventTime + pstruSuperFrame->dCAPLength;
649 pstruEventDetails->nDeviceId = nGlobalPANCoordinatorId;
650 pstruEventDetails->nInterfaceId = 1;
651 pstruEventDetails->nEventType = TIMER_EVENT;
652 pstruEventDetails->nSubEventType = CAP_END;
653 pstruEventDetails->nProtocolId = MAC_PROTOCOL_IEEE802_15_4;
654 fnpAddEvent(pstruEventDetails);
660 pstruSuperFrame->nSuperFrameStatus = CFPMODE;
661 pstruEventDetails->dEventTime = pstruEventDetails->dEventTime + pstruSuperFrame->dCFPLength;
662 pstruEventDetails->nDeviceId = nGlobalPANCoordinatorId;
663 pstruEventDetails->nInterfaceId = 1;
664 pstruEventDetails->nEventType = TIMER_EVENT;
665 pstruEventDetails->nSubEventType = CFP_END;
666 pstruEventDetails->nProtocolId = MAC_PROTOCOL_IEEE802_15_4;
667 fnpAddEvent(pstruEventDetails);
672 NETSIM_ID nLink_Id, nConnectionID, nConnectionPortID, nLoop;
673 nLink_Id = fn_NetSim_Stack_GetConnectedDevice(pstruEventDetails->nDeviceId, pstruEventDetails->nInterfaceId, &nConnectionID, &nConnectionPortID);
674 for (nLoop = 1; nLoop <= NETWORK->ppstruNetSimLinks[nLink_Id - 1]->puniDevList.pstruMP2MP.nConnectedDeviceCount; nLoop++)
676 nDeviceId = NETWORK->ppstruNetSimLinks[nLink_Id - 1]->puniDevList.pstruMP2MP.anDevIds[nLoop - 1];
677 WSN_MAC(nDeviceId)->nNodeStatus = OFF;
678 ZIGBEE_CHANGERADIOSTATE(nDeviceId, WSN_PHY(nDeviceId)->nRadioState, SLEEP);
681 pstruSuperFrame->nSuperFrameStatus = INACTIVEMODE;
685 case SUBEVENT_GETLINKQUALITY:
687 double* pass = pstruEventDetails->szOtherDetails;
688 NETSIM_ID trx = (NETSIM_ID)pass[0];
689 NETSIM_ID tri = (NETSIM_ID)pass[1];
690 NETSIM_ID rx = (NETSIM_ID)pass[2];
691 NETSIM_ID ri = (NETSIM_ID)pass[3];
692 pass[4] = zigbee_get_link_quality(trx, tri, rx, ri);
696 fnNetSimError(
"Invalid event %d for zigbee protocol\n", pstruEventDetails->nSubEventType);
702 fnNetSimError(
"Invalid event 5d for zigbee protocol\n", pstruEventDetails->nEventType);
708_declspec(dllexport)
int fn_NetSim_Zigbee_Configure(
void** var)
710 return fn_NetSim_Zigbee_Configure_F(var);
713_declspec (dllexport)
int fn_NetSim_Zigbee_Init()
715 init_linkpacketlog();
716 RadioMeasurements_802_15_4_Init();
717 return fn_NetSim_Zigbee_Init_F();
723_declspec(dllexport)
int fn_NetSim_Zigbee_Finish()
725 fn_NetSim_IEEE802_15_4_FreePropagationInfo();
726 fn_NetSim_Zigbee_Finish_F();
727 RadioMeasurements_802_15_4_Finish();
728 LinkPacketLog_close();
732_declspec (dllexport)
char* fn_NetSim_Zigbee_Trace(
int nSubEvent)
734 return (fn_NetSim_Zigbee_Trace_F(nSubEvent));
737_declspec(dllexport)
int fn_NetSim_Zigbee_FreePacket(NetSim_PACKET* pstruPacket)
739 return fn_NetSim_Zigbee_FreePacket_F(pstruPacket);
742_declspec(dllexport)
int fn_NetSim_Zigbee_CopyPacket(NetSim_PACKET* pstruSrcPacket, NetSim_PACKET* pstruDestPacket)
744 return fn_NetSim_Zigbee_CopyPacket_F(pstruSrcPacket, pstruDestPacket);
747_declspec(dllexport)
int fn_NetSim_Zigbee_Metrics(PMETRICSWRITER metricsWriter)
749 return fn_NetSim_Zigbee_Metrics_F(metricsWriter);
756_declspec(dllexport)
char* fn_NetSim_Zigbee_ConfigPacketTrace(
const void* xmlNetSimNode)
766_declspec(dllexport)
int fn_NetSim_Zigbee_WritePacketTrace(NetSim_PACKET* pstruPacket,
char** ppszTrace)
773int fn_NetSim_Zigbee_ChannelFormation(CHANNELS** pstruChannelList)
775 *pstruChannelList = calloc(1,
sizeof(CHANNELS));
776 (*pstruChannelList)->nChannelStatus = IDLE;
777 (*pstruChannelList)->dFrequency = WSN_PHY(nGlobalPANCoordinatorId)->dFrequencyBand_MHz;
778 (*pstruChannelList)->nChannelNumber = (int)((*pstruChannelList)->dFrequency - 2405) / 5 + 11;
782_declspec(dllexport)
int fn_NetSim_ZigBee_SinkNodeApp()
784 fn_NetSim_Packet_FreePacket(pstruEventDetails->pPacket);
788bool get_protocol_log_status(
char* logname)
792 sprintf(str,
"%s/%s", pszIOPath,
"ProtocolLogsConfig.txt");
793 fp = fopen(str,
"r");
798 while (fgets(data, BUFSIZ, fp))
801 sprintf(str,
"%s=true", logname);
802 if (!_strnicmp(data, str, strlen(str)))
double dReceiverSensivity
-85 dbm default