PixSpace/src/tracker.rs

119 lines
3.4 KiB
Rust
Raw Normal View History

2022-12-11 23:41:22 +01:00
use bevy::prelude::*;
extern crate bytes;
2022-12-12 23:18:34 +01:00
extern crate vrpn;
use bytes::{Bytes, BytesMut};
use std::{
io::{Read,self},
net::{SocketAddr, TcpStream},
};
2022-12-11 23:41:22 +01:00
use vrpn::{
2022-12-12 23:18:34 +01:00
codec::peek_u32,
constants::MAGIC_DATA,
cookie::check_ver_nonfile_compatible,
2022-12-12 23:18:34 +01:00
message::MessageSize,
sync_io::{read_cookie, write_cookie},
CookieData, Message, Result, SequencedGenericMessage, Unbuffer,
2022-12-11 23:41:22 +01:00
};
#[derive(Component)]
pub struct Tracker {
2022-12-12 23:18:34 +01:00
stream: TcpStream, // endpoint: EndpointSyncTcp,
// dispatcher: TypeDispatcher
// stream: ConnectionIpStream,
// connection: Arc<ConnectionIp>
2022-12-11 23:41:22 +01:00
}
2022-12-12 23:18:34 +01:00
// #[derive(Debug)]
// struct TrackerHandler {}
2022-12-11 23:41:22 +01:00
2022-12-12 23:18:34 +01:00
// impl TypedHandler for TrackerHandler {
// type Item = PoseReport;
// fn handle_typed(&mut self, msg: &Message<PoseReport>) -> Result<HandlerCode> {
// info!("{:?}\n {:?}", msg.header, msg.body);
// Ok(HandlerCode::ContinueProcessing)
// }
// }
2022-12-11 23:41:22 +01:00
impl Tracker {
2022-12-12 03:12:56 +01:00
pub fn from_info(server_ip: &str, port: u16) -> Self {
// 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");
2022-12-12 23:18:34 +01:00
let addr: SocketAddr = format!("{}:{}", server_ip.to_string(), port)
.parse()
.unwrap();
2022-12-12 03:12:56 +01:00
let mut stream = TcpStream::connect(addr).unwrap();
stream.set_nodelay(true).unwrap();
2022-12-12 23:18:34 +01:00
// We first write our cookie, then read and check the server's cookie, before the loop.
2022-12-12 03:12:56 +01:00
write_cookie(&mut stream, CookieData::from(MAGIC_DATA)).unwrap();
let cookie_buf = read_cookie(&mut stream).unwrap();
2022-12-12 23:18:34 +01:00
// let mut cookie_buf = Bytes::from(&cookie_buf[..]);
2022-12-12 23:18:34 +01:00
// CookieData::unbuffer_ref(&mut cookie_buf)
// .and_then(|msg| check_ver_nonfile_compatible(msg.version)).unwrap();
2022-12-12 23:18:34 +01:00
Tracker { stream }
2022-12-12 03:12:56 +01:00
}
2022-12-12 23:18:34 +01:00
pub fn update(&mut self) -> vrpn::Result<()> {
2022-12-11 23:41:22 +01:00
2022-12-12 23:18:34 +01:00
let mut buf = BytesMut::new();
// Read the message header and padding
buf.resize(24, 0);
self.stream.read_exact(buf.as_mut())?;
// Peek the size field, to compute the MessageSize.
let total_len = peek_u32(&buf.clone().freeze())?.unwrap();
let size = MessageSize::from_length_field(total_len);
2022-12-11 23:41:22 +01:00
2022-12-12 23:18:34 +01:00
// Read the body of the message
let mut body_buf = BytesMut::new();
body_buf.resize(size.padded_body_size(), 0);
self.stream.read_exact(body_buf.as_mut())?;
2022-12-11 23:41:22 +01:00
2022-12-12 23:18:34 +01:00
// Combine the body with the header
buf.extend_from_slice(&body_buf[..]);
let mut buf = buf.freeze();
2022-12-12 03:12:56 +01:00
2022-12-12 23:18:34 +01:00
// Unbuffer the message.
let unbuffered = SequencedGenericMessage::unbuffer_ref(&mut buf)?;
eprintln!("{:?}", Message::from(unbuffered));
Ok(())
2022-12-11 23:41:22 +01:00
}
}
2022-12-12 23:18:34 +01:00
pub fn setup_tracker(mut commands: Commands) {
// commands.spawn(Tracker::from_info("127.0.0.1", 3883));
}
// pub fn update_tracker(mut query:Query<&mut Tracker>)
// {
// for mut tracker in query.iter_mut() {
// // tracker.update();
2022-12-11 23:41:22 +01:00
2022-12-12 23:18:34 +01:00
// // tracker.connection.poll_endpoints();
// // tracker
// }
// }