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 + -
显示快捷键?