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