@@ -91,15 +91,15 @@ func (p PushDataPacket) GetUplinkFrames(skipCRCCheck bool, FakeRxInfoTime bool)
91
91
}
92
92
93
93
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 )
95
95
if err != nil {
96
96
return nil , errors .Wrap (err , "backend/semtechudp/packets: get uplink frame error" )
97
97
}
98
98
frame .RxInfo .UplinkId = uint32 (p .RandomToken )
99
99
frames = append (frames , frame )
100
100
} else {
101
101
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 )
103
103
if err != nil {
104
104
return nil , errors .Wrap (err , "backend/semtechudp/packets: get uplink frame error" )
105
105
}
@@ -127,7 +127,7 @@ func setUplinkFrameRSig(frame *gw.UplinkFrame, rxPK RXPK, rSig RSig) *gw.UplinkF
127
127
return frame
128
128
}
129
129
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 ) {
131
131
frame := gw.UplinkFrame {
132
132
PhyPayload : rxpk .Data ,
133
133
TxInfo : & gw.UplinkTxInfo {
@@ -145,6 +145,18 @@ func getUplinkFrame(gatewayID lorawan.EUI64, rxpk RXPK, FakeRxInfoTime bool) (*g
145
145
},
146
146
}
147
147
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
+
148
160
switch rxpk .Stat {
149
161
case 1 :
150
162
frame .RxInfo .CrcStatus = gw .CRCStatus_CRC_OK
0 commit comments