diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/src/signalk.rs b/src/signalk.rs new file mode 100644 index 0000000..fea1c1f --- /dev/null +++ b/src/signalk.rs @@ -0,0 +1,58 @@ +use std::thread; +use tungstenite::connect; +use url::Url; +use serde_json::{Result, Value}; + +// Model the data sent over SignalK Websocket +// that I'm interested in +pub enum SignalKEvent { + SpeedOverGround(f32), + SpeedThroughWater(f32), + Location(f32, f32), + CourseOverGround(f32), + TrueCompassCourse(f32), + AISVessel(String, f32, f32, f32), // Name, lat, long, speed + BatteryLevel(u8, u8), // Bank#, percentage + FuelLevel(u8), // percentage +} + + +pub struct SignalKData { + latitude: f32, + longitude: f32, + position_timestamp: u64, +} + +impl SignalKData { + + pub fn parseJson (json: String) -> Vec { + let res = Vec::::new(); + let v: Value = match serde_json::from_str(&json) { + Ok(value) => value, + Err(_) => return res, + }; +/* for d in v["updates"]["values"] { + println!("{}", d); + } */ + res + } + + pub fn connect() -> SignalKData { + let mut data = SignalKData { + latitude: f32::NAN, + longitude: f32::NAN, + position_timestamp: 0, + }; + let handle = thread::spawn(|| { + let (mut socket, response) = connect(Url::parse("ws://localhost:3000/signalk/v1/stream?subscribe=self").unwrap()).expect("Can't connect"); + loop { + let msg = socket.read_message().expect("Error reading message"); + if msg.is_text() { + println!("{}", msg.into_text().unwrap()); + } + } + }); + data + } + +}