diff --git a/examples/receiver/receiver.go b/examples/receiver/receiver.go index 208b56d..8bd91b0 100644 --- a/examples/receiver/receiver.go +++ b/examples/receiver/receiver.go @@ -6,6 +6,7 @@ import ( "context" "io" "machine" + "strconv" "time" "github.com/soypat/lora" @@ -17,7 +18,7 @@ var ( ) const ( - SX127X_PIN_RST = machine.GP16 + SX127X_PIN_RST = machine.GP6 // SPI definition for SX127x SX127X_PIN_SCK = machine.GP2 @@ -59,7 +60,7 @@ func main() { if err != nil { return err } - println("received LoRa:", string(rx[:n])) + println("received LoRa length", n, ":", strconv.Quote(string(rx[:n]))) return nil }) diff --git a/examples/transmitter/transmitter.go b/examples/transmitter/transmitter.go index b94c628..c7d4ed5 100644 --- a/examples/transmitter/transmitter.go +++ b/examples/transmitter/transmitter.go @@ -16,7 +16,7 @@ var ( ) const ( - SX127X_PIN_RST = machine.GP16 + SX127X_PIN_RST = machine.GP6 // SPI definition for SX127x SX127X_PIN_SCK = machine.GP2 @@ -27,6 +27,7 @@ const ( func main() { time.Sleep(500 * time.Millisecond) + println("program start") defer println("program end") SX127X_PIN_RST.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) cfg := sx127x.DefaultConfig(lora.Freq433_0M) - cfg.TxPower = 0 // Minimum power. err = dev.Configure(cfg) if err != nil { panic(err.Error()) @@ -49,8 +49,9 @@ func main() { randomU32, _ := dev.RandomU32() myName := fmt.Sprintf("user-%x", randomU32%0xffff) - println("config success; sending messages as ", myName) + packet := []byte(myName + " says hello!") + println("config success; sending messages as ", myName, "of length", len(packet)) for { err = dev.Tx(packet) if err != nil { diff --git a/sx127x/registers.go b/sx127x/registers.go index eb79a92..9486380 100644 --- a/sx127x/registers.go +++ b/sx127x/registers.go @@ -76,13 +76,13 @@ const ( regPA_RAMP = 0x0a regOCP = 0x0b regLNA = 0x0c - regFIFO_ADDR_PTR = 0x0d - regFIFO_TX_BASE_ADDR = 0x0e - regFIFO_RX_BASE_ADDR = 0x0f - regFIFO_RX_CURRENT_ADDR = 0x10 + regFIFO_ADDR_PTR = 0x0d // FIFO SPI Pointer. + regFIFO_TX_BASE_ADDR = 0x0e // Start of Tx data. May overlap with Rx data. + regFIFO_RX_BASE_ADDR = 0x0f // Start of Rx data. May overlap with Tx data. + regFIFO_RX_CURRENT_ADDR = 0x10 // Start address of last packet received. regIRQ_FLAGS_MASK = 0x11 regIRQ_FLAGS = 0x12 - regRX_NB_BYTES = 0x13 + regRX_NB_BYTES = 0x13 // Number of received bytes. regPKT_SNR_VALUE = 0x19 regPKT_RSSI_VALUE = 0x1a regRSSI_VALUE = 0x1b @@ -94,6 +94,7 @@ const ( regPAYLOAD_LENGTH = 0x22 regMAX_PAYLOAD_LENGTH = 0x23 regHOP_PERIOD = 0x24 + regFIFO_RX_BYTE_ADDR = 0x25 // Address of last byte received in FIFO. regMODEM_CONFIG_3 = 0x26 regFREQ_ERROR_MSB = 0x28 regFREQ_ERROR_MID = 0x29 diff --git a/sx127x/sx127x.go b/sx127x/sx127x.go index 61eee98..7fb934b 100644 --- a/sx127x/sx127x.go +++ b/sx127x/sx127x.go @@ -1067,10 +1067,7 @@ func (d *DeviceLoRa) readerToLastPacket() (_ *fifoReader, err error) { } // We now know that the packet has been received succesfully. Proceed to read. - curraddr, err := d.read8(regFIFO_RX_CURRENT_ADDR) - if err != nil { - return nil, err - } + // RxNbBytes indicates the number of received bytes thus far. numBytes, err := d.read8(regRX_NB_BYTES) if err != nil { return nil, err @@ -1078,16 +1075,30 @@ func (d *DeviceLoRa) readerToLastPacket() (_ *fifoReader, err error) { if numBytes == 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) if err != nil { return nil, err } - return &fifoReader{d: d, leftToRead: numBytes}, nil + return &fifoReader{D: d, BTR: numBytes}, nil } type fifoReader struct { - d *DeviceLoRa - leftToRead uint8 + D *DeviceLoRa + // Bytes to read. + BTR uint8 } 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) { - if f.leftToRead == 0 { + if f.BTR == 0 { return 0, io.EOF } - toRead := f.leftToRead + toRead := f.BTR if int(toRead) > len(buf) { toRead = uint8(len(buf)) } - for i := uint8(0); i < toRead; i-- { - buf[i], err = f.d.read8(regFIFO) + for i := uint8(0); i < toRead; i++ { + buf[i], err = f.D.read8(regFIFO) if err != nil { return i, err } } - f.leftToRead -= toRead + f.BTR -= toRead return toRead, nil }