diff --git a/lora/lorawan/adaptor.go b/lora/lorawan/adaptor.go index a3db730..e09681d 100644 --- a/lora/lorawan/adaptor.go +++ b/lora/lorawan/adaptor.go @@ -44,6 +44,15 @@ func UseRadio(r lora.Radio) { ActiveRadio = r } +func ApplyChannelConfig(ch *region.Channel) { + ActiveRadio.SetFrequency(ch.Frequency) + ActiveRadio.SetBandwidth(ch.Bandwidth) + ActiveRadio.SetCodingRate(ch.CodingRate) + ActiveRadio.SetSpreadingFactor(ch.SpreadingFactor) + ActiveRadio.SetPreambleLength(ch.PreambleLength) + ActiveRadio.SetTxPower(ch.TxPowerDBm) +} + func Join(otaa *Otaa, session *Session) error { var resp []uint8 @@ -64,25 +73,18 @@ func Join(otaa *Otaa, session *Session) error { } // Prepare radio for Join Tx - joinChannel := regionSettings.GetJoinRequestChannel() - ActiveRadio.SetFrequency(joinChannel.Frequency) - ActiveRadio.SetBandwidth(joinChannel.Bandwidth) - ActiveRadio.SetCodingRate(joinChannel.CodingRate) - ActiveRadio.SetSpreadingFactor(joinChannel.SpreadingFactor) + ApplyChannelConfig(regionSettings.JoinRequestChannel()) ActiveRadio.SetCrc(true) - ActiveRadio.SetIqMode(0) // IQ Standard + ActiveRadio.SetIqMode(lora.IQStandard) ActiveRadio.Tx(payload, LORA_TX_TIMEOUT) if err != nil { return err } // Wait for JoinAccept - joinChannel = regionSettings.GetJoinAcceptChannel() - ActiveRadio.SetFrequency(joinChannel.Frequency) - ActiveRadio.SetBandwidth(joinChannel.Bandwidth) - ActiveRadio.SetCodingRate(joinChannel.CodingRate) - ActiveRadio.SetSpreadingFactor(joinChannel.SpreadingFactor) - ActiveRadio.SetIqMode(1) // IQ Inverted + ApplyChannelConfig(regionSettings.JoinAcceptChannel()) + ActiveRadio.SetCrc(true) + ActiveRadio.SetIqMode(lora.IQInverted) for i := 0; i < Retries; i++ { resp, err = ActiveRadio.Rx(LORA_RX_TIMEOUT) if err != nil { @@ -115,13 +117,9 @@ func SendUplink(data []uint8, session *Session) error { return err } - joinChannel := regionSettings.GetUplinkChannel() - ActiveRadio.SetFrequency(joinChannel.Frequency) - ActiveRadio.SetBandwidth(joinChannel.Bandwidth) - ActiveRadio.SetCodingRate(joinChannel.CodingRate) - ActiveRadio.SetSpreadingFactor(joinChannel.SpreadingFactor) + ApplyChannelConfig(regionSettings.UplinkChannel()) ActiveRadio.SetCrc(true) - ActiveRadio.SetIqMode(0) // IQ Standard + ActiveRadio.SetIqMode(lora.IQInverted) ActiveRadio.Tx(payload, LORA_TX_TIMEOUT) if err != nil { return err diff --git a/lora/lorawan/region/au915.go b/lora/lorawan/region/au915.go index 3168f05..6cabd4a 100644 --- a/lora/lorawan/region/au915.go +++ b/lora/lorawan/region/au915.go @@ -2,21 +2,48 @@ package region import "tinygo.org/x/drivers/lora" +const ( + AU915_DEFAULT_PREAMBLE_LEN = 8 + AU915_DEFAULT_TX_POWER_DBM = 20 +) + type RegionSettingsAU915 struct { + joinRequestChannel *Channel + joinAcceptChannel *Channel + uplinkChannel *Channel } func AU915() *RegionSettingsAU915 { - return &RegionSettingsAU915{} + return &RegionSettingsAU915{ + joinRequestChannel: &Channel{916800000, + lora.Bandwidth_125_0, + lora.SpreadingFactor9, + lora.CodingRate4_7, + AU915_DEFAULT_PREAMBLE_LEN, + AU915_DEFAULT_TX_POWER_DBM}, + joinAcceptChannel: &Channel{923300000, + lora.Bandwidth_500_0, + lora.SpreadingFactor9, + lora.CodingRate4_7, + AU915_DEFAULT_PREAMBLE_LEN, + AU915_DEFAULT_TX_POWER_DBM}, + uplinkChannel: &Channel{868500000, + lora.Bandwidth_125_0, + lora.SpreadingFactor9, + lora.CodingRate4_7, + AU915_DEFAULT_PREAMBLE_LEN, + AU915_DEFAULT_TX_POWER_DBM}, + } } -func (r *RegionSettingsAU915) GetJoinRequestChannel() Channel { - return Channel{916800000, lora.Bandwidth_125_0, lora.SpreadingFactor9, lora.CodingRate4_5} +func (r *RegionSettingsAU915) JoinRequestChannel() *Channel { + return r.joinRequestChannel } -func (r *RegionSettingsAU915) GetJoinAcceptChannel() Channel { - return Channel{923300000, lora.Bandwidth_500_0, lora.SpreadingFactor9, lora.CodingRate4_5} +func (r *RegionSettingsAU915) JoinAcceptChannel() *Channel { + return r.joinAcceptChannel } -func (r *RegionSettingsAU915) GetUplinkChannel() Channel { - return Channel{868500000, lora.Bandwidth_125_0, lora.SpreadingFactor9, lora.CodingRate4_5} +func (r *RegionSettingsAU915) UplinkChannel() *Channel { + return r.uplinkChannel } diff --git a/lora/lorawan/region/eu868.go b/lora/lorawan/region/eu868.go index ee81497..71850e5 100644 --- a/lora/lorawan/region/eu868.go +++ b/lora/lorawan/region/eu868.go @@ -2,21 +2,48 @@ package region import "tinygo.org/x/drivers/lora" +const ( + EU868_DEFAULT_PREAMBLE_LEN = 8 + EU868_DEFAULT_TX_POWER_DBM = 20 +) + type RegionSettingsEU868 struct { + joinRequestChannel *Channel + joinAcceptChannel *Channel + uplinkChannel *Channel } func EU868() *RegionSettingsEU868 { - return &RegionSettingsEU868{} + return &RegionSettingsEU868{ + joinRequestChannel: &Channel{868100000, + lora.Bandwidth_125_0, + lora.SpreadingFactor9, + lora.CodingRate4_7, + EU868_DEFAULT_PREAMBLE_LEN, + EU868_DEFAULT_TX_POWER_DBM}, + joinAcceptChannel: &Channel{868100000, + lora.Bandwidth_125_0, + lora.SpreadingFactor9, + lora.CodingRate4_7, + EU868_DEFAULT_PREAMBLE_LEN, + EU868_DEFAULT_TX_POWER_DBM}, + uplinkChannel: &Channel{868100000, + lora.Bandwidth_125_0, + lora.SpreadingFactor9, + lora.CodingRate4_7, + EU868_DEFAULT_PREAMBLE_LEN, + EU868_DEFAULT_TX_POWER_DBM}, + } } -func (r *RegionSettingsEU868) GetJoinRequestChannel() Channel { - return Channel{868100000, lora.Bandwidth_125_0, lora.SpreadingFactor9, lora.CodingRate4_7} +func (r *RegionSettingsEU868) JoinRequestChannel() *Channel { + return r.joinRequestChannel } -func (r *RegionSettingsEU868) GetJoinAcceptChannel() Channel { - return Channel{868100000, lora.Bandwidth_125_0, lora.SpreadingFactor9, lora.CodingRate4_7} +func (r *RegionSettingsEU868) JoinAcceptChannel() *Channel { + return r.joinAcceptChannel } -func (r *RegionSettingsEU868) GetUplinkChannel() Channel { - return Channel{868100000, lora.Bandwidth_125_0, lora.SpreadingFactor9, lora.CodingRate4_7} +func (r *RegionSettingsEU868) UplinkChannel() *Channel { + return r.uplinkChannel } diff --git a/lora/lorawan/region/regionset.go b/lora/lorawan/region/regionset.go index cf7dd8d..981d63e 100644 --- a/lora/lorawan/region/regionset.go +++ b/lora/lorawan/region/regionset.go @@ -5,10 +5,12 @@ type Channel struct { Bandwidth uint8 SpreadingFactor uint8 CodingRate uint8 + PreambleLength uint16 + TxPowerDBm int8 } type RegionSettings interface { - GetJoinRequestChannel() Channel - GetJoinAcceptChannel() Channel - GetUplinkChannel() Channel + JoinRequestChannel() *Channel + JoinAcceptChannel() *Channel + UplinkChannel() *Channel } diff --git a/lora/radio.go b/lora/radio.go index b23e352..97f6b49 100644 --- a/lora/radio.go +++ b/lora/radio.go @@ -10,5 +10,7 @@ type Radio interface { SetBandwidth(bw uint8) SetCrc(enable bool) SetSpreadingFactor(sf uint8) + SetPreambleLength(plen uint16) + SetTxPower(txpow int8) LoraConfig(cnf Config) } diff --git a/sx126x/sx126x.go b/sx126x/sx126x.go index bd30d7a..191a950 100644 --- a/sx126x/sx126x.go +++ b/sx126x/sx126x.go @@ -558,12 +558,24 @@ func (d *Device) SetCrc(enable bool) { } } -// SetSpreadingFactor setc surrent Lora Spreading Factor +// SetSpreadingFactor sets current Lora Spreading Factor // NB: Change will be applied at next RX / TX func (d *Device) SetSpreadingFactor(sf uint8) { d.loraConf.Sf = sf } +// SetPreambleLength sets current Lora Preamble Length +// NB: Change will be applied at next RX / TX +func (d *Device) SetPreambleLength(pl uint16) { + d.loraConf.Preamble = pl +} + +// SetTxPowerDbm sets current Lora TX Power in DBm +// NB: Change will be applied at next RX / TX +func (d *Device) SetTxPower(txpow int8) { + d.loraConf.LoraTxPowerDBm = txpow +} + // // Lora functions // diff --git a/sx127x/sx127x.go b/sx127x/sx127x.go index a6c1426..fae572c 100644 --- a/sx127x/sx127x.go +++ b/sx127x/sx127x.go @@ -145,8 +145,13 @@ func (d *Device) GetBandwidth() int32 { } */ -// SetTxPower sets the transmitter output power -func (d *Device) SetTxPower(txPower int8, paBoost bool) { +// SetTxPower sets the transmitter output (with paBoost ON) +func (d *Device) SetTxPower(txPower int8) { + d.SetTxPowerWithPaBoost(txPower, true) +} + +// SetTxPowerWithPaBoost sets the transmitter output power and may activate paBoost +func (d *Device) SetTxPowerWithPaBoost(txPower int8, paBoost bool) { if !paBoost { // RFO if txPower < 0 { @@ -315,7 +320,7 @@ func (d *Device) SetCrc(enable bool) { } } -func (d *Device) SetPreamble(pLen uint16) { +func (d *Device) SetPreambleLength(pLen uint16) { // Sets preamble length d.WriteRegister(SX127X_REG_PREAMBLE_MSB, uint8((pLen>>8)&0xFF)) d.WriteRegister(SX127X_REG_PREAMBLE_LSB, uint8(pLen&0xFF)) @@ -353,14 +358,14 @@ func (d *Device) Tx(pkt []uint8, timeoutMs uint32) error { d.WriteRegister(SX127X_REG_LNA, SX127X_LNA_MAX_GAIN) // Set Low Noise Amplifier to MAX d.SetFrequency(d.loraConf.Freq) - d.SetPreamble(d.loraConf.Preamble) + d.SetPreambleLength(d.loraConf.Preamble) d.SetSyncWord(d.loraConf.SyncWord) d.SetBandwidth(d.loraConf.Bw) d.SetSpreadingFactor(d.loraConf.Sf) d.SetIqMode(d.loraConf.Iq) d.SetCodingRate(d.loraConf.Cr) d.SetCrc(d.loraConf.Crc == lora.CRCOn) - d.SetTxPower(d.loraConf.LoraTxPowerDBm, true) + d.SetTxPower(d.loraConf.LoraTxPowerDBm) d.SetHeaderMode(d.loraConf.HeaderType) d.SetAgcAuto(SX127X_AGC_AUTO_ON) @@ -409,14 +414,14 @@ func (d *Device) Rx(timeoutMs uint32) ([]uint8, error) { d.WriteRegister(SX127X_REG_LNA, SX127X_LNA_MAX_GAIN) // Set Low Noise Amplifier to MAX d.SetFrequency(d.loraConf.Freq) - d.SetPreamble(d.loraConf.Preamble) + d.SetPreambleLength(d.loraConf.Preamble) d.SetSyncWord(d.loraConf.SyncWord) d.SetBandwidth(d.loraConf.Bw) d.SetSpreadingFactor(d.loraConf.Sf) d.SetIqMode(d.loraConf.Iq) d.SetCodingRate(d.loraConf.Cr) d.SetCrc(d.loraConf.Crc == lora.CRCOn) - d.SetTxPower(d.loraConf.LoraTxPowerDBm, true) + d.SetTxPower(d.loraConf.LoraTxPowerDBm) d.SetHeaderMode(d.loraConf.HeaderType) d.SetAgcAuto(SX127X_AGC_AUTO_ON)