Cache locations shared in packets.

This commit is contained in:
mattbk
2025-10-27 20:59:58 -05:00
parent f1d0f6dc31
commit 863657f61f

View File

@@ -378,7 +378,7 @@ impl BufferManager {
/// - Filters out frames destined for "NODES" and frames with an XID payload.
/// - Optionally filters to only UI frames if requested.
/// - Buffers multi-line frames and prints a formatted session line.
fn handle_frame(frame: &AgwFrame, cli: &Cli, buffers: &mut BufferManager) {
fn handle_frame(frame: &AgwFrame, cli: &Cli, buffers: &mut BufferManager, loc_store: &mut HashMap<String, Vec<String>>) {
let hdr = &frame.header;
// Process only frames on the specified channel.
if hdr.port != cli.channel as i32 {
@@ -411,9 +411,26 @@ fn handle_frame(frame: &AgwFrame, cli: &Cli, buffers: &mut BufferManager) {
// Extract location from APRS format
let (lat, lon) = aprs_loc(&text);
// Store the location
// Only update location store if there is a real location
if lat > -9999.0_f64 && lon > -9999.0_f64 {
let loc = vec![lat.to_string(), lon.to_string()];
loc_store.insert(source.clone(), loc);
}
// Look up a stored location
// If it doesn't exist, set to empty
let stored_loc = match loc_store.get(&source) {
Some(loc_value) => loc_value,
None => &vec!["".to_string(), "".to_string()],
};
// Only send good locations on
let json_lat = if lat > -9999.0_f64 && lon > -9999.0_f64 { lat.to_string() } else { "".to_string() }; // send nothing
let json_lon = if lat > -9999.0_f64 && lon > -9999.0_f64 { lon.to_string() } else { "".to_string() }; // send nothing
let json_lat = stored_loc[0].clone() ;
let json_lon = stored_loc[1].clone() ;
//let json_lat = if lat > -9999.0_f64 && lon > -9999.0_f64 { lat.to_string() } else { old_loc[0].clone() };
//let json_lon = if lat > -9999.0_f64 && lon > -9999.0_f64 { lon.to_string() } else { old_loc[1].clone() };
// Ignore frames where the basic destination contains "NODES" (caseinsensitive).
if basic_destination.to_uppercase().contains("NODES") {
@@ -440,6 +457,18 @@ fn handle_frame(frame: &AgwFrame, cli: &Cli, buffers: &mut BufferManager) {
return;
}
// In non-debug mode, print the session line and any additional lines.
if !cli.debug {
print_session_line(&timestamp, &source, &final_destination, &summary);
if lines.len() > 1 {
for line in &lines[1..] {
println!("{}", line);
}
}
}
println!("Stored location: {} {}", stored_loc[0].clone(), stored_loc[1].clone());
// If Spothole is enabled
if summary == "UI" && cli.spothole {
// POST JSON
@@ -486,16 +515,6 @@ fn handle_frame(frame: &AgwFrame, cli: &Cli, buffers: &mut BufferManager) {
});
let _ = socket.expect("REASON").send_to(packet.to_string().as_bytes(), uaddr);
}
// In non-debug mode, print the session line and any additional lines.
if !cli.debug {
print_session_line(&timestamp, &source, &final_destination, &summary);
if lines.len() > 1 {
for line in &lines[1..] {
println!("{}", line);
}
}
}
}
@@ -554,6 +573,10 @@ fn main() -> Result<()> {
let uaddr = format!("{}:{}", cli.uip, cli.uport);
let reconnect_delay_ms = 5000;
// Set up the location store
//let mut loc_store = HashMap:: new();
let mut loc_store: HashMap<String, Vec<String>> = HashMap::new();
if cli.uport != 55555 {
// Bind the client socket to any available address and port
let socket = UdpSocket::bind("0.0.0.0:0")?;
@@ -601,7 +624,7 @@ fn main() -> Result<()> {
while buffer.len() >= 36 {
match parse_frame(&buffer, cli.debug) {
Ok((consumed, frame)) => {
handle_frame(&frame, &cli, &mut buffers);
handle_frame(&frame, &cli, &mut buffers, &mut loc_store);
// Remove the processed frame from the buffer.
buffer.drain(0..consumed);
}