Skip to content

Commit

Permalink
ENH: Add Enumeration states to XTCE parser
Browse files Browse the repository at this point in the history
This adds the ability to include derived enumeration states from
the "States" tab in the spreadsheets.
  • Loading branch information
greglucas committed Aug 26, 2024
1 parent 87ede4d commit 8d922cf
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 1 deletion.
30 changes: 30 additions & 0 deletions docs/source/code-documentation/tools/xtce-generator.rst
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,13 @@ the conversion details.
- ANALOG
- Apply an analog conversion
-
* - MY_INSTRUMENT_HK
- VARIABLE_ENUMERATED
- 1
- UINT
- STATE
- Apply an enumeration state
-
* - MY_INSTRUMENT_HK
- VARIABLE_LENGTH_BINARY_SCIENCE
- 100
Expand Down Expand Up @@ -164,3 +171,26 @@ coefficients defined from ``c0`` to ``c7`` to define the order of the polynomial
-
-
-

States tab (optional)
~~~~~~~~~~~~~~~~~~~~~

Packet parsing can also apply enumeration/state conversions to the data being read in.
For example, to change from a raw unsigned integer value to a "VALID" / "INVALID" string.
The ``States`` tab is used to define these enumerations.

.. list-table:: States
:header-rows: 1

* - packetName
- mnemonic
- value
- state
* - MY_INSTRUMENT_HK
- VARIABLE_ENUMERATED
- 0
- INVALID
* - MY_INSTRUMENT_HK
- VARIABLE_ENUMERATED
- 1
- VALID
33 changes: 32 additions & 1 deletion imap_processing/ccsds/excel_to_xtce.py
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,6 @@ def _add_parameter(self, row: pd.Series, total_packet_bits: int) -> None:
# Combine the packet name and mnemonic to create a unique parameter name
name = f"{row['packetName']}.{row['mnemonic']}"
parameter.attrib["name"] = name
# UINT8, ...
parameter.attrib["parameterTypeRef"] = name

# Add descriptions if they exist
Expand Down Expand Up @@ -329,6 +328,10 @@ def _add_parameter(self, row: pd.Series, total_packet_bits: int) -> None:
# Go look up the conversion in the AnalogConversions tab
# and add it to the encoding
self._add_analog_conversion(row, encoding)
elif row["convertAs"] == "STATE":
# Go look up the states in the States tab
# and add them to the parameter type
self._add_state_conversion(row, parameter_type)

def _add_analog_conversion(self, row: pd.Series, encoding: Et.Element) -> None:
"""
Expand Down Expand Up @@ -363,6 +366,34 @@ def _add_analog_conversion(self, row: pd.Series, encoding: Et.Element) -> None:
term.attrib["coefficient"] = str(conversion[col])
term.attrib["exponent"] = str(i)

def _add_state_conversion(self, row: pd.Series, parameter_type: Et.Element) -> None:
"""
Add a state conversion to the parameter type.
Changing from an IntegerParameterType to an EnumeratedParameterType. Adding
the list of state mappings to the parameter type.
Parameters
----------
row : pandas.Row
Row to be added to the XTCE file, containing mnemonic, packetName.
parameter_type : Element
The parameter type element to add the conversion to.
"""
# It is an EnumeratedParameterType rather than an IntegerParameterType
parameter_type.tag = "xtce:EnumeratedParameterType"
enumeration_list = Et.SubElement(parameter_type, "xtce:EnumerationList")
# Lookup the enumeration states for this parameter from the States sheet
state_sheet = self.sheets["States"]
state_sheet = state_sheet.loc[
(state_sheet["packetName"] == row["packetName"])
& (state_sheet["mnemonic"] == row["mnemonic"])
]
for _, state_row in state_sheet.iterrows():
enumeration = Et.SubElement(enumeration_list, "xtce:Enumeration")
enumeration.attrib["value"] = str(state_row["value"])
enumeration.attrib["label"] = str(state_row["state"])

def to_xml(self, output_xml_path: Path) -> None:
"""
Create and output an XTCE file from the Element Tree representation.
Expand Down

0 comments on commit 8d922cf

Please sign in to comment.