16#include "../UWAN/UWAN.h"
17#include "AdvancedPlots.h"
18#include "../BatteryModel/BatteryModel.h"
19#pragma comment(lib,"AdvancedPlots.lib")
22void wait_for_random_time();
23int fn_NetSim_Aloha_handleMobility(NETSIM_ID d);
25PHY_MODULATION getModulationFromString(
char* val)
27 if(!_stricmp(val,
"QPSK"))
28 return Modulation_QPSK;
29 else if(!_stricmp(val,
"BPSK"))
30 return Modulation_BPSK;
31 else if (!_stricmp(val,
"FSK"))
32 return Modulation_FSK;
33 else if(!_stricmp(val,
"16QAM"))
34 return Modulation_16_QAM;
35 else if(!_stricmp(val,
"64QAM"))
36 return Modulation_64_QAM;
37 else if (!_stricmp(val,
"256QAM"))
38 return Modulation_256_QAM;
41 fnNetSimError(
"Unknown modulation %s. Assigning QPSK\n",val);
42 return Modulation_QPSK;
46_declspec(dllexport)
int fn_NetSim_Aloha_Configure(
void** var)
50 NETSIM_ID nInterfaceId;
51 LAYER_TYPE nLayerType;
52 xmlNetSimNode = var[2];
53 nDeviceId = *((NETSIM_ID*)var[3]);
54 nInterfaceId = *((NETSIM_ID*)var[4]);
55 nLayerType = *((LAYER_TYPE*)var[5]);
60 PALOHA_PHY_VAR phy = ALOHA_PHY(nDeviceId,nInterfaceId);
65 phy = (PALOHA_PHY_VAR)calloc(1,
sizeof *phy);
66 DEVICE_PHYVAR(nDeviceId,nInterfaceId) = phy;
69 phy->frequency = fn_NetSim_Config_read_Frequency(xmlNetSimNode,
"FREQUENCY",
70 ALOHA_FREQUENCY_DEFAULT,
"MHZ");
72 phy->bandwidth = fn_NetSim_Config_read_Frequency(xmlNetSimNode,
"BANDWIDTH",
73 ALOHA_BANDWIDTH_DEFAULT,
"MHz");
75 phy->tx_power = fn_NetSim_Config_read_txPower(xmlNetSimNode,
"TX_POWER",
76 ALOHA_TX_POWER_DEFAULT,
"MW");
78 getXmlVar(&phy->rx_sensitivity,RECEIVER_SENSITIVITY_DBM,xmlNetSimNode,1, _DOUBLE,ALOHA);
79 getXmlVar(&szVal,MODULATION,xmlNetSimNode,1,_STRING,ALOHA);
80 phy->modulation = getModulationFromString(szVal);
82 phy->data_rate = fn_NetSim_Config_read_dataRate(xmlNetSimNode,
"DATA_RATE",
83 ALOHA_DATA_RATE_DEFAULT,
"MBPS");
85 void* pXmlChild = fn_NetSim_xmlGetChildElement(xmlNetSimNode,
"POWER", 0);
88 fn_NetSim_Configure_UWAN_POWER(xmlNetSimNode, nDeviceId,nInterfaceId);
95 PALOHA_MAC_VAR mac = ALOHA_MAC(nDeviceId,nInterfaceId);
100 mac = (PALOHA_MAC_VAR)calloc(1,
sizeof *mac);
101 DEVICE_MACVAR(nDeviceId,nInterfaceId) = mac;
105 szVal = fn_NetSim_xmlConfig_GetVal(xmlNetSimNode,
"MAC_ADDRESS",1);
108 NETWORK->ppstruDeviceList[nDeviceId-1]->ppstruInterfaceList[nInterfaceId-1]->pstruMACLayer->szMacAddress = STR_TO_MAC(szVal);
112 getXmlVar(&mac->slotlength,SLOT_LENGTH,xmlNetSimNode,0, _DOUBLE,ALOHA);
114 getXmlVar(&mac->retryLimit, RETRY_LIMIT, xmlNetSimNode, 1, _UINT, ALOHA);
116 getXmlVar(&mac->isMACBuffer, IS_MAC_BUFFER, xmlNetSimNode, 1, _BOOL, ALOHA);
120 fnNetSimError(
"%d layer is not implemented for Aloha protocol\n",nLayerType);
126_declspec (dllexport)
int fn_NetSim_Aloha_Init()
130 init_linkpacketlog();
131 fn_NetSim_Aloha_CalulateReceivedPower();
132 fnMobilityRegisterCallBackFunction(fn_NetSim_Aloha_handleMobility);
133 for (i = 0; i < NETWORK->nDeviceCount; i++)
135 PALOHA_MAC_VAR mac = ALOHA_MAC(i + 1, 1);
136 PALOHA_PHY_VAR phy = ALOHA_PHY(i + 1, 1);
139 mac->isSlotted =
true;
145 mac->slotlength = get_slot_length(phy);
149 phy->transmitter_status = RX_ON_IDLE;
151 battery_set_mode(phy->battery, RX_ON_IDLE, ldEventTime);
152 phy->dInterferencePower = MW_TO_DBM(0);
157_declspec (dllexport)
int fn_NetSim_Aloha_Run()
159 switch(pstruEventDetails->nEventType)
162 fn_NetSim_Aloha_Handle_MacOut();
165 pstruEventDetails->nEventType = NETWORK_IN_EVENT;
166 fnpAddEvent(pstruEventDetails);
168 case PHYSICAL_OUT_EVENT:
169 fn_NetSim_Aloha_PhyOut();
171 case PHYSICAL_IN_EVENT:
172 fn_NetSim_Aloha_PhyIn();
175 fnNetSimError(
"Unknown event type %d for aloha protocol in %s",pstruEventDetails->nEventType,__FUNCTION__);
181_declspec(dllexport)
int fn_NetSim_Aloha_Finish()
184 LinkPacketLog_close();
185 fn_NetSim_Aloha_FreePropagationInfo();
189#include "Aloha_enum.h"
190_declspec (dllexport)
char* fn_NetSim_Aloha_Trace(
int nSubEvent)
192 return GetStringALOHA_Subevent(nSubEvent);
194_declspec(dllexport)
int fn_NetSim_Aloha_FreePacket(NetSim_PACKET* pstruPacket)
204_declspec(dllexport)
int fn_NetSim_Aloha_CopyPacket(NetSim_PACKET* pstruDestPacket,NetSim_PACKET* pstruSrcPacket)
214_declspec(dllexport)
int fn_NetSim_Aloha_Metrics(PMETRICSWRITER metricsWriter)
217 battery_metrics(metricsWriter);
224_declspec(dllexport)
char* fn_NetSim_Aloha_ConfigPacketTrace()
232_declspec(dllexport)
char* fn_NetSim_Aloha_WritePacketTrace(NetSim_PACKET* pstruPacket,
char** ppszTrace)
239int fn_NetSim_Configure_UWAN_POWER(
void* xmlNetSimNode,
int nDeviceId,
int nInterfaceId)
243 pXmlChild = fn_NetSim_xmlGetChildElement(xmlNetSimNode,
"POWER", 0);
244 szVal = fn_NetSim_xmlConfig_GetVal(pXmlChild,
"SOURCE", 1);
247 if (_stricmp(szVal,
"Battery"))
254 PALOHA_PHY_VAR phy = ALOHA_PHY(nDeviceId, nInterfaceId);
255 double dRechargingCurrent = 0;
257 double dInitialEnergy = 0;
259 getXmlVar(&dRechargingCurrent, RECHARGING_CURRENT_MA, pXmlChild, 0, _DOUBLE, BATTERY);
260 getXmlVar(&dVoltage, VOLTAGE_V, pXmlChild, 0, _DOUBLE, BATTERY);
261 getXmlVar(&dInitialEnergy, INITIAL_ENERGY, pXmlChild, 0, _DOUBLE, BATTERY);
262 dInitialEnergy *= dVoltage * 3600;
263 phy->battery = battery_init_new(nDeviceId,
269 getXmlVar(&dCurrent, TRANSMITTING_CURRENT_MA, pXmlChild, 0, _DOUBLE, BATTERY);
270 battery_add_new_mode(phy->battery, TRX_ON_BUSY, dCurrent,
"Transmitting energy(mJ)");
272 getXmlVar(&dCurrent, RECEIVING_CURRENT_MA, pXmlChild, 0, _DOUBLE, BATTERY);
273 battery_add_new_mode(phy->battery, RX_ON_BUSY, dCurrent,
"Receiving energy(mJ)");
275 getXmlVar(&dCurrent, IDLEMODE_CURRENT_MA, pXmlChild, 0, _DOUBLE, BATTERY);
276 battery_add_new_mode(phy->battery, RX_ON_IDLE, dCurrent,
"Idle energy(mJ)");
280static bool isChangeRadioIsPermitted(PALOHA_PHY_VAR phy, PHY_TX_STATUS newState)
282 PHY_TX_STATUS oldState = phy->transmitter_status;
283 if (oldState == RX_ON_IDLE)
285 if (oldState == RX_ON_BUSY && newState != RX_ON_IDLE)
287 if (oldState == TRX_ON_BUSY && newState != RX_ON_IDLE)
292bool set_radio_state(NETSIM_ID DeviceId, NETSIM_ID InterfaceId, PHY_TX_STATUS state)
294 PALOHA_PHY_VAR phy = ALOHA_PHY(DeviceId, InterfaceId);
295 if (phy == NULL) {
return false; }
296 ptrBATTERY battery = phy->battery;
298 if (phy->transmitter_status == RX_OFF)
301 if (!isChangeRadioIsPermitted(phy, state))
303 bool isChange =
true;
306 isChange = battery_set_mode(battery, state, ldEventTime);
310 phy->transmitter_status = state;
314 phy->transmitter_status = RX_OFF;
315 battery_set_mode(battery, state, ldEventTime);