The instrument does
the flying math.
Joran is FlySys's own Attitude & Heading Reference System and Air Data Computer — a proprietary, self-contained instrument developed entirely in-house. Named after the sudden wind that sweeps down from the Jura across Lake Geneva. Joran computes the whole flight picture on board; the FlySys PFD is pure glass.
Attitude, heading, turn rate, slip, load factor, barometric altitude against the pilot's QNH, vertical speed and GNSS position — all computed on the instrument and streamed to the display as one atomic frame, sixty times a second. No phone sensor takes part: the picture is the same on any device, propped at any angle.
| PFD stream | 60 Hz (30 Hz selectable) — attitude, heading, turn rate, slip, load factor, baro altitude vs QNH, VSI, status flags |
|---|---|
| GNSS | dual-band receiver on the instrument, 5 or 10 Hz — position, ground speed, track; the phone's GPS is not used |
| Align | one button: the instrument levels itself, zeroes the slip ball and remembers the mounting — persisted across power cycles |
| Telemetry | battery, temperatures, CPU, storage and integrity counters at 1 Hz — the health of the instrument, on the display |
A mechanical altimeter keeps its QNH when you swap the glass in front of it. Joran extends that idea to the whole panel: the altimeter setting, display units, auxiliary field and alarm thresholds are stored on the instrument. Any display that connects adopts them within a second — swap the tablet for a phone mid-flight and the cockpit looks exactly the same. Change a unit on one display and every display follows, because the instrument is the single source of truth.
| QNH | set from the PFD knob, persisted on the instrument — yesterday's setting is the pilot's business |
|---|---|
| Units | speed, altitude, vertical speed and pressure units travel with the instrument |
| Recordings | flight recordings carry the panel and the mounting they were flown with, so a replay shows what the pilot saw |
Alarms originate on Joran, not in an app — a display that happens to connect can neither miss them nor silence them by accident. Two levels, aviation-style: an amber caution (a soft double note, no acknowledgement owed) and a red alarm that stays until the pilot explicitly acknowledges it. Battery warning and critical voltages are the pilot's to set, and they persist on the instrument.
Joran records its raw sensor stream on board and replays it faithfully — the same filter, the same numbers, the same display, every time. Calibrations (magnetometer, accelerometer, installation) run on the instrument with guided maneuvers and audible cues, straight from the PFD's settings panel. Firmware updates arrive over Bluetooth, in the field, with integrity checks end to end.
How the Primary Flight System fits together: the instrument, the link, and the screen.
Joran — our own AHRS & Air Data Computer — computes everything on board: attitude, heading, turn rate, slip, load factor, barometric altitude against QNH, vertical speed and GNSS position. It streams ready-made flight data over Bluetooth LE; the Android device is a pure display. Joran is a proprietary FlySys instrument, developed in-house.
Every calibration below runs on Joran — started from the PFD’s settings panel (CAL MAG, CAL 2D, CAL ACC, ALIGN), guided with audible cues, judged by the instrument and persisted on board. Swap the display: the calibrations stay.
The three calibrations enter Joran's signal chain at different points — the accelerometer fix is applied to the raw signal before the filter, the gyro alignment happens inside the filter, and the magnetometer fix feeds heading. All of it on the instrument; the display only presses the buttons.
Metal and avionics distort the local magnetic field in two ways. Hard-iron comes from permanently magnetised material — speakers, screws, magnets — and adds a fixed offset that shifts the whole field; it moves the centre c. Soft-iron comes from ferromagnetic material that bends and re-scales the field differently with heading; it stretches the sphere of readings into a tilted ellipsoid — the shape W. Calibration maps both and corrects them, so magnetic heading reads true in the installed environment — not just on the bench.
Rotate
Turn the unit through many orientations so it samples the field from all directions.
Fit
A 3D fit (or 2D when motion is limited) recovers the hard- and soft-iron correction.
Apply
The correction is stored and applied continuously to incoming data.
The fit. Started with CAL MAG, the instrument collects while you turn it slowly through all orientations; the raw samples trace an off-centre, squashed sphere. A full ellipsoid fit — linear least-squares (Merayo-style) on the quadric — recovers the hard-iron centre c and a soft-iron 3×3 shape W that maps the ellipsoid back to a sphere. Installed in the aircraft, where you can't tumble the airframe, CAL 2D fits a 2D ellipse from one level turn instead. A residual-RMS (root-mean-square) and an axis-ratio check reject a bad fit — the instrument announces the verdict.
Re-run when the environment changes — a new mounting, added avionics or a different airframe all shift the field. Recalibrate to keep the map current.
Keyed by what actually affects it — the 3D calibrations (the accelerometer 6-face fit and the magnetometer sensor fit) characterise the sensor itself, so they are stored per IMU (by its address) and stay valid at any mounting. Only the in-aircraft 2D magnetometer fit depends on the install orientation, so it is stored per IMU and per mounting preset. Swap IMUs or change the mounting and the app loads the matching calibrations automatically — and a 3D calibration is never re-run just because the mounting changed.
A small per-axis offset or scale error tilts the measured gravity vector and shows up as a bank error growing toward 45°. A classic six-point fit removes it. Hold the unit still on each of its six faces in turn:
Face +X up
Hold steady until captured.
Face −X up
Flip to the opposite face.
Face +Y up
Rotate to the next axis.
Face −Y up
Opposite face, hold still.
Face +Z up
Level, hold still.
Face −Z up
Inverted, hold still.
Each axis is bracketed by its + and − faces, giving a per-axis offset and scale — an axis-aligned ellipsoid mapped to a sphere of radius g, with no absolute-gravity assumption. The result is applied to the raw accelerometer before the filters, so every estimator benefits.
Every gyro has a small zero-rate bias that, uncorrected, would drift heading and attitude. A short static "Align" window at power-up — held still on the ground — measures and removes it automatically.
| When | at power-up, on the ground |
|---|---|
| Condition | aircraft held still |
| Window | a few seconds, automatic |
| Result | zero-rate bias removed |
The discipline behind the numbers — vibration, manoeuvre load, dropped links, stale data — running at 240 Hz on the instrument, with a zero-loss acquisition and one rule for live and replay.
Airframe and engine vibration ride on the raw accelerometer and gyro. Each axis is cleaned by its own 2-pole Butterworth low-pass — an IIR (infinite impulse response) filter in Direct Form II Transposed — before it reaches the filters and the slip ball — branch-free and allocation-free, safe to run at full sensor rate.
The accelerometer only tells you "down" when it's measuring pure gravity. In a turn, under braking, in turbulence, it isn't — so its correction is gated. And the reference gravity magnitude is learned per device (a slow exponential moving average (EMA), τ≈16 s) rather than assumed to be 9.81 m/s² — MEMS (Micro-Electro-Mechanical Systems) units often read ~10.2 — so a scale bias can't quietly tilt the horizon.
Gating the accelerometer would leave the filter blind through a long turn — so it is never the only correction. The ESKF (Error-State Kalman Filter) runs a set of independent measurement updates, each watching a different observable and weighted by its own σ. When gravity can't be trusted, these are what hold a true attitude.
| Gravity direction | accelerometer, pitch & roll (gated in turns) |
|---|---|
| Coordinated-turn bank | bank = atan(V·ω / g) (GPS) |
| Load-factor bank | bank = acos(1 / N) (no GPS) |
| Flight-path pitch | pitch = asin(VSI / V) + AoA (VSI = vertical speed, AoA = angle of attack; baro & GPS-alt) |
| Heading | magnetometer (GPS track as fallback) |
| Gyro bias | learned online, temperature-tracked b_eff(T) |
The load-factor bank is the quiet workhorse: acos(1/N) reads the bank straight off the g-load with no GPS at all — so a coordinated turn stays true even with no satellites and the accelerometer gated off.
Small touches that matter in the cockpit: the tape digits roll over with hysteresis so they never flicker on the boundary, and if the data goes quiet the display tells you — it doesn't pretend.
Rollover hysteresis
Tape digits only change past a small margin, so a value sitting on a boundary stays put instead of stuttering.
Stale-data caution
If samples stop arriving, an amber caution latches after a few seconds blind — the picture never silently freezes as if all were well.
Bluetooth in a metal cockpit drops. When it does, the reader reconnects on its own and re-seeds the attitude from the current orientation, so the horizon snaps back upright instead of tumbling. On the network path, the TCP gateway is found automatically by mDNS — no IP addresses to type.
Auto-reconnect & re-seed
A dropped Inertial Measurement Unit (IMU) link is re-established automatically; attitude is re-initialised from gravity so there's no long settle.
Zero-config discovery
The FlySys TCP source is located on the network by name — plug in and it appears, no manual addressing.
The IMU module fuses natively in ENU (East-North-Up); the PFD's attitude pipeline works in NED (North-East-Down). The app re-expresses the solution ENU→NED at ingestion, so every filter, the horizon and the slip ball share one consistent frame.
| Android | 7.0 or newer |
|---|---|
| Graphics | OpenGL ES 3.0 |
| Radios | Bluetooth LE for the Joran link |
| Fallback | internal accel, gyro, mag, baro |
No Bluetooth hardware? The internal-sensor, simulator and replay paths run on an emulator, so you can try the full display before wiring anything up.