Some elementary network code
This commit is contained in:
625
Cargo.lock
generated
625
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@ -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
11
run_net.sh
Executable 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
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
ffmpeg -re -i audio/modulated.wav -f s16le -acodec pcm_s16le udp://127.0.0.1:8080
|
||||
51
src/main.rs
51
src/main.rs
@ -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.)
|
||||
|
||||
Reference in New Issue
Block a user