From 82bc3c4116196f864ae63dac77edfe946953788e Mon Sep 17 00:00:00 2001 From: Stephen D <webmaster@scd31.com> Date: Fri, 1 Dec 2023 00:47:34 -0400 Subject: [PATCH] add rssi to route --- Cargo.lock | 20 ++++++++++---------- src/gate.rs | 8 ++++---- src/main.rs | 2 +- src/radio.rs | 6 +++--- src/util.rs | 23 +++++++++++++---------- 5 files changed, 31 insertions(+), 28 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c1304bf..28f8dd1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -376,9 +376,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -386,9 +386,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "crc" @@ -631,7 +631,7 @@ dependencies = [ [[package]] name = "ham-cats" version = "0.1.0" -source = "git+https://gitlab.scd31.com/cats/ham-cats#cccc04c1c96ebe64681a59d9c2a7c66e00418067" +source = "git+https://gitlab.scd31.com/cats/ham-cats#25ed83d5eb68cd54f438f487c37f9059cd464e87" dependencies = [ "arrayvec", "bitvec", @@ -867,9 +867,9 @@ checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" [[package]] name = "linux-raw-sys" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" +checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" [[package]] name = "log" @@ -1266,15 +1266,15 @@ checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" [[package]] name = "rustix" -version = "0.38.25" +version = "0.38.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc99bc2d4f1fed22595588a013687477aedf3cdcfb26558c559edb67b4d9b22e" +checksum = "9470c4bf8246c8daf25f9598dca807fb6510347b1e1cfa55749113850c79d88a" dependencies = [ "bitflags 2.4.1", "errno", "libc", "linux-raw-sys", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] diff --git a/src/gate.rs b/src/gate.rs index 2334635..1731132 100644 --- a/src/gate.rs +++ b/src/gate.rs @@ -109,11 +109,11 @@ pub async fn packet_handler( ssid: u8, tx: broadcast::Sender<SemiPacketIn>, packet_send: mpsc::Sender<Vec<u8>>, - mut packet_receive: mpsc::Receiver<Vec<u8>>, + mut packet_receive: mpsc::Receiver<(Vec<u8>, f64)>, uuid: Uuid, ) -> anyhow::Result<()> { loop { - let packet = packet_receive + let (packet, rssi) = packet_receive .recv() .await .context("Packet receive channel died")?; @@ -122,7 +122,7 @@ pub async fn packet_handler( if let Ok(mut packet) = attempt_decode(&packet, &mut buf) { let mut buf2 = [0; MAX_PACKET_LEN]; let mut internet_packet = packet.clone_backing(&mut buf2); - match append_internet_to_packet_route(&callsign, ssid, &mut internet_packet) { + match append_internet_to_packet_route(&callsign, ssid, rssi, &mut internet_packet) { Some(()) => match internet_packet.semi_encode() { Ok(encoded) => { let semi = SemiPacketIn { @@ -146,7 +146,7 @@ pub async fn packet_handler( match packet.should_digipeat(&callsign, ssid) { Ok(()) => { - if let Err(e) = packet.append_to_route(&callsign, ssid) { + if let Err(e) = packet.append_to_route(&callsign, ssid, Some(rssi)) { eprintln!( "Could not add routing to packet before digipeating: {e}. Skipping" ); diff --git a/src/main.rs b/src/main.rs index 1bf053d..77343ba 100644 --- a/src/main.rs +++ b/src/main.rs @@ -105,7 +105,7 @@ async fn gate_forever( config: &Config, mut radio: RadioManager, packet_send: mpsc::Sender<Vec<u8>>, - packet_receive: mpsc::Receiver<Vec<u8>>, + packet_receive: mpsc::Receiver<(Vec<u8>, f64)>, ) -> anyhow::Result<()> { let uuid = Uuid::new_v4(); diff --git a/src/radio.rs b/src/radio.rs index c60cdd9..0d4d9e5 100644 --- a/src/radio.rs +++ b/src/radio.rs @@ -14,13 +14,13 @@ pub const MAX_PACKET_LEN: usize = 8191; pub struct RadioManager { radio: Rf4463<Spi, OutputPin, OutputPin, Delay>, - tx: Sender<Vec<u8>>, + tx: Sender<(Vec<u8>, f64)>, rx: Receiver<Vec<u8>>, rx_buf: [u8; MAX_PACKET_LEN], } impl RadioManager { - pub fn new(tx: Sender<Vec<u8>>, rx: Receiver<Vec<u8>>) -> anyhow::Result<Self> { + pub fn new(tx: Sender<(Vec<u8>, f64)>, rx: Receiver<Vec<u8>>) -> anyhow::Result<Self> { let spi = Spi::new(Bus::Spi0, SlaveSelect::Ss0, 1_000_000, Mode::Mode0)?; let gpio = Gpio::new()?; let sdn = gpio.get(22)?.into_output(); @@ -87,7 +87,7 @@ impl RadioManager { .map_err(|e| anyhow!("{e}"))?; self.tx - .send(data.data().to_vec()) + .send((data.data().to_vec(), data.rssi())) .await .ok() .context("TX channel died")?; diff --git a/src/util.rs b/src/util.rs index a8273c9..832b092 100644 --- a/src/util.rs +++ b/src/util.rs @@ -3,7 +3,7 @@ use anyhow::anyhow; use colored::{Color, Colorize}; use ham_cats::{ packet::Packet, - whisker::{Route, RouteNode}, + whisker::{Route, RouteIdentity, RouteNode}, }; pub fn print_packet(pkt: &Packet<MAX_PACKET_LEN>, is_rf: bool) { @@ -31,8 +31,10 @@ pub fn print_packet(pkt: &Packet<MAX_PACKET_LEN>, is_rf: bool) { .iter() .map(|rn| match rn { ham_cats::whisker::RouteNode::Internet => "[NET]".to_string(), - ham_cats::whisker::RouteNode::Identity(rc, rs, is_future) => { - let s = if is_future { "*" } else { "" }; + ham_cats::whisker::RouteNode::Identity(ident) => { + let s = if ident.is_future() { "*" } else { "" }; + let rc = ident.callsign(); + let rs = ident.ssid(); format!("{rc}-{rs}{s}") } }) @@ -86,40 +88,41 @@ pub fn attempt_decode<'a>( pub fn append_internet_to_packet_route( callsign: &str, ssid: u8, + rssi: f64, packet: &mut Packet<MAX_PACKET_LEN>, ) -> Option<()> { let mut route = packet.route().unwrap_or(Route::new(0)); let first_future = route.iter().find_map(|rn| match rn { - RouteNode::Identity(rc, rs, is_future) if is_future => Some((rc, rs)), + RouteNode::Identity(ident) if ident.is_future() => Some((ident.callsign(), ident.ssid())), _ => None, }); if let Some((rc, rs)) = first_future { if rc == callsign && rs == ssid { // we can just do the normal thing - route.append_node(callsign, ssid).ok()?; + route.append_node(callsign, ssid, Some(rssi)).ok()?; } else { // rip off all the futures and add ourselves let mut new_route = Route::new(route.max_hops); for r in route.iter() { match r { RouteNode::Internet => new_route.push_internet()?, - RouteNode::Identity(rc, rs, is_future) => { - if is_future { + RouteNode::Identity(ident) => { + if ident.is_future() { break; } - new_route.push_callsign(rc, rs, false); + new_route.push_callsign(ident); } } } route = new_route; - route.push_callsign(callsign, ssid, false); + route.push_callsign(RouteIdentity::new(callsign, ssid, Some(rssi), false)); } } else { - route.append_node(callsign, ssid).ok()?; + route.append_node(callsign, ssid, Some(rssi)).ok()?; } route.push_internet()?; -- GitLab