|
|
| 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); |
|
|
443 |
|
| 444 |
if (params == 0) |
| 445 |
{ |
| 446 |
NS_LOG_LOGIC ("Node: " << m_device->GetAddress() << " Removing interferent: " << *(par->psd)); |
| 447 |
return; |
| 448 |
} |
| 422 |
|
449 |
|
| 423 |
// If this is the end of the currently received packet, check if reception was successfull. |
450 |
// If this is the end of the currently received packet, check if reception was successfull. |
| 424 |
Ptr<LrWpanSpectrumSignalParameters> currentRxParams = m_currentRxPacket.first; |
451 |
Ptr<LrWpanSpectrumSignalParameters> currentRxParams = m_currentRxPacket.first; |
|
|
| 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; |