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

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.)