update with halfbaked VRPN tracker implementation
This commit is contained in:
parent
d7bc604289
commit
df1f5e99ec
3 changed files with 59 additions and 28 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -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",
|
||||||
]
|
]
|
||||||
|
|
|
@ -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
|
|
@ -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));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue