use crate::{
client::TraciClient,
constants::*,
error::TraciError,
storage::Storage,
types::{ContextSubscriptionResults, SubscriptionResults, TraciPosition},
};
#[derive(Debug, Default)]
pub struct GuiScope {
pub subscription_results: SubscriptionResults,
pub context_subscription_results: ContextSubscriptionResults,
}
impl GuiScope {
crate::impl_scope_accessors!();
pub fn get_id_list(&self, client: &mut TraciClient) -> Result<Vec<String>, TraciError> {
client.create_command(CMD_GET_GUI_VARIABLE, TRACI_ID_LIST, "", None);
client.process_get(CMD_GET_GUI_VARIABLE, Some(TYPE_STRINGLIST))?;
client.read_string_list_from_input()
}
pub fn get_zoom(&self, client: &mut TraciClient, view_id: &str) -> Result<f64, TraciError> {
client.create_command(CMD_GET_GUI_VARIABLE, VAR_VIEW_ZOOM, view_id, None);
client.process_get(CMD_GET_GUI_VARIABLE, Some(TYPE_DOUBLE))?;
client.read_double_from_input()
}
pub fn get_offset(&self, client: &mut TraciClient, view_id: &str) -> Result<TraciPosition, TraciError> {
client.create_command(CMD_GET_GUI_VARIABLE, VAR_VIEW_OFFSET, view_id, None);
client.process_get(CMD_GET_GUI_VARIABLE, Some(POSITION_2D))?;
client.read_pos_2d_from_input()
}
pub fn get_schema(&self, client: &mut TraciClient, view_id: &str) -> Result<String, TraciError> {
client.create_command(CMD_GET_GUI_VARIABLE, VAR_VIEW_SCHEMA, view_id, None);
client.process_get(CMD_GET_GUI_VARIABLE, Some(TYPE_STRING))?;
client.read_string_from_input()
}
pub fn get_boundary(&self, client: &mut TraciClient, view_id: &str) -> Result<Vec<TraciPosition>, TraciError> {
client.create_command(CMD_GET_GUI_VARIABLE, VAR_VIEW_BOUNDARY, view_id, None);
client.process_get(CMD_GET_GUI_VARIABLE, Some(TYPE_POLYGON))?;
client.read_polygon_from_input()
}
pub fn set_zoom(&self, client: &mut TraciClient, view_id: &str, zoom: f64) -> Result<(), TraciError> {
let mut add = Storage::new();
add.write_u8(TYPE_DOUBLE);
add.write_f64(zoom);
client.create_command(CMD_SET_GUI_VARIABLE, VAR_VIEW_ZOOM, view_id, Some(&add));
client.process_set(CMD_SET_GUI_VARIABLE)?;
Ok(())
}
pub fn set_offset(&self, client: &mut TraciClient, view_id: &str, x: f64, y: f64) -> Result<(), TraciError> {
let mut add = Storage::new();
add.write_u8(POSITION_2D);
add.write_f64(x);
add.write_f64(y);
client.create_command(CMD_SET_GUI_VARIABLE, VAR_VIEW_OFFSET, view_id, Some(&add));
client.process_set(CMD_SET_GUI_VARIABLE)?;
Ok(())
}
pub fn set_schema(&self, client: &mut TraciClient, view_id: &str, schema_name: &str) -> Result<(), TraciError> {
let mut add = Storage::new();
add.write_u8(TYPE_STRING);
add.write_string(schema_name);
client.create_command(CMD_SET_GUI_VARIABLE, VAR_VIEW_SCHEMA, view_id, Some(&add));
client.process_set(CMD_SET_GUI_VARIABLE)?;
Ok(())
}
pub fn set_boundary(
&self,
client: &mut TraciClient,
view_id: &str,
xmin: f64,
ymin: f64,
xmax: f64,
ymax: f64,
) -> Result<(), TraciError> {
let mut add = Storage::new();
add.write_u8(TYPE_POLYGON);
add.write_u8(2);
add.write_f64(xmin);
add.write_f64(ymin);
add.write_f64(xmax);
add.write_f64(ymax);
client.create_command(CMD_SET_GUI_VARIABLE, VAR_VIEW_BOUNDARY, view_id, Some(&add));
client.process_set(CMD_SET_GUI_VARIABLE)?;
Ok(())
}
pub fn screenshot(
&self,
client: &mut TraciClient,
view_id: &str,
filename: &str,
width: i32,
height: i32,
) -> Result<(), TraciError> {
let mut add = Storage::new();
add.write_u8(TYPE_COMPOUND);
add.write_i32(3);
add.write_u8(TYPE_STRING);
add.write_string(filename);
add.write_u8(TYPE_INTEGER);
add.write_i32(width);
add.write_u8(TYPE_INTEGER);
add.write_i32(height);
client.create_command(CMD_SET_GUI_VARIABLE, VAR_SCREENSHOT, view_id, Some(&add));
client.process_set(CMD_SET_GUI_VARIABLE)?;
Ok(())
}
pub fn track_vehicle(&self, client: &mut TraciClient, view_id: &str, veh_id: &str) -> Result<(), TraciError> {
let mut add = Storage::new();
add.write_u8(TYPE_STRING);
add.write_string(veh_id);
client.create_command(CMD_SET_GUI_VARIABLE, VAR_VIEW_SCHEMA, view_id, Some(&add));
client.process_set(CMD_SET_GUI_VARIABLE)?;
Ok(())
}
pub fn subscribe(&self, client: &mut TraciClient, view_id: &str, vars: &[u8], begin: f64, end: f64) -> Result<(), TraciError> {
client.subscribe_object_variable(CMD_SUBSCRIBE_GUI_VARIABLE, view_id, begin, end, vars)
}
pub fn subscribe_context(&self, client: &mut TraciClient, view_id: &str, domain: u8, range: f64, vars: &[u8], begin: f64, end: f64) -> Result<(), TraciError> {
client.subscribe_object_context(CMD_SUBSCRIBE_GUI_CONTEXT, view_id, begin, end, domain, range, vars)
}
}