|
|
| 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; |