diff --git a/src/main.rs b/src/main.rs index 3f98ab4..4cc5797 100644 --- a/src/main.rs +++ b/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>, rx_stream: Receiver>, eye_receiver: Receiver>, + state_receiver: Receiver, } impl Transceiver { @@ -225,9 +237,15 @@ impl Transceiver { self.eye_receiver.try_recv() } + pub fn try_recv_state(&mut self) -> Result { + self.state_receiver.try_recv() + } + pub fn start(mut sample_stream: Receiver, mut sample_sender: Sender>) -> Self { let mut resend: Option> = None; let (mut eyes_tx, eyes_rx) = channel::>(1024); + let (mut state_tx, state_rx) = channel::(1024); + state_tx.try_send(TransceiverState::Waiting); let (rx_stream_sender, mut rx_stream_receiver) = channel::>(1024); let (tx_stream_sender, mut tx_stream_receiver) = channel::>(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>, + 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));