104 lines
3.6 KiB
Rust
104 lines
3.6 KiB
Rust
#[macro_use]
|
|
extern crate arrayref;
|
|
use std::error::Error;
|
|
use std::thread;
|
|
use std::time::Duration;
|
|
use std::f32::consts::PI;
|
|
use chrono::{DateTime, Utc};
|
|
use chrono_tz::Tz;
|
|
|
|
|
|
use image::{
|
|
Rgb,
|
|
RgbImage
|
|
};
|
|
use imageproc::rect::Rect;
|
|
use imageproc::drawing::draw_filled_rect_mut;
|
|
|
|
mod ilidisplay;
|
|
mod forms;
|
|
mod signalk;
|
|
|
|
fn main() -> Result<(), Box<dyn Error>> {
|
|
|
|
let mut course_screen = forms::Screen::new(200, 200);
|
|
let mut sog_screen = forms::Screen::new(160,60);
|
|
let mut gps_screen = forms::Screen::new(400, 40);
|
|
let mut time_screen = forms::Screen::new(200, 60);
|
|
|
|
let mut loader = forms::Loader::new("/root/helms-display".to_string());
|
|
|
|
let c = loader.load_form("compass-rose.svg").unwrap();
|
|
let b = loader.load_form("boat.svg").unwrap();
|
|
let cog = loader.load_form("cog.svg").unwrap();
|
|
let wind = loader.load_form("wind.svg").unwrap();
|
|
let font = loader.load_font("font.ttf").unwrap();
|
|
|
|
/*
|
|
let mut img = RgbImage::new(480, 320);
|
|
let thickness = 10;
|
|
draw_filled_rect_mut(&mut img, Rect::at(0,0).of_size(240, 160), Rgb([255,0,0]));
|
|
draw_filled_rect_mut(&mut img, Rect::at(0,160).of_size(240, 160), Rgb([0, 255, 0]));
|
|
draw_filled_rect_mut(&mut img, Rect::at(240,0).of_size(240, 160), Rgb([0, 0, 255]));
|
|
*/
|
|
|
|
let mut e = ilidisplay::IliDisplay::init()?;
|
|
e.init_chip();
|
|
e.turn_on();
|
|
|
|
|
|
course_screen.clear();
|
|
let rad = (6 as f32) * 2.0*PI / 100.0;
|
|
course_screen.clear();
|
|
course_screen.render(&cog, -rad*2.0, 500, 500);
|
|
course_screen.render(&wind, rad*2.0, 500, 500);
|
|
course_screen.render(&c, rad, 500, 500);
|
|
course_screen.render(&b, 0.0, 500, 500);
|
|
e.put_image(&(course_screen.image), (160, (160-100)));
|
|
|
|
sog_screen.clear();
|
|
sog_screen.text(&font, "SOG", 32.0, 5, 5);
|
|
sog_screen.text(&font, "speed over ground", 12.0, 5, 38);
|
|
let speed_over_ground = 5.0; // in m/s
|
|
let speed_over_ground = speed_over_ground * 1.9438612860586; // now in nautic miles per hour
|
|
sog_screen.text_rj(&font, format!("{:.1}", speed_over_ground).as_str(), 32.0, 138, 5);
|
|
sog_screen.fraction(&font, "nm", "h", 14.0, 140, 6);
|
|
e.put_image(&(sog_screen.image), (0, 0));
|
|
|
|
gps_screen.clear();
|
|
// format with unicodes for degrees, minutes and seconds.
|
|
let longitude: f32 = 55.658863;
|
|
let latitude: f32 = 12.480960;
|
|
|
|
let long_d: u8 = longitude.trunc() as u8;
|
|
let longitude = longitude.fract() * 60.0;
|
|
let long_m: u8 = longitude.trunc() as u8;
|
|
let longitude = longitude.fract() * 60.0;
|
|
let long_s: u8 = longitude.round() as u8;
|
|
let long_ns: char = 'N';
|
|
|
|
let lat_d: u8 = latitude.trunc() as u8;
|
|
let latitude = latitude.fract() * 60.0;
|
|
let lat_m: u8 = latitude.trunc() as u8;
|
|
let latitude = latitude.fract() * 60.0;
|
|
let lat_s: u8 = latitude.round() as u8;
|
|
let lat_ew: char = 'E';
|
|
gps_screen.text_c(&font, format!("{}{:02}\u{00B0}{:02}\u{2032}{:02}\u{2033} {}{:02}\u{00B0}{:02}\u{2032}{:02}\u{2033}", long_ns, long_d, long_m, long_s, lat_ew, lat_d, lat_m, lat_s).as_str(), 32.0, 200, 5);
|
|
e.put_image(&(gps_screen.image), (240,370));
|
|
|
|
time_screen.clear();
|
|
let tz: Tz = "Europe/Copenhagen".parse().unwrap();
|
|
let now = Utc::now().with_timezone(&tz);
|
|
time_screen.text_c(&font, now.format("%H:%M:%S %Z").to_string().as_str(), 24.0, 100, 1);
|
|
time_screen.text_c(&font, "Europe/Copenhagen", 16.0, 100, 25);
|
|
time_screen.text_c(&font, now.format("%Y-%m-%d").to_string().as_str(), 16.0, 100, 43);
|
|
time_screen.save();
|
|
|
|
|
|
println!("Display has been rendered now, sleeping for 5s");
|
|
signalk::SignalKData::connect();
|
|
thread::sleep(Duration::from_millis(5000));
|
|
e.turn_off();
|
|
Ok(())
|
|
}
|