First attempt on SignalK Websocket handling

This commit is contained in:
2020-06-07 00:09:49 +00:00
parent b66fb03b8f
commit c111a52156
2 changed files with 59 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/target

58
src/signalk.rs Normal file
View File

@@ -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<SignalKEvent> {
let res = Vec::<SignalKEvent>::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
}
}