uint8_t RegionEU868DlChannelReq( DlChannelReqParams_t* dlChannelReq )
{
    uint8_t status = 0x03;
    uint8_t band = 0;

    // Verify if the frequency is supported
    if( VerifyTxFreq( dlChannelReq->Rx1Frequency, &band ) == false )
    {
        status &= 0xFE;
    }

    // Verify if an uplink frequency exists
    if( Channels[dlChannelReq->ChannelId].Frequency == 0 )
    {
        status &= 0xFD;
    }

    // Apply Rx1 frequency, if the status is OK
    if( status == 0x03 )
    {
        Channels[dlChannelReq->ChannelId].Rx1Frequency = dlChannelReq->Rx1Frequency;
    }

    return status;
}
Beispiel #2
0
LoRaMacStatus_t RegionCN470AChannelAdd( ChannelAddParams_t *channelAdd )
{
    uint8_t band = 0;
    bool drInvalid = false;
    bool freqInvalid = false;
    uint8_t id = channelAdd->ChannelId;

    if ( id >= CN470A_MAX_NB_CHANNELS ) {
        return LORAMAC_STATUS_PARAMETER_INVALID;
    }

    // Validate the datarate range
    if ( RegionCommonValueInRange( channelAdd->NewChannel->DrRange.Fields.Min, CN470A_TX_MIN_DATARATE,
                                   CN470A_TX_MAX_DATARATE ) == false ) {
        drInvalid = true;
    }
    if ( RegionCommonValueInRange( channelAdd->NewChannel->DrRange.Fields.Max, CN470A_TX_MIN_DATARATE,
                                   CN470A_TX_MAX_DATARATE ) == false ) {
        drInvalid = true;
    }
    if ( channelAdd->NewChannel->DrRange.Fields.Min > channelAdd->NewChannel->DrRange.Fields.Max ) {
        drInvalid = true;
    }

    // Default channels don't accept all values
    if ( id < CN470A_NUMB_DEFAULT_CHANNELS ) {
        // Validate the datarate range for min: must be DR_0
        if ( channelAdd->NewChannel->DrRange.Fields.Min > DR_0 ) {
            drInvalid = true;
        }
        // Validate the datarate range for max: must be DR_5 <= Max <= TX_MAX_DATARATE
        if ( RegionCommonValueInRange( channelAdd->NewChannel->DrRange.Fields.Max, DR_5, CN470A_TX_MAX_DATARATE ) == false ) {
            drInvalid = true;
        }
        // We are not allowed to change the frequency
        if ( channelAdd->NewChannel->Frequency != Channels[id].Frequency ) {
            freqInvalid = true;
        }
    }

    // Check frequency
    if ( freqInvalid == false ) {
        if ( VerifyTxFreq( channelAdd->NewChannel->Frequency ) == false ) {
            freqInvalid = true;
        }
    }

    // Check status
    if ( ( drInvalid == true ) && ( freqInvalid == true ) ) {
        return LORAMAC_STATUS_FREQ_AND_DR_INVALID;
    }
    if ( drInvalid == true ) {
        return LORAMAC_STATUS_DATARATE_INVALID;
    }
    if ( freqInvalid == true ) {
        return LORAMAC_STATUS_FREQUENCY_INVALID;
    }

    memcpy( &(Channels[id]), channelAdd->NewChannel, sizeof( Channels[id] ) );
    Channels[id].Band = band;
    ChannelsMask[0] |= ( 1 << id );
    return LORAMAC_STATUS_OK;
}