2022-12-20 23:23:03 +01:00
|
|
|
|
2022-12-11 23:41:22 +01:00
|
|
|
use bevy::prelude::*;
|
|
|
|
|
2022-12-12 00:07:42 +01:00
|
|
|
extern crate bytes;
|
2022-12-12 23:18:34 +01:00
|
|
|
extern crate vrpn;
|
|
|
|
|
2022-12-14 16:56:52 +01:00
|
|
|
// use futures_lite::future;
|
|
|
|
use rand::Rng;
|
|
|
|
use std::time::{Duration, Instant};
|
|
|
|
|
2022-12-12 23:18:34 +01:00
|
|
|
use bytes::{Bytes, BytesMut};
|
|
|
|
use std::{
|
2022-12-13 20:35:22 +01:00
|
|
|
io::{self, Read},
|
2022-12-12 23:18:34 +01:00
|
|
|
net::{SocketAddr, TcpStream},
|
|
|
|
};
|
2022-12-11 23:41:22 +01:00
|
|
|
|
2022-12-20 23:23:03 +01:00
|
|
|
use std::sync::mpsc::{channel, Receiver};
|
2022-12-14 22:55:26 +01:00
|
|
|
|
2022-12-11 23:41:22 +01:00
|
|
|
use vrpn::{
|
2022-12-12 23:18:34 +01:00
|
|
|
codec::peek_u32,
|
2022-12-12 00:07:42 +01:00
|
|
|
constants::MAGIC_DATA,
|
|
|
|
cookie::check_ver_nonfile_compatible,
|
2022-12-14 16:56:52 +01:00
|
|
|
handler::{HandlerCode, TypedHandler},
|
2022-12-12 23:18:34 +01:00
|
|
|
message::MessageSize,
|
2022-12-14 16:56:52 +01:00
|
|
|
sync_io::{read_cookie, write_cookie, EndpointSyncTcp},
|
2022-12-13 20:35:22 +01:00
|
|
|
tracker::PoseReport,
|
2022-12-20 23:23:03 +01:00
|
|
|
unbuffer, CookieData, Message, Result, SequencedGenericMessage, TypeDispatcher,
|
|
|
|
TypedBodylessHandler, Unbuffer,
|
2022-12-11 23:41:22 +01:00
|
|
|
};
|
|
|
|
|
2023-01-16 19:21:28 +01:00
|
|
|
#[derive(Resource, Debug, Sync)]
|
|
|
|
pub struct Tracker { rx : Receiver<PoseReport> }
|
2022-12-11 23:41:22 +01:00
|
|
|
|
2022-12-20 23:23:03 +01:00
|
|
|
impl FromWorld for Tracker {
|
|
|
|
fn from_world(world: &mut World) -> Self {
|
2022-12-22 13:11:52 +01:00
|
|
|
|
|
|
|
info!("Test here!");
|
|
|
|
|
2022-12-20 23:23:03 +01:00
|
|
|
let (sender, receiver): (_, Receiver<PoseReport>) = channel();
|
2022-12-14 22:55:26 +01:00
|
|
|
|
2023-01-16 19:21:28 +01:00
|
|
|
let sender_th = sender.clone();
|
|
|
|
|
2022-12-14 22:55:26 +01:00
|
|
|
std::thread::spawn(move || {
|
2022-12-22 13:11:52 +01:00
|
|
|
|
|
|
|
// 212.201.64.122 | 127.0.0.1
|
2023-01-09 16:07:07 +01:00
|
|
|
let addr: SocketAddr = "127.0.0.1:3883".parse().unwrap();
|
2022-12-14 22:55:26 +01:00
|
|
|
let mut stream = TcpStream::connect(addr).unwrap();
|
|
|
|
stream.set_nodelay(true).unwrap();
|
2022-12-22 13:11:52 +01:00
|
|
|
|
2022-12-14 22:55:26 +01:00
|
|
|
// We first write our cookie, then read and check the server's cookie, before the loop.
|
|
|
|
write_cookie(&mut stream, CookieData::from(MAGIC_DATA)).unwrap();
|
|
|
|
let cookie_buf = read_cookie(&mut stream).unwrap();
|
|
|
|
let mut cookie_buf = Bytes::from(&cookie_buf[..]);
|
2022-12-12 00:07:42 +01:00
|
|
|
|
2022-12-22 13:11:52 +01:00
|
|
|
|
2022-12-20 23:23:03 +01:00
|
|
|
CookieData::unbuffer_ref(&mut cookie_buf)
|
|
|
|
.and_then(|msg| check_ver_nonfile_compatible(msg.version))
|
|
|
|
.unwrap();
|
2022-12-12 00:07:42 +01:00
|
|
|
|
2022-12-22 13:11:52 +01:00
|
|
|
|
2022-12-20 23:23:03 +01:00
|
|
|
// Not actually doing anything with the messages here, just receiving them and printing them.
|
|
|
|
loop {
|
|
|
|
let mut buf = BytesMut::new();
|
2022-12-12 00:07:42 +01:00
|
|
|
|
2022-12-20 23:23:03 +01:00
|
|
|
// Read the message header and padding
|
|
|
|
buf.resize(24, 0);
|
|
|
|
stream.read_exact(buf.as_mut()).unwrap();
|
2022-12-12 23:18:34 +01:00
|
|
|
|
2022-12-20 23:23:03 +01:00
|
|
|
// Peek the size field, to compute the MessageSize.
|
|
|
|
let total_len = peek_u32(&buf.clone().freeze()).unwrap().unwrap();
|
|
|
|
let size = MessageSize::from_length_field(total_len);
|
2022-12-12 03:12:56 +01:00
|
|
|
|
2022-12-20 23:23:03 +01:00
|
|
|
// Read the body of the message
|
|
|
|
let mut body_buf = BytesMut::new();
|
|
|
|
body_buf.resize(size.padded_body_size(), 0);
|
|
|
|
stream.read_exact(body_buf.as_mut()).unwrap();
|
2022-12-14 13:00:18 +01:00
|
|
|
|
2022-12-20 23:23:03 +01:00
|
|
|
// Combine the body with the header
|
|
|
|
buf.extend_from_slice(&body_buf[..]);
|
|
|
|
let mut buf = buf.freeze();
|
2022-12-12 00:07:42 +01:00
|
|
|
|
2022-12-20 23:23:03 +01:00
|
|
|
// Unbuffer the message.
|
|
|
|
let unbuffered = SequencedGenericMessage::unbuffer_ref(&mut buf).unwrap();
|
2022-12-12 00:07:42 +01:00
|
|
|
|
2022-12-20 23:23:03 +01:00
|
|
|
let message = Message::from(unbuffered);
|
2022-12-12 23:18:34 +01:00
|
|
|
|
2022-12-20 23:23:03 +01:00
|
|
|
|
|
|
|
// let result: Message<PoseReport> = Message::try_from_generic(&message)?;
|
2022-12-12 23:18:34 +01:00
|
|
|
|
2022-12-20 23:23:03 +01:00
|
|
|
let result = Message::<PoseReport>::try_from_generic(&message);
|
2022-12-13 18:13:59 +01:00
|
|
|
|
2022-12-20 23:23:03 +01:00
|
|
|
match result {
|
2022-12-13 18:13:59 +01:00
|
|
|
|
2023-01-16 19:21:28 +01:00
|
|
|
Ok(result) => {
|
|
|
|
eprintln!("Pose from tracker {:?}",result.body);
|
|
|
|
|
|
|
|
// sender_th.send(result.body).unwrap();
|
|
|
|
},
|
2023-01-09 16:07:07 +01:00
|
|
|
Err(_) => { /* silently fail */ }
|
2022-12-20 23:23:03 +01:00
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2022-12-12 03:12:56 +01:00
|
|
|
|
2023-01-16 19:21:28 +01:00
|
|
|
Self { rx = receiver.clone() }
|
2022-12-20 23:23:03 +01:00
|
|
|
}
|
|
|
|
}
|