Compare commits

..

No commits in common. "9e1e08851e5ddc6f4e428d4673ab4804f2b11ead" and "1995aaa858a8a8788049237e80877c753265f281" have entirely different histories.

4 changed files with 23 additions and 70 deletions

View file

@ -25,6 +25,8 @@ impl JoecalState {
pub async fn listen_multicast(&self, config: &Config) -> crate::error::Result<()> {
let mut buf = [0; 65536];
println!("Socket local addr: {:?}", self.socket.local_addr()?);
println!("Listening on multicast addr: {}", config.multicast_addr);
let mut timeout = tokio::time::interval(Duration::from_secs(5));

View file

@ -21,9 +21,10 @@ impl JoecalState {
config: &Config,
) -> crate::error::Result<()> {
let app = self.create_router(config);
// TODO: make addr config
let addr = SocketAddr::from(([0, 0, 0, 0], config.port));
let listener = TcpListener::bind(&addr).await?;
println!("HTTP server listening on {addr}");
axum::serve(
listener,

View file

@ -1,4 +1,3 @@
#![feature(slice_as_array)]
use std::{collections::BTreeMap, io, net::SocketAddr};
use joecalsend::{Config, JoecalState, RunningState, error, models::Device};
@ -58,13 +57,11 @@ async fn main() -> error::Result<()> {
Ok(result?)
}
pub type Peers = BTreeMap<SocketAddr, (String, String)>;
pub struct App {
state: JoecalState,
screen: CurrentScreen,
// addr -> (alias, fingerprint)
peers: Peers,
peers: BTreeMap<SocketAddr, (String, String)>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
@ -72,7 +69,6 @@ enum CurrentScreen {
Main,
Sending,
Receiving,
Stopping,
}
impl App {
@ -88,13 +84,11 @@ impl App {
loop {
terminal.draw(|frame| self.draw(frame))?;
self.handle_events().await?;
if self.screen == CurrentScreen::Stopping {
let rstate = self.state.running_state.lock().await;
if *rstate == RunningState::Stopping {
break;
}
let peers = self.state.peers.lock().await;
self.peers.clear();
peers.iter().for_each(|(k, v)| {
// k is fingerprint, v is addr, device
let addr = v.0;
@ -106,6 +100,10 @@ impl App {
Ok(())
}
fn draw(&self, frame: &mut Frame) {
frame.render_widget(self, frame.area());
}
async fn handle_events(&mut self) -> io::Result<()> {
match event::read()? {
// it's important to check that the event is a key press event as
@ -128,9 +126,8 @@ impl App {
}
}
async fn exit(&mut self) {
async fn exit(&self) {
self.state.stop().await;
self.screen = CurrentScreen::Stopping;
}
async fn send(&mut self) {

View file

@ -5,7 +5,7 @@ use ratatui::{
layout::{Constraint, Direction, Layout, Rect},
style::Stylize,
text::{Line, Span},
widgets::{Block, Borders, List, ListItem},
widgets::{List, ListItem},
};
use crate::App;
@ -35,63 +35,16 @@ fn centered_rect(percent_x: u16, percent_y: u16, r: Rect) -> Rect {
}
impl App {
pub fn draw(&self, frame: &mut Frame) {
let [top, middle, bottom] = Layout::default()
.direction(Direction::Vertical)
.constraints([Constraint::Min(3), Constraint::Min(3), Constraint::Min(3)])
.split(frame.area())
.as_array()
.cloned()
.unwrap();
let [footer_left, footer_right] = Layout::default()
.direction(Direction::Horizontal)
.constraints([Constraint::Percentage(50), Constraint::Percentage(50)])
.split(bottom)
.as_array()
.cloned()
.unwrap();
frame.render_widget(self, frame.area());
network_info(frame, footer_left);
peers(&self.peers, frame, footer_right);
}
}
fn peers(peers: &crate::Peers, frame: &mut Frame, area: Rect) {
let mut items = Vec::with_capacity(peers.len());
for (k, v) in peers.iter() {
let item = format!("{:?}: {} ({})", k, v.0, v.1);
pub fn peers(&self, frame: &mut Frame) {
let mut items = Vec::with_capacity(self.peers.len());
for (k, v) in self.peers.iter() {
let item = format!("{:?}: {}({})", k, v.0, v.1);
let s = Line::from(item.yellow());
let item = ListItem::new(s);
items.push(item);
}
let block = Block::default().title("Peers").borders(Borders::all());
let list = List::new(items).block(block);
frame.render_widget(list, area);
}
fn network_info(frame: &mut Frame, area: Rect) {
let udp: Line = format!("UDP socket: {:?}", joecalsend::LISTENING_SOCKET_ADDR)
.yellow()
.into();
let multicast: Line = format!(
"Multicast address: {:?}:{}",
joecalsend::MULTICAST_IP,
joecalsend::DEFAULT_PORT
)
.yellow()
.into();
let http: Line = format!("HTTP address: {:?}", joecalsend::LISTENING_SOCKET_ADDR)
.yellow()
.into();
let items = [
ListItem::new(udp),
ListItem::new(multicast),
ListItem::new(http),
];
let block = Block::default().title("Listeners").borders(Borders::all());
let list = List::new(items).block(block);
frame.render_widget(list, area);
let list = List::new(items);
frame.render_widget(list, frame.area());
}
}