Artificial Horizon — Robotics/Flight Instruments
Robotics/Flight_Instruments/Artificial_Horizon · 0 input / 0 output port(s) at insert · exports to Python, MATLAB, Java, Rust, C, C++, VHDL, Verilog, SystemVerilog, PLC Structured Text
Description#
The block's own DESCRIPTION_HTML, rendered verbatim — the same text the config dialog's info panel and the library navigator show. Fix a wrong sentence in the block's .cpp (R-D9), never here.
Artificial Horizon
Robotics / Flight Instruments
An attitude indicator. It shows a two-entry signal it is told the name of, [roll pitch] in degrees, clamped to roll ±90 and pitch ±30: the horizon sits 92/30 of a pixel lower per degree of pitch on a 300-pixel face (more sky with the nose up), and the ground, its pitch ladder and the bank scale turn by −roll about the centre while the aircraft symbol stays level. It has no ports at all.
Ports
- None. Not one input, not one output: the dial reads the signal it is bound to by name, as Simulink's binds to the one selected on its canvas.
Parameters
- Signal – the name of the link to read, for example
attitude, or its full path when the name contains/. Matching runs over this block's own subsystem and everything below it. It names a link, not a variable, so it is never looked up in the variables space. A name that matches no link is reported when the run starts, and the dial then shows no value. The signal must be a vector of at least two entries; the first two are read, in the order given above. - Refresh Period (s) – how often the dial is repainted, in wall-clock seconds, so a fast run does not turn the face into a blur. Zero or less repaints on every sample; the final sample of a run is always shown.
- Sampling Time (s) – how often the value is read. Zero or less inherits the solver's rate.
Notes
- The value is one sample behind. A block with no inputs has no input dependency, so it runs at the head of every step and reads what its source published on the previous one.
- Stateless: it draws, and computes nothing a later step reads.
- The pitch ladder's labels step 30 pixels, about 9.8°, against a 10° pitch scale – Simulink's face does the same, and this one keeps it. Ladder lines that would fall outside the sky disc are left out rather than clipped.
Code export
All ten targets: Python, MATLAB, Java, Rust, C, C++, VHDL, Verilog, SystemVerilog and PLC Structured Text. A deployable target has no dial, so each one prints the two bound VALUES, roll and pitch, as they arrive (the clamps are the dial's). PLC Structured Text emits comments only, naming the signal array entry to tap. The one-sample shift applies to the exported code too.
Code-export verification
This block is excluded from the code-export verification matrix, by name: the verifier records a terminal block's input signals, and a block with no inputs records nothing, so a rig around it would fail all ten languages at residual 0 and say nothing about the block.
Simulink bridge
None, and that is a measurement. Simulink's Artificial Horizon
(aerolibhmi/Artificial Horizon, BlockType=ArtificialHorizonBlock) has ZERO ports of any kind
and no SampleTime, measured on R2026a; it reaches its signal through
Binding, a canvas selection stored outside the block's parameters, and ICore has
no counterpart for that. This block is the ICore reading of it – the signal is named
rather than clicked – so it is reported on exchange rather than mapped.
Code facts#
| Fact | Value |
|---|---|
| registered type | Robotics/Flight_Instruments/Artificial_Horizon |
| family | Robotics/Flight_Instruments |
| solver environment class | ICoreBlock_0_Robotics_1_Flight_Instruments_2_Artificial_Horizon |
| source | src/ICoreBlocks/ICoreBlockLibrary/Blocks/Robotics/Flight_Instruments/Artificial_Horizon/ICoreBlock_0_Robotics_1_Flight_Instruments_2_Artificial_Horizon.cpp |
| header | src/ICoreBlocks/ICoreBlockLibrary/Blocks/Robotics/Flight_Instruments/Artificial_Horizon/ICoreBlock_0_Robotics_1_Flight_Instruments_2_Artificial_Horizon.h |
| ports at insert | 0 in, 0 out |
| code generators implemented | Python, MATLAB, Java, Rust, C, C++, VHDL, Verilog, SystemVerilog, PLC Structured Text |
Ports#
The constructor creates no port explicitly — the port list comes from registerInitialPorts (0 in, 0 out) or from the block's configuration.
Configuration variables#
| Config variable | Default | Simulink parameter |
|---|---|---|
Signal | — | — |
Refresh Period (s) | 0.1 | — |
Every block also carries Sampling Time (s) from ICoreBlockSolverEnvironment: zero or less inherits the solver's rate, a positive value runs the block at that period.
Simulink bridge#
| support | Support::None |
| Simulink path | — |
| port-count rule | PortsParam::None |
SampleTime parameter | yes |
Caveat (shown to the user): Simulink's Artificial Horizon (aerolibhmi, BlockType=ArtificialHorizonBlock) has ZERO ports of any kind and no SampleTime - measured on R2026a. It does not receive its value on a wire: it reaches the signal through Binding, a canvas selection stored outside the block's parameters, and ICore has no counterpart for that. This block is the ICore reading of that dial - the signal is named rather than clicked - so it is reported on exchange rather than asserted
Catalog contract: src/ICoreBlocks/ICoreCoder/ICoreCommandSystem/SimulinkBridge/ICoreSimulinkBlockCatalog.h
Description vs code#
The checker has a blind spot here — it could not resolve something (a grouped port bullet, a computed config name), which is reported and never counted as a pass. A reader has to settle it:
B0no sample under docs/generated/samples/ — nothing to cross-check (P8.1)
The verdict above is
tools/docs/check_block_descriptions.py(P7.1), which compares LISTS. It cannot read a sentence: "stateless" on a block with a state, an initial-value semantic the recursion does not implement, a "not synthesizable" caveat the HDL banner contradicts. That is the agent audit (P7.3) on BLOCK_DESCRIPTION_AUDIT.md, and this tool's green is not a substitute for one.
File banner (developer view)#
The top comment of the block's .cpp — the maths, the realization and the export strategy, addressed to whoever changes it. It must not contradict the description above (P7.5).
Artificial Horizon -- an attitude indicator bound to a signal by name The Aerospace Blockset's Flight Instruments/Artificial Horizon, measured on R2026a (BlockType=ArtificialHorizonBlock): ZERO ports, no SampleTime, no parameter of its own. The value is ONE two-entry signal, [roll pitch] in degrees, clamped to roll +/-90 and pitch +/-30. Read from the component that draws it: the sky is a static disc of radius 108.5; the ground is REBUILT from the value as the segment of that disc below a chord at y = 150 + (92/30) * pitch; a pitch ladder runs every 15 px from the chord, short lines between long labelled ones, and lines outside 58 <= y <= 242 are DROPPED rather than clipped (the labels step 30 px, about 9.8 degrees, against a 10-degree scale -- a quirk of Simulink's face kept here). The ground and the bank scale turn together by -roll; the aircraft symbol stays fixed.
Sample results#
No sample run is committed for this block. Samples come from the headless harness (DOCS_PLAN.md P8.1) into docs/generated/samples/; until one exists this block's behaviour is witnessed by the parity and export-verification suites, not by a plot here.