feat: Wait for connect

This commit is contained in:
Baud 2024-03-04 21:33:46 +00:00
parent 4a41d1f5d7
commit 676ff7630e
2 changed files with 24 additions and 5 deletions

View File

@ -21,7 +21,7 @@ impl Atem {
}
}
pub async fn connect(&self, address: SocketAddr) {
pub async fn connect(&self, address: SocketAddr) -> bool {
let (callback_tx, callback_rx) = tokio::sync::oneshot::channel();
self.socket_message_tx
.send(AtemSocketMessage::Connect {
@ -31,7 +31,7 @@ impl Atem {
.await
.unwrap();
callback_rx.await.unwrap().unwrap();
callback_rx.await.unwrap()
}
pub async fn run(

View File

@ -6,7 +6,11 @@ use std::{
time::{Duration, SystemTime},
};
use tokio::{net::UdpSocket, sync::Barrier, task::yield_now};
use tokio::{
net::UdpSocket,
sync::{Barrier, Mutex},
task::yield_now,
};
use crate::{
atem_lib::{atem_packet::AtemPacket, atem_util},
@ -34,7 +38,7 @@ const ACK_PACKET_LENGTH: u16 = 12;
pub enum AtemSocketMessage {
Connect {
address: SocketAddr,
result_callback: tokio::sync::oneshot::Sender<Result<(), io::Error>>,
result_callback: tokio::sync::oneshot::Sender<bool>,
},
Disconnect,
SendCommands {
@ -108,6 +112,7 @@ pub struct AtemSocket {
received_without_ack: u16,
atem_event_tx: tokio::sync::mpsc::UnboundedSender<AtemEvent>,
connected_callbacks: Mutex<Vec<tokio::sync::oneshot::Sender<bool>>>,
}
#[derive(PartialEq, Clone)]
@ -163,6 +168,7 @@ impl AtemSocket {
received_without_ack: 0,
atem_event_tx,
connected_callbacks: Mutex::default(),
}
}
@ -178,7 +184,16 @@ impl AtemSocket {
address,
result_callback,
} => {
result_callback.send(self.connect(address).await).ok();
{
let mut connected_callbacks = self.connected_callbacks.lock().await;
connected_callbacks.push(result_callback);
}
if self.connect(address).await.is_err() {
let mut connected_callbacks = self.connected_callbacks.lock().await;
for callback in connected_callbacks.drain(0..) {
let _ = callback.send(false);
}
}
}
AtemSocketMessage::Disconnect => self.disconnect(),
AtemSocketMessage::SendCommands {
@ -523,6 +538,10 @@ impl AtemSocket {
fn on_connect(&mut self) {
let _ = self.atem_event_tx.send(AtemEvent::Connected);
let mut connected_callbacks = self.connected_callbacks.blocking_lock();
for callback in connected_callbacks.drain(0..) {
let _ = callback.send(false);
}
}
fn on_disconnect(&mut self) {