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. Each word or phrase should consist of
characters from the alphanumeric set and the following five: '_', '-',
'.', '+', '@'. 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.