Files
drivers/lora/lorawan/adaptor.go
T
2023-01-10 22:45:01 +01:00

81 lines
1.6 KiB
Go

package lorawan
import (
"errors"
"tinygo.org/x/drivers/lora"
)
const LORA_RXTX_TIMEOUT = 1000
var (
ActiveRadio lora.Radio
)
func UseRadio(r lora.Radio) {
if ActiveRadio != nil {
panic("lorawan.ActiveRadio is already set")
}
ActiveRadio = r
}
func Join(otaa *Otaa, session *Session) error {
var resp []uint8
if ActiveRadio == nil {
return errors.New("no LoRa radio attached")
}
otaa.Init()
// Send join packet
payload, err := otaa.GenerateJoinRequest()
if err != nil {
return err
}
ActiveRadio.SetCrc(true)
ActiveRadio.SetIqMode(0) // IQ Standard
ActiveRadio.Tx(payload, LORA_RXTX_TIMEOUT)
if err != nil {
return err
}
// Wait for JoinAccept
//println("lorawan: Wait for JOINACCEPT for 10s")
ActiveRadio.SetIqMode(1) // IQ Inverted
for i := 0; i < 15; i++ {
resp, err = ActiveRadio.Rx(LORA_RXTX_TIMEOUT)
if err != nil {
return err
}
if resp != nil {
break
}
}
if resp == nil {
return errors.New("no JoinAccept packet received")
}
//println("lorawan: Received packet: len=", len(resp), "payload=", bytesToHexString(resp))
err = otaa.DecodeJoinAccept(resp, session)
if err != nil {
return err
}
// println("lorawan: Valid JOINACCEPT, now connected")
// println("lorawan: | DevAddr: ", bytesToHexString(r.Session.DevAddr[:]), " (LSB)")
// println("lorawan: | NetID : ", bytesToHexString(r.Otaa.NetID[:]))
// println("lorawan: | NwkSKey: ", bytesToHexString(r.Session.NwkSKey[:]))
// println("lorawan: | AppSKey: ", bytesToHexString(r.Session.AppSKey[:]))
return nil
}
func SendUplink() error {
return nil
}
func ListenDownlink() error {
return nil
}