update with halfbaked VRPN tracker implementation

This commit is contained in:
Hartmut Seichter 2022-12-12 00:07:42 +01:00
parent d7bc604289
commit df1f5e99ec
3 changed files with 59 additions and 28 deletions

1
Cargo.lock generated
View file

@ -2701,6 +2701,7 @@ name = "pix_space"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"bevy", "bevy",
"bytes 1.3.0",
"rand 0.8.5", "rand 0.8.5",
"vrpn", "vrpn",
] ]

View file

@ -2,6 +2,8 @@
name = "pix_space" name = "pix_space"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"
authors = ["Hartmut Seichter <hartmut@technotecture.com>"]
readme = "README.md"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@ -11,6 +13,7 @@ bevy = { version = "0.9.1", features = ["dynamic"] }
rand = "0.8.4" rand = "0.8.4"
# vrpn = "0.1.0" # not compatible with 2021 # vrpn = "0.1.0" # not compatible with 2021
vrpn = { git = "https://github.com/seichter/vrpn-rs" } vrpn = { git = "https://github.com/seichter/vrpn-rs" }
bytes = "1.3.0"
[profile.release] [profile.release]
opt-level = 3 opt-level = 3

View file

@ -1,52 +1,79 @@
use bevy::prelude::*; use bevy::prelude::*;
extern crate vrpn; extern crate vrpn;
extern crate bytes;
// extern crate tokio; // extern crate tokio;
use std::sync::Arc; use bytes::Bytes;
use std::net::{SocketAddr, TcpStream};
use vrpn::{ use vrpn::{
async_io::{ping, ConnectionIp, ConnectionIpStream}, constants::MAGIC_DATA,
cookie::check_ver_nonfile_compatible,
handler::{HandlerCode, TypedHandler}, handler::{HandlerCode, TypedHandler},
ping::Server, sync_io::{read_cookie, write_cookie, EndpointSyncTcp},
prelude::*,
tracker::PoseReport, tracker::PoseReport,
Message, Result, ServerInfo, StaticSenderName, CookieData, Message, Result, TypeDispatcher, Unbuffer,
}; };
#[derive(Component)] #[derive(Component)]
pub struct Tracker { pub struct Tracker {
stream: ConnectionIpStream, // stream: ConnectionIpStream,
connection: Arc<ConnectionIp> // connection: Arc<ConnectionIp>
} }
impl Tracker { #[derive(Debug)]
pub fn from_info(server_ip: &str, port: u16) -> Self { struct TrackerHandler {}
let server = format!("tcp://{}:{}", server_ip, port)
.parse::<ServerInfo>()
.unwrap();
let connection = ConnectionIp::new_client(server, None, None).expect("msg");
let sender = connection
.register_sender(StaticSenderName(b"Tracker0"))
.expect("should be able to register sender");
let ping_client = ping::Client::new(sender, Arc::clone(&connection))
.expect("should be able to create ping client");
Self {
stream: ConnectionIpStream::new(Arc::clone(&connection)),
connection
}
}
impl TypedHandler for TrackerHandler {
type Item = PoseReport;
fn handle_typed(&mut self, msg: &Message<PoseReport>) -> Result<HandlerCode> { fn handle_typed(&mut self, msg: &Message<PoseReport>) -> Result<HandlerCode> {
info!("{:?}\n {:?}", msg.header, msg.body); info!("{:?}\n {:?}", msg.header, msg.body);
Ok(HandlerCode::ContinueProcessing) Ok(HandlerCode::ContinueProcessing)
} }
} }
impl Tracker {
pub fn from_info(server_ip: &str, port: u16) -> Result<()> {
// let server = format!("tcp://{}:{}", server_ip, port)
// .parse::<ServerInfo>()
// .unwrap();
// let connection = ConnectionIp::new_client(server, None, None).expect("msg");
// let sender = connection
// .register_sender(StaticSenderName(b"Tracker0"))
// .expect("should be able to register sender");
// let ping_client = ping::Client::new(sender, Arc::clone(&connection))
// .expect("should be able to create ping client");
let addr: SocketAddr = "127.0.0.1:3883".parse().unwrap();
let mut stream = TcpStream::connect(addr)?;
stream.set_nodelay(true)?;
// We first write our cookie, then read and check the server's cookie, before the loop.
write_cookie(&mut stream, CookieData::from(MAGIC_DATA))?;
let cookie_buf = read_cookie(&mut stream)?;
let mut cookie_buf = Bytes::from(&cookie_buf[..]);
// CookieData::unbuffer_ref(&mut cookie_buf)
// .and_then(|msg| check_ver_nonfile_compatible(msg.version))?;
let mut endpoint = EndpointSyncTcp::new(stream);
let mut dispatcher = TypeDispatcher::new();
let _ = dispatcher.add_typed_handler(Box::new(TrackerHandler {}), None)?;
// Ok(Self {
// // stream: ConnectionIpStream::new(Arc::clone(&connection)),
// // connection
// })
}
}
pub fn setup_tracker(mut commands: Commands) pub fn setup_tracker(mut commands: Commands)
{ {
commands.spawn(Tracker::from_info("127.0.0.1",3883)); commands.spawn(Tracker::from_info("127.0.0.1",3883));