GstPipelineStudio/src/gps/wsserver.rs
2023-09-30 10:56:47 +02:00

71 lines
2.2 KiB
Rust

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<String>,
#[serde(rename = "object-gtype")]
#[serde(default)]
object_gtype: Option<String>,
#[serde(rename = "element-factory")]
#[serde(default)]
element_factory: Option<String>,
#[serde(rename = "property-name")]
#[serde(default)]
property_name: Option<String>,
#[serde(rename = "property-value")]
#[serde(default)]
property_value: Option<String>,
}
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());
}
}
}
}
}
}