use std::borrow::Cow;
use std::time::SystemTime;
mod units;
pub use units::{Feet, Meters, Knots, MetersPerSecond, MilesPerHour, KilometersPerHour,
Degrees, Fahrenheits, Celsius, Radians};
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Position{
pub latitude: f32,
pub longitude: f32,
pub precision: Option<Feet>,
}
impl Position {
pub fn from_latlng(lat: f32, lng: f32) -> Position {
Position{
latitude: lat,
longitude: lng,
precision: None,
}
}
pub fn from_latlng_precise(lat: f32, lng: f32, precision: Feet) -> Position {
Position{
latitude: lat,
longitude: lng,
precision: Some(precision),
}
}
pub fn set_precision(&mut self, precision : Feet) -> &mut Self {
self.precision = Some(precision);
self
}
pub fn coordinates(&self) -> (f32, f32) {
(self.longitude, self.latitude)
}
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum Symbol {
Sheriff, Emergency, Phone, BankOrAtm, PowerPlant, HfGateway, SmallAircraft, IncidentSite, MobileSatelliteStation, Cloudy, Handicapped, Firenet, Snowmobile, RedCross, Church, BoyScouts, GirlScouts, HouseQth, HouseHhf, Cross, BigQuestionMark, RedDot, Waypoint, Circle, WiFi, GasStation, Fire, Campground, Park, Motorcycle, Advisory, RailroadEngine, Car, OverlayedVehicles, Server, InfoKiosk, Dot, Huricane, AidStation, BoxOverlay, Bbs, Canoe, CoastGuard, Depots, Eyeball, Smoke, Tractor, GridSquare, SnowShower, Hotel, Haze, NetworkStation, RainShower, Lightening, School, KenwoodHt, PcUser, Lighthouse, MacAprs, Military, NtsStation, NavigationBuoy, Balloon, Rocket, Police, Parking, Quake, RecVehicle, Restaurant, Shuttle, Satellite, Sstv, Thunderstorm, Bus, Sunny, Atv, VortacNavAid, NationalWxServiceSite, NwsSite, Helo, Pharmacy, Yacht, RadiosAndDevices, WinAprs, Person, CloudOrHumansWOvrly, Triangle, GpsSymbol, PostOffice, LargeAircraft, OtherAircraft, WeatherStation, WxSite, DishAntenna, Rain, Ambulance, Bike, IncidentCommandPost, FireDept, Horse, Sleet, FireTruck, FunnelCloud, Glider, Gale, Hospital, Store, PointOfInterest, Jeep, Workzone, Truck, SpecialVehicle, Laptop, Areas, MicERepeater, ValueSign, Node, OverlayTriangle, SmallCircle, Dog, Restroom, Boat, OverlayBoat, TruckStop, Tornado, Truck18Wheeler, OverlayedTruck, Van, OverlayedVan, WaterStation, Flooding, Wreck, Skywarn, OverlayedShelter, Other,
}
pub const PRIMARY_SYMBOL_TABLE : u8 = 0x2f;
pub const ALT_SYMBOL_TABLE : u8 = 0x5c;
mod symbol;
impl Symbol {
pub fn from_table(table: u8, code: u8) -> Symbol {
symbol::from_table(table, code)
}
}
pub trait Packet {
fn source(&self) -> Cow<str>;
fn symbol(&self) -> Symbol;
fn timestamp(&self) -> Option<SystemTime>;
fn destination(&self) -> Option<Cow<str>>;
fn comment(&self) -> Option<Cow<str>>;
fn position(&self) -> Option<Position>;
fn speed(&self) -> Option<Knots>;
fn course(&self) -> Option<Degrees>;
fn altitude(&self) -> Option<Feet>;
fn temperature(&self) -> Option<Fahrenheits>;
fn wind_direction(&self) -> Option<Degrees>;
fn wind_speed(&self) -> Option<Knots>;
fn latitude(&self) -> Option<f32> {
self.position().map(|v| v.latitude)
}
fn longitude(&self) -> Option<f32> {
self.position().map(|v| v.longitude)
}
fn precision(&self) -> Option<Feet> {
self.position().and_then(|v| v.precision)
}
}
#[cfg(test)] #[macro_use] extern crate approx;