1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
//! Value types of the KINAVIS crates.
//!
//! The kernel holds what has exactly one correct implementation: units, angles,
//! positions, time, the error type. Anything with a choice of method (sailing,
//! interpolation, fix) lives in `kinavis`; every satellite crate (parsers,
//! magnetic model, INS) depends on the kernel alone. This is the workspace
//! dependency rule: adapters change without touching the core.
//!
//! Most users should depend on `kinavis`, which re-exports these modules.
//! Depend on `kinavis-kernel` directly for an adapter that must not pull in the
//! algorithms.
//!
//! # Type guarantees
//!
//! Angles carry their reference frame: [`CompassCourse`], [`MagneticCourse`],
//! [`TrueCourse`], [`GyroCourse`], [`Variation`], [`Deviation`],
//! [`RelativeBearing`]. Passing a magnetic course where a true one is expected
//! does not compile. [`Distance`] and [`Speed`] are types, so knots cannot be
//! passed as m/s.
//!
//! Each type enforces its range: a [`Direction`] is always finite and in `[0°,
//! 360°)`, a [`Latitude`] in `[-90°, 90°]`. Existence implies validity, so
//! corrections built on them return values, not `Result`. Invalid input is
//! rejected at construction with a [`KernelError`]; nothing panics on caller
//! data.
//!
//! # Modules
//!
//! - [`angle`] — frame-tagged angles.
//! - [`units`] — angles, distances, speeds, rate of turn.
//! - [`position`] — latitude, longitude, notation.
//! - [`error`] — the error type and validation helpers.
//! - [`time`] — instants with the time scale in the type, calendar, leap-second
//! port.
//! - [`observation`] — a value with its time and quality; age is computed.
//! - [`geodesy`] — ellipsoids, heights with datum, ECEF, chart datums and their
//! transformation to WGS 84.
//! - [`local`] — NED and other local frames; vectors typed by frame and unit; a
//! frame anchored at a point.
//! - [`gnss`] — a satellite fix, independent of the sentence format.
//! - [`state`] — navigation state aggregate behind invariants, projected to the
//! read model.
//! - [`estimation`] — estimator ports: process model and observation.
//! - [`environment`] — environment ports (magnetic field, current, wind, tide,
//! leeway, deviation) and the sample they return.
//! - [`snapshot`] — read model: position, motion, uncertainty and age, for
//! displays and alarms.
//! - [`event`] — events returned as values in a fixed-capacity list, never via
//! callbacks.
//! - [`matrix`] — small dense matrices with checked access and Cholesky
//! factorisation.
//! - [`math`] — floating-point primitives routed to `std` or `libm`. Every
//! transcendental call in the crate family goes through here, for
//! reproducibility across targets.
//! - [`inline`] — fixed-capacity storage; no allocator required.
//!
//! # Feature flags
//!
//! - `std` *(default)* — standard library floating-point maths.
//! - `libm` — for `no_std` targets: `--no-default-features --features libm`.
//! - `serde` — serialisation of the value types; deserialisation applies the
//! same validation as construction.
//! - `alloc` — unused here; lets dependent crates name one flag for the whole
//! family.
//!
//! No dependencies in the default configuration.
//!
//! # Hidden items
//!
//! Some public items are `#[doc(hidden)]`: constructors that accept a raw value
//! unchecked (`from_degrees_unchecked`, `from_knots_unchecked`,
//! `from_degrees_wrapped`, `relabel`) and accessors exposing internal
//! representation (`NavigationState` vector, covariance and `from_parts`, the
//! state dimension, Jacobian entries). The algorithm crates need them — a
//! solver wrapping an already-bounded angle should not pay for a check, an
//! estimator must see the covariance — and Rust has no visibility between
//! crates other than `pub`. They form an internal contract of the crate family:
//! not covered by the stability guarantee, may change in a minor release, and
//! marked as such in their docs. Use them only from crates released together
//! with the kernel.
// The crate does not allocate; test modules use `format!`, hence `test`. The
// bare-metal CI build enables neither.
extern crate alloc;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use InlineStr;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;
pub use ;