Some elementary network code

This commit is contained in:
2025-10-20 22:21:31 +02:00
parent ce9b36fa41
commit 97ba2ea3e2
5 changed files with 617 additions and 74 deletions

625
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -11,3 +11,4 @@ hound = "3.5.1"
plotters = "0.3.7"
rand = "0.9.2"
tokio = { version = "1.47.1", features = ["full", "macros", "net", "sync", "time"] }
tun-tap = "0.1.4"

11
run_net.sh Executable file
View File

@ -0,0 +1,11 @@
#!/bin/sh
cargo b --release
sudo setcap cap_net_admin+eip target/release/rdsp
./target/release/rdsp 0 &
sleep .5
sudo ip a a 192.168.7.0/24 dev radio0
sudo ip -6 addr flush radio0
sudo ip link set radio0 up
sudo ip -6 addr flush radio0

View File

@ -1,3 +0,0 @@
#!/bin/sh
ffmpeg -re -i audio/modulated.wav -f s16le -acodec pcm_s16le udp://127.0.0.1:8080

View File

@ -36,6 +36,7 @@ use tokio::{
sync::mpsc::{UnboundedSender, error::TryRecvError, unbounded_channel},
time::timeout,
};
use tun_tap::Iface;
use crate::{
bfsk::BFSKMod,
@ -254,8 +255,8 @@ impl Transceiver {
{
match recv.as_mut().unwrap().receive(iq).await
{
Ok(Some(Frame::Data(_))) => {println!("GOT DATA"); send_ack = true; recv = None; state_tx.try_send(TransceiverState::EOT);},
Ok(Some(Frame::Ack)) => {current_message = None; recv = None; state_tx.try_send(TransceiverState::EOT);},
Ok(Some(Frame::Data(_))) => {println!("GOT DATA"); send_ack = false; recv = None; state_tx.try_send(TransceiverState::EOT);},
//Ok(Some(Frame::Ack)) => {current_message = None; recv = None; state_tx.try_send(TransceiverState::EOT);},
Err(()) => {recv = None;},
_ => {}
}
@ -275,14 +276,14 @@ impl Transceiver {
current_message = Some((tx_stream_receiver).recv().await.unwrap());
}
state_tx.try_send(TransceiverState::Listening);
tokio::time::sleep(Duration::from_millis(500 * rand::random_range(1..6))).await;
tokio::time::sleep(Duration::from_millis(50 * rand::random_range(1..10))).await;
current_message.as_ref().unwrap()
} =>
{
state_tx.try_send(TransceiverState::Sending);
println!("Sending message");
Self::transmit(Frame::Data(message.clone()), &mut sample_sender).await;
//current_message = None;
current_message = None;
println!("Sent message");
state_tx.try_send(TransceiverState::Waiting);
}
@ -497,9 +498,13 @@ struct EguiApp {
eyes: VecDeque<Vec<f32>>,
current_state: TransceiverState,
iface: Iface,
}
impl EguiApp {
fn new(_cc: &eframe::CreationContext<'_>) -> Self {
let iface = Iface::new("radio%d", tun_tap::Mode::Tap).unwrap();
iface.set_non_blocking().unwrap();
let (up_sender, mut up_receiver) = channel::<Vec<f32>>(16);
let (down_sender, down_receiver) = channel::<f32>(1024);
@ -577,7 +582,7 @@ impl EguiApp {
*d = stream[progression
.fetch_add(1, std::sync::atomic::Ordering::Relaxed)
as usize]
* 0.1; // TODO
* 0.01; // TODO
}
},
move |err| {
@ -596,6 +601,7 @@ impl EguiApp {
eyes: VecDeque::new(),
current_state: TransceiverState::Waiting,
iface,
}
}
}
@ -605,6 +611,19 @@ impl eframe::App for EguiApp {
egui::CentralPanel::default().show(ctx, |ui| {
let max_eyes = 100;
// INTERFACE
let mut frame = [0u8; 2000];
while let Ok(length) = self.iface.recv(&mut frame) {
let _ = self
.transceiver
.get_sender()
.try_send(Vec::from(&frame[0..length]));
}
while let Ok(frame) = self.transceiver.try_recv() {
let _ = self.iface.send(frame.as_slice());
}
while let Ok(eye) = self.transceiver.try_recv_eye() {
self.eyes.push_back(eye);
}
@ -616,17 +635,17 @@ impl eframe::App for EguiApp {
}
ui.horizontal(|ui| {
if ui.button("Start").clicked() {
let snd = self.transceiver.get_sender();
let data = (0..rand::random_range(50..250))
.map(|_| rand::random::<char>() as u8)
.collect::<Vec<_>>();
tokio::spawn(async move {
let _ = snd.send(data).await;
});
}
// if ui.button("Start").clicked() {
// let snd = self.transceiver.get_sender();
// let data = (0..rand::random_range(50..250))
// .map(|_| rand::random::<char>() as u8)
// .collect::<Vec<_>>();
//
// tokio::spawn(async move {
// let _ = snd.send(data).await;
// });
// }
//
ui.label(
RichText::new(format!("{:?}", self.current_state))
.size(35.)