Add state display

This commit is contained in:
2025-10-19 15:36:51 +02:00
parent 46c276b5ca
commit 8cab34faa0

View File

@ -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));