mirror of
https://github.com/soypat/lora.git
synced 2026-08-20 12:28:59 +00:00
begin adding working version
This commit is contained in:
+11
-2
@@ -2,6 +2,7 @@ package sx127x
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/soypat/lora"
|
"github.com/soypat/lora"
|
||||||
)
|
)
|
||||||
@@ -11,14 +12,18 @@ type DeviceLoRaBare struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d *DeviceLoRaBare) Configure(c lora.Config) (err error) {
|
func (d *DeviceLoRaBare) Configure(c lora.Config) (err error) {
|
||||||
err = d.DL.InitLoRaMode()
|
d.DL.Reset()
|
||||||
|
// Seems to take just under ~6ms. Wait 20ms.
|
||||||
|
err = d.DL.rxFSKChainCalibration(20 * time.Millisecond)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = d.DL.SetOpMode(OpSleep)
|
err = d.SetOpModeBare(OpSleep)
|
||||||
|
// err = d.DL.InitLoRaMode()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set up FIFO
|
// Set up FIFO
|
||||||
// We configure so that we can use the entire 256 byte FIFO for either receive
|
// We configure so that we can use the entire 256 byte FIFO for either receive
|
||||||
// or transmit, but not both at the same time
|
// or transmit, but not both at the same time
|
||||||
@@ -69,6 +74,10 @@ func (d *DeviceLoRaBare) crappySetTxPower(power int8, useRFO bool) (err error) {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *DeviceLoRaBare) SetOpModeBare(mode OpMode) (err error) {
|
||||||
|
return d.DL.writeMasked8(regOP_MODE, uint8(mode), 0x07)
|
||||||
|
}
|
||||||
|
|
||||||
func (d *DeviceLoRaBare) Send(packet []byte) (err error) {
|
func (d *DeviceLoRaBare) Send(packet []byte) (err error) {
|
||||||
if len(packet) > 251 {
|
if len(packet) > 251 {
|
||||||
return errors.New("too long")
|
return errors.New("too long")
|
||||||
|
|||||||
+66
-6
@@ -82,7 +82,7 @@ func DefaultConfig(freq lora.Frequency) lora.Config {
|
|||||||
return lora.Config{
|
return lora.Config{
|
||||||
Frequency: freq,
|
Frequency: freq,
|
||||||
SpreadFactor: lora.SF7,
|
SpreadFactor: lora.SF7,
|
||||||
Bandwidth: 125 * lora.Kilohertz,
|
Bandwidth: lora.BW125k,
|
||||||
CodingRate: lora.CR4_5,
|
CodingRate: lora.CR4_5,
|
||||||
PreambleLength: 8,
|
PreambleLength: 8,
|
||||||
HeaderType: lora.HeaderExplicit,
|
HeaderType: lora.HeaderExplicit,
|
||||||
@@ -110,7 +110,7 @@ var (
|
|||||||
errBadMode = errors.New("bad op mode: sx127x in FSK/OOK mode, not LoRa or viceversa")
|
errBadMode = errors.New("bad op mode: sx127x in FSK/OOK mode, not LoRa or viceversa")
|
||||||
errSharedMode = errors.New("bad op mode: sx127x in shared access mode")
|
errSharedMode = errors.New("bad op mode: sx127x in shared access mode")
|
||||||
errBadCodingRate = errors.New("bad coding rate")
|
errBadCodingRate = errors.New("bad coding rate")
|
||||||
errUnsupportedBandwidth = errors.New("bandwidth too high for frequency around 169MHz")
|
errUnsupportedBandwidth = errors.New("unsupported bandwidth")
|
||||||
errIRQNotCleared = errors.New("IRQs not cleared")
|
errIRQNotCleared = errors.New("IRQs not cleared")
|
||||||
ErrDeviceBusy = errors.New("device busy")
|
ErrDeviceBusy = errors.New("device busy")
|
||||||
ErrCRC = errors.New("crc error")
|
ErrCRC = errors.New("crc error")
|
||||||
@@ -147,7 +147,8 @@ func (d *DeviceLoRa) Configure(cfg lora.Config) (err error) {
|
|||||||
err = errPreambleTooShort
|
err = errPreambleTooShort
|
||||||
case cfg.CodingRate < lora.CR4_5 || cfg.CodingRate > lora.CR4_8:
|
case cfg.CodingRate < lora.CR4_5 || cfg.CodingRate > lora.CR4_8:
|
||||||
err = errBadCodingRate
|
err = errBadCodingRate
|
||||||
case cfg.Frequency < 175*lora.Megahertz && cfg.Bandwidth > 125*lora.Kilohertz:
|
case cfg.Frequency < 175*lora.Megahertz && cfg.Bandwidth > 125*lora.Kilohertz ||
|
||||||
|
(cfg.Bandwidth > 500*lora.Kilohertz): // according to a famous library 500kHz is limit? todo: check this.
|
||||||
err = errUnsupportedBandwidth
|
err = errUnsupportedBandwidth
|
||||||
case cfg.HeaderType != lora.HeaderImplicit && cfg.HeaderType != lora.HeaderExplicit:
|
case cfg.HeaderType != lora.HeaderImplicit && cfg.HeaderType != lora.HeaderExplicit:
|
||||||
err = errors.New("bad header type")
|
err = errors.New("bad header type")
|
||||||
@@ -239,11 +240,11 @@ func (d *DeviceLoRa) Configure(cfg lora.Config) (err error) {
|
|||||||
|
|
||||||
func (d *DeviceLoRa) Reset() {
|
func (d *DeviceLoRa) Reset() {
|
||||||
d.rst(true)
|
d.rst(true)
|
||||||
time.Sleep(200 * time.Millisecond)
|
time.Sleep(6 * time.Millisecond)
|
||||||
d.rst(false)
|
d.rst(false)
|
||||||
time.Sleep(200 * time.Millisecond)
|
time.Sleep(1 * time.Millisecond)
|
||||||
d.rst(true)
|
d.rst(true)
|
||||||
time.Sleep(200 * time.Millisecond)
|
time.Sleep(6 * time.Millisecond)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsConnected reads the version register and checks if it matches the expected value.
|
// IsConnected reads the version register and checks if it matches the expected value.
|
||||||
@@ -1110,3 +1111,62 @@ func (f *fifoReader) readInternal(buf []byte) (_ uint8, err error) {
|
|||||||
f.leftToRead -= toRead
|
f.leftToRead -= toRead
|
||||||
return toRead, nil
|
return toRead, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *DeviceLoRa) rxFSKChainCalibration(timeout time.Duration) error {
|
||||||
|
deadline := time.Now().Add(timeout)
|
||||||
|
// Store configuration subject to change.
|
||||||
|
cfg, err := d.ReadConfig()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
paCfgInitVal, err := d.read8(regPA_CONFIG)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
d.Write8(regPA_CONFIG, 0x00) // Cut PA just in case.
|
||||||
|
|
||||||
|
// Launch Rx chain calibration for LF band
|
||||||
|
err = d.imageCal(deadline)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Launch calibration in HF band.
|
||||||
|
err = d.setFrequency(lora.Freq868_1M)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = d.imageCal(deadline)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Restore initial configuration.
|
||||||
|
err = d.Write8(regPA_CONFIG, paCfgInitVal)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return d.setFrequency(cfg.Frequency)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *DeviceLoRa) imageCal(deadline time.Time) error {
|
||||||
|
const imageCalStart, imageCalMask = 0x40, 0xBF
|
||||||
|
err := d.writeMasked8(regImageCal, imageCalMask, imageCalStart)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for time.Now().Before(deadline) {
|
||||||
|
const imageCalRunning = 0x20
|
||||||
|
got, err := d.read8(regImageCal)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if got&imageCalRunning != imageCalRunning {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
runtime.Gosched()
|
||||||
|
}
|
||||||
|
if !time.Now().Before(deadline) {
|
||||||
|
return errors.New("imageCal timeout")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user