function
Estimation.FusionHorizon.readMeasurement
Select one queued measurement without a dynamic index
Public declarations
Explicit source declarations; dimensions, modifications and defaults are shown as written, without evaluation.
| Role | Name | Type | Dimensions / attributes / default | Description |
|---|---|---|---|---|
| input | queue | Real | [:, :] | One aiding source's delayed-measurement FIFO, one packed sample per row |
| input | slot | Integer | | Row to read; any value outside 1..size(queue,1) reads zero, which is how a tick with an empty queue reads nothing without a branch |
| output | row | Real | [size(queue, 2)] |
Modelica declarations and implementation
Show parameters, interfaces and source
Parameters, inputs, outputs, defaults and equations from the source file.
function readMeasurement
"Select one queued measurement without a dynamic index"
input Real queue[:, :]
"One aiding source's delayed-measurement FIFO, one packed sample per row";
input Integer slot
"Row to read; any value outside 1..size(queue,1) reads zero, which is how
a tick with an empty queue reads nothing without a branch";
output Real row[size(queue, 2)];
protected
Real hit;
algorithm
// The same masked fixed-length walk Estimation.FusionHorizon.readRow uses on
// the delta ring, and for the same two reasons. The code generator refuses a
// dynamic array index it cannot prove in range, which for a ring buffer is
// the right refusal; and a constant-time read makes the worst case the
// measured case, which is the only kind of worst case a flight timing record
// can be written against.
//
// It is generic in the row width rather than fixed at DeltaLength because
// the five aiding sources pack to five different widths and one kernel over
// all of them is one kernel to get right.
row := zeros(size(queue, 2));
for k in 1:size(queue, 1) loop
hit := if k == slot then 1.0 else 0.0;
row := row + hit * queue[k, :];
end for;
end readMeasurement;