@@ -91,15 +91,15 @@ func (p PushDataPacket) GetUplinkFrames(skipCRCCheck bool, FakeRxInfoTime bool)
9191 }
9292
9393 if len (p .Payload .RXPK [i ].RSig ) == 0 {
94- frame , err := getUplinkFrame (p .GatewayMAC , p .Payload .RXPK [i ], FakeRxInfoTime )
94+ frame , err := getUplinkFrame (p .GatewayMAC , p .Payload .Stat , p . Payload . RXPK [i ], FakeRxInfoTime )
9595 if err != nil {
9696 return nil , errors .Wrap (err , "backend/semtechudp/packets: get uplink frame error" )
9797 }
9898 frame .RxInfo .UplinkId = uint32 (p .RandomToken )
9999 frames = append (frames , frame )
100100 } else {
101101 for j := range p .Payload .RXPK [i ].RSig {
102- frame , err := getUplinkFrame (p .GatewayMAC , p .Payload .RXPK [i ], FakeRxInfoTime )
102+ frame , err := getUplinkFrame (p .GatewayMAC , p .Payload .Stat , p . Payload . RXPK [i ], FakeRxInfoTime )
103103 if err != nil {
104104 return nil , errors .Wrap (err , "backend/semtechudp/packets: get uplink frame error" )
105105 }
@@ -127,7 +127,7 @@ func setUplinkFrameRSig(frame *gw.UplinkFrame, rxPK RXPK, rSig RSig) *gw.UplinkF
127127 return frame
128128}
129129
130- func getUplinkFrame (gatewayID lorawan.EUI64 , rxpk RXPK , FakeRxInfoTime bool ) (* gw.UplinkFrame , error ) {
130+ func getUplinkFrame (gatewayID lorawan.EUI64 , stat * Stat , rxpk RXPK , FakeRxInfoTime bool ) (* gw.UplinkFrame , error ) {
131131 frame := gw.UplinkFrame {
132132 PhyPayload : rxpk .Data ,
133133 TxInfo : & gw.UplinkTxInfo {
@@ -145,6 +145,18 @@ func getUplinkFrame(gatewayID lorawan.EUI64, rxpk RXPK, FakeRxInfoTime bool) (*g
145145 },
146146 }
147147
148+ // If a Stat is present and it contains a location, immediately set the location for this uplink.
149+ // This is for example the case of Helium, where the UDP frame contains both a rxpk and stat
150+ // payload to provide additional gateway context.
151+ if stat != nil && (stat .Lati != 0 || stat .Long != 0 || stat .Alti != 0 ) {
152+ frame .RxInfo .Location = & common.Location {
153+ Latitude : stat .Lati ,
154+ Longitude : stat .Long ,
155+ Altitude : float64 (stat .Alti ),
156+ Source : common .LocationSource_GPS ,
157+ }
158+ }
159+
148160 switch rxpk .Stat {
149161 case 1 :
150162 frame .RxInfo .CrcStatus = gw .CRCStatus_CRC_OK
0 commit comments