|
274 |
NS_LOG_FUNCTION (this << spectrumRxParams); |
274 |
NS_LOG_FUNCTION (this << spectrumRxParams); |
275 |
LrWpanSpectrumValueHelper psdHelper; |
275 |
LrWpanSpectrumValueHelper psdHelper; |
276 |
|
276 |
|
277 |
|
|
|
278 |
Ptr<LrWpanSpectrumSignalParameters> lrWpanRxParams = DynamicCast<LrWpanSpectrumSignalParameters> (spectrumRxParams); |
279 |
NS_ASSERT (lrWpanRxParams != 0); |
280 |
Ptr<Packet> p = (lrWpanRxParams->packetBurst->GetPackets ()).front (); |
281 |
NS_ASSERT (p != 0); |
282 |
|
283 |
if (!m_edRequest.IsExpired ()) |
277 |
if (!m_edRequest.IsExpired ()) |
284 |
{ |
278 |
{ |
285 |
// Update the average receive power during ED. |
279 |
// Update the average receive power during ED. |
286 |
Time now = Simulator::Now (); |
280 |
Time now = Simulator::Now (); |
287 |
m_edPower.averagePower += LrWpanSpectrumValueHelper::TotalAvgPower (m_signal->GetSignalPsd ()) * (now - m_edPower.lastUpdate).GetTimeStep () / m_edPower.measurementLength.GetTimeStep (); |
281 |
m_edPower.averagePower += LrWpanSpectrumValueHelper::TotalAvgPower (m_signal->GetSignalPsd (), m_phyPIBAttributes.phyCurrentChannel) * (now - m_edPower.lastUpdate).GetTimeStep () / m_edPower.measurementLength.GetTimeStep (); |
288 |
m_edPower.lastUpdate = now; |
282 |
m_edPower.lastUpdate = now; |
289 |
} |
283 |
} |
290 |
|
284 |
|
|
|
285 |
Ptr<LrWpanSpectrumSignalParameters> lrWpanRxParams = DynamicCast<LrWpanSpectrumSignalParameters> (spectrumRxParams); |
286 |
|
287 |
if ( lrWpanRxParams == 0) |
288 |
{ |
289 |
CheckInterference (); |
290 |
m_signal->AddSignal (spectrumRxParams->psd); |
291 |
|
292 |
// Update peak power if CCA is in progress. |
293 |
if (!m_ccaRequest.IsExpired ()) |
294 |
{ |
295 |
double power = LrWpanSpectrumValueHelper::TotalAvgPower (m_signal->GetSignalPsd (), m_phyPIBAttributes.phyCurrentChannel); |
296 |
if (m_ccaPeakPower < power) |
297 |
{ |
298 |
m_ccaPeakPower = power; |
299 |
} |
300 |
} |
301 |
|
302 |
Simulator::Schedule (spectrumRxParams->duration, &LrWpanPhy::EndRx, this, spectrumRxParams); |
303 |
return; |
304 |
} |
305 |
|
306 |
Ptr<Packet> p = (lrWpanRxParams->packetBurst->GetPackets ()).front (); |
307 |
NS_ASSERT (p != 0); |
308 |
|
291 |
// Prevent PHY from receiving another packet while switching the transceiver state. |
309 |
// Prevent PHY from receiving another packet while switching the transceiver state. |
292 |
if (m_trxState == IEEE_802_15_4_PHY_RX_ON && !m_setTRXState.IsRunning ()) |
310 |
if (m_trxState == IEEE_802_15_4_PHY_RX_ON && !m_setTRXState.IsRunning ()) |
293 |
{ |
311 |
{ |
|
307 |
|
325 |
|
308 |
// Add any incoming packet to the current interference before checking the |
326 |
// Add any incoming packet to the current interference before checking the |
309 |
// SINR. |
327 |
// SINR. |
310 |
NS_LOG_DEBUG (this << " receiving packet with power: " << 10 * log10(LrWpanSpectrumValueHelper::TotalAvgPower (lrWpanRxParams->psd)) + 30 << "dBm"); |
328 |
NS_LOG_DEBUG (this << " receiving packet with power: " << 10 * log10(LrWpanSpectrumValueHelper::TotalAvgPower (lrWpanRxParams->psd, m_phyPIBAttributes.phyCurrentChannel)) + 30 << "dBm"); |
311 |
m_signal->AddSignal (lrWpanRxParams->psd); |
329 |
m_signal->AddSignal (lrWpanRxParams->psd); |
312 |
Ptr<SpectrumValue> interferenceAndNoise = m_signal->GetSignalPsd (); |
330 |
Ptr<SpectrumValue> interferenceAndNoise = m_signal->GetSignalPsd (); |
313 |
*interferenceAndNoise -= *lrWpanRxParams->psd; |
331 |
*interferenceAndNoise -= *lrWpanRxParams->psd; |
314 |
*interferenceAndNoise += *m_noise; |
332 |
*interferenceAndNoise += *m_noise; |
315 |
double sinr = LrWpanSpectrumValueHelper::TotalAvgPower (lrWpanRxParams->psd) / LrWpanSpectrumValueHelper::TotalAvgPower (interferenceAndNoise); |
333 |
double sinr = LrWpanSpectrumValueHelper::TotalAvgPower (lrWpanRxParams->psd, m_phyPIBAttributes.phyCurrentChannel) / LrWpanSpectrumValueHelper::TotalAvgPower (interferenceAndNoise, m_phyPIBAttributes.phyCurrentChannel); |
316 |
|
334 |
|
317 |
// Std. 802.15.4-2006, appendix E, Figure E.2 |
335 |
// Std. 802.15.4-2006, appendix E, Figure E.2 |
318 |
// At SNR < -5 the BER is less than 10e-1. |
336 |
// At SNR < -5 the BER is less than 10e-1. |
|
357 |
// Update peak power if CCA is in progress. |
375 |
// Update peak power if CCA is in progress. |
358 |
if (!m_ccaRequest.IsExpired ()) |
376 |
if (!m_ccaRequest.IsExpired ()) |
359 |
{ |
377 |
{ |
360 |
double power = LrWpanSpectrumValueHelper::TotalAvgPower (m_signal->GetSignalPsd ()); |
378 |
double power = LrWpanSpectrumValueHelper::TotalAvgPower (m_signal->GetSignalPsd (), m_phyPIBAttributes.phyCurrentChannel); |
361 |
if (m_ccaPeakPower < power) |
379 |
if (m_ccaPeakPower < power) |
362 |
{ |
380 |
{ |
363 |
m_ccaPeakPower = power; |
381 |
m_ccaPeakPower = power; |
|
366 |
|
384 |
|
367 |
// Always call EndRx to update the interference. |
385 |
// Always call EndRx to update the interference. |
368 |
// \todo: Do we need to keep track of these events to unschedule them when disposing off the PHY? |
386 |
// \todo: Do we need to keep track of these events to unschedule them when disposing off the PHY? |
369 |
Simulator::Schedule (lrWpanRxParams->duration, &LrWpanPhy::EndRx, this, lrWpanRxParams); |
387 |
|
|
|
388 |
Simulator::Schedule (spectrumRxParams->duration, &LrWpanPhy::EndRx, this, spectrumRxParams); |
370 |
} |
389 |
} |
371 |
|
390 |
|
372 |
void |
391 |
void |
|
390 |
Ptr<SpectrumValue> interferenceAndNoise = m_signal->GetSignalPsd (); |
409 |
Ptr<SpectrumValue> interferenceAndNoise = m_signal->GetSignalPsd (); |
391 |
*interferenceAndNoise -= *currentRxParams->psd; |
410 |
*interferenceAndNoise -= *currentRxParams->psd; |
392 |
*interferenceAndNoise += *m_noise; |
411 |
*interferenceAndNoise += *m_noise; |
393 |
double sinr = LrWpanSpectrumValueHelper::TotalAvgPower (currentRxParams->psd) / LrWpanSpectrumValueHelper::TotalAvgPower (interferenceAndNoise); |
412 |
double sinr = LrWpanSpectrumValueHelper::TotalAvgPower (currentRxParams->psd, m_phyPIBAttributes.phyCurrentChannel) / LrWpanSpectrumValueHelper::TotalAvgPower (interferenceAndNoise, m_phyPIBAttributes.phyCurrentChannel); |
394 |
double per = 1.0 - m_errorModel->GetChunkSuccessRate (sinr, chunkSize); |
413 |
double per = 1.0 - m_errorModel->GetChunkSuccessRate (sinr, chunkSize); |
395 |
|
414 |
|
396 |
// The LQI is the total packet success rate scaled to 0-255. |
415 |
// The LQI is the total packet success rate scaled to 0-255. |
|
416 |
} |
435 |
} |
417 |
|
436 |
|
418 |
void |
437 |
void |
419 |
LrWpanPhy::EndRx (Ptr<LrWpanSpectrumSignalParameters> params) |
438 |
LrWpanPhy::EndRx (Ptr<SpectrumSignalParameters> par) |
420 |
{ |
439 |
{ |
421 |
NS_LOG_FUNCTION (this); |
440 |
NS_LOG_FUNCTION (this); |
422 |
NS_ASSERT (params != 0); |
441 |
//NS_ASSERT (params != 0); |
|
|
442 |
|
443 |
Ptr<LrWpanSpectrumSignalParameters> params = DynamicCast<LrWpanSpectrumSignalParameters> (par); |
423 |
|
444 |
|
424 |
if (!m_edRequest.IsExpired ()) |
445 |
if (!m_edRequest.IsExpired ()) |
425 |
{ |
446 |
{ |
426 |
// Update the average receive power during ED. |
447 |
// Update the average receive power during ED. |
427 |
Time now = Simulator::Now (); |
448 |
Time now = Simulator::Now (); |
428 |
m_edPower.averagePower += LrWpanSpectrumValueHelper::TotalAvgPower (m_signal->GetSignalPsd ()) * (now - m_edPower.lastUpdate).GetTimeStep () / m_edPower.measurementLength.GetTimeStep (); |
449 |
m_edPower.averagePower += LrWpanSpectrumValueHelper::TotalAvgPower (m_signal->GetSignalPsd (), m_phyPIBAttributes.phyCurrentChannel) * (now - m_edPower.lastUpdate).GetTimeStep () / m_edPower.measurementLength.GetTimeStep (); |
429 |
m_edPower.lastUpdate = now; |
450 |
m_edPower.lastUpdate = now; |
430 |
} |
451 |
} |
431 |
|
452 |
|
432 |
CheckInterference (); |
453 |
CheckInterference (); |
433 |
|
454 |
|
434 |
// Update the interference. |
455 |
// Update the interference. |
435 |
m_signal->RemoveSignal (params->psd); |
456 |
m_signal->RemoveSignal (par->psd); |
436 |
|
457 |
|
437 |
// If this is the end of the currently received packet, check if reception was successfull. |
458 |
if (params == 0) |
|
|
459 |
{ |
460 |
NS_LOG_LOGIC ("Node: " << m_device->GetAddress() << " Removing interferent: " << *(par->psd)); |
461 |
return; |
462 |
} |
463 |
|
464 |
// If this is the end of the currently received packet, check if reception was successful. |
438 |
Ptr<LrWpanSpectrumSignalParameters> currentRxParams = m_currentRxPacket.first; |
465 |
Ptr<LrWpanSpectrumSignalParameters> currentRxParams = m_currentRxPacket.first; |
439 |
if (currentRxParams == params) |
466 |
if (currentRxParams == params) |
440 |
{ |
467 |
{ |
|
1043 |
{ |
1070 |
{ |
1044 |
NS_LOG_FUNCTION (this); |
1071 |
NS_LOG_FUNCTION (this); |
1045 |
|
1072 |
|
1046 |
m_edPower.averagePower += LrWpanSpectrumValueHelper::TotalAvgPower (m_signal->GetSignalPsd ()) * (Simulator::Now () - m_edPower.lastUpdate).GetTimeStep () / m_edPower.measurementLength.GetTimeStep (); |
1073 |
m_edPower.averagePower += LrWpanSpectrumValueHelper::TotalAvgPower (m_signal->GetSignalPsd (), m_phyPIBAttributes.phyCurrentChannel) * (Simulator::Now () - m_edPower.lastUpdate).GetTimeStep () / m_edPower.measurementLength.GetTimeStep (); |
1047 |
|
1074 |
|
1048 |
uint8_t energyLevel; |
1075 |
uint8_t energyLevel; |
1049 |
|
1076 |
|
|
1077 |
LrWpanPhyEnumeration sensedChannelState = IEEE_802_15_4_PHY_UNSPECIFIED; |
1104 |
LrWpanPhyEnumeration sensedChannelState = IEEE_802_15_4_PHY_UNSPECIFIED; |
1078 |
|
1105 |
|
1079 |
// Update peak power. |
1106 |
// Update peak power. |
1080 |
double power = LrWpanSpectrumValueHelper::TotalAvgPower (m_signal->GetSignalPsd ()); |
1107 |
double power = LrWpanSpectrumValueHelper::TotalAvgPower (m_signal->GetSignalPsd (), m_phyPIBAttributes.phyCurrentChannel); |
1081 |
if (m_ccaPeakPower < power) |
1108 |
if (m_ccaPeakPower < power) |
1082 |
{ |
1109 |
{ |
1083 |
m_ccaPeakPower = power; |
1110 |
m_ccaPeakPower = power; |