The attributes flag_values
,
flag_masks
and flag_meanings
are intended to make variables that contain flag values self describing.
Status codes and Boolean (binary) condition flags
may be expressed with different combinations of flag_values
and flag_masks
attribute definitions.
The flag_values
and flag_meanings
attributes describe a status flag consisting of mutually exclusive coded values.
The flag_values
attribute is the same type as the variable to which
it is attached, and contains a list of the possible flag values.
The flag_meanings
attribute is a string whose value is a blank
separated list of descriptive words or phrases, one for each flag value.
If multi-word phrases are used to describe the flag values, then the words within
a phrase should be connected with underscores. The following example illustrates
the use of flag values to express a speed quality with an enumerated status code.
Example 3.3. A flag variable, using flag_values
byte current_speed_qc(time, depth, lat, lon) ; current_speed_qc:long_name = "Current Speed Quality" ; current_speed_qc:standard_name = "sea_water_speed status_flag" ; current_speed_qc:_FillValue = -128b ; current_speed_qc:valid_range = 0b, 2b-127b, 127b ; current_speed_qc:flag_values = 0b, 1b, 2b ; current_speed_qc:flag_meanings = "quality_good sensor_nonfunctional outside_valid_range" ;
The flag_masks
and flag_meanings
attributes describe a number of independent Boolean conditions using bit field notation by setting
unique bits in each flag_masks
value. The flag_masks
attribute
is the same type as the variable to which it is attached, and contains a list of values matching unique
bit fields. The flag_meanings
attribute is defined as above, one for each
flag_masks
value. A flagged condition is identified by performing a bitwise AND
of the variable value and each flag_masks
value; a non-zero result indicates a
true
condition. Thus, any or all of the flagged conditions may be true
,
depending on the variable bit settings. The following example illustrates the use of flag_masks
to express six sensor status conditions.
Example 3.4. A flag variable, using flag_masks
byte sensor_status_qc(time, depth, lat, lon) ;
sensor_status_qc:long_name = "Sensor Status" ;
sensor_status_qc:_FillValue = 0b ;
sensor_status_qc:valid_range = 1b, 63b ;
sensor_status_qc:flag_masks = 1b, 2b, 4b, 8b, 16b, 32b ;
sensor_status_qc:flag_meanings = "low_battery processor_fault
memory_fault disk_fault
software_fault
maintenance_required" ;
The flag_masks
, flag_values
and
flag_meanings
attributes, used together, describe a blend of independent Boolean
conditions and enumerated status codes. The flag_masks
and flag_values
attributes are both the same type as the variable to which they are attached. A flagged condition
is identified by a bitwise AND of the variable value and each flag_masks
value;
a result that matches the flag_values
value indicates a true
condition. Repeated flag_masks
define a bit field mask that identifies a number
of status conditions with different flag_values
. The flag_meanings
attribute is defined as above, one for each flag_masks
bit field and
flag_values
definition. Each flag_values
and
flag_masks
value must coincide with a flag_meanings
value.
The following example illustrates the use of flag_masks
and flag_values
to express two sensor status conditions and one enumerated status code.
Example 3.5. A flag variable, using flag_masks
and flag_values
byte sensor_status_qc(time, depth, lat, lon) ;
sensor_status_qc:long_name = "Sensor Status" ;
sensor_status_qc:_FillValue = 0b ;
sensor_status_qc:valid_range = 1b, 15b ;
sensor_status_qc:flag_masks = 1b, 2b, 12b, 12b, 12b ;
sensor_status_qc:flag_values = 1b, 2b, 4b, 8b, 12b ;
sensor_status_qc:flag_meanings =
"low_battery
hardware_fault
offline_mode calibration_mode maintenance_mode" ;
In this case, mutually exclusive values are blended with Boolean values
to maximize use of the available bits in a flag value. The table below represents the four binary
digits (bits) expressed by the sensor_status_qc
variable in the previous
example.
Bit 0 and Bit 1 are Boolean values indicating a low battery condition and a hardware fault, respectively. The next two bits (Bit 2 and Bit 3) express an enumeration indicating abnormal sensor operating modes. Thus, if Bit 0 is set, the battery is low and if Bit 1 is set, there is a hardware fault - independent of the current sensor operating mode.
The remaining bits (Bit 2 and Bit 3) are decoded as follows:
Table 3.3. Flag Variable Bit 2 and Bit 3 (from Example)
Bit 3 | Bit 2 | Mode |
---|---|---|
0 | 1 | offline_mode |
1 | 0 | calibration_mode |
1 | 1 | maintenance_mode |
The "12b" flag mask is repeated in the sensor_status_qc
flag_masks
definition to explicitly declare the recommended bit field masks to
repeatedly AND with the variable value while searching for matching enumerated values. An application
determines if any of the conditions declared in the flag_meanings
list are
true
by simply iterating through each of the flag_masks
and
AND'ing them with the variable. When a result is equal to the corresponding flag_values
element, that condition is true
. The repeated flag_masks
enable
a simple mechanism for clients to detect all possible conditions.