feat: Wait for connect
This commit is contained in:
		
							parent
							
								
									4a41d1f5d7
								
							
						
					
					
						commit
						676ff7630e
					
				@ -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(
 | 
			
		||||
 | 
			
		||||
@ -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) {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user