use crate::app::GPSApp; use crate::logger; use crate::settings::Settings; use crate::GPS_INFO; use async_tungstenite::gio::connect_async; use futures::StreamExt; use serde::{Deserialize, Serialize}; ///https://gitlab.freedesktop.org/thiblahute/gst-plugins-rs/-/blob/tracerserver //https://blog.devgenius.io/getting-started-with-websockets-and-json-data-in-rust-84434ddbfc21 ///GST_TRACERS=wsserver gst-launch-1.0 videotestsrc ! autovideosink #[derive(Debug, Serialize, Deserialize, Default)] struct WSMessage { #[serde(rename = "type")] msg_type: String, #[serde(rename = "object-id")] #[serde(default)] object_id: u64, #[serde(rename = "src-id")] #[serde(default)] src_id: u64, #[serde(rename = "sink-id")] #[serde(default)] sink_id: u64, #[serde(rename = "pad-id")] #[serde(default)] pad_id: u64, #[serde(rename = "object-name")] #[serde(default)] object_name: Option, #[serde(rename = "object-gtype")] #[serde(default)] object_gtype: Option, #[serde(rename = "element-factory")] #[serde(default)] element_factory: Option, #[serde(rename = "property-name")] #[serde(default)] property_name: Option, #[serde(rename = "property-value")] #[serde(default)] property_value: Option, } pub async fn run(app: &GPSApp) { let connect_addr = Settings::websocket_description(); if let Ok((ws_stream, _)) = connect_async(connect_addr).await { GPS_INFO!("WebSocket handshake has been successfully completed"); let (_write, mut read) = ws_stream.split(); app.clear_graph(); while let Some(message) = read.next().await { //GPS_INFO!("{message:?}"); let ws_msg: WSMessage = serde_json::from_str(message.unwrap().into_text().unwrap().as_str()).unwrap(); GPS_INFO!("{ws_msg:?}"); if ws_msg.msg_type == "new-object" { GPS_INFO!("{ws_msg:?}"); if let Some(factory_name) = ws_msg.element_factory { if factory_name != "pipeline" { app.add_new_element(factory_name.as_str()); } } } } } }