Reconnect SRS after disconnect

This commit is contained in:
AviiNL
2023-12-23 09:18:44 +01:00
parent 05f4859f67
commit 945cf75242
2 changed files with 161 additions and 137 deletions

View File

@@ -56,6 +56,7 @@ fn connect_to_grpc(mut commands: Commands, tokio: Res<TokioResource>, url: Res<G
tokio::time::sleep(Duration::from_secs(5)).await; tokio::time::sleep(Duration::from_secs(5)).await;
continue; continue;
}; };
println!("Connected to DCS: {}", url);
let Ok(mut stream) = client let Ok(mut stream) = client
.stream_units(StreamUnitsRequest { .stream_units(StreamUnitsRequest {
@@ -86,10 +87,8 @@ fn connect_to_grpc(mut commands: Commands, tokio: Res<TokioResource>, url: Res<G
} }
} }
eprintln!("Disconnected"); eprintln!("Disconnected from DCS: {}", url);
tx.send(Response::Disconnected).ok(); tx.send(Response::Disconnected).ok();
tokio::time::sleep(Duration::from_secs(5)).await;
} }
}); });

View File

@@ -164,8 +164,12 @@ fn listen_srs(
let voice = radio.voice; let voice = radio.voice;
let stt_url = stt_url.as_str().to_string(); let stt_url = stt_url.as_str().to_string();
radio.handle = Some(tokio.0.spawn(async move { radio.handle = Some(tokio.0.spawn(async move {
// todo: add loop here to reconnect on disconnect/errors loop {
let tcp = TcpStream::connect(addr).await?; let Ok(tcp) = TcpStream::connect(addr).await else {
eprintln!("Connection failed: {}", addr);
sleep(Duration::from_secs(5)).await;
continue;
};
let (tcp_stream, tcp_sink) = tcp.into_split(); let (tcp_stream, tcp_sink) = tcp.into_split();
let mut messages_sink = FramedWrite::new(tcp_sink, MessagesCodec::new()); let mut messages_sink = FramedWrite::new(tcp_sink, MessagesCodec::new());
@@ -179,13 +183,15 @@ fn listen_srs(
let mut packet_id = 1; let mut packet_id = 1;
messages_sink if let Err(e) = messages_sink.send(MessageRequest::Sync(SyncMessageRequest {
.send(MessageRequest::Sync(SyncMessageRequest {
msg_type: MsgType, msg_type: MsgType,
client, client: client.clone(),
version: SRS_VERSION.to_string(), version: SRS_VERSION.to_string(),
})) })).await {
.await?; eprintln!("Srs error: {:?}", e);
sleep(Duration::from_secs(5)).await;
continue;
};
let transmissions = Arc::new(RwLock::new(HashMap::<u32, Vec<VoicePacket>>::new())); let transmissions = Arc::new(RwLock::new(HashMap::<u32, Vec<VoicePacket>>::new()));
@@ -231,10 +237,13 @@ fn listen_srs(
} }
} }
Some(data) = message_handle.recv() => { Some(data) = message_handle.recv() => {
messages_sink.send(data).await?; if messages_sink.send(data).await.is_err() {
break;
};
} }
Some(Ok(data)) = messages_stream.next() => { Some(data) = messages_stream.next() => {
match data {
Ok(data) => {
match &data { match &data {
Message::VersionMismatch(VersionMismatchMessage { version, .. }) => { Message::VersionMismatch(VersionMismatchMessage { version, .. }) => {
eprintln!("Version mismatch {} != {}", SRS_VERSION, version); eprintln!("Version mismatch {} != {}", SRS_VERSION, version);
@@ -250,10 +259,17 @@ fn listen_srs(
_ => {}, _ => {},
} }
} }
Err(_) => {
break;
}
}
}
Some(data) = voice_handle.recv() => { Some(data) = voice_handle.recv() => {
frames.push(synthesize(data.as_str(), &voice).await?).await; frames.push(synthesize(data.as_str(), &voice).await?).await;
} }
Some(Ok(data)) = voice_stream.next() => { Some(data) = voice_stream.next() => {
match data {
Ok(data) => {
// Collect voice packets // Collect voice packets
let (data, _) = data; let (data, _) = data;
@@ -267,6 +283,11 @@ fn listen_srs(
let t1 = t.get_mut(&unit_id).unwrap(); let t1 = t.get_mut(&unit_id).unwrap();
t1.push(data); t1.push(data);
} }
},
Err(_) => {
break;
}
}
} }
_ = tokio::time::sleep(Duration::from_millis(200)) => { _ = tokio::time::sleep(Duration::from_millis(200)) => {
// Process voice packets // Process voice packets
@@ -297,10 +318,14 @@ fn listen_srs(
transmissions.clear(); transmissions.clear();
} }
_ = voice_ping_interval.tick() => { _ = voice_ping_interval.tick() => {
voice_sink.send((voice_codec::Packet::Ping(sguid), addr)).await?; if voice_sink.send((voice_codec::Packet::Ping(sguid), addr)).await.is_err() {
break;
};
} }
}; };
} }
eprintln!("Disconnected from SRS: {}", addr);
}
#[allow(unreachable_code)] #[allow(unreachable_code)]
Ok(()) Ok(())
})); }));