MCPcopy Create free account
hub / github.com/chirpstack/chirpstack / get_downlink_frame

Method get_downlink_frame

chirpstack/src/downlink/tx_ack.rs:184–214  ·  view source on GitHub ↗
(&mut self)

Source from the content-addressed store, hash-verified

182 }
183
184 async fn get_downlink_frame(&mut self) -> Result<()> {
185 trace!("Get downlink-frame from Redis");
186 let df = downlink_frame::get_and_del(self.downlink_id).await?;
187 let gw_df = &df
188 .downlink_frame
189 .as_ref()
190 .ok_or_else(|| anyhow!("downlink_frame is None"))?;
191
192 // Validate that we don't receive more ack items than downlink items that were
193 // sent to the gateway. Receiving less acks is valid, e.g. the gateway might
194 // ack the first item only.
195 if self.downlink_tx_ack.items.len() > gw_df.items.len() {
196 return Err(anyhow!("More items in tx ack than in downlink-frame"));
197 }
198
199 for (i, tx_ack) in self.downlink_tx_ack.items.iter().enumerate() {
200 if tx_ack.status() == gw::TxAckStatus::Ok {
201 self.downlink_frame_item = Some(gw_df.items[i].clone());
202 }
203 }
204
205 // take last negative ack if there is no positive ack
206 if self.downlink_frame_item.is_none() {
207 self.downlink_frame_item =
208 Some(gw_df.items[self.downlink_tx_ack.items.len() - 1].clone());
209 }
210
211 self.downlink_frame = Some(df);
212
213 Ok(())
214 }
215
216 async fn get_device_data(&mut self) -> Result<()> {
217 trace!("Getting device data");

Callers 1

_handleMethod · 0.80

Calls 4

get_and_delFunction · 0.85
as_refMethod · 0.80
iterMethod · 0.80
statusMethod · 0.80

Tested by

no test coverage detected