mirror of
https://github.com/soypat/lora.git
synced 2026-07-26 07:28:38 +00:00
fix bug in SX1278 read received message
This commit is contained in:
@@ -6,6 +6,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"io"
|
"io"
|
||||||
"machine"
|
"machine"
|
||||||
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/soypat/lora"
|
"github.com/soypat/lora"
|
||||||
@@ -17,7 +18,7 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
SX127X_PIN_RST = machine.GP16
|
SX127X_PIN_RST = machine.GP6
|
||||||
// SPI definition for SX127x
|
// SPI definition for SX127x
|
||||||
|
|
||||||
SX127X_PIN_SCK = machine.GP2
|
SX127X_PIN_SCK = machine.GP2
|
||||||
@@ -59,7 +60,7 @@ func main() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
println("received LoRa:", string(rx[:n]))
|
println("received LoRa length", n, ":", strconv.Quote(string(rx[:n])))
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
SX127X_PIN_RST = machine.GP16
|
SX127X_PIN_RST = machine.GP6
|
||||||
// SPI definition for SX127x
|
// SPI definition for SX127x
|
||||||
|
|
||||||
SX127X_PIN_SCK = machine.GP2
|
SX127X_PIN_SCK = machine.GP2
|
||||||
@@ -27,6 +27,7 @@ const (
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
time.Sleep(500 * time.Millisecond)
|
time.Sleep(500 * time.Millisecond)
|
||||||
|
println("program start")
|
||||||
defer println("program end")
|
defer println("program end")
|
||||||
SX127X_PIN_RST.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
SX127X_PIN_RST.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
||||||
SX127X_PIN_CS.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
SX127X_PIN_CS.Configure(machine.PinConfig{Mode: machine.PinOutput})
|
||||||
@@ -41,7 +42,6 @@ func main() {
|
|||||||
}
|
}
|
||||||
dev := sx127x.NewLoRa(SX127X_SPI, SX127X_PIN_CS.Set, SX127X_PIN_RST.Set)
|
dev := sx127x.NewLoRa(SX127X_SPI, SX127X_PIN_CS.Set, SX127X_PIN_RST.Set)
|
||||||
cfg := sx127x.DefaultConfig(lora.Freq433_0M)
|
cfg := sx127x.DefaultConfig(lora.Freq433_0M)
|
||||||
cfg.TxPower = 0 // Minimum power.
|
|
||||||
err = dev.Configure(cfg)
|
err = dev.Configure(cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err.Error())
|
panic(err.Error())
|
||||||
@@ -49,8 +49,9 @@ func main() {
|
|||||||
|
|
||||||
randomU32, _ := dev.RandomU32()
|
randomU32, _ := dev.RandomU32()
|
||||||
myName := fmt.Sprintf("user-%x", randomU32%0xffff)
|
myName := fmt.Sprintf("user-%x", randomU32%0xffff)
|
||||||
println("config success; sending messages as ", myName)
|
|
||||||
packet := []byte(myName + " says hello!")
|
packet := []byte(myName + " says hello!")
|
||||||
|
println("config success; sending messages as ", myName, "of length", len(packet))
|
||||||
for {
|
for {
|
||||||
err = dev.Tx(packet)
|
err = dev.Tx(packet)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
+6
-5
@@ -76,13 +76,13 @@ const (
|
|||||||
regPA_RAMP = 0x0a
|
regPA_RAMP = 0x0a
|
||||||
regOCP = 0x0b
|
regOCP = 0x0b
|
||||||
regLNA = 0x0c
|
regLNA = 0x0c
|
||||||
regFIFO_ADDR_PTR = 0x0d
|
regFIFO_ADDR_PTR = 0x0d // FIFO SPI Pointer.
|
||||||
regFIFO_TX_BASE_ADDR = 0x0e
|
regFIFO_TX_BASE_ADDR = 0x0e // Start of Tx data. May overlap with Rx data.
|
||||||
regFIFO_RX_BASE_ADDR = 0x0f
|
regFIFO_RX_BASE_ADDR = 0x0f // Start of Rx data. May overlap with Tx data.
|
||||||
regFIFO_RX_CURRENT_ADDR = 0x10
|
regFIFO_RX_CURRENT_ADDR = 0x10 // Start address of last packet received.
|
||||||
regIRQ_FLAGS_MASK = 0x11
|
regIRQ_FLAGS_MASK = 0x11
|
||||||
regIRQ_FLAGS = 0x12
|
regIRQ_FLAGS = 0x12
|
||||||
regRX_NB_BYTES = 0x13
|
regRX_NB_BYTES = 0x13 // Number of received bytes.
|
||||||
regPKT_SNR_VALUE = 0x19
|
regPKT_SNR_VALUE = 0x19
|
||||||
regPKT_RSSI_VALUE = 0x1a
|
regPKT_RSSI_VALUE = 0x1a
|
||||||
regRSSI_VALUE = 0x1b
|
regRSSI_VALUE = 0x1b
|
||||||
@@ -94,6 +94,7 @@ const (
|
|||||||
regPAYLOAD_LENGTH = 0x22
|
regPAYLOAD_LENGTH = 0x22
|
||||||
regMAX_PAYLOAD_LENGTH = 0x23
|
regMAX_PAYLOAD_LENGTH = 0x23
|
||||||
regHOP_PERIOD = 0x24
|
regHOP_PERIOD = 0x24
|
||||||
|
regFIFO_RX_BYTE_ADDR = 0x25 // Address of last byte received in FIFO.
|
||||||
regMODEM_CONFIG_3 = 0x26
|
regMODEM_CONFIG_3 = 0x26
|
||||||
regFREQ_ERROR_MSB = 0x28
|
regFREQ_ERROR_MSB = 0x28
|
||||||
regFREQ_ERROR_MID = 0x29
|
regFREQ_ERROR_MID = 0x29
|
||||||
|
|||||||
+23
-12
@@ -1067,10 +1067,7 @@ func (d *DeviceLoRa) readerToLastPacket() (_ *fifoReader, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// We now know that the packet has been received succesfully. Proceed to read.
|
// We now know that the packet has been received succesfully. Proceed to read.
|
||||||
curraddr, err := d.read8(regFIFO_RX_CURRENT_ADDR)
|
// RxNbBytes indicates the number of received bytes thus far.
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
numBytes, err := d.read8(regRX_NB_BYTES)
|
numBytes, err := d.read8(regRX_NB_BYTES)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -1078,16 +1075,30 @@ func (d *DeviceLoRa) readerToLastPacket() (_ *fifoReader, err error) {
|
|||||||
if numBytes == 0 {
|
if numBytes == 0 {
|
||||||
return nil, errors.New("readerToNextPacket called with RX_NB_BYTES=0")
|
return nil, errors.New("readerToNextPacket called with RX_NB_BYTES=0")
|
||||||
}
|
}
|
||||||
|
// FIFORxCurrentAddr is the location in the FIFO of the last packet received.
|
||||||
|
curraddr, err := d.read8(regFIFO_RX_CURRENT_ADDR)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
byteAddr, err := d.read8(regFIFO_RX_BYTE_ADDR)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
calcNumBytes := byteAddr - curraddr
|
||||||
|
if calcNumBytes != numBytes {
|
||||||
|
println("inconsistent numBytes", numBytes, "calcNumBytes", calcNumBytes)
|
||||||
|
}
|
||||||
err = d.Write8(regFIFO_ADDR_PTR, curraddr)
|
err = d.Write8(regFIFO_ADDR_PTR, curraddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &fifoReader{d: d, leftToRead: numBytes}, nil
|
return &fifoReader{D: d, BTR: numBytes}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type fifoReader struct {
|
type fifoReader struct {
|
||||||
d *DeviceLoRa
|
D *DeviceLoRa
|
||||||
leftToRead uint8
|
// Bytes to read.
|
||||||
|
BTR uint8
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *fifoReader) Read(buf []byte) (int, error) {
|
func (f *fifoReader) Read(buf []byte) (int, error) {
|
||||||
@@ -1096,20 +1107,20 @@ func (f *fifoReader) Read(buf []byte) (int, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (f *fifoReader) readInternal(buf []byte) (_ uint8, err error) {
|
func (f *fifoReader) readInternal(buf []byte) (_ uint8, err error) {
|
||||||
if f.leftToRead == 0 {
|
if f.BTR == 0 {
|
||||||
return 0, io.EOF
|
return 0, io.EOF
|
||||||
}
|
}
|
||||||
toRead := f.leftToRead
|
toRead := f.BTR
|
||||||
if int(toRead) > len(buf) {
|
if int(toRead) > len(buf) {
|
||||||
toRead = uint8(len(buf))
|
toRead = uint8(len(buf))
|
||||||
}
|
}
|
||||||
for i := uint8(0); i < toRead; i-- {
|
for i := uint8(0); i < toRead; i++ {
|
||||||
buf[i], err = f.d.read8(regFIFO)
|
buf[i], err = f.D.read8(regFIFO)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return i, err
|
return i, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
f.leftToRead -= toRead
|
f.BTR -= toRead
|
||||||
return toRead, nil
|
return toRead, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user