phy_802_15_4.cpp
来自「802.15.4协议的物理层c文件和header文件」· C++ 代码 · 共 2,109 行 · 第 1/5 页
CPP
2,109 行
else { ERROR_ReportError( "PHY802.15.4: Illegal modulation scheme\n"); } } } else { ERROR_ReportError( "PHY802.15.4: Illegal PHY-RX-MODEL\n"); } if (sinrp) { *sinrp = sinr; } if (DEBUG) { printf("%lld : Node %d: 802.15.4PHY : calculated SINR of %f for " "current signal\n", getSimTime(node), node->nodeId, IN_DB(sinr)); fflush(stdout); } if (DYNAMIC_STATS) { GUI_SendRealData(node->nodeId, phy802_15_4->stats.currentSINRId, IN_DB(sinr), getSimTime(node)); } if (BER != 0.0) { double numBits = ((double)(getSimTime(node) - phy802_15_4->rxTimeEvaluated) * (double)phy802_15_4->dataRate /(double)SECOND); double errorProbability = 1.0 - pow((1.0 - BER), numBits); double rand = RANDOM_erand(phy802_15_4->thisPhy->seed); assert((errorProbability >= 0.0) && (errorProbability <= 1.0)); if (errorProbability > rand) { packeterror = TRUE; } } // if BER return packeterror;}// /**// FUNCTION :: Phy802_15_4Init// LAYER :: PHY// PURPOSE :: Initialize configurable parameters// PARAMETERS ::// + node : Node* : Pointer to node.// + phyIndex : const int : Index of the PHY// + nodeInput : const NodeInput* : Pointer to node input// RETURN :: void : NULL// **/void Phy802_15_4Init( Node *node, const int phyIndex, const NodeInput *nodeInput){ double txPower_dBm; BOOL wasFound; int i; char buf[MAX_STRING_LENGTH]; int channelIndex; double bandwidth; int symbolRate = 0; int bitsPerSymbol = 0; double preambleHeaderLength = 0.0; double threshold = 0.0; int numChannels = PROP_NumberChannels(node); PhyData802_15_4 *phy802_15_4 = (PhyData802_15_4 *)MEM_malloc(sizeof(PhyData802_15_4)); memset(phy802_15_4, 0, sizeof(PhyData802_15_4)); node->phyData[phyIndex]->phyVar = (void *)phy802_15_4; phy802_15_4->thisPhy = node->phyData[phyIndex]; bandwidth = PHY802_15_4_DEFAULT_CHANNEL_BANDWIDTH; // // Antenna model initialization // ANTENNA_Init(node, phyIndex, nodeInput); ERROR_Assert(((phy802_15_4->thisPhy->antennaData->antennaModelType == ANTENNA_OMNIDIRECTIONAL) || (phy802_15_4->thisPhy->antennaData->antennaModelType == ANTENNA_PATTERNED)) , "Illegal antennaModelType.\n"); // // Set phy_802_15_4-TX-POWER // IO_ReadDouble( node->nodeId, phy802_15_4->thisPhy->networkAddress, nodeInput, "PHY802.15.4-TX-POWER", &wasFound, &txPower_dBm); if (wasFound) { phy802_15_4->txPower_dBm = (float)txPower_dBm; } else { phy802_15_4->txPower_dBm = PHY802_15_4_DEFAULT_TX_POWER_dBm; } IO_ReadString( node->nodeId, phy802_15_4->thisPhy->networkAddress, nodeInput, "PHY802.15.4-MODULATION", &wasFound, buf); if (wasFound) { if (strcmp(buf, "O-QPSK") == 0) { phy802_15_4->modulation = O_QPSK; } else if (strcmp(buf, "BPSK") == 0) { phy802_15_4->modulation = BPSK; } else if (strcmp(buf, "ASK") == 0) { phy802_15_4->modulation = ASK; } else { ERROR_ReportError("Unknown Modulation Scheme"); } } else { phy802_15_4->modulation = PHY802_15_4_DEFAULT_MODULATION; } IO_ReadString( node->nodeId, phy802_15_4->thisPhy->networkAddress, nodeInput, "PHY802.15.4-CCA-MODE", &wasFound, buf); if (wasFound) { if (strcmp(buf, "ENERGY-ABOVE-THRESHOLD") == 0) { phy802_15_4->CCAmode = ENERGY_ABOVE_THRESHOLD; if ( phy802_15_4->modulation == BPSK) { phy802_15_4->EDthreshold_mW = NON_DB(PHY802_15_4_BPSK_ED_THRESHOLD); } else { phy802_15_4->EDthreshold_mW = NON_DB(PHY802_15_4_ED_THRESHOLD); } } else if (strcmp(buf, "CARRIER-SENSE") == 0) { phy802_15_4->CCAmode = CARRIER_SENSE; } else if (strcmp(buf, "CARRIER-SENSE-WITH-ENERGY-ABOVE-THRESHOLD") == 0) { phy802_15_4->CCAmode = CARRIER_SENSE_WITH_ENERGY_ABOVE_THRESHOLD; } else { ERROR_ReportError("Unknown PHY802.15.4-CCA-MODE"); } } else { phy802_15_4->CCAmode = PHY802_15_4_DEFAULT_CCA_MODE; } // // Initialize phy statistics variables // phy802_15_4->stats.totalTxSignals = 0; phy802_15_4->stats.totalSignalsDetected = 0; phy802_15_4->stats.totalSignalsLocked = 0; phy802_15_4->stats.totalSignalsWithErrors = 0; phy802_15_4->stats.totalRxSignalsToMac = 0; phy802_15_4->stats.energyConsumed = 0.0; phy802_15_4->stats.turnOnTime = getSimTime(node); phy802_15_4->stats.turnOnPeriod = 0; if (DYNAMIC_STATS) { phy802_15_4->stats.totalTxSignalsId = GUI_DefineMetric("Signals transmitted", node->nodeId, GUI_PHY_LAYER, 0, GUI_INTEGER_TYPE, GUI_CUMULATIVE_METRIC); phy802_15_4->stats.totalSignalsDetectedId = GUI_DefineMetric("Signals detected", node->nodeId, GUI_PHY_LAYER, 0, GUI_INTEGER_TYPE, GUI_CUMULATIVE_METRIC); phy802_15_4->stats.totalSignalsLockedId = GUI_DefineMetric("Signals locked on by PHY", node->nodeId, GUI_PHY_LAYER, 0, GUI_INTEGER_TYPE, GUI_CUMULATIVE_METRIC); phy802_15_4->stats.totalSignalsWithErrors = GUI_DefineMetric("Signals received but with errors", node->nodeId, GUI_PHY_LAYER, 0, GUI_INTEGER_TYPE, GUI_CUMULATIVE_METRIC); phy802_15_4->stats.totalRxSignalsToMacId = GUI_DefineMetric("Signals received and forwarded to MAC", node->nodeId, GUI_PHY_LAYER, 0, GUI_INTEGER_TYPE, GUI_CUMULATIVE_METRIC); phy802_15_4->stats.currentSINRId = GUI_DefineMetric("Current SINR", node->nodeId, GUI_PHY_LAYER, 0, GUI_DOUBLE_TYPE, GUI_AVERAGE_METRIC); phy802_15_4->stats.energyConsumedId = GUI_DefineMetric("Energy consumption (in mWhr)", node->nodeId, GUI_PHY_LAYER, 0, GUI_DOUBLE_TYPE, GUI_CUMULATIVE_METRIC); } PHY_GetTransmissionChannel(node, phyIndex, &channelIndex); PropProfile *propProfile = node->propChannel[channelIndex].profile;//// set phy parameters such as data rate, preamble and header time and// spread factor for different frequency bands and modulation schemes// if ((propProfile->frequency >= 868000000) && (propProfile->frequency <= 868600000)) { if (phy802_15_4->modulation == BPSK) { symbolRate = PHY802_15_4_800MHZ_BPSK_SYMBOL_RATE; bitsPerSymbol = PHY802_15_4_BPSK_BITS_PER_SYMBOL; phy802_15_4->spreadFactor = PHY802_15_4_BPSK_SPREAD_FACTOR; threshold = PHY802_15_4_BPSK_THRESHOLD; preambleHeaderLength = PHY802_15_4_BPSK_PREAMBLE_LENGTH + PHY802_15_4_SFD_LENGTH + PHY802_15_4_PHR_LENGTH / bitsPerSymbol; } else if (phy802_15_4->modulation == ASK) { symbolRate = PHY802_15_4_800MHZ_ASK_SYMBOL_RATE; bitsPerSymbol = PHY802_15_4_800MHZ_ASK_BITS_PER_SYMBOL; phy802_15_4->spreadFactor = PHY802_15_4_ASK_SPREAD_FACTOR; threshold = PHY802_15_4_800MHZ_ASK_THRESHOLD; preambleHeaderLength = PHY802_15_4_800MHZ_ASK_PREAMBLE_LENGTH + PHY802_15_4_SFD_LENGTH + PHY802_15_4_PHR_LENGTH / bitsPerSymbol; } else if (phy802_15_4->modulation == O_QPSK) { symbolRate = PHY802_15_4_800MHZ_O_QPSK_SYMBOL_RATE; bitsPerSymbol = PHY802_15_4_O_QPSK_BITS_PER_SYMBOL; phy802_15_4->spreadFactor = PHY802_15_4_O_QPSK_SPREAD_FACTOR; threshold = PHY802_15_4_O_QPSK_THRESHOLD; preambleHeaderLength = PHY802_15_4_O_QPSK_PREAMBLE_LENGTH + PHY802_15_4_SFD_LENGTH + PHY802_15_4_PHR_LENGTH / bitsPerSymbol; } else { ERROR_ReportError( "PHY802.15.4:\n" "Illegal modulation scheme\n" "only BPSK, ASK, and O-QPSK are supported\n" "in this frequency band\n" ); } } else if((propProfile->frequency > 902000000) && (propProfile->frequency < 928000000)) { if (phy802_15_4->modulation == BPSK) { symbolRate = PHY802_15_4_900MHZ_BPSK_SYMBOL_RATE; bitsPerSymbol = PHY802_15_4_BPSK_BITS_PER_SYMBOL; phy802_15_4->spreadFactor = PHY802_15_4_BPSK_SPREAD_FACTOR; threshold = PHY802_15_4_BPSK_THRESHOLD; preambleHeaderLength = PHY802_15_4_BPSK_PREAMBLE_LENGTH + PHY802_15_4_SFD_LENGTH + PHY802_15_4_PHR_LENGTH / bitsPerSymbol; } else if (phy802_15_4->modulation == ASK) { symbolRate = PHY802_15_4_900MHZ_ASK_SYMBOL_RATE; bitsPerSymbol = PHY802_15_4_900MHZ_ASK_BITS_PER_SYMBOL; phy802_15_4->spreadFactor = PHY802_15_4_ASK_SPREAD_FACTOR; threshold = PHY802_15_4_900MHZ_ASK_THRESHOLD; preambleHeaderLength = PHY802_15_4_900MHZ_ASK_PREAMBLE_LENGTH + PHY802_15_4_SFD_LENGTH + PHY802_15_4_PHR_LENGTH / bitsPerSymbol; } else if (phy802_15_4->modulation == O_QPSK) { symbolRate = PHY802_15_4_O_QPSK_SYMBOL_RATE; bitsPerSymbol = PHY802_15_4_O_QPSK_BITS_PER_SYMBOL; phy802_15_4->spreadFactor = PHY802_15_4_O_QPSK_SPREAD_FACTOR; threshold = PHY802_15_4_O_QPSK_THRESHOLD; preambleHeaderLength = PHY802_15_4_O_QPSK_PREAMBLE_LENGTH + PHY802_15_4_SFD_LENGTH + PHY802_15_4_PHR_LENGTH / bitsPerSymbol; } else { ERROR_ReportError( "PHY802.15.4:\n" "Illegal modulation scheme\n" "only BPSK, ASK and O-QPSK are supported\n" "in this frequency band\n" ); } } else if ((propProfile->frequency >= 2400000000U) && (propProfile->frequency <= 2483500000U)) { if (phy802_15_4->modulation == O_QPSK) { symbolRate = PHY802_15_4_O_QPSK_SYMBOL_RATE; bitsPerSymbol = PHY802_15_4_O_QPSK_BITS_PER_SYMBOL; phy802_15_4->spreadFactor = PHY802_15_4_2400MHZ_O_QPSK_SPREAD_FACTOR; threshold = PHY802_15_4_2400MHZ_O_QPSK_THRESHOLD; preambleHeaderLength = PHY802_15_4_O_QPSK_PREAMBLE_LENGTH + PHY802_15_4_SFD_LENGTH + PHY802_15_4_PHR_LENGTH / bitsPerSymbol; } else { ERROR_ReportError( "PHY802.15.4:\n" "Illegal modulation scheme\n" "only O-QPSK is supported in this frequency band\n" ); } } else { char buf[MAX_STRING_LENGTH]; sprintf(buf, "PHY802.15.4:\n" " the frequency %5.3f MHz is not in the specified range,\n" " it should be in the range:\n" " 868-868.6 MHz or\n" " 902-928 MHZ or\n" " 2400-2483.5 MHz\n", propProfile->frequency / 1.0e6); ERROR_ReportError(buf); } phy802_15_4->symbolPeriod = SECOND / symbolRate; phy802_15_4->dataRate = symbolRate * bitsPerSymbol; phy802_15_4->preambleHeaderPeriod = (clocktype)(phy802_15_4->symbolPeriod * preambleHeaderLength); phy802_15_4->RxTxTurnAroundTime = PHY802_15_4_RX_TX_TURNAROUND_TIME_IN_SYMBOL_PERIODS * phy802_15_4->symbolPeriod; // // Initialize status of phy // if ((propProfile->frequency >= 868000000) && (propProfile->frequency <= 868600000)) { bandwidth = PHY802_15_4_800MHZ_DEFAULT_CHANNEL_BANDWIDTH; } phy802_15_4->rxMsg = NULL;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?