|
260 |
NS_LOG_FUNCTION (this << spectrumRxParams); |
260 |
NS_LOG_FUNCTION (this << spectrumRxParams); |
261 |
LrWpanSpectrumValueHelper psdHelper; |
261 |
LrWpanSpectrumValueHelper psdHelper; |
262 |
|
262 |
|
263 |
|
|
|
264 |
Ptr<LrWpanSpectrumSignalParameters> lrWpanRxParams = DynamicCast<LrWpanSpectrumSignalParameters> (spectrumRxParams); |
265 |
NS_ASSERT (lrWpanRxParams != 0); |
266 |
Ptr<Packet> p = (lrWpanRxParams->packetBurst->GetPackets ()).front (); |
267 |
NS_ASSERT (p != 0); |
268 |
|
269 |
if (!m_edRequest.IsExpired ()) |
263 |
if (!m_edRequest.IsExpired ()) |
270 |
{ |
264 |
{ |
271 |
// Update the average receive power during ED. |
265 |
// Update the average receive power during ED. |
272 |
Time now = Simulator::Now (); |
266 |
Time now = Simulator::Now (); |
273 |
m_edPower.averagePower += LrWpanSpectrumValueHelper::TotalAvgPower (m_signal->GetSignalPsd ()) * (now - m_edPower.lastUpdate).GetTimeStep () / m_edPower.measurementLength.GetTimeStep (); |
267 |
m_edPower.averagePower += LrWpanSpectrumValueHelper::TotalAvgPower (m_signal->GetSignalPsd (), m_phyPIBAttributes.phyCurrentChannel) * (now - m_edPower.lastUpdate).GetTimeStep () / m_edPower.measurementLength.GetTimeStep (); |
274 |
m_edPower.lastUpdate = now; |
268 |
m_edPower.lastUpdate = now; |
275 |
} |
269 |
} |
276 |
|
270 |
|
|
|
271 |
Ptr<LrWpanSpectrumSignalParameters> lrWpanRxParams = DynamicCast<LrWpanSpectrumSignalParameters> (spectrumRxParams); |
272 |
|
273 |
if ( lrWpanRxParams == 0) |
274 |
{ |
275 |
CheckInterference (); |
276 |
m_signal->AddSignal (spectrumRxParams->psd); |
277 |
|
278 |
// Update peak power if CCA is in progress. |
279 |
if (!m_ccaRequest.IsExpired ()) |
280 |
{ |
281 |
double power = LrWpanSpectrumValueHelper::TotalAvgPower (m_signal->GetSignalPsd (), m_phyPIBAttributes.phyCurrentChannel); |
282 |
if (m_ccaPeakPower < power) |
283 |
{ |
284 |
m_ccaPeakPower = power; |
285 |
} |
286 |
} |
287 |
|
288 |
Simulator::Schedule (spectrumRxParams->duration, &LrWpanPhy::EndRx, this, spectrumRxParams); |
289 |
return; |
290 |
} |
291 |
|
292 |
Ptr<Packet> p = (lrWpanRxParams->packetBurst->GetPackets ()).front (); |
293 |
NS_ASSERT (p != 0); |
294 |
|
277 |
// Prevent PHY from receiving another packet while switching the transceiver state. |
295 |
// Prevent PHY from receiving another packet while switching the transceiver state. |
278 |
if (m_trxState == IEEE_802_15_4_PHY_RX_ON && !m_setTRXState.IsRunning ()) |
296 |
if (m_trxState == IEEE_802_15_4_PHY_RX_ON && !m_setTRXState.IsRunning ()) |
279 |
{ |
297 |
{ |
|
293 |
|
311 |
|
294 |
// Add any incoming packet to the current interference before checking the |
312 |
// Add any incoming packet to the current interference before checking the |
295 |
// SINR. |
313 |
// SINR. |
296 |
NS_LOG_DEBUG (this << " receiving packet with power: " << 10 * log10(LrWpanSpectrumValueHelper::TotalAvgPower (lrWpanRxParams->psd)) + 30 << "dBm"); |
314 |
NS_LOG_DEBUG (this << " receiving packet with power: " << 10 * log10(LrWpanSpectrumValueHelper::TotalAvgPower (lrWpanRxParams->psd, m_phyPIBAttributes.phyCurrentChannel)) + 30 << "dBm"); |
297 |
m_signal->AddSignal (lrWpanRxParams->psd); |
315 |
m_signal->AddSignal (lrWpanRxParams->psd); |
298 |
Ptr<SpectrumValue> interferenceAndNoise = m_signal->GetSignalPsd (); |
316 |
Ptr<SpectrumValue> interferenceAndNoise = m_signal->GetSignalPsd (); |
299 |
*interferenceAndNoise -= *lrWpanRxParams->psd; |
317 |
*interferenceAndNoise -= *lrWpanRxParams->psd; |
300 |
*interferenceAndNoise += *m_noise; |
318 |
*interferenceAndNoise += *m_noise; |
301 |
double sinr = LrWpanSpectrumValueHelper::TotalAvgPower (lrWpanRxParams->psd) / LrWpanSpectrumValueHelper::TotalAvgPower (interferenceAndNoise); |
319 |
double sinr = LrWpanSpectrumValueHelper::TotalAvgPower (lrWpanRxParams->psd, m_phyPIBAttributes.phyCurrentChannel) / LrWpanSpectrumValueHelper::TotalAvgPower (interferenceAndNoise, m_phyPIBAttributes.phyCurrentChannel); |
302 |
|
320 |
|
303 |
// Std. 802.15.4-2006, appendix E, Figure E.2 |
321 |
// Std. 802.15.4-2006, appendix E, Figure E.2 |
304 |
// At SNR < -5 the BER is less than 10e-1. |
322 |
// At SNR < -5 the BER is less than 10e-1. |
|
343 |
// Update peak power if CCA is in progress. |
361 |
// Update peak power if CCA is in progress. |
344 |
if (!m_ccaRequest.IsExpired ()) |
362 |
if (!m_ccaRequest.IsExpired ()) |
345 |
{ |
363 |
{ |
346 |
double power = LrWpanSpectrumValueHelper::TotalAvgPower (m_signal->GetSignalPsd ()); |
364 |
double power = LrWpanSpectrumValueHelper::TotalAvgPower (m_signal->GetSignalPsd (), m_phyPIBAttributes.phyCurrentChannel); |
347 |
if (m_ccaPeakPower < power) |
365 |
if (m_ccaPeakPower < power) |
348 |
{ |
366 |
{ |
349 |
m_ccaPeakPower = power; |
367 |
m_ccaPeakPower = power; |
|
352 |
|
370 |
|
353 |
// Always call EndRx to update the interference. |
371 |
// Always call EndRx to update the interference. |
354 |
// \todo: Do we need to keep track of these events to unschedule them when disposing off the PHY? |
372 |
// \todo: Do we need to keep track of these events to unschedule them when disposing off the PHY? |
355 |
Simulator::Schedule (lrWpanRxParams->duration, &LrWpanPhy::EndRx, this, lrWpanRxParams); |
373 |
|
|
|
374 |
Simulator::Schedule (spectrumRxParams->duration, &LrWpanPhy::EndRx, this, spectrumRxParams); |
356 |
} |
375 |
} |
357 |
|
376 |
|
358 |
void |
377 |
void |
|
376 |
Ptr<SpectrumValue> interferenceAndNoise = m_signal->GetSignalPsd (); |
395 |
Ptr<SpectrumValue> interferenceAndNoise = m_signal->GetSignalPsd (); |
377 |
*interferenceAndNoise -= *currentRxParams->psd; |
396 |
*interferenceAndNoise -= *currentRxParams->psd; |
378 |
*interferenceAndNoise += *m_noise; |
397 |
*interferenceAndNoise += *m_noise; |
379 |
double sinr = LrWpanSpectrumValueHelper::TotalAvgPower (currentRxParams->psd) / LrWpanSpectrumValueHelper::TotalAvgPower (interferenceAndNoise); |
398 |
double sinr = LrWpanSpectrumValueHelper::TotalAvgPower (currentRxParams->psd, m_phyPIBAttributes.phyCurrentChannel) / LrWpanSpectrumValueHelper::TotalAvgPower (interferenceAndNoise, m_phyPIBAttributes.phyCurrentChannel); |
380 |
double per = 1.0 - m_errorModel->GetChunkSuccessRate (sinr, chunkSize); |
399 |
double per = 1.0 - m_errorModel->GetChunkSuccessRate (sinr, chunkSize); |
381 |
|
400 |
|
382 |
// The LQI is the total packet success rate scaled to 0-255. |
401 |
// The LQI is the total packet success rate scaled to 0-255. |
|
402 |
} |
421 |
} |
403 |
|
422 |
|
404 |
void |
423 |
void |
405 |
LrWpanPhy::EndRx (Ptr<LrWpanSpectrumSignalParameters> params) |
424 |
LrWpanPhy::EndRx (Ptr<SpectrumSignalParameters> par) |
406 |
{ |
425 |
{ |
407 |
NS_LOG_FUNCTION (this); |
426 |
NS_LOG_FUNCTION (this); |
408 |
NS_ASSERT (params != 0); |
427 |
//NS_ASSERT (params != 0); |
|
|
428 |
|
429 |
Ptr<LrWpanSpectrumSignalParameters> params = DynamicCast<LrWpanSpectrumSignalParameters> (par); |
409 |
|
430 |
|
410 |
if (!m_edRequest.IsExpired ()) |
431 |
if (!m_edRequest.IsExpired ()) |
411 |
{ |
432 |
{ |
412 |
// Update the average receive power during ED. |
433 |
// Update the average receive power during ED. |
413 |
Time now = Simulator::Now (); |
434 |
Time now = Simulator::Now (); |
414 |
m_edPower.averagePower += LrWpanSpectrumValueHelper::TotalAvgPower (m_signal->GetSignalPsd ()) * (now - m_edPower.lastUpdate).GetTimeStep () / m_edPower.measurementLength.GetTimeStep (); |
435 |
m_edPower.averagePower += LrWpanSpectrumValueHelper::TotalAvgPower (m_signal->GetSignalPsd (), m_phyPIBAttributes.phyCurrentChannel) * (now - m_edPower.lastUpdate).GetTimeStep () / m_edPower.measurementLength.GetTimeStep (); |
415 |
m_edPower.lastUpdate = now; |
436 |
m_edPower.lastUpdate = now; |
416 |
} |
437 |
} |
417 |
|
438 |
|
418 |
CheckInterference (); |
439 |
CheckInterference (); |
419 |
|
440 |
|
420 |
// Update the interference. |
441 |
// Update the interference. |
421 |
m_signal->RemoveSignal (params->psd); |
442 |
m_signal->RemoveSignal (par->psd); |
422 |
|
443 |
|
423 |
// If this is the end of the currently received packet, check if reception was successfull. |
444 |
if (params == 0) |
|
|
445 |
{ |
446 |
NS_LOG_LOGIC ("Node: " << m_device->GetAddress() << " Removing interferent: " << *(par->psd)); |
447 |
return; |
448 |
} |
449 |
|
450 |
// If this is the end of the currently received packet, check if reception was successful. |
424 |
Ptr<LrWpanSpectrumSignalParameters> currentRxParams = m_currentRxPacket.first; |
451 |
Ptr<LrWpanSpectrumSignalParameters> currentRxParams = m_currentRxPacket.first; |
425 |
if (currentRxParams == params) |
452 |
if (currentRxParams == params) |
426 |
{ |
453 |
{ |
|
1029 |
{ |
1056 |
{ |
1030 |
NS_LOG_FUNCTION (this); |
1057 |
NS_LOG_FUNCTION (this); |
1031 |
|
1058 |
|
1032 |
m_edPower.averagePower += LrWpanSpectrumValueHelper::TotalAvgPower (m_signal->GetSignalPsd ()) * (Simulator::Now () - m_edPower.lastUpdate).GetTimeStep () / m_edPower.measurementLength.GetTimeStep (); |
1059 |
m_edPower.averagePower += LrWpanSpectrumValueHelper::TotalAvgPower (m_signal->GetSignalPsd (), m_phyPIBAttributes.phyCurrentChannel) * (Simulator::Now () - m_edPower.lastUpdate).GetTimeStep () / m_edPower.measurementLength.GetTimeStep (); |
1033 |
|
1060 |
|
1034 |
uint8_t energyLevel; |
1061 |
uint8_t energyLevel; |
1035 |
|
1062 |
|
|
1063 |
LrWpanPhyEnumeration sensedChannelState = IEEE_802_15_4_PHY_UNSPECIFIED; |
1090 |
LrWpanPhyEnumeration sensedChannelState = IEEE_802_15_4_PHY_UNSPECIFIED; |
1064 |
|
1091 |
|
1065 |
// Update peak power. |
1092 |
// Update peak power. |
1066 |
double power = LrWpanSpectrumValueHelper::TotalAvgPower (m_signal->GetSignalPsd ()); |
1093 |
double power = LrWpanSpectrumValueHelper::TotalAvgPower (m_signal->GetSignalPsd (), m_phyPIBAttributes.phyCurrentChannel); |
1067 |
if (m_ccaPeakPower < power) |
1094 |
if (m_ccaPeakPower < power) |
1068 |
{ |
1095 |
{ |
1069 |
m_ccaPeakPower = power; |
1096 |
m_ccaPeakPower = power; |