First attempt on SignalK Websocket handling
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/target
|
||||
58
src/signalk.rs
Normal file
58
src/signalk.rs
Normal 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
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user