use super::ChannelPlan;
#[cfg(any(
feature = "eu868",
feature = "us915",
feature = "eu433",
feature = "au915",
feature = "cn470",
feature = "as923",
feature = "kr920",
feature = "in865",
feature = "ru864"
))]
use super::{Beacon, ChannelBlock, DataRate, MaxPayload};
#[cfg(any(
feature = "eu868",
feature = "eu433",
feature = "as923",
feature = "kr920",
feature = "ru864"
))]
use super::SubBand;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum Region {
#[cfg(feature = "eu868")]
Eu868,
#[cfg(feature = "us915")]
Us915,
#[cfg(feature = "eu433")]
Eu433,
#[cfg(feature = "au915")]
Au915,
#[cfg(feature = "cn470")]
Cn470,
#[cfg(feature = "as923")]
As923,
#[cfg(feature = "kr920")]
Kr920,
#[cfg(feature = "in865")]
In865,
#[cfg(feature = "ru864")]
Ru864,
}
impl Region {
pub const fn plan(self) -> &'static ChannelPlan<'static> {
match self {
#[cfg(feature = "eu868")]
Region::Eu868 => &EU868,
#[cfg(feature = "us915")]
Region::Us915 => &US915,
#[cfg(feature = "eu433")]
Region::Eu433 => &EU433,
#[cfg(feature = "au915")]
Region::Au915 => &AU915,
#[cfg(feature = "cn470")]
Region::Cn470 => &CN470,
#[cfg(feature = "as923")]
Region::As923 => &AS923,
#[cfg(feature = "kr920")]
Region::Kr920 => &KR920,
#[cfg(feature = "in865")]
Region::In865 => &IN865,
#[cfg(feature = "ru864")]
Region::Ru864 => &RU864,
}
}
pub const fn name(self) -> &'static str {
self.plan().name
}
pub const fn code(self) -> &'static str {
match self {
#[cfg(feature = "eu868")]
Region::Eu868 => "EU868",
#[cfg(feature = "us915")]
Region::Us915 => "US915",
#[cfg(feature = "eu433")]
Region::Eu433 => "EU433",
#[cfg(feature = "au915")]
Region::Au915 => "AU915",
#[cfg(feature = "cn470")]
Region::Cn470 => "CN470",
#[cfg(feature = "as923")]
Region::As923 => "AS923",
#[cfg(feature = "kr920")]
Region::Kr920 => "KR920",
#[cfg(feature = "in865")]
Region::In865 => "IN865",
#[cfg(feature = "ru864")]
Region::Ru864 => "RU864",
}
}
pub fn from_code(code: &str) -> Option<Self> {
Self::all().iter().copied().find(|region| {
code.eq_ignore_ascii_case(region.code()) || code.eq_ignore_ascii_case(region.name())
})
}
pub const fn all() -> &'static [Region] {
&[
#[cfg(feature = "eu868")]
Region::Eu868,
#[cfg(feature = "us915")]
Region::Us915,
#[cfg(feature = "eu433")]
Region::Eu433,
#[cfg(feature = "au915")]
Region::Au915,
#[cfg(feature = "cn470")]
Region::Cn470,
#[cfg(feature = "as923")]
Region::As923,
#[cfg(feature = "kr920")]
Region::Kr920,
#[cfg(feature = "in865")]
Region::In865,
#[cfg(feature = "ru864")]
Region::Ru864,
]
}
}
#[cfg(feature = "eu868")]
static EU868_DATA_RATES: [Option<DataRate>; 14] = [
Some(DataRate::lora(12, 125_000, 250)),
Some(DataRate::lora(11, 125_000, 440)),
Some(DataRate::lora(10, 125_000, 980)),
Some(DataRate::lora(9, 125_000, 1_760)),
Some(DataRate::lora(8, 125_000, 3_125)),
Some(DataRate::lora(7, 125_000, 5_470)),
Some(DataRate::lora(7, 250_000, 11_000)),
Some(DataRate::fsk(50_000)),
Some(DataRate::lr_fhss(1, 3, 137_000, 162)),
Some(DataRate::lr_fhss(2, 3, 137_000, 325)),
Some(DataRate::lr_fhss(1, 3, 336_000, 162)),
Some(DataRate::lr_fhss(2, 3, 336_000, 325)),
Some(DataRate::lora(6, 125_000, 9_375)),
Some(DataRate::lora(5, 125_000, 15_625)),
];
#[cfg(feature = "eu868")]
static EU868_MAX_PAYLOAD_REPEATER: [Option<MaxPayload>; 14] = [
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(123, 115)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(58, 50)),
Some(MaxPayload::new(123, 115)),
Some(MaxPayload::new(58, 50)),
Some(MaxPayload::new(123, 115)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
];
#[cfg(feature = "eu868")]
static EU868_MAX_PAYLOAD_DIRECT: [Option<MaxPayload>; 14] = [
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(123, 115)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(58, 50)),
Some(MaxPayload::new(123, 115)),
Some(MaxPayload::new(58, 50)),
Some(MaxPayload::new(123, 115)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
];
#[cfg(feature = "eu868")]
static EU868_RX1: [&[u8]; 14] = [
&[0, 0, 0, 0, 0, 0],
&[1, 0, 0, 0, 0, 0],
&[2, 1, 0, 0, 0, 0],
&[3, 2, 1, 0, 0, 0],
&[4, 3, 2, 1, 0, 0],
&[5, 4, 3, 2, 1, 0],
&[6, 5, 4, 3, 2, 1],
&[7, 6, 5, 4, 3, 2],
&[1, 0, 0, 0, 0, 0],
&[2, 1, 0, 0, 0, 0],
&[1, 0, 0, 0, 0, 0],
&[2, 1, 0, 0, 0, 0],
&[12, 5, 4, 3, 2, 1],
&[13, 12, 5, 4, 3, 2],
];
#[cfg(feature = "eu868")]
static EU868_BACKOFF: [Option<u8>; 14] = [
None,
Some(0),
Some(1),
Some(2),
Some(3),
Some(4),
Some(5),
Some(6),
Some(0),
Some(8),
Some(0),
Some(10),
Some(5),
Some(12),
];
#[cfg(feature = "eu868")]
static EU868_CHANNELS: [ChannelBlock; 1] = [ChannelBlock::new(868_100_000, 200_000, 3, 0, 5)];
#[cfg(feature = "eu868")]
static EU868_SUB_BANDS: [SubBand; 2] = [
SubBand::new(868_000_000, 868_600_000, 10, 16),
SubBand::new(869_400_000, 869_650_000, 100, 27),
];
#[cfg(feature = "eu868")]
pub static EU868: ChannelPlan<'static> = ChannelPlan {
name: "EU863-870",
uplink_data_rates: &EU868_DATA_RATES,
downlink_data_rates: &EU868_DATA_RATES,
max_payload_repeater: &EU868_MAX_PAYLOAD_REPEATER,
max_payload_direct: &EU868_MAX_PAYLOAD_DIRECT,
downlink_max_payload_repeater: &EU868_MAX_PAYLOAD_REPEATER,
downlink_max_payload_direct: &EU868_MAX_PAYLOAD_DIRECT,
max_payload_dwell_limited: None,
join_channels: &EU868_CHANNELS,
default_channels: &EU868_CHANNELS,
sub_bands: &EU868_SUB_BANDS,
default_max_eirp_dbm: 16,
tx_power_step_db: 2,
max_tx_power_index: 7,
rx1_data_rate_offsets: &EU868_RX1,
rx1_data_rate_offsets_dwell_limited: None,
max_rx1_data_rate_offset: 5,
rx2_frequency_hz: 869_525_000,
rx2_data_rate: 0,
data_rate_backoff: &EU868_BACKOFF,
beacon: Beacon {
data_rate: 3,
frequency_hz: 869_525_000,
ping_slot_frequency_hz: 869_525_000,
},
has_dwell_time_limit: false,
};
#[cfg(feature = "us915")]
static US915_UPLINK_DATA_RATES: [Option<DataRate>; 9] = [
Some(DataRate::lora(10, 125_000, 980)),
Some(DataRate::lora(9, 125_000, 1_760)),
Some(DataRate::lora(8, 125_000, 3_125)),
Some(DataRate::lora(7, 125_000, 5_470)),
Some(DataRate::lora(8, 500_000, 12_500)),
Some(DataRate::lr_fhss(1, 3, 1_523_000, 162)),
Some(DataRate::lr_fhss(2, 3, 1_523_000, 325)),
Some(DataRate::lora(6, 125_000, 9_375)),
Some(DataRate::lora(5, 125_000, 15_625)),
];
#[cfg(feature = "us915")]
static US915_DOWNLINK_DATA_RATES: [Option<DataRate>; 15] = [
Some(DataRate::lora(5, 500_000, 62_500)),
None,
None,
None,
None,
None,
None,
None,
Some(DataRate::lora(12, 500_000, 980)),
Some(DataRate::lora(11, 500_000, 1_760)),
Some(DataRate::lora(10, 500_000, 3_900)),
Some(DataRate::lora(9, 500_000, 7_000)),
Some(DataRate::lora(8, 500_000, 12_500)),
Some(DataRate::lora(7, 500_000, 21_900)),
Some(DataRate::lora(6, 500_000, 37_500)),
];
#[cfg(feature = "us915")]
static US915_MAX_PAYLOAD_REPEATER: [Option<MaxPayload>; 9] = [
Some(MaxPayload::new(19, 11)),
Some(MaxPayload::new(61, 53)),
Some(MaxPayload::new(133, 125)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(58, 50)),
Some(MaxPayload::new(133, 125)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
];
#[cfg(feature = "us915")]
static US915_MAX_PAYLOAD_DIRECT: [Option<MaxPayload>; 9] = [
Some(MaxPayload::new(19, 11)),
Some(MaxPayload::new(61, 53)),
Some(MaxPayload::new(133, 125)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(58, 50)),
Some(MaxPayload::new(133, 125)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
];
#[cfg(feature = "us915")]
static US915_DOWNLINK_MAX_PAYLOAD_REPEATER: [Option<MaxPayload>; 15] = [
Some(MaxPayload::new(230, 222)),
None,
None,
None,
None,
None,
None,
None,
Some(MaxPayload::new(61, 53)),
Some(MaxPayload::new(137, 129)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
];
#[cfg(feature = "us915")]
static US915_DOWNLINK_MAX_PAYLOAD_DIRECT: [Option<MaxPayload>; 15] = [
Some(MaxPayload::new(250, 242)),
None,
None,
None,
None,
None,
None,
None,
Some(MaxPayload::new(61, 53)),
Some(MaxPayload::new(137, 129)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
];
#[cfg(feature = "us915")]
static US915_RX1: [&[u8]; 9] = [
&[10, 9, 8, 8],
&[11, 10, 9, 8],
&[12, 11, 10, 9],
&[13, 12, 11, 10],
&[13, 13, 12, 11],
&[10, 9, 8, 8],
&[11, 10, 9, 8],
&[14, 13, 12, 11],
&[0, 14, 13, 12],
];
#[cfg(feature = "us915")]
static US915_BACKOFF: [Option<u8>; 9] = [
None,
Some(0),
Some(1),
Some(2),
Some(3),
Some(0),
Some(5),
Some(3),
Some(7),
];
#[cfg(feature = "us915")]
static US915_CHANNELS: [ChannelBlock; 2] = [
ChannelBlock::new(902_300_000, 200_000, 64, 0, 3),
ChannelBlock::new(903_000_000, 1_600_000, 8, 4, 4),
];
#[cfg(feature = "us915")]
static US915_JOIN_CHANNELS: [ChannelBlock; 2] = [
ChannelBlock::new(902_300_000, 200_000, 64, 0, 0),
ChannelBlock::new(903_000_000, 1_600_000, 8, 4, 4),
];
#[cfg(feature = "us915")]
pub static US915: ChannelPlan<'static> = ChannelPlan {
name: "US902-928",
uplink_data_rates: &US915_UPLINK_DATA_RATES,
downlink_data_rates: &US915_DOWNLINK_DATA_RATES,
max_payload_repeater: &US915_MAX_PAYLOAD_REPEATER,
max_payload_direct: &US915_MAX_PAYLOAD_DIRECT,
downlink_max_payload_repeater: &US915_DOWNLINK_MAX_PAYLOAD_REPEATER,
downlink_max_payload_direct: &US915_DOWNLINK_MAX_PAYLOAD_DIRECT,
max_payload_dwell_limited: None,
join_channels: &US915_JOIN_CHANNELS,
default_channels: &US915_CHANNELS,
sub_bands: &[],
default_max_eirp_dbm: 30,
tx_power_step_db: 2,
max_tx_power_index: 14,
rx1_data_rate_offsets: &US915_RX1,
rx1_data_rate_offsets_dwell_limited: None,
max_rx1_data_rate_offset: 3,
rx2_frequency_hz: 923_300_000,
rx2_data_rate: 8,
data_rate_backoff: &US915_BACKOFF,
beacon: Beacon {
data_rate: 8,
frequency_hz: 923_300_000,
ping_slot_frequency_hz: 923_300_000,
},
has_dwell_time_limit: true,
};
#[cfg(feature = "eu433")]
static EU433_DATA_RATES: [Option<DataRate>; 14] = [
Some(DataRate::lora(12, 125_000, 250)),
Some(DataRate::lora(11, 125_000, 440)),
Some(DataRate::lora(10, 125_000, 980)),
Some(DataRate::lora(9, 125_000, 1_760)),
Some(DataRate::lora(8, 125_000, 3_125)),
Some(DataRate::lora(7, 125_000, 5_470)),
Some(DataRate::lora(7, 250_000, 11_000)),
Some(DataRate::fsk(50_000)),
None,
None,
None,
None,
Some(DataRate::lora(6, 125_000, 9_375)),
Some(DataRate::lora(5, 125_000, 15_625)),
];
#[cfg(feature = "eu433")]
static EU433_MAX_PAYLOAD_REPEATER: [Option<MaxPayload>; 14] = [
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(123, 115)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
None,
None,
None,
None,
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
];
#[cfg(feature = "eu433")]
static EU433_MAX_PAYLOAD_DIRECT: [Option<MaxPayload>; 14] = [
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(123, 115)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
None,
None,
None,
None,
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
];
#[cfg(feature = "eu433")]
static EU433_RX1: [&[u8]; 14] = [
&[0, 0, 0, 0, 0, 0],
&[1, 0, 0, 0, 0, 0],
&[2, 1, 0, 0, 0, 0],
&[3, 2, 1, 0, 0, 0],
&[4, 3, 2, 1, 0, 0],
&[5, 4, 3, 2, 1, 0],
&[6, 5, 4, 3, 2, 1],
&[7, 6, 5, 4, 3, 2],
&[0, 0, 0, 0, 0, 0],
&[0, 0, 0, 0, 0, 0],
&[0, 0, 0, 0, 0, 0],
&[0, 0, 0, 0, 0, 0],
&[12, 5, 4, 3, 2, 1],
&[13, 12, 5, 4, 3, 2],
];
#[cfg(feature = "eu433")]
static EU433_BACKOFF: [Option<u8>; 14] = [
None,
Some(0),
Some(1),
Some(2),
Some(3),
Some(4),
Some(5),
Some(6),
None,
None,
None,
None,
Some(5),
Some(12),
];
#[cfg(feature = "eu433")]
static EU433_CHANNELS: [ChannelBlock; 1] = [ChannelBlock::new(433_175_000, 200_000, 3, 0, 5)];
#[cfg(feature = "eu433")]
static EU433_SUB_BANDS: [SubBand; 1] = [SubBand::new(433_050_000, 434_790_000, 100, 12)];
#[cfg(feature = "eu433")]
pub static EU433: ChannelPlan<'static> = ChannelPlan {
name: "EU433",
uplink_data_rates: &EU433_DATA_RATES,
downlink_data_rates: &EU433_DATA_RATES,
max_payload_repeater: &EU433_MAX_PAYLOAD_REPEATER,
max_payload_direct: &EU433_MAX_PAYLOAD_DIRECT,
downlink_max_payload_repeater: &EU433_MAX_PAYLOAD_REPEATER,
downlink_max_payload_direct: &EU433_MAX_PAYLOAD_DIRECT,
max_payload_dwell_limited: None,
join_channels: &EU433_CHANNELS,
default_channels: &EU433_CHANNELS,
sub_bands: &EU433_SUB_BANDS,
default_max_eirp_dbm: 12,
tx_power_step_db: 2,
max_tx_power_index: 5,
rx1_data_rate_offsets: &EU433_RX1,
rx1_data_rate_offsets_dwell_limited: None,
max_rx1_data_rate_offset: 5,
rx2_frequency_hz: 434_665_000,
rx2_data_rate: 0,
data_rate_backoff: &EU433_BACKOFF,
beacon: Beacon {
data_rate: 3,
frequency_hz: 434_665_000,
ping_slot_frequency_hz: 434_665_000,
},
has_dwell_time_limit: false,
};
#[cfg(feature = "au915")]
static AU915_UPLINK_DATA_RATES: [Option<DataRate>; 11] = [
Some(DataRate::lora(12, 125_000, 250)),
Some(DataRate::lora(11, 125_000, 440)),
Some(DataRate::lora(10, 125_000, 980)),
Some(DataRate::lora(9, 125_000, 1_760)),
Some(DataRate::lora(8, 125_000, 3_125)),
Some(DataRate::lora(7, 125_000, 5_470)),
Some(DataRate::lora(8, 500_000, 12_500)),
Some(DataRate::lr_fhss(1, 3, 1_523_000, 162)),
None,
Some(DataRate::lora(6, 125_000, 9_375)),
Some(DataRate::lora(5, 125_000, 15_625)),
];
#[cfg(feature = "au915")]
static AU915_DOWNLINK_DATA_RATES: [Option<DataRate>; 15] = [
Some(DataRate::lora(5, 500_000, 62_500)),
None,
None,
None,
None,
None,
None,
None,
Some(DataRate::lora(12, 500_000, 980)),
Some(DataRate::lora(11, 500_000, 1_760)),
Some(DataRate::lora(10, 500_000, 3_900)),
Some(DataRate::lora(9, 500_000, 7_000)),
Some(DataRate::lora(8, 500_000, 12_500)),
Some(DataRate::lora(7, 500_000, 21_900)),
Some(DataRate::lora(6, 500_000, 37_500)),
];
#[cfg(feature = "au915")]
static AU915_MAX_PAYLOAD_REPEATER: [Option<MaxPayload>; 11] = [
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(123, 115)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(58, 50)),
None,
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
];
#[cfg(feature = "au915")]
static AU915_MAX_PAYLOAD_DIRECT: [Option<MaxPayload>; 11] = [
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(123, 115)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(58, 50)),
None,
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
];
#[cfg(feature = "au915")]
static AU915_MAX_PAYLOAD_DWELL: [Option<MaxPayload>; 11] = [
None,
None,
Some(MaxPayload::new(19, 11)),
Some(MaxPayload::new(61, 53)),
Some(MaxPayload::new(133, 125)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(58, 50)),
None,
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
];
#[cfg(feature = "au915")]
static AU915_DOWNLINK_MAX_PAYLOAD_REPEATER: [Option<MaxPayload>; 15] = [
Some(MaxPayload::new(230, 222)),
None,
None,
None,
None,
None,
None,
None,
Some(MaxPayload::new(61, 53)),
Some(MaxPayload::new(137, 129)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
];
#[cfg(feature = "au915")]
static AU915_DOWNLINK_MAX_PAYLOAD_DIRECT: [Option<MaxPayload>; 15] = [
Some(MaxPayload::new(250, 242)),
None,
None,
None,
None,
None,
None,
None,
Some(MaxPayload::new(61, 53)),
Some(MaxPayload::new(137, 129)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
];
#[cfg(feature = "au915")]
static AU915_RX1: [&[u8]; 11] = [
&[8, 8, 8, 8, 8, 8],
&[9, 8, 8, 8, 8, 8],
&[10, 9, 8, 8, 8, 8],
&[11, 10, 9, 8, 8, 8],
&[12, 11, 10, 9, 8, 8],
&[13, 12, 11, 10, 9, 8],
&[13, 13, 12, 11, 10, 9],
&[9, 8, 8, 8, 8, 8],
&[8, 8, 8, 8, 8, 8],
&[14, 13, 12, 11, 10, 9],
&[0, 14, 13, 12, 11, 10],
];
#[cfg(feature = "au915")]
static AU915_BACKOFF: [Option<u8>; 11] = [
None,
Some(0),
Some(1),
Some(2),
Some(3),
Some(4),
Some(5),
Some(0),
None,
Some(5),
Some(9),
];
#[cfg(feature = "au915")]
static AU915_CHANNELS: [ChannelBlock; 2] = [
ChannelBlock::new(915_200_000, 200_000, 64, 0, 5),
ChannelBlock::new(915_900_000, 1_600_000, 8, 6, 7),
];
#[cfg(feature = "au915")]
pub static AU915: ChannelPlan<'static> = ChannelPlan {
name: "AU915-928",
uplink_data_rates: &AU915_UPLINK_DATA_RATES,
downlink_data_rates: &AU915_DOWNLINK_DATA_RATES,
max_payload_repeater: &AU915_MAX_PAYLOAD_REPEATER,
max_payload_direct: &AU915_MAX_PAYLOAD_DIRECT,
downlink_max_payload_repeater: &AU915_DOWNLINK_MAX_PAYLOAD_REPEATER,
downlink_max_payload_direct: &AU915_DOWNLINK_MAX_PAYLOAD_DIRECT,
max_payload_dwell_limited: Some(&AU915_MAX_PAYLOAD_DWELL),
join_channels: &AU915_CHANNELS,
default_channels: &AU915_CHANNELS,
sub_bands: &[],
default_max_eirp_dbm: 30,
tx_power_step_db: 2,
max_tx_power_index: 14,
rx1_data_rate_offsets: &AU915_RX1,
rx1_data_rate_offsets_dwell_limited: None,
max_rx1_data_rate_offset: 5,
rx2_frequency_hz: 923_300_000,
rx2_data_rate: 8,
data_rate_backoff: &AU915_BACKOFF,
beacon: Beacon {
data_rate: 8,
frequency_hz: 923_300_000,
ping_slot_frequency_hz: 923_300_000,
},
has_dwell_time_limit: true,
};
#[cfg(feature = "cn470")]
static CN470_DATA_RATES: [Option<DataRate>; 8] = [
Some(DataRate::lora(12, 125_000, 250)),
Some(DataRate::lora(11, 125_000, 440)),
Some(DataRate::lora(10, 125_000, 980)),
Some(DataRate::lora(9, 125_000, 1_760)),
Some(DataRate::lora(8, 125_000, 3_125)),
Some(DataRate::lora(7, 125_000, 5_470)),
Some(DataRate::lora(7, 500_000, 21_900)),
Some(DataRate::fsk(50_000)),
];
#[cfg(feature = "cn470")]
static CN470_MAX_PAYLOAD_REPEATER: [Option<MaxPayload>; 8] = [
None,
Some(MaxPayload::new(31, 23)),
Some(MaxPayload::new(94, 86)),
Some(MaxPayload::new(192, 184)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
];
#[cfg(feature = "cn470")]
static CN470_MAX_PAYLOAD_DIRECT: [Option<MaxPayload>; 8] = [
None,
Some(MaxPayload::new(31, 23)),
Some(MaxPayload::new(94, 86)),
Some(MaxPayload::new(192, 184)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
];
#[cfg(feature = "cn470")]
static CN470_RX1: [&[u8]; 8] = [
&[0, 0, 0, 0, 0, 0],
&[1, 1, 1, 1, 1, 1],
&[2, 1, 1, 1, 1, 1],
&[3, 2, 1, 1, 1, 1],
&[4, 3, 2, 1, 1, 1],
&[5, 4, 3, 2, 1, 1],
&[6, 5, 4, 3, 2, 1],
&[7, 6, 5, 4, 3, 2],
];
#[cfg(feature = "cn470")]
static CN470_BACKOFF: [Option<u8>; 8] = [
None,
Some(0),
Some(1),
Some(2),
Some(3),
Some(4),
Some(5),
Some(6),
];
#[cfg(feature = "cn470")]
static CN470_CHANNELS: [ChannelBlock; 2] = [
ChannelBlock::new(470_300_000, 200_000, 32, 0, 5),
ChannelBlock::new(483_900_000, 200_000, 32, 0, 5),
];
#[cfg(feature = "cn470")]
static CN470_JOIN_CHANNELS: [ChannelBlock; 2] = [
ChannelBlock::new(470_900_000, 1_600_000, 4, 0, 5),
ChannelBlock::new(504_100_000, 1_600_000, 4, 0, 5),
];
#[cfg(feature = "cn470")]
pub static CN470: ChannelPlan<'static> = ChannelPlan {
name: "CN470-510",
uplink_data_rates: &CN470_DATA_RATES,
downlink_data_rates: &CN470_DATA_RATES,
max_payload_repeater: &CN470_MAX_PAYLOAD_REPEATER,
max_payload_direct: &CN470_MAX_PAYLOAD_DIRECT,
downlink_max_payload_repeater: &CN470_MAX_PAYLOAD_REPEATER,
downlink_max_payload_direct: &CN470_MAX_PAYLOAD_DIRECT,
max_payload_dwell_limited: None,
join_channels: &CN470_JOIN_CHANNELS,
default_channels: &CN470_CHANNELS,
sub_bands: &[],
default_max_eirp_dbm: 19,
tx_power_step_db: 2,
max_tx_power_index: 7,
rx1_data_rate_offsets: &CN470_RX1,
rx1_data_rate_offsets_dwell_limited: None,
max_rx1_data_rate_offset: 5,
rx2_frequency_hz: 486_900_000,
rx2_data_rate: 1,
data_rate_backoff: &CN470_BACKOFF,
beacon: Beacon {
data_rate: 2,
frequency_hz: 486_900_000,
ping_slot_frequency_hz: 486_900_000,
},
has_dwell_time_limit: false,
};
#[cfg(feature = "as923")]
static AS923_DATA_RATES: [Option<DataRate>; 14] = [
Some(DataRate::lora(12, 125_000, 250)),
Some(DataRate::lora(11, 125_000, 440)),
Some(DataRate::lora(10, 125_000, 980)),
Some(DataRate::lora(9, 125_000, 1_760)),
Some(DataRate::lora(8, 125_000, 3_125)),
Some(DataRate::lora(7, 125_000, 5_470)),
Some(DataRate::lora(7, 250_000, 11_000)),
Some(DataRate::fsk(50_000)),
None,
None,
None,
None,
Some(DataRate::lora(6, 125_000, 9_375)),
Some(DataRate::lora(5, 125_000, 15_625)),
];
#[cfg(feature = "as923")]
static AS923_MAX_PAYLOAD_REPEATER: [Option<MaxPayload>; 14] = [
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(123, 115)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
None,
None,
None,
None,
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
];
#[cfg(feature = "as923")]
static AS923_MAX_PAYLOAD_DIRECT: [Option<MaxPayload>; 14] = [
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(123, 115)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
None,
None,
None,
None,
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
];
#[cfg(feature = "as923")]
static AS923_RX1: [&[u8]; 14] = [
&[0, 0, 0, 0, 0, 0, 1, 2],
&[1, 0, 0, 0, 0, 0, 2, 3],
&[2, 1, 0, 0, 0, 0, 3, 4],
&[3, 2, 1, 0, 0, 0, 4, 5],
&[4, 3, 2, 1, 0, 0, 5, 6],
&[5, 4, 3, 2, 1, 0, 6, 7],
&[6, 5, 4, 3, 2, 1, 7, 7],
&[7, 6, 5, 4, 3, 2, 7, 7],
&[0, 0, 0, 0, 0, 0, 1, 2],
&[0, 0, 0, 0, 0, 0, 1, 2],
&[0, 0, 0, 0, 0, 0, 1, 2],
&[0, 0, 0, 0, 0, 0, 1, 2],
&[12, 5, 4, 3, 2, 1, 13, 13],
&[13, 12, 5, 4, 3, 2, 13, 13],
];
#[cfg(feature = "as923")]
static AS923_RX1_DWELL: [&[u8]; 14] = [
&[2, 2, 2, 2, 2, 2, 2, 2],
&[2, 2, 2, 2, 2, 2, 2, 3],
&[2, 2, 2, 2, 2, 2, 3, 4],
&[3, 2, 2, 2, 2, 2, 4, 5],
&[4, 3, 2, 2, 2, 2, 5, 6],
&[5, 4, 3, 2, 2, 2, 6, 7],
&[6, 5, 4, 3, 2, 2, 7, 7],
&[7, 6, 5, 4, 3, 2, 7, 7],
&[2, 2, 2, 2, 2, 2, 2, 2],
&[2, 2, 2, 2, 2, 2, 2, 2],
&[2, 2, 2, 2, 2, 2, 2, 2],
&[2, 2, 2, 2, 2, 2, 2, 2],
&[12, 5, 4, 3, 2, 2, 13, 13],
&[13, 12, 5, 4, 3, 2, 13, 13],
];
#[cfg(feature = "as923")]
static AS923_BACKOFF: [Option<u8>; 14] = [
None,
Some(0),
Some(1),
Some(2),
Some(3),
Some(4),
Some(5),
Some(6),
None,
None,
None,
None,
Some(5),
Some(12),
];
#[cfg(feature = "as923")]
static AS923_CHANNELS: [ChannelBlock; 1] = [ChannelBlock::new(923_200_000, 200_000, 2, 0, 5)];
#[cfg(feature = "as923")]
static AS923_SUB_BANDS: [SubBand; 1] = [SubBand::new(923_000_000, 923_500_000, 10, 16)];
#[cfg(feature = "as923")]
pub static AS923: ChannelPlan<'static> = ChannelPlan {
name: "AS923",
uplink_data_rates: &AS923_DATA_RATES,
downlink_data_rates: &AS923_DATA_RATES,
max_payload_repeater: &AS923_MAX_PAYLOAD_REPEATER,
max_payload_direct: &AS923_MAX_PAYLOAD_DIRECT,
downlink_max_payload_repeater: &AS923_MAX_PAYLOAD_REPEATER,
downlink_max_payload_direct: &AS923_MAX_PAYLOAD_DIRECT,
max_payload_dwell_limited: None,
join_channels: &AS923_CHANNELS,
default_channels: &AS923_CHANNELS,
sub_bands: &AS923_SUB_BANDS,
default_max_eirp_dbm: 16,
tx_power_step_db: 2,
max_tx_power_index: 7,
rx1_data_rate_offsets: &AS923_RX1,
rx1_data_rate_offsets_dwell_limited: Some(&AS923_RX1_DWELL),
max_rx1_data_rate_offset: 7,
rx2_frequency_hz: 923_200_000,
rx2_data_rate: 2,
data_rate_backoff: &AS923_BACKOFF,
beacon: Beacon {
data_rate: 3,
frequency_hz: 923_400_000,
ping_slot_frequency_hz: 923_400_000,
},
has_dwell_time_limit: true,
};
#[cfg(feature = "kr920")]
static KR920_DATA_RATES: [Option<DataRate>; 14] = [
Some(DataRate::lora(12, 125_000, 250)),
Some(DataRate::lora(11, 125_000, 440)),
Some(DataRate::lora(10, 125_000, 980)),
Some(DataRate::lora(9, 125_000, 1_760)),
Some(DataRate::lora(8, 125_000, 3_125)),
Some(DataRate::lora(7, 125_000, 5_470)),
None,
None,
None,
None,
None,
None,
Some(DataRate::lora(6, 125_000, 9_375)),
Some(DataRate::lora(5, 125_000, 15_625)),
];
#[cfg(feature = "kr920")]
static KR920_MAX_PAYLOAD_REPEATER: [Option<MaxPayload>; 14] = [
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(123, 115)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
None,
None,
None,
None,
None,
None,
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
];
#[cfg(feature = "kr920")]
static KR920_MAX_PAYLOAD_DIRECT: [Option<MaxPayload>; 14] = [
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(123, 115)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
None,
None,
None,
None,
None,
None,
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
];
#[cfg(feature = "kr920")]
static KR920_RX1: [&[u8]; 14] = [
&[0, 0, 0, 0, 0, 0],
&[1, 0, 0, 0, 0, 0],
&[2, 1, 0, 0, 0, 0],
&[3, 2, 1, 0, 0, 0],
&[4, 3, 2, 1, 0, 0],
&[5, 4, 3, 2, 1, 0],
&[0, 0, 0, 0, 0, 0],
&[0, 0, 0, 0, 0, 0],
&[0, 0, 0, 0, 0, 0],
&[0, 0, 0, 0, 0, 0],
&[0, 0, 0, 0, 0, 0],
&[0, 0, 0, 0, 0, 0],
&[12, 5, 4, 3, 2, 1],
&[13, 12, 5, 4, 3, 2],
];
#[cfg(feature = "kr920")]
static KR920_BACKOFF: [Option<u8>; 14] = [
None,
Some(0),
Some(1),
Some(2),
Some(3),
Some(4),
None,
None,
None,
None,
None,
None,
Some(5),
Some(12),
];
#[cfg(feature = "kr920")]
static KR920_CHANNELS: [ChannelBlock; 1] = [ChannelBlock::new(922_100_000, 200_000, 3, 0, 5)];
#[cfg(feature = "kr920")]
static KR920_SUB_BANDS: [SubBand; 2] = [
SubBand::new(920_900_000, 921_900_000, 1000, 10),
SubBand::new(922_100_000, 923_300_000, 1000, 14),
];
#[cfg(feature = "kr920")]
pub static KR920: ChannelPlan<'static> = ChannelPlan {
name: "KR920-923",
uplink_data_rates: &KR920_DATA_RATES,
downlink_data_rates: &KR920_DATA_RATES,
max_payload_repeater: &KR920_MAX_PAYLOAD_REPEATER,
max_payload_direct: &KR920_MAX_PAYLOAD_DIRECT,
downlink_max_payload_repeater: &KR920_MAX_PAYLOAD_REPEATER,
downlink_max_payload_direct: &KR920_MAX_PAYLOAD_DIRECT,
max_payload_dwell_limited: None,
join_channels: &KR920_CHANNELS,
default_channels: &KR920_CHANNELS,
sub_bands: &KR920_SUB_BANDS,
default_max_eirp_dbm: 14,
tx_power_step_db: 2,
max_tx_power_index: 7,
rx1_data_rate_offsets: &KR920_RX1,
rx1_data_rate_offsets_dwell_limited: None,
max_rx1_data_rate_offset: 5,
rx2_frequency_hz: 921_900_000,
rx2_data_rate: 0,
data_rate_backoff: &KR920_BACKOFF,
beacon: Beacon {
data_rate: 3,
frequency_hz: 923_100_000,
ping_slot_frequency_hz: 923_100_000,
},
has_dwell_time_limit: false,
};
#[cfg(feature = "in865")]
static IN865_DATA_RATES: [Option<DataRate>; 14] = [
Some(DataRate::lora(12, 125_000, 250)),
Some(DataRate::lora(11, 125_000, 440)),
Some(DataRate::lora(10, 125_000, 980)),
Some(DataRate::lora(9, 125_000, 1_760)),
Some(DataRate::lora(8, 125_000, 3_125)),
Some(DataRate::lora(7, 125_000, 5_470)),
None,
Some(DataRate::fsk(50_000)),
None,
None,
None,
None,
Some(DataRate::lora(6, 125_000, 9_375)),
Some(DataRate::lora(5, 125_000, 15_625)),
];
#[cfg(feature = "in865")]
static IN865_MAX_PAYLOAD_REPEATER: [Option<MaxPayload>; 14] = [
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(123, 115)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
None,
Some(MaxPayload::new(230, 222)),
None,
None,
None,
None,
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
];
#[cfg(feature = "in865")]
static IN865_MAX_PAYLOAD_DIRECT: [Option<MaxPayload>; 14] = [
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(123, 115)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
None,
Some(MaxPayload::new(250, 242)),
None,
None,
None,
None,
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
];
#[cfg(feature = "in865")]
static IN865_RX1: [&[u8]; 14] = [
&[0, 0, 0, 0, 0, 0, 1, 2],
&[1, 0, 0, 0, 0, 0, 2, 3],
&[2, 1, 0, 0, 0, 0, 3, 4],
&[3, 2, 1, 0, 0, 0, 4, 5],
&[4, 3, 2, 1, 0, 0, 5, 5],
&[5, 4, 3, 2, 1, 0, 5, 7],
&[0, 0, 0, 0, 0, 0, 1, 2],
&[7, 5, 5, 4, 3, 2, 7, 7],
&[0, 0, 0, 0, 0, 0, 1, 2],
&[0, 0, 0, 0, 0, 0, 1, 2],
&[0, 0, 0, 0, 0, 0, 1, 2],
&[0, 0, 0, 0, 0, 0, 1, 2],
&[12, 5, 4, 3, 2, 1, 13, 13],
&[13, 12, 5, 4, 3, 2, 13, 13],
];
#[cfg(feature = "in865")]
static IN865_BACKOFF: [Option<u8>; 14] = [
None,
Some(0),
Some(1),
Some(2),
Some(3),
Some(4),
None,
Some(5),
None,
None,
None,
None,
Some(5),
Some(12),
];
#[cfg(feature = "in865")]
static IN865_CHANNELS: [ChannelBlock; 3] = [
ChannelBlock::new(865_062_500, 0, 1, 0, 5),
ChannelBlock::new(865_402_500, 0, 1, 0, 5),
ChannelBlock::new(865_985_000, 0, 1, 0, 5),
];
#[cfg(feature = "in865")]
pub static IN865: ChannelPlan<'static> = ChannelPlan {
name: "IN865",
uplink_data_rates: &IN865_DATA_RATES,
downlink_data_rates: &IN865_DATA_RATES,
max_payload_repeater: &IN865_MAX_PAYLOAD_REPEATER,
max_payload_direct: &IN865_MAX_PAYLOAD_DIRECT,
downlink_max_payload_repeater: &IN865_MAX_PAYLOAD_REPEATER,
downlink_max_payload_direct: &IN865_MAX_PAYLOAD_DIRECT,
max_payload_dwell_limited: None,
join_channels: &IN865_CHANNELS,
default_channels: &IN865_CHANNELS,
sub_bands: &[],
default_max_eirp_dbm: 29,
tx_power_step_db: 2,
max_tx_power_index: 10,
rx1_data_rate_offsets: &IN865_RX1,
rx1_data_rate_offsets_dwell_limited: None,
max_rx1_data_rate_offset: 7,
rx2_frequency_hz: 866_550_000,
rx2_data_rate: 2,
data_rate_backoff: &IN865_BACKOFF,
beacon: Beacon {
data_rate: 4,
frequency_hz: 866_550_000,
ping_slot_frequency_hz: 866_550_000,
},
has_dwell_time_limit: false,
};
#[cfg(feature = "ru864")]
static RU864_DATA_RATES: [Option<DataRate>; 14] = [
Some(DataRate::lora(12, 125_000, 250)),
Some(DataRate::lora(11, 125_000, 440)),
Some(DataRate::lora(10, 125_000, 980)),
Some(DataRate::lora(9, 125_000, 1_760)),
Some(DataRate::lora(8, 125_000, 3_125)),
Some(DataRate::lora(7, 125_000, 5_470)),
Some(DataRate::lora(7, 250_000, 11_000)),
Some(DataRate::fsk(50_000)),
None,
None,
None,
None,
Some(DataRate::lora(6, 125_000, 9_375)),
Some(DataRate::lora(5, 125_000, 15_625)),
];
#[cfg(feature = "ru864")]
static RU864_MAX_PAYLOAD_REPEATER: [Option<MaxPayload>; 14] = [
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(123, 115)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
None,
None,
None,
None,
Some(MaxPayload::new(230, 222)),
Some(MaxPayload::new(230, 222)),
];
#[cfg(feature = "ru864")]
static RU864_MAX_PAYLOAD_DIRECT: [Option<MaxPayload>; 14] = [
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(59, 51)),
Some(MaxPayload::new(123, 115)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
None,
None,
None,
None,
Some(MaxPayload::new(250, 242)),
Some(MaxPayload::new(250, 242)),
];
#[cfg(feature = "ru864")]
static RU864_RX1: [&[u8]; 14] = [
&[0, 0, 0, 0, 0, 0],
&[1, 0, 0, 0, 0, 0],
&[2, 1, 0, 0, 0, 0],
&[3, 2, 1, 0, 0, 0],
&[4, 3, 2, 1, 0, 0],
&[5, 4, 3, 2, 1, 0],
&[6, 5, 4, 3, 2, 1],
&[7, 6, 5, 4, 3, 2],
&[0, 0, 0, 0, 0, 0],
&[0, 0, 0, 0, 0, 0],
&[0, 0, 0, 0, 0, 0],
&[0, 0, 0, 0, 0, 0],
&[12, 5, 4, 3, 2, 1],
&[13, 12, 5, 4, 3, 2],
];
#[cfg(feature = "ru864")]
static RU864_BACKOFF: [Option<u8>; 14] = [
None,
Some(0),
Some(1),
Some(2),
Some(3),
Some(4),
Some(5),
Some(6),
None,
None,
None,
None,
Some(5),
Some(12),
];
#[cfg(feature = "ru864")]
static RU864_CHANNELS: [ChannelBlock; 1] = [ChannelBlock::new(868_900_000, 200_000, 2, 0, 5)];
#[cfg(feature = "ru864")]
static RU864_SUB_BANDS: [SubBand; 1] = [SubBand::new(868_700_000, 869_200_000, 10, 16)];
#[cfg(feature = "ru864")]
pub static RU864: ChannelPlan<'static> = ChannelPlan {
name: "RU864-870",
uplink_data_rates: &RU864_DATA_RATES,
downlink_data_rates: &RU864_DATA_RATES,
max_payload_repeater: &RU864_MAX_PAYLOAD_REPEATER,
max_payload_direct: &RU864_MAX_PAYLOAD_DIRECT,
downlink_max_payload_repeater: &RU864_MAX_PAYLOAD_REPEATER,
downlink_max_payload_direct: &RU864_MAX_PAYLOAD_DIRECT,
max_payload_dwell_limited: None,
join_channels: &RU864_CHANNELS,
default_channels: &RU864_CHANNELS,
sub_bands: &RU864_SUB_BANDS,
default_max_eirp_dbm: 16,
tx_power_step_db: 2,
max_tx_power_index: 7,
rx1_data_rate_offsets: &RU864_RX1,
rx1_data_rate_offsets_dwell_limited: None,
max_rx1_data_rate_offset: 5,
rx2_frequency_hz: 869_100_000,
rx2_data_rate: 0,
data_rate_backoff: &RU864_BACKOFF,
beacon: Beacon {
data_rate: 3,
frequency_hz: 869_100_000,
ping_slot_frequency_hz: 868_900_000,
},
has_dwell_time_limit: false,
};