Add state display
This commit is contained in:
67
src/main.rs
67
src/main.rs
@ -20,6 +20,7 @@ use std::{
|
||||
cell::{Cell, RefCell},
|
||||
collections::VecDeque,
|
||||
env::{self, args},
|
||||
fmt::Display,
|
||||
fs::File,
|
||||
io::{BufWriter, Read, Sink, Write, stdout},
|
||||
ops::DerefMut,
|
||||
@ -46,7 +47,7 @@ use crate::{
|
||||
ted::elg::ELGate,
|
||||
units::frequency::hz_to_rad_per_sample,
|
||||
};
|
||||
use eframe::egui::{self, CentralPanel, Color32};
|
||||
use eframe::egui::{self, CentralPanel, Color32, RichText};
|
||||
use tokio::sync::RwLock;
|
||||
use tokio::sync::mpsc::{Receiver, Sender, channel};
|
||||
|
||||
@ -146,9 +147,9 @@ impl FSKReceiver {
|
||||
//let mut dc_block = DCBlocker::new(0.999);
|
||||
let mut dc_block = DCBlocker::new(1.);
|
||||
|
||||
let loop_i = 0.0;
|
||||
let loop_i = 0.03;
|
||||
let loop_p = 0.1;
|
||||
let mut loop_ir = vec![Complex32::new(loop_i, 0.); samples_per_symbol as usize];
|
||||
let mut loop_ir = vec![Complex32::new(loop_i, 0.); samples_per_symbol as usize / 2];
|
||||
loop_ir.push(Complex32::new(loop_p, 0.));
|
||||
let mut elg = ELGate::new(samples_per_symbol, FIRFilter::new(&loop_ir));
|
||||
Self {
|
||||
@ -201,11 +202,22 @@ impl FSKReceiver {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
enum TransceiverState {
|
||||
Waiting,
|
||||
Receiving,
|
||||
EOT,
|
||||
SendingAck,
|
||||
Sending,
|
||||
Listening,
|
||||
}
|
||||
|
||||
struct Transceiver {
|
||||
tx_stream: Sender<Vec<u8>>,
|
||||
rx_stream: Receiver<Vec<u8>>,
|
||||
|
||||
eye_receiver: Receiver<Vec<f32>>,
|
||||
state_receiver: Receiver<TransceiverState>,
|
||||
}
|
||||
|
||||
impl Transceiver {
|
||||
@ -225,9 +237,15 @@ impl Transceiver {
|
||||
self.eye_receiver.try_recv()
|
||||
}
|
||||
|
||||
pub fn try_recv_state(&mut self) -> Result<TransceiverState, TryRecvError> {
|
||||
self.state_receiver.try_recv()
|
||||
}
|
||||
|
||||
pub fn start(mut sample_stream: Receiver<f32>, mut sample_sender: Sender<Vec<f32>>) -> Self {
|
||||
let mut resend: Option<Vec<u8>> = None;
|
||||
let (mut eyes_tx, eyes_rx) = channel::<Vec<f32>>(1024);
|
||||
let (mut state_tx, state_rx) = channel::<TransceiverState>(1024);
|
||||
state_tx.try_send(TransceiverState::Waiting);
|
||||
|
||||
let (rx_stream_sender, mut rx_stream_receiver) = channel::<Vec<u8>>(1024);
|
||||
let (tx_stream_sender, mut tx_stream_receiver) = channel::<Vec<u8>>(1024);
|
||||
@ -246,6 +264,7 @@ impl Transceiver {
|
||||
}
|
||||
=>
|
||||
{
|
||||
state_tx.try_send(TransceiverState::Receiving);
|
||||
// Wait for end of tranmission
|
||||
let mut recv = Some(FSKReceiver::new(eyes_tx.clone()));
|
||||
let mut send_ack = false;
|
||||
@ -255,18 +274,19 @@ impl Transceiver {
|
||||
{
|
||||
match recv.as_mut().unwrap().receive(iq).await
|
||||
{
|
||||
Ok(Some(Frame::Data(_))) => {println!("GOT DATA"); send_ack = true; recv = None;},
|
||||
Ok(Some(Frame::Ack)) => {current_message = None; recv = None;},
|
||||
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);},
|
||||
Err(()) => {recv = None;},
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
println!("EOT");
|
||||
if send_ack
|
||||
{
|
||||
state_tx.try_send(TransceiverState::SendingAck);
|
||||
Self::transmit(Frame::Ack, &mut sample_sender).await;
|
||||
}
|
||||
state_tx.try_send(TransceiverState::Waiting);
|
||||
},
|
||||
message = async
|
||||
{
|
||||
@ -274,14 +294,17 @@ impl Transceiver {
|
||||
{
|
||||
current_message = Some((tx_stream_receiver).recv().await.unwrap());
|
||||
}
|
||||
state_tx.try_send(TransceiverState::Listening);
|
||||
tokio::time::sleep(Duration::from_secs(rand::random_range(1..3))).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;
|
||||
println!("Sent message");
|
||||
state_tx.try_send(TransceiverState::Waiting);
|
||||
}
|
||||
};
|
||||
}
|
||||
@ -289,6 +312,7 @@ impl Transceiver {
|
||||
|
||||
Self {
|
||||
eye_receiver: eyes_rx,
|
||||
state_receiver: state_rx,
|
||||
|
||||
tx_stream: tx_stream_sender,
|
||||
rx_stream: rx_stream_receiver,
|
||||
@ -464,6 +488,7 @@ struct EguiApp {
|
||||
transceiver: Transceiver,
|
||||
|
||||
eyes: VecDeque<Vec<f32>>,
|
||||
current_state: TransceiverState,
|
||||
}
|
||||
impl EguiApp {
|
||||
fn new(_cc: &eframe::CreationContext<'_>) -> Self {
|
||||
@ -562,6 +587,7 @@ impl EguiApp {
|
||||
transceiver,
|
||||
|
||||
eyes: VecDeque::new(),
|
||||
current_state: TransceiverState::Waiting,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -577,6 +603,26 @@ impl eframe::App for EguiApp {
|
||||
while self.eyes.len() > max_eyes {
|
||||
self.eyes.pop_front();
|
||||
}
|
||||
if let Ok(new_state) = self.transceiver.try_recv_state() {
|
||||
self.current_state = new_state;
|
||||
}
|
||||
|
||||
ui.horizontal(|ui| {
|
||||
if ui.button("Start").clicked() {
|
||||
let snd = self.transceiver.get_sender();
|
||||
tokio::spawn(async move {
|
||||
let _ = snd
|
||||
.send("Skibditoilet".repeat(10).as_bytes().to_vec())
|
||||
.await;
|
||||
});
|
||||
}
|
||||
|
||||
ui.label(
|
||||
RichText::new(format!("{:?}", self.current_state))
|
||||
.size(35.)
|
||||
.color(Color32::LIGHT_GREEN),
|
||||
);
|
||||
});
|
||||
|
||||
Plot::new("EyeA")
|
||||
.legend(Legend::default())
|
||||
@ -594,15 +640,6 @@ impl eframe::App for EguiApp {
|
||||
plot_ui.line(line);
|
||||
}
|
||||
});
|
||||
|
||||
if ui.button("Start").clicked() {
|
||||
let snd = self.transceiver.get_sender();
|
||||
tokio::spawn(async move {
|
||||
let _ = snd
|
||||
.send("Skibditoilet".repeat(10).as_bytes().to_vec())
|
||||
.await;
|
||||
});
|
||||
}
|
||||
}); // Central panel
|
||||
|
||||
std::thread::sleep(Duration::from_millis(16));
|
||||
|
||||
Reference in New Issue
Block a user