From b3d03773ccb73ebd4d0ac760b2c8f7a4300f2a54 Mon Sep 17 00:00:00 2001 From: Matthew Bourque Date: Thu, 15 Aug 2024 12:00:12 -0600 Subject: [PATCH 1/7] Various CoDICE L1 Updates (#711) * Moved create_hskp_dataset to within l1a module to be consistent with how science datasets are created * Now using epoch attrs defined in yaml files instead of dataclasses * Fixed warnings given off from CdfAttributeManager * Improvements to some CDF attribute definitions * Added initial support for lo and hi event data processing * Improved formatting for readability * Changes to support actual simulated data * Moved hard-coded test file paths to conftest --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .../config/imap_codice_global_cdf_attrs.yaml | 14 + .../imap_codice_l1a_variable_attrs.yaml | 46 ++- .../imap_codice_l1b_variable_attrs.yaml | 48 ++- imap_processing/codice/codice_l0.py | 2 + imap_processing/codice/codice_l1a.py | 293 +++++++++++------- imap_processing/codice/constants.py | 16 + .../P_COD_HI_INST_COUNTS_AGGREGATED.xml | 4 +- .../P_COD_HI_INST_COUNTS_SINGLES.xml | 4 +- .../P_COD_HI_OMNI_SPECIES_COUNTS.xml | 8 +- .../packet_definitions/P_COD_HI_PHA.xml | 120 ++++--- .../P_COD_HI_SECT_SPECIES_COUNTS.xml | 8 +- .../packet_definitions/P_COD_LO_PHA.xml | 124 ++++---- imap_processing/codice/utils.py | 73 ----- imap_processing/tests/codice/conftest.py | 56 ++++ ..._hi-counters-aggregated_20240429_v001.pkts | Bin 0 -> 100 bytes ..._l0_hi-counters-singles_20240429_v001.pkts | Bin 0 -> 132 bytes .../imap_codice_l0_hi-omni_20240429_v001.pkts | Bin 0 -> 208 bytes .../imap_codice_l0_hi-pha_20240429_v001.pkts | Bin 0 -> 8528 bytes ...p_codice_l0_hi-sectored_20240429_v001.pkts | Bin 0 -> 160 bytes .../imap_codice_l0_lo-pha_20240429_v001.pkts | Bin 0 -> 10812 bytes .../tests/codice/test_codice_l0.py | 6 +- .../tests/codice/test_codice_l1a.py | 80 ++--- .../tests/codice/test_codice_l1b.py | 50 +-- 23 files changed, 490 insertions(+), 462 deletions(-) create mode 100644 imap_processing/tests/codice/conftest.py create mode 100644 imap_processing/tests/codice/data/imap_codice_l0_hi-pha_20240429_v001.pkts create mode 100644 imap_processing/tests/codice/data/imap_codice_l0_lo-pha_20240429_v001.pkts diff --git a/imap_processing/cdf/config/imap_codice_global_cdf_attrs.yaml b/imap_processing/cdf/config/imap_codice_global_cdf_attrs.yaml index 005085e52..fa8dc99e0 100644 --- a/imap_processing/cdf/config/imap_codice_global_cdf_attrs.yaml +++ b/imap_processing/cdf/config/imap_codice_global_cdf_attrs.yaml @@ -49,6 +49,13 @@ imap_codice_l1a_hi_sectored: Logical_source: imap_codice_l1a_hi-sectored Logical_source_description: IMAP Mission CoDICE Hi Level-1A Sectored Data. +imap_codice_l1a_hi_pha: + <<: *instrument_base + Data_level: 1A + Data_type: L1A_hi-pha->Level-1A Hi Event Data + Logical_source: imap_codice_l1a_hi-pha + Logical_source_description: IMAP Mission CoDICE Hi Level-1A Event Data. + imap_codice_l1a_lo_counters_aggregated: <<: *instrument_base Data_level: 1A @@ -105,6 +112,13 @@ imap_codice_l1a_lo_nsw_species: Logical_source: imap_codice_l1a_lo-nsw-species Logical_source_description: IMAP Mission CoDICE Lo Level-1A Non-Sunward Species Counts Data. +imap_codice_l1a_lo_pha: + <<: *instrument_base + Data_level: 1A + Data_type: L1A_lo-pha->Level-1A Lo Event Data + Logical_source: imap_codice_l1a_lo-pha + Logical_source_description: IMAP Mission CoDICE Lo Level-1A Event Data. + # L1b imap_codice_l1b_hskp: <<: *instrument_base diff --git a/imap_processing/cdf/config/imap_codice_l1a_variable_attrs.yaml b/imap_processing/cdf/config/imap_codice_l1a_variable_attrs.yaml index 2407e77aa..54701c71c 100644 --- a/imap_processing/cdf/config/imap_codice_l1a_variable_attrs.yaml +++ b/imap_processing/cdf/config/imap_codice_l1a_variable_attrs.yaml @@ -1,14 +1,24 @@ +# TODO: Some currently blank attributes may be removed once +# cdf_attribute_manager.py is updated to only check required attributes. +# See comment here: +# https://github.com/IMAP-Science-Operations-Center/imap_processing/pull/711#discussion_r1690212527 # <=== Defaults ===> default_attrs: &default - # Assumed values for all variable attrs unless overwritten - DISPLAY_TYPE: no_plot - FILLVAL: -9223372036854775808 - FORMAT: I12 - UNITS: dN - VALIDMIN: -9223372036854775808 - VALIDMAX: 9223372036854775807 - VAR_TYPE: data - SCALETYP: linear + CATDESC: "" + DISPLAY_TYPE: no_plot + FIELDNAM: "" + FILLVAL: -9223372036854775808 + FORMAT: I12 + LABLAXIS: "" + REFERENCE_POSITION: "" + RESOLUTION: "" + SCALETYP: linear + TIME_BASE: "" + TIME_SCALE: "" + UNITS: dN + VALIDMIN: -9223372036854775808 + VALIDMAX: 9223372036854775807 + VAR_TYPE: data codice_support_attrs: &support_default <<: *default @@ -29,23 +39,32 @@ energy_attrs: # <=== Labels ===> energy_label: CATDESC: Energy per charge (E/q) sweeping step + DISPLAY_TYPE: "" FIELDNAM: Energy step + FILLVAL: "" FORMAT: A3 + LABLAXIS: "" + REFERENCE_POSITION: "" + RESOLUTION: "" + TIME_BASE: "" + TIME_SCALE: "" + UNITS: "" + VALIDMAX: "" + VALIDMIN: "" VAR_TYPE: metadata # <=== Dataset Attributes ===> -# TODO: resolve ISTP warning: Width of F10 FORMAT may be insufficient for -# values. Adjust FORMAT or VALIDMIN/VALIDMAX value to resolve. acquisition_times_attrs: <<: *default CATDESC: Time of acquisition for the energy step + DEPEND_1: energy FIELDNAM: Acquisition Time - FILLVAL: 1.7976931348623157e+308 + FILLVAL: .NAN FORMAT: F10.3 LABLAXIS: Acq Time UNITS: ms VALIDMIN: 0 - VALIDMAX: 1.7976931348623157e+308 + VALIDMAX: 1000 VAR_TYPE: support_data counters_attrs: &counters @@ -63,6 +82,7 @@ counters_attrs: &counters esa_sweep_attrs: <<: *default CATDESC: ElectroStatic Analyzer Energy Values + DEPEND_1: energy FIELDNAM: ESA Voltage FORMAT: I19 LABLAXIS: ESA V diff --git a/imap_processing/cdf/config/imap_codice_l1b_variable_attrs.yaml b/imap_processing/cdf/config/imap_codice_l1b_variable_attrs.yaml index 90c79664f..1d5d44eb5 100644 --- a/imap_processing/cdf/config/imap_codice_l1b_variable_attrs.yaml +++ b/imap_processing/cdf/config/imap_codice_l1b_variable_attrs.yaml @@ -1,14 +1,20 @@ # <=== Defaults ===> default_attrs: &default - # Assumed values for all variable attrs unless overwritten - DISPLAY_TYPE: no_plot - FILLVAL: -9223372036854775808 - FORMAT: I12 - UNITS: dN - VALIDMIN: -9223372036854775808 - VALIDMAX: 9223372036854775807 - VAR_TYPE: data - SCALETYP: linear + CATDESC: "" + DISPLAY_TYPE: no_plot + FIELDNAM: "" + FILLVAL: -9223372036854775808 + FORMAT: I12 + LABLAXIS: "" + REFERENCE_POSITION: "" + RESOLUTION: "" + SCALETYP: linear + TIME_BASE: "" + TIME_SCALE: "" + UNITS: dN + VALIDMIN: -9223372036854775808 + VALIDMAX: 9223372036854775807 + VAR_TYPE: data codice_support_attrs: &support_default <<: *default @@ -29,23 +35,32 @@ energy_attrs: # <=== Labels ===> energy_label: CATDESC: Energy per charge (E/q) sweeping step + DISPLAY_TYPE: "" FIELDNAM: Energy step + FILLVAL: "" FORMAT: A3 + LABLAXIS: "" + REFERENCE_POSITION: "" + RESOLUTION: "" + TIME_BASE: "" + TIME_SCALE: "" + UNITS: "" + VALIDMAX: "" + VALIDMIN: "" VAR_TYPE: metadata # <=== Dataset Attributes ===> -# TODO: resolve ISTP warning: Width of F10 FORMAT may be insufficient for -# values. Adjust FORMAT or VALIDMIN/VALIDMAX value to resolve. acquisition_times_attrs: <<: *default CATDESC: Time of acquisition for the energy step + DEPEND_1: energy FIELDNAM: Acquisition Time - FILLVAL: 1.7976931348623157e+308 + FILLVAL: .NAN FORMAT: F10.3 LABLAXIS: Acq Time UNITS: ms VALIDMIN: 0 - VALIDMAX: 1.7976931348623157e+308 + VALIDMAX: 1000 VAR_TYPE: support_data counters_attrs: &counters @@ -55,16 +70,15 @@ counters_attrs: &counters DEPEND_1: energy DISPLAY_TYPE: time_series FIELDNAM: Fill in at creation - FILLVAL: 1.7976931348623157e+308 - FORMAT: F10.3 LABL_PTR_1: energy_label - UNITS: rates + UNITS: counts VALIDMIN: 0 - VALIDMAX: 1.7976931348623157e+308 + VALIDMAX: 8388607 # max value for a signed 24-bit integer esa_sweep_attrs: <<: *default CATDESC: ElectroStatic Analyzer Energy Values + DEPEND_1: energy FIELDNAM: ESA Voltage FORMAT: I19 LABLAXIS: ESA V diff --git a/imap_processing/codice/codice_l0.py b/imap_processing/codice/codice_l0.py index 71a5db5bb..4515af8fb 100644 --- a/imap_processing/codice/codice_l0.py +++ b/imap_processing/codice/codice_l0.py @@ -38,6 +38,7 @@ def decom_packets(packet_file: Path) -> list: "imap_codice_l0_hi-counters-singles_20240429_v001.pkts": "P_COD_HI_INST_COUNTS_SINGLES.xml", # noqa "imap_codice_l0_hi-omni_20240429_v001.pkts": "P_COD_HI_OMNI_SPECIES_COUNTS.xml", "imap_codice_l0_hi-sectored_20240429_v001.pkts": "P_COD_HI_SECT_SPECIES_COUNTS.xml", # noqa + "imap_codice_l0_hi-pha_20240429_v001.pkts": "P_COD_HI_PHA.xml", "imap_codice_l0_hskp_20100101_v001.pkts": "P_COD_NHK.xml", "imap_codice_l0_lo-counters-aggregated_20240429_v001.pkts": "P_COD_LO_INST_COUNTS_AGGREGATED.xml", # noqa "imap_codice_l0_lo-counters-singles_20240429_v001.pkts": "P_COD_LO_INST_COUNTS_SINGLES.xml", # noqa @@ -47,6 +48,7 @@ def decom_packets(packet_file: Path) -> list: "imap_codice_l0_lo-nsw-priority_20240429_v001.pkts": "P_COD_LO_NSW_PRIORITY_COUNTS.xml", # noqa "imap_codice_l0_lo-sw-species_20240429_v001.pkts": "P_COD_LO_SW_SPECIES_COUNTS.xml", # noqa "imap_codice_l0_lo-nsw-species_20240429_v001.pkts": "P_COD_LO_NSW_SPECIES_COUNTS.xml", # noqa + "imap_codice_l0_lo-pha_20240429_v001.pkts": "P_COD_LO_PHA.xml", } xtce_document = Path( diff --git a/imap_processing/codice/codice_l1a.py b/imap_processing/codice/codice_l1a.py index 94760fa6d..0c925fee7 100644 --- a/imap_processing/codice/codice_l1a.py +++ b/imap_processing/codice/codice_l1a.py @@ -13,6 +13,7 @@ from __future__ import annotations +import collections import logging from pathlib import Path @@ -23,19 +24,19 @@ from imap_processing import imap_module_directory from imap_processing.cdf.imap_cdf_manager import ImapCdfAttributes -from imap_processing.cdf.utils import IMAP_EPOCH, met_to_j2000ns +from imap_processing.cdf.utils import met_to_j2000ns from imap_processing.codice import constants from imap_processing.codice.codice_l0 import decom_packets -from imap_processing.codice.utils import CODICEAPID, create_hskp_dataset +from imap_processing.codice.utils import CODICEAPID, add_metadata_to_array from imap_processing.utils import group_by_apid, sort_by_time logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) # TODO: Decom data arrays need to be decompressed -# TODO: Add metadata attrs to science dataset? # TODO: In decommutation, how to have a variable length data and then a checksum -# after it? +# after it? (Might be fixed with new XTCE script updates) +# TODO: Add support for decomming multiple APIDs from a single file class CoDICEL1aPipeline: @@ -60,12 +61,12 @@ class CoDICEL1aPipeline: Methods ------- + configure_data_products() + Set the various settings for defining the data products. create_science_dataset() Create an ``xarray`` dataset for the unpacked science data. get_acquisition_times() Retrieve the acquisition times via the Lo stepping table. - get_data_products() - Retrieve the lo data products. get_esa_sweep_values() Retrieve the ESA sweep values. unpack_science_data() @@ -79,6 +80,21 @@ def __init__(self, table_id: int, plan_id: int, plan_step: int, view_id: int): self.plan_step = plan_step self.view_id = view_id + def configure_data_products(self, apid: int) -> None: + """ + Set the various settings for defining the data products. + + Parameters + ---------- + apid : int + The APID of interest. + """ + config = constants.DATA_PRODUCT_CONFIGURATIONS.get(apid) # type: ignore[call-overload] + self.num_counters = config["num_counters"] + self.num_energy_steps = config["num_energy_steps"] + self.variable_names = config["variable_names"] + self.dataset_name = config["dataset_name"] + def create_science_dataset(self, met: np.int64, data_version: str) -> xr.Dataset: """ Create an ``xarray`` dataset for the unpacked science data. @@ -140,7 +156,7 @@ def create_science_dataset(self, met: np.int64, data_version: str) -> xr.Dataset # TODO: Currently, cdflib doesn't properly write/read CDF files that # have a single epoch value. To get around this for now, use # two epoch values and reshape accordingly. Revisit this after - # SIT-3. + # SIT-3. See https://github.com/MAVENSDC/cdflib/issues/268 variable_data_arr = np.array(list(variable_data) * 2, dtype=int).reshape( 2, self.num_energy_steps ) @@ -156,6 +172,8 @@ def create_science_dataset(self, met: np.int64, data_version: str) -> xr.Dataset # Add ESA Sweep Values and acquisition times (lo only) if "_lo_" in self.dataset_name: + self.get_esa_sweep_values() + self.get_acquisition_times() dataset["esa_sweep_values"] = xr.DataArray( self.esa_sweep_values, dims=["energy"], @@ -213,23 +231,6 @@ def get_acquisition_times(self) -> None: row_number = np.argmax(energy_steps == str(step_number), axis=1).argmax() self.acquisition_times.append(lo_stepping_values.acq_time[row_number]) - def get_data_products(self, apid: int) -> None: - """ - Retrieve various settings for defining the data products. - - Parameters - ---------- - apid : int - The APID of interest. - """ - config = constants.DATA_PRODUCT_CONFIGURATIONS.get(apid) # type: ignore[call-overload] - # TODO Change, No overload variant of "get" of - # "dict" matches argument type "str". - self.num_counters = config["num_counters"] - self.num_energy_steps = config["num_energy_steps"] - self.variable_names = config["variable_names"] - self.dataset_name = config["dataset_name"] - def get_esa_sweep_values(self) -> None: """ Retrieve the ESA sweep values. @@ -290,6 +291,119 @@ def unpack_science_data(self, science_values: str) -> None: self.data = [["1"] * 128] * self.num_counters +def create_event_dataset( + met: list[int], event_data: str, dataset_name: str, data_version: str +) -> xr.Dataset: + """ + Create dataset for event data. + + Parameters + ---------- + met : list[int] + The Mission Elapsed Time of the data. + event_data : str + A string of binary numbers representing the event data. + dataset_name : str + The name for the dataset. + data_version : str + Version of the data product being created. + + Returns + ------- + dataset : xarray.Dataset + Xarray dataset containing the event data. + """ + cdf_attrs = ImapCdfAttributes() + cdf_attrs.add_instrument_global_attrs("codice") + cdf_attrs.add_instrument_variable_attrs("codice", "l1a") + cdf_attrs.add_global_attribute("Data_version", data_version) + + # Define coordinates + epoch = xr.DataArray( + met_to_j2000ns(met), # TODO: Fix after SIT-3 (see note below) + name="epoch", + dims=["epoch"], + attrs=cdf_attrs.get_variable_attributes("epoch"), + ) + + # Create the dataset to hold the data variables + dataset = xr.Dataset( + coords={ + "epoch": epoch, + }, + attrs=cdf_attrs.get_global_attributes(dataset_name), + ) + + # TODO: Determine what should go in event data CDF and how it should be + # structured. + + return dataset + + +def create_hskp_dataset( + packets: list[space_packet_parser.parser.Packet], + data_version: str, +) -> xr.Dataset: + """ + Create dataset for each metadata field for housekeeping data. + + Parameters + ---------- + packets : list[space_packet_parser.parser.Packet] + The list of packets to process. + data_version : str + Version of the data product being created. + + Returns + ------- + dataset : xarray.Dataset + Xarray dataset containing the metadata. + """ + cdf_attrs = ImapCdfAttributes() + cdf_attrs.add_instrument_global_attrs("codice") + cdf_attrs.add_instrument_variable_attrs("codice", "l1a") + cdf_attrs.add_global_attribute("Data_version", data_version) + + metadata_arrays: dict = collections.defaultdict(list) + + for packet in packets: + add_metadata_to_array(packet, metadata_arrays) + + epoch = xr.DataArray( + met_to_j2000ns( + metadata_arrays["SHCOARSE"], + reference_epoch=np.datetime64("2010-01-01T00:01:06.184", "ns"), + ), + name="epoch", + dims=["epoch"], + attrs=cdf_attrs.get_variable_attributes("epoch"), + ) + + dataset = xr.Dataset( + coords={"epoch": epoch}, + attrs=cdf_attrs.get_global_attributes("imap_codice_l1a_hskp"), + ) + + # TODO: Change 'TBD' catdesc and fieldname + # Once housekeeping packet definition file is re-generated with updated + # version of space_packet_parser, can get fieldname and catdesc info via: + # for key, value in (packet.header | packet.data).items(): + # fieldname = value.short_description + # catdesc = value.long_description + # I am holding off making this change until I acquire updated housekeeping + # packets/validation data that match the latest telemetry definitions + for key, value in metadata_arrays.items(): + attrs = cdf_attrs.get_variable_attributes("codice_support_attrs") + attrs["CATDESC"] = "TBD" + attrs["DEPEND_0"] = "epoch" + attrs["FIELDNAM"] = "TBD" + attrs["LABLAXIS"] = key + + dataset[key] = xr.DataArray(value, dims=["epoch"], attrs=attrs) + + return dataset + + def get_params(packet: space_packet_parser.parser.Packet) -> tuple[int, int, int, int]: """ Return the four 'main' parameters used for l1a processing. @@ -343,88 +457,57 @@ def process_codice_l1a(file_path: Path, data_version: str) -> xr.Dataset: dataset : xarray.Dataset The ``xarray`` dataset containing the science data and supporting metadata. """ - # TODO: Once simulated data for codice-hi is acquired, there shouldn't be a - # need to split the processing based on the file_path, so this function can - # be simplified. - - apids_for_lo_science_processing = [ - CODICEAPID.COD_LO_INST_COUNTS_AGGREGATED, - CODICEAPID.COD_LO_INST_COUNTS_SINGLES, - CODICEAPID.COD_LO_SW_ANGULAR_COUNTS, - CODICEAPID.COD_LO_NSW_ANGULAR_COUNTS, - CODICEAPID.COD_LO_SW_PRIORITY_COUNTS, - CODICEAPID.COD_LO_NSW_PRIORITY_COUNTS, - CODICEAPID.COD_LO_SW_SPECIES_COUNTS, - CODICEAPID.COD_LO_NSW_SPECIES_COUNTS, - ] - - # TODO: Temporary workaround in order to create hi data products in absence - # of simulated data - if file_path.name.startswith(("imap_codice_l0_lo", "imap_codice_l0_hskp")): - # Decom the packets, group data by APID, and sort by time - packets = decom_packets(file_path) - grouped_data = group_by_apid(packets) - - for apid in grouped_data: - logger.info(f"\nProcessing {CODICEAPID(apid).name} packet") - - if apid == CODICEAPID.COD_NHK: - packets = grouped_data[apid] - sorted_packets = sort_by_time(packets, "SHCOARSE") - dataset = create_hskp_dataset(sorted_packets, data_version) - - elif apid in apids_for_lo_science_processing: - # Sort the packets by time - packets = sort_by_time(grouped_data[apid], "SHCOARSE") - - # Determine the start time of the packet - met = packets[0].data["ACQ_START_SECONDS"].raw_value - met = [met, met + 1] # TODO: Remove after SIT-3 - # Extract the data - science_values = packets[0].data["DATA"].raw_value - - # Get the four "main" parameters for processing - table_id, plan_id, plan_step, view_id = get_params(packets[0]) - - # Run the pipeline to create a dataset for the product - pipeline = CoDICEL1aPipeline(table_id, plan_id, plan_step, view_id) - pipeline.get_esa_sweep_values() - pipeline.get_acquisition_times() - pipeline.get_data_products(apid) - pipeline.unpack_science_data(science_values) - dataset = pipeline.create_science_dataset(met, data_version) - - # TODO: Temporary workaround in order to create hi data products in absence - # of simulated data. This is essentially the same process as is for - # lo, but don't try to decom any packets, just define the data - # outright. - elif file_path.name.startswith("imap_codice_l0_hi"): - if file_path.name.startswith("imap_codice_l0_hi-counters-aggregated"): - apid = CODICEAPID.COD_HI_INST_COUNTS_AGGREGATED - table_id, plan_id, plan_step, view_id = (1, 0, 0, 3) - elif file_path.name.startswith("imap_codice_l0_hi-counters-singles"): - apid = CODICEAPID.COD_HI_INST_COUNTS_SINGLES - table_id, plan_id, plan_step, view_id = (1, 0, 0, 4) - elif file_path.name.startswith("imap_codice_l0_hi-omni"): - apid = CODICEAPID.COD_HI_OMNI_SPECIES_COUNTS - table_id, plan_id, plan_step, view_id = (1, 0, 0, 5) - elif file_path.name.startswith("imap_codice_l0_hi-sectored"): - apid = CODICEAPID.COD_HI_SECT_SPECIES_COUNTS - table_id, plan_id, plan_step, view_id = (1, 0, 0, 6) - - met0: np.timedelta64 = (np.datetime64("2024-04-29T00:00") - IMAP_EPOCH).astype( - "timedelta64[s]" - ) - met0 = met0.astype(np.int64) - met = [met0, met0 + 1] # Using this to match the other data products - science_values = "" # Currently don't have simulated data for this + # TODO: Use new packet_file_to_dataset() function to simplify things - pipeline = CoDICEL1aPipeline(table_id, plan_id, plan_step, view_id) - pipeline.get_data_products(apid) - pipeline.unpack_science_data(science_values) - dataset = pipeline.create_science_dataset(met, data_version) + # Decom the packets, group data by APID, and sort by time + packets = decom_packets(file_path) + grouped_data = group_by_apid(packets) - # Write dataset to CDF - logger.info(f"\nFinal data product:\n{dataset}\n") + for apid in grouped_data: + logger.info(f"\nProcessing {CODICEAPID(apid).name} packet") + + if apid == CODICEAPID.COD_NHK: + packets = grouped_data[apid] + sorted_packets = sort_by_time(packets, "SHCOARSE") + dataset = create_hskp_dataset(sorted_packets, data_version) + + elif apid in [CODICEAPID.COD_LO_PHA, CODICEAPID.COD_HI_PHA]: + if apid == CODICEAPID.COD_LO_PHA: + dataset_name = "imap_codice_l1a_lo_pha" + elif apid == CODICEAPID.COD_HI_PHA: + dataset_name = "imap_codice_l1a_hi_pha" + + # Sort the packets by time + packets = sort_by_time(grouped_data[apid], "SHCOARSE") + # Determine the start time of the packet + met = packets[0].data["ACQ_START_SECONDS"].raw_value + met = [met, met + 1] # TODO: Remove after cdflib fix + + # Extract the data + event_data = packets[0].data["EVENT_DATA"].raw_value + + # Create the dataset + dataset = create_event_dataset(met, event_data, dataset_name, data_version) + + elif apid in constants.APIDS_FOR_SCIENCE_PROCESSING: + # Sort the packets by time + packets = sort_by_time(grouped_data[apid], "SHCOARSE") + + # Determine the start time of the packet + met = packets[0].data["ACQ_START_SECONDS"].raw_value + met = [met, met + 1] # TODO: Remove after cdflib fix + # Extract the data + science_values = packets[0].data["DATA"].raw_value + + # Get the four "main" parameters for processing + table_id, plan_id, plan_step, view_id = get_params(packets[0]) + + # Run the pipeline to create a dataset for the product + pipeline = CoDICEL1aPipeline(table_id, plan_id, plan_step, view_id) + pipeline.configure_data_products(apid) + pipeline.unpack_science_data(science_values) + dataset = pipeline.create_science_dataset(met, data_version) + + logger.info(f"\nFinal data product:\n{dataset}\n") return dataset diff --git a/imap_processing/codice/constants.py b/imap_processing/codice/constants.py index 425b6b57d..a8bcf3503 100644 --- a/imap_processing/codice/constants.py +++ b/imap_processing/codice/constants.py @@ -14,6 +14,22 @@ from imap_processing.codice.utils import CODICEAPID, CoDICECompression +APIDS_FOR_SCIENCE_PROCESSING = [ + CODICEAPID.COD_HI_INST_COUNTS_AGGREGATED, + CODICEAPID.COD_HI_INST_COUNTS_SINGLES, + CODICEAPID.COD_HI_OMNI_SPECIES_COUNTS, + CODICEAPID.COD_HI_SECT_SPECIES_COUNTS, + CODICEAPID.COD_LO_INST_COUNTS_AGGREGATED, + CODICEAPID.COD_LO_INST_COUNTS_SINGLES, + CODICEAPID.COD_LO_SW_ANGULAR_COUNTS, + CODICEAPID.COD_LO_NSW_ANGULAR_COUNTS, + CODICEAPID.COD_LO_SW_PRIORITY_COUNTS, + CODICEAPID.COD_LO_NSW_PRIORITY_COUNTS, + CODICEAPID.COD_LO_SW_SPECIES_COUNTS, + CODICEAPID.COD_LO_NSW_SPECIES_COUNTS, +] + + # CDF-friendly names for lo data products LO_INST_COUNTS_AGGREGATED_NAMES = ["aggregated"] LO_INST_COUNTS_SINGLES_NAMES = ["apd_singles"] diff --git a/imap_processing/codice/packet_definitions/P_COD_HI_INST_COUNTS_AGGREGATED.xml b/imap_processing/codice/packet_definitions/P_COD_HI_INST_COUNTS_AGGREGATED.xml index 64bce2a39..4ac8bc9c1 100644 --- a/imap_processing/codice/packet_definitions/P_COD_HI_INST_COUNTS_AGGREGATED.xml +++ b/imap_processing/codice/packet_definitions/P_COD_HI_INST_COUNTS_AGGREGATED.xml @@ -1,6 +1,6 @@ - + @@ -43,7 +43,7 @@ - 4325376 + 512 diff --git a/imap_processing/codice/packet_definitions/P_COD_HI_INST_COUNTS_SINGLES.xml b/imap_processing/codice/packet_definitions/P_COD_HI_INST_COUNTS_SINGLES.xml index 80f0cec4d..1319d645f 100644 --- a/imap_processing/codice/packet_definitions/P_COD_HI_INST_COUNTS_SINGLES.xml +++ b/imap_processing/codice/packet_definitions/P_COD_HI_INST_COUNTS_SINGLES.xml @@ -1,6 +1,6 @@ - + @@ -43,7 +43,7 @@ - 4325376 + 768 diff --git a/imap_processing/codice/packet_definitions/P_COD_HI_OMNI_SPECIES_COUNTS.xml b/imap_processing/codice/packet_definitions/P_COD_HI_OMNI_SPECIES_COUNTS.xml index 92743c372..53bae3cde 100644 --- a/imap_processing/codice/packet_definitions/P_COD_HI_OMNI_SPECIES_COUNTS.xml +++ b/imap_processing/codice/packet_definitions/P_COD_HI_OMNI_SPECIES_COUNTS.xml @@ -1,6 +1,6 @@ - + @@ -39,11 +39,11 @@ - + - 28704768 + 1376 @@ -124,7 +124,7 @@ NUMBER OF BYTES IN THE DATA ARRAY. IF COMPRESSED, THIS VALUE REPRESENTS THE LENGTH OF THE COMPRESSED DATA. - + COUNTER DATA VARIABLE LENGTH; MAXIMUM (BASED ON UNCOLLAPSED, UNCOMPRESSED DATA, AND ASSUMING ALL 146 SQRT(2) SPECEIS COUNTERS INCLUDED): diff --git a/imap_processing/codice/packet_definitions/P_COD_HI_PHA.xml b/imap_processing/codice/packet_definitions/P_COD_HI_PHA.xml index cc28a6896..b75581c0a 100644 --- a/imap_processing/codice/packet_definitions/P_COD_HI_PHA.xml +++ b/imap_processing/codice/packet_definitions/P_COD_HI_PHA.xml @@ -1,6 +1,6 @@ - + @@ -12,12 +12,12 @@ + + + - - - @@ -27,17 +27,14 @@ - - - - + - 276480 + 5760 @@ -64,73 +61,64 @@ CCSDS Packet Length (number of bytes after Packet length minus 1) - - S/C Time - Seconds - Secondary Header - Whole-seconds part of SCLK + + SECONDARY HEADER - WHOLE-SECONDS PART OF SCLK - - Packet Version - Packet version - this will be incremented each time the format of the packet changesCOD_LO_PHA. + + PACKET VERSION - THIS WILL BE INCREMENTED EACH TIME THE FORMAT OF THE PACKET CHANGESCOD_LO_PHA. - - Spin Period reported by the Spacecraft - Spin period reported by the Spacecraft in the Time and Status message. Reported period is the period that was active when the 16-spin acquisition cycle started. + + SPIN PERIOD REPORTED BY THE SPACECRAFT IN THE TIME AND STATUS MESSAGE. REPORTED PERIOD IS THE PERIOD THAT WAS ACTIVE WHEN THE 16-SPIN ACQUISITION CYCLE STARTED. - - Acquisition Start Time (Seconds) - Full-seconds portion of the time at which the 16-spin cycle started + + FULL-SECONDS PORTION OF THE TIME AT WHICH THE 16-SPIN CYCLE STARTED - - Acquisition Start Time (Subseconds) - Sub-seconds portion of the time at which the 16-spin cycle started + + SUB-SECONDS PORTION OF THE TIME AT WHICH THE 16-SPIN CYCLE STARTED - - Spare for alignment - Spare for alignment + + SPARE FOR ALIGNMENT - - Total number of TCR events - Total number of TCR events that occurred during the collection cycle + + BIAS GAIN MODE FOR THE SUPRATHERMAL SECTOR - - Total number of DCR events - Total number of DCR events that occurred during the collection cycle + + BIAS GAIN MODE FOR THE SOLARWIND SECTOR - - Total number of APD-Only events - Total number of APD-Only events that occurred during the collection cycle + + + INDICATES THAT THERE WAS SOME ERROR DETECTED DURING ACQUISITION OR PROCESSING OF THE DATA. ERRORS COULD INCLUDE CORRUPTED ACQUISITION MEMORY (I.E. EDAC ERRORS), TIMING VIOLATIONS, OR OTHER EVENTS THAT INTERRUPTED OR OTHERWISE AFFECTED DATA COLLECTION. - - Number of events included in this packet - Number of events selected for downlink (i.e. number of events in the Event_Data array) + + WHETHER THE EVENT DATA IS COMPRESSED. IF 1/YES, EVENT_DATA ARRAY IS COMPRESSED USING THE RICE COMPRESSION ALGORITHM. - - Whether the event data is compressed - Whether the event data is compressed. If 1/Yes, Event_Data array is compressed using the Rice compression algorithm. + + NUMBER OF EVENTS SELECTED FOR DOWNLINK (I.E. NUMBER OF EVENTS IN THE EVENT_DATA ARRAY) - - Number of bytes in the Event Data array - Number of bytes in the Event_Data array. If compressed, this value represents the length of the compressed data. + + NUMBER OF BYTES IN THE EVENT_DATA ARRAY. IF COMPRESSED, THIS VALUE REPRESENTS THE LENGTH OF THE COMPRESSED DATA. - - Event Data - Optionally compressed array of Event Data + + OPTIONALLY COMPRESSED ARRAY OF EVENT DATA -Format is TBD; some considerations/options: -- Full events have a lot of redundant data (e.g. will have many events with the same priority/spin/spin phase information). How well does compression to deal with the redundancy? -- Could include mini-headers for each (priority,spin, spin-phase) group and strip the redundant data from the events -- Should events be tightly packed, or can we pad out to 64-bit word boundaries? How well does compression compensate for the extra bits? +FORMAT IS TBD; SOME CONSIDERATIONS/OPTIONS: +- FULL EVENTS HAVE A LOT OF REDUNDANT DATA (E.G. WILL HAVE MANY EVENTS WITH THE SAME PRIORITY/SPIN/SPIN PHASE INFORMATION). HOW WELL DOES COMPRESSION TO DEAL WITH THE REDUNDANCY? +- COULD INCLUDE MINI-HEADERS FOR EACH (PRIORITY,SPIN, SPIN-PHASE) GROUP AND STRIP THE REDUNDANT DATA FROM THE EVENTS +- SHOULD EVENTS BE TIGHTLY PACKED, OR CAN WE PAD OUT TO 64-BIT WORD BOUNDARIES? HOW WELL DOES COMPRESSION COMPENSATE FOR THE EXTRA BITS? -Each event consists of: -- 10-bit TOF -- 9-bit SSD Energy -- 2-bit Energy Range -- 7-bit Spin Angle -- 4-bit SSD Position -- 4-bit Spin Number -- 2-bit PHA Type +EACH EVENT CONSISTS OF: +- 10-BIT TOF +- 9-BIT SSD ENERGY +- 2-BIT ENERGY RANGE +- 7-BIT SPIN ANGLE +- 4-BIT SSD POSITION +- 4-BIT SPIN NUMBER +- 2-BIT PHA TYPE -TBD: Events may be tightly packed, or may have spares added to keep each event byte-aligned. In either case, there may be up to 1 byte of padding to keep the total size of the packet even. +TBD: EVENTS MAY BE TIGHTLY PACKED, OR MAY HAVE SPARES ADDED TO KEEP EACH EVENT BYTE-ALIGNED. IN EITHER CASE, THERE MAY BE UP TO 1 BYTE OF PADDING TO KEEP THE TOTAL SIZE OF THE PACKET EVEN. + + + PACKET CHECKSUM @@ -158,13 +146,15 @@ TBD: Events may be tightly packed, or may have spares added to keep each event b - - - - + + + + + + diff --git a/imap_processing/codice/packet_definitions/P_COD_HI_SECT_SPECIES_COUNTS.xml b/imap_processing/codice/packet_definitions/P_COD_HI_SECT_SPECIES_COUNTS.xml index 397b3c841..176c12ff7 100644 --- a/imap_processing/codice/packet_definitions/P_COD_HI_SECT_SPECIES_COUNTS.xml +++ b/imap_processing/codice/packet_definitions/P_COD_HI_SECT_SPECIES_COUNTS.xml @@ -1,6 +1,6 @@ - + @@ -39,11 +39,11 @@ - + - 9043968 + 992 @@ -124,7 +124,7 @@ NUMBER OF BYTES IN THE DATA ARRAY. IF COMPRESSED, THIS VALUE REPRESENTS THE LENGTH OF THE COMPRESSED DATA. - + COUNTER DATA VARIABLE LENGTH; MAXIMUM (BASED ON UNCOLLAPSED, UNCOMPRESSED DATA, AND ASSUMING ALL X2 SPECEIS COUNTERS INCLUDED): diff --git a/imap_processing/codice/packet_definitions/P_COD_LO_PHA.xml b/imap_processing/codice/packet_definitions/P_COD_LO_PHA.xml index e0e28109d..fc8cd2d85 100644 --- a/imap_processing/codice/packet_definitions/P_COD_LO_PHA.xml +++ b/imap_processing/codice/packet_definitions/P_COD_LO_PHA.xml @@ -1,6 +1,6 @@ - + @@ -12,12 +12,12 @@ + + + - - - @@ -27,17 +27,14 @@ - - - - + - 276480 + 640 @@ -64,75 +61,66 @@ CCSDS Packet Length (number of bytes after Packet length minus 1) - - S/C Time - Seconds - Secondary Header - Whole-seconds part of SCLK + + SECONDARY HEADER - WHOLE-SECONDS PART OF SCLK - - Packet Version - Packet version - this will be incremented each time the format of the packet changesCOD_LO_PHA. + + PACKET VERSION - THIS WILL BE INCREMENTED EACH TIME THE FORMAT OF THE PACKET CHANGESCOD_LO_PHA. - - Spin Period reported by the Spacecraft - Spin period reported by the Spacecraft in the Time and Status message. Reported period is the period that was active when the 16-spin acquisition cycle started. + + SPIN PERIOD REPORTED BY THE SPACECRAFT IN THE TIME AND STATUS MESSAGE. REPORTED PERIOD IS THE PERIOD THAT WAS ACTIVE WHEN THE 16-SPIN ACQUISITION CYCLE STARTED. - - Acquisition Start Time (Seconds) - Full-seconds portion of the time at which the 16-spin cycle started + + FULL-SECONDS PORTION OF THE TIME AT WHICH THE 16-SPIN CYCLE STARTED - - Acquisition Start Time (Subseconds) - Sub-seconds portion of the time at which the 16-spin cycle started + + SUB-SECONDS PORTION OF THE TIME AT WHICH THE 16-SPIN CYCLE STARTED - - Spare for alignment - Spare for alignment + + SPARE FOR ALIGNMENT - - Total number of TCR events - Total number of TCR events that occurred during the collection cycle + + BIAS GAIN MODE FOR THE SUPRATHERMAL SECTOR - - Total number of DCR events - Total number of DCR events that occurred during the collection cycle + + BIAS GAIN MODE FOR THE SOLARWIND SECTOR - - Total number of APD-Only events - Total number of APD-Only events that occurred during the collection cycle + + + INDICATES THAT THERE WAS SOME ERROR DETECTED DURING ACQUISITION OR PROCESSING OF THE DATA. ERRORS COULD INCLUDE CORRUPTED ACQUISITION MEMORY (I.E. EDAC ERRORS), TIMING VIOLATIONS, OR OTHER EVENTS THAT INTERRUPTED OR OTHERWISE AFFECTED DATA COLLECTION. - - Number of events included in this packet - Number of events selected for downlink (i.e. number of events in the Event_Data array) + + WHETHER THE EVENT DATA IS COMPRESSED. IF 1/YES, EVENT_DATA ARRAY IS COMPRESSED USING THE LZMA COMPRESSION ALGORITHM. - - Whether the event data is compressed - Whether the event data is compressed. If 1/Yes, Event_Data array is compressed using the LZMA compression algorithm. + + NUMBER OF EVENTS SELECTED FOR DOWNLINK (I.E. NUMBER OF EVENTS IN THE EVENT_DATA ARRAY) - - Number of bytes in the Event Data array - Number of bytes in the Event_Data array. If compressed, this value represents the length of the compressed data. + + NUMBER OF BYTES IN THE EVENT_DATA ARRAY. IF COMPRESSED, THIS VALUE REPRESENTS THE LENGTH OF THE COMPRESSED DATA. - - Event Data - Optionally compressed array of Event Data + + OPTIONALLY COMPRESSED ARRAY OF EVENT DATA -Format is TBD; some considerations/options: -- Full events have a lot of redundant data (e.g. will have many events with the same priority/e-step/spin phase information). How well does compression to deal with the redundancy? -- Could include mini-headers for each (priority,e-step, spin-phase) group and strip the redundant data from the events -- Should events be tightly packed, or can we pad out to 64-bit word boundaries? How well does compression compensate for the extra bits? +FORMAT IS TBD; SOME CONSIDERATIONS/OPTIONS: +- FULL EVENTS HAVE A LOT OF REDUNDANT DATA (E.G. WILL HAVE MANY EVENTS WITH THE SAME PRIORITY/E-STEP/SPIN PHASE INFORMATION). HOW WELL DOES COMPRESSION TO DEAL WITH THE REDUNDANCY? +- COULD INCLUDE MINI-HEADERS FOR EACH (PRIORITY,E-STEP, SPIN-PHASE) GROUP AND STRIP THE REDUNDANT DATA FROM THE EVENTS +- SHOULD EVENTS BE TIGHTLY PACKED, OR CAN WE PAD OUT TO 64-BIT WORD BOUNDARIES? HOW WELL DOES COMPRESSION COMPENSATE FOR THE EXTRA BITS? -Each event consists of: -- 7-bit E-step -- 10-bit TOF -- 9-bit APD Energy -- 7-bit Spin Angle -- 5-bit Position -- 5-bit APD-ID -- 1-bit APD-Gain -- 2-bit PHA Type -- 3-bit Priority Range +EACH EVENT CONSISTS OF: +- 7-BIT E-STEP +- 10-BIT TOF +- 9-BIT APD ENERGY +- 7-BIT SPIN ANGLE +- 5-BIT POSITION +- 5-BIT APD-ID +- 1-BIT APD-GAIN +- 2-BIT PHA TYPE +- 3-BIT PRIORITY RANGE -TBD: Events may be tightly packed, or may have spares added to keep each event byte-aligned. In either case, there may be up to 1 byte of padding to keep the total size of the packet even. +TBD: EVENTS MAY BE TIGHTLY PACKED, OR MAY HAVE SPARES ADDED TO KEEP EACH EVENT BYTE-ALIGNED. IN EITHER CASE, THERE MAY BE UP TO 1 BYTE OF PADDING TO KEEP THE TOTAL SIZE OF THE PACKET EVEN. + + + PACKET CHECKSUM @@ -160,13 +148,15 @@ TBD: Events may be tightly packed, or may have spares added to keep each event b - - - - + + + + + + diff --git a/imap_processing/codice/utils.py b/imap_processing/codice/utils.py index a4a7e8560..934656146 100644 --- a/imap_processing/codice/utils.py +++ b/imap_processing/codice/utils.py @@ -5,15 +5,9 @@ other CoDICE processing modules. """ -import collections from enum import IntEnum -import numpy as np import space_packet_parser -import xarray as xr - -from imap_processing.cdf.imap_cdf_manager import ImapCdfAttributes -from imap_processing.cdf.utils import met_to_j2000ns class CODICEAPID(IntEnum): @@ -99,70 +93,3 @@ def add_metadata_to_array(packet: space_packet_parser, metadata_arrays: dict) -> metadata_arrays.setdefault(key, []).append(value.raw_value) return metadata_arrays - - -# TODO: Correct the type of "packets" -def create_hskp_dataset( # type: ignore[no-untyped-def] - packets, - data_version: str, -) -> xr.Dataset: - """ - Create dataset for each metadata field for housekeeping data. - - Parameters - ---------- - packets : list[space_packet_parser.parser.Packet] - The list of packets to process. - data_version : str - Version of the data product being created. - - Returns - ------- - dataset : xarray.Dataset - Xarray dataset containing the metadata. - """ - cdf_attrs = ImapCdfAttributes() - cdf_attrs.add_instrument_global_attrs("codice") - cdf_attrs.add_instrument_variable_attrs("codice", "l1a") - cdf_attrs.add_global_attribute("Data_version", data_version) - - metadata_arrays: dict = collections.defaultdict(list) - - for packet in packets: - add_metadata_to_array(packet, metadata_arrays) - - # TODO: Is there a way to get the attrs from the YAML-based method? - epoch = xr.DataArray( - met_to_j2000ns( - metadata_arrays["SHCOARSE"], - reference_epoch=np.datetime64("2010-01-01T00:01:06.184", "ns"), - ), - name="epoch", - dims=["epoch"], - attrs=cdf_attrs.get_variable_attributes("epoch"), - ) - - dataset = xr.Dataset( - coords={"epoch": epoch}, - attrs=cdf_attrs.get_global_attributes("imap_codice_l1a_hskp"), - ) - - # TODO: Change 'TBD' catdesc and fieldname - # Once packet definition files are re-generated, can get this info from - # something like this: - # for key, value in (packet.header | packet.data).items(): - # fieldname = value.short_description - # catdesc = value.short_description - # I am holding off making this change until I acquire updated housekeeping - # packets/validation data that match the latest telemetry definitions - # I may also be able to replace this function with utils.create_dataset(?) - for key, value in metadata_arrays.items(): - attrs = cdf_attrs.get_variable_attributes("codice_support_attrs") - attrs["CATDESC"] = "TBD" - attrs["DEPEND_0"] = "epoch" - attrs["FIELDNAM"] = "TBD" - attrs["LABLAXIS"] = key - - dataset[key] = xr.DataArray(value, dims=["epoch"], attrs=attrs) - - return dataset diff --git a/imap_processing/tests/codice/conftest.py b/imap_processing/tests/codice/conftest.py new file mode 100644 index 000000000..66f36a697 --- /dev/null +++ b/imap_processing/tests/codice/conftest.py @@ -0,0 +1,56 @@ +from imap_processing import imap_module_directory + +TEST_DATA_PATH = imap_module_directory / "tests" / "codice" / "data" + +TEST_PACKETS = [ + TEST_DATA_PATH / "imap_codice_l0_hskp_20100101_v001.pkts", + TEST_DATA_PATH / "imap_codice_l0_hi-counters-aggregated_20240429_v001.pkts", + TEST_DATA_PATH / "imap_codice_l0_hi-counters-singles_20240429_v001.pkts", + TEST_DATA_PATH / "imap_codice_l0_hi-omni_20240429_v001.pkts", + TEST_DATA_PATH / "imap_codice_l0_hi-sectored_20240429_v001.pkts", + TEST_DATA_PATH / "imap_codice_l0_hi-pha_20240429_v001.pkts", + TEST_DATA_PATH / "imap_codice_l0_lo-counters-aggregated_20240429_v001.pkts", + TEST_DATA_PATH / "imap_codice_l0_lo-counters-singles_20240429_v001.pkts", + TEST_DATA_PATH / "imap_codice_l0_lo-sw-angular_20240429_v001.pkts", + TEST_DATA_PATH / "imap_codice_l0_lo-nsw-angular_20240429_v001.pkts", + TEST_DATA_PATH / "imap_codice_l0_lo-sw-priority_20240429_v001.pkts", + TEST_DATA_PATH / "imap_codice_l0_lo-nsw-priority_20240429_v001.pkts", + TEST_DATA_PATH / "imap_codice_l0_lo-sw-species_20240429_v001.pkts", + TEST_DATA_PATH / "imap_codice_l0_lo-nsw-species_20240429_v001.pkts", + TEST_DATA_PATH / "imap_codice_l0_lo-pha_20240429_v001.pkts", +] + +TEST_L1A_FILES = [ + TEST_DATA_PATH / "imap_codice_l1a_hskp_20100101_v001.pkts", + TEST_DATA_PATH / "imap_codice_l1a_hi-counters-aggregated_20240429_v001.pkts", + TEST_DATA_PATH / "imap_codice_l1a_hi-counters-singles_20240429_v001.pkts", + TEST_DATA_PATH / "imap_codice_l1a_hi-omni_20240429_v001.pkts", + TEST_DATA_PATH / "imap_codice_l1a_hi-sectored_20240429_v001.pkts", + TEST_DATA_PATH / "imap_codice_l1a_lo-counters-aggregated_20240429_v001.pkts", + TEST_DATA_PATH / "imap_codice_l1a_lo-counters-singles_20240429_v001.pkts", + TEST_DATA_PATH / "imap_codice_l1a_lo-sw-angular_20240429_v001.pkts", + TEST_DATA_PATH / "imap_codice_l1a_lo-nsw-angular_20240429_v001.pkts", + TEST_DATA_PATH / "imap_codice_l1a_lo-sw-priority_20240429_v001.pkts", + TEST_DATA_PATH / "imap_codice_l1a_lo-nsw-priority_20240429_v001.pkts", + TEST_DATA_PATH / "imap_codice_l1a_lo-sw-species_20240429_v001.pkts", + TEST_DATA_PATH / "imap_codice_l1a_lo-nsw-species_20240429_v001.pkts", +] + +# Placeholder for validation data files +VALIDATION_DATA = [ + TEST_DATA_PATH / "validation_hskp.cdf", + TEST_DATA_PATH / "validation_hi-counters-aggregated.cdf", + TEST_DATA_PATH / "validation_hi-counters-singles.cdf", + TEST_DATA_PATH / "validation_hi-omni.cdf", + TEST_DATA_PATH / "validation_hi-sectored.cdf", + TEST_DATA_PATH / "validation_hi-pha.cdf", + TEST_DATA_PATH / "validation_lo-counters-aggregated.cdf", + TEST_DATA_PATH / "validation_lo-counters-singles.cdf", + TEST_DATA_PATH / "validation_lo-sw-angular.cdf", + TEST_DATA_PATH / "validation_lo-nsw-angular.cdf", + TEST_DATA_PATH / "validation_lo-sw-priority.cdf", + TEST_DATA_PATH / "validation_lo-nsw-priority.cdf", + TEST_DATA_PATH / "validation_lo-sw-species.cdf", + TEST_DATA_PATH / "validation_lo-nsw-species.cdf", + TEST_DATA_PATH / "validation_lo-pha.cdf", +] diff --git a/imap_processing/tests/codice/data/imap_codice_l0_hi-counters-aggregated_20240429_v001.pkts b/imap_processing/tests/codice/data/imap_codice_l0_hi-counters-aggregated_20240429_v001.pkts index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..53d675033c55dfd784b66ab2b758124a1063e72d 100644 GIT binary patch literal 100 zcmd;?bl?L+th7+7GXukRX$Z{#0*nj{%>O?%FgW}*uZoCbU|@N6ZHpTdgCe6CP_jh- t>0(9(*1!M%{0A$}FMpzA(x$bXfl-d_p#BnB`E8$Tfd&9|MMkYy2LNvt9RmOW literal 0 HcmV?d00001 diff --git a/imap_processing/tests/codice/data/imap_codice_l0_hi-counters-singles_20240429_v001.pkts b/imap_processing/tests/codice/data/imap_codice_l0_hi-counters-singles_20240429_v001.pkts index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..b7a783fed4cb7c22e458d7019dc6d37a2f43197f 100644 GIT binary patch literal 132 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 Xk@o`%T7`}3 literal 0 HcmV?d00001 diff --git a/imap_processing/tests/codice/data/imap_codice_l0_hi-sectored_20240429_v001.pkts b/imap_processing/tests/codice/data/imap_codice_l0_hi-sectored_20240429_v001.pkts index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..976d1725550f7c337e5cff3b6f06655d86757a32 100644 GIT binary patch literal 160 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 literal 0 HcmV?d00001 diff --git a/imap_processing/tests/codice/test_codice_l0.py b/imap_processing/tests/codice/test_codice_l0.py index 47a1c9dd3..6920fdd74 100644 --- a/imap_processing/tests/codice/test_codice_l0.py +++ b/imap_processing/tests/codice/test_codice_l0.py @@ -9,7 +9,7 @@ from imap_processing import imap_module_directory from imap_processing.codice import codice_l0 -from imap_processing.codice.utils import create_hskp_dataset +from imap_processing.codice.codice_l1a import create_hskp_dataset from imap_processing.utils import convert_raw_to_eu @@ -62,7 +62,7 @@ def validation_data() -> pd.core.frame.DataFrame: return validation_data -def test_eu_hk_data( +def test_eu_hskp_data( decom_test_data: list[space_packet_parser.parser.Packet], validation_data: pd.core.frame.DataFrame, ): @@ -105,7 +105,7 @@ def test_eu_hk_data( assert round(eu_val, 5) == round(validation_val, 5) -def test_raw_hk_data( +def test_raw_hskp_data( decom_test_data: list[space_packet_parser.parser.Packet], validation_data: pd.core.frame.DataFrame, ): diff --git a/imap_processing/tests/codice/test_codice_l1a.py b/imap_processing/tests/codice/test_codice_l1a.py index b1f2bd962..383a07b9b 100644 --- a/imap_processing/tests/codice/test_codice_l1a.py +++ b/imap_processing/tests/codice/test_codice_l1a.py @@ -1,15 +1,20 @@ """Tests the L1a processing for decommutated CoDICE data""" +import logging from pathlib import Path import numpy as np import pytest import xarray as xr -from imap_processing import imap_module_directory -from imap_processing.cdf.utils import load_cdf +from imap_processing.cdf.utils import load_cdf, write_cdf from imap_processing.codice.codice_l1a import process_codice_l1a +from .conftest import TEST_PACKETS, VALIDATION_DATA + +logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) + # TODO: Add test that processes a file with multiple APIDs EXPECTED_ARRAY_SHAPES = [ @@ -18,6 +23,7 @@ (1, 128), # hi-counters-singles (1, 128), # hi-omni (1, 128), # hi-sectored + (1, 128), # hi-pha (1, 128), # lo-counters-aggregated (1, 128), # lo-counters-aggregated (1, 128), # lo-sw-angular @@ -26,6 +32,7 @@ (1, 128), # lo-nsw-priority (1, 128), # lo-sw-species (1, 128), # lo-nsw-species + (1, 128), # lo-pha ] EXPECTED_ARRAY_SIZES = [ 123, # hskp @@ -33,6 +40,7 @@ 3, # hi-counters-singles 8, # hi-omni 4, # hi-sectored + 0, # hi-pha 3, # lo-counters-aggregated 3, # lo-counters-singles 6, # lo-sw-angular @@ -41,6 +49,7 @@ 4, # lo-nsw-priority 18, # lo-sw-species 10, # lo-nsw-species + 0, # lo-pha ] EXPECTED_LOGICAL_SOURCE = [ "imap_codice_l1a_hskp", @@ -48,6 +57,7 @@ "imap_codice_l1a_hi-counters-singles", "imap_codice_l1a_hi-omni", "imap_codice_l1a_hi-sectored", + "imap_codice_l1a_hi-pha", "imap_codice_l1a_lo-counters-aggregated", "imap_codice_l1a_lo-counters-singles", "imap_codice_l1a_lo-sw-angular", @@ -56,64 +66,7 @@ "imap_codice_l1a_lo-nsw-priority", "imap_codice_l1a_lo-sw-species", "imap_codice_l1a_lo-nsw-species", -] -TEST_PACKETS = [ - Path( - f"{imap_module_directory}/tests/codice/data/imap_codice_l0_hskp_20100101_v001.pkts" - ), - Path( - f"{imap_module_directory}/tests/codice/data/imap_codice_l0_hi-counters-aggregated_20240429_v001.pkts" - ), - Path( - f"{imap_module_directory}/tests/codice/data/imap_codice_l0_hi-counters-singles_20240429_v001.pkts" - ), - Path( - f"{imap_module_directory}/tests/codice/data/imap_codice_l0_hi-omni_20240429_v001.pkts" - ), - Path( - f"{imap_module_directory}/tests/codice/data/imap_codice_l0_hi-sectored_20240429_v001.pkts" - ), - Path( - f"{imap_module_directory}/tests/codice/data/imap_codice_l0_lo-counters-aggregated_20240429_v001.pkts" - ), - Path( - f"{imap_module_directory}/tests/codice/data/imap_codice_l0_lo-counters-singles_20240429_v001.pkts" - ), - Path( - f"{imap_module_directory}/tests/codice/data/imap_codice_l0_lo-sw-angular_20240429_v001.pkts" - ), - Path( - f"{imap_module_directory}/tests/codice/data/imap_codice_l0_lo-nsw-angular_20240429_v001.pkts" - ), - Path( - f"{imap_module_directory}/tests/codice/data/imap_codice_l0_lo-sw-priority_20240429_v001.pkts" - ), - Path( - f"{imap_module_directory}/tests/codice/data/imap_codice_l0_lo-nsw-priority_20240429_v001.pkts" - ), - Path( - f"{imap_module_directory}/tests/codice/data/imap_codice_l0_lo-sw-species_20240429_v001.pkts" - ), - Path( - f"{imap_module_directory}/tests/codice/data/imap_codice_l0_lo-nsw-species_20240429_v001.pkts" - ), -] - -# Placeholder for validation data files -VALIDATION_DATA = [ - f"{imap_module_directory}/tests/codice/data/validation_hskp.cdf", - f"{imap_module_directory}/tests/codice/data/validation_hi-counters-aggregated.cdf", - f"{imap_module_directory}/tests/codice/data/validation_hi-counters-singles.cdf", - f"{imap_module_directory}/tests/codice/data/validation_hi-omni.cdf", - f"{imap_module_directory}/tests/codice/data/validation_hi-sectored.cdf", - f"{imap_module_directory}/tests/codice/data/validation_lo-counters-aggregated.cdf", - f"{imap_module_directory}/tests/codice/data/validation_lo-counters-singles.cdf", - f"{imap_module_directory}/tests/codice/data/validation_lo-sw-angular.cdf", - f"{imap_module_directory}/tests/codice/data/validation_lo-nsw-angular.cdf", - f"{imap_module_directory}/tests/codice/data/validation_lo-sw-priority.cdf", - f"{imap_module_directory}/tests/codice/data/validation_lo-nsw-priority.cdf", - f"{imap_module_directory}/tests/codice/data/validation_lo-sw-species.cdf", - f"{imap_module_directory}/tests/codice/data/validation_lo-nsw-species.cdf", + "imap_codice_l1a_lo-pha", ] @@ -128,6 +81,11 @@ def test_l1a_data(request) -> xr.Dataset: """ dataset = process_codice_l1a(file_path=request.param, data_version="001") + + # Write the dataset to a CDF so it can be manually inspected as well + file_path = write_cdf(dataset) + logger.info(f"CDF file written to {file_path}") + return dataset @@ -153,7 +111,7 @@ def test_l1a_cdf_filenames(test_l1a_data: xr.Dataset, expected_logical_source: s @pytest.mark.xfail( - reason="Currently failing due to cdflib/epoch issue. Revisit after SIT-3" + reason="Currently failing due to cdflib/epoch issue. See https://github.com/MAVENSDC/cdflib/issues/268" ) @pytest.mark.parametrize( "test_l1a_data, expected_shape", diff --git a/imap_processing/tests/codice/test_codice_l1b.py b/imap_processing/tests/codice/test_codice_l1b.py index 7b36ec251..685f88dde 100644 --- a/imap_processing/tests/codice/test_codice_l1b.py +++ b/imap_processing/tests/codice/test_codice_l1b.py @@ -1,14 +1,13 @@ """Tests the L1b processing for CoDICE L1a data""" -from pathlib import Path - import pytest import xarray as xr -from imap_processing import imap_module_directory from imap_processing.cdf.utils import load_cdf from imap_processing.codice.codice_l1b import process_codice_l1b +from .conftest import TEST_L1A_FILES + EXPECTED_LOGICAL_SOURCE = [ "imap_codice_l1b_hskp", "imap_codice_l1b_hi-counters-aggregated", @@ -24,50 +23,9 @@ "imap_codice_l1b_lo-sw-species", "imap_codice_l1b_lo-nsw-species", ] -TEST_FILES = [ - Path( - f"{imap_module_directory}/tests/codice/data/imap_codice_l1a_hskp_20100101_v001.pkts" - ), - Path( - f"{imap_module_directory}/tests/codice/data/imap_codice_l1a_hi-counters-aggregated_20240429_v001.pkts" - ), - Path( - f"{imap_module_directory}/tests/codice/data/imap_codice_l1a_hi-counters-singles_20240429_v001.pkts" - ), - Path( - f"{imap_module_directory}/tests/codice/data/imap_codice_l1a_hi-omni_20240429_v001.pkts" - ), - Path( - f"{imap_module_directory}/tests/codice/data/imap_codice_l1a_hi-sectored_20240429_v001.pkts" - ), - Path( - f"{imap_module_directory}/tests/codice/data/imap_codice_l1a_lo-counters-aggregated_20240429_v001.pkts" - ), - Path( - f"{imap_module_directory}/tests/codice/data/imap_codice_l1a_lo-counters-singles_20240429_v001.pkts" - ), - Path( - f"{imap_module_directory}/tests/codice/data/imap_codice_l1a_lo-sw-angular_20240429_v001.pkts" - ), - Path( - f"{imap_module_directory}/tests/codice/data/imap_codice_l1a_lo-nsw-angular_20240429_v001.pkts" - ), - Path( - f"{imap_module_directory}/tests/codice/data/imap_codice_l1a_lo-sw-priority_20240429_v001.pkts" - ), - Path( - f"{imap_module_directory}/tests/codice/data/imap_codice_l1a_lo-nsw-priority_20240429_v001.pkts" - ), - Path( - f"{imap_module_directory}/tests/codice/data/imap_codice_l1a_lo-sw-species_20240429_v001.pkts" - ), - Path( - f"{imap_module_directory}/tests/codice/data/imap_codice_l1a_lo-nsw-species_20240429_v001.pkts" - ), -] -@pytest.fixture(params=TEST_FILES) +@pytest.fixture(params=TEST_L1A_FILES) def test_l1b_data(request) -> xr.Dataset: """Return a ``xarray`` dataset containing test data. @@ -83,7 +41,7 @@ def test_l1b_data(request) -> xr.Dataset: @pytest.mark.parametrize( "test_l1b_data, expected_logical_source", - list(zip(TEST_FILES, EXPECTED_LOGICAL_SOURCE)), + list(zip(TEST_L1A_FILES, EXPECTED_LOGICAL_SOURCE)), indirect=["test_l1b_data"], ) def test_l1b_cdf_filenames(test_l1b_data: xr.Dataset, expected_logical_source: str): From 4a2642b09956be882f278b38175660a4b2e670da Mon Sep 17 00:00:00 2001 From: Tim Plummer Date: Fri, 16 Aug 2024 09:19:53 -0600 Subject: [PATCH 2/7] 728 spice kernel furnishing decorator (#734) * Add preliminary decorator that handles automatically furnishing of spice kernels in correct module Add test incomplete test coverage of ensure_spice decorator in correct location * Add spice kernel furnishing fixtures Add leapsecond kernel to test data Add sclk kernel to test data Add metekrnel template to test data * Add test coverage for time kernels only use of ensure_spice Add test coverage for ensure_spice failure -> SpiceyError * Remove unused fixture Move metakernel template to other spice kernel location * remove duplicate kernel files * Add comments about why ensure_spice tests expect an exception to be raised * Use imap_data_access.config DATA_DIR instead of new tmp_path to write test metakernel Move leapsecond and spacecraft clock kernel into imap_processing package --- imap_processing/spice/kernels.py | 157 ++++++++++++++++++ imap_processing/tests/conftest.py | 107 ++++++++++++ .../tests/spice/test_data}/imap_sclk_0000.tsc | 0 .../test_data/imap_test_metakernel.template | 2 + .../tests/spice/test_data}/naif0012.tls | 0 imap_processing/tests/spice/test_kernels.py | 68 ++++++++ tools/tests/unit/test_spice_examples.py | 7 + 7 files changed, 341 insertions(+) rename {tools/tests/test_data/spice => imap_processing/tests/spice/test_data}/imap_sclk_0000.tsc (100%) create mode 100644 imap_processing/tests/spice/test_data/imap_test_metakernel.template rename {tools/tests/test_data/spice => imap_processing/tests/spice/test_data}/naif0012.tls (100%) diff --git a/imap_processing/spice/kernels.py b/imap_processing/spice/kernels.py index 1ff30df21..2d4e21154 100644 --- a/imap_processing/spice/kernels.py +++ b/imap_processing/spice/kernels.py @@ -1 +1,158 @@ """Functions for furnishing and tracking SPICE kernels.""" + +import functools +import logging +import os +from typing import Any, Callable, Optional + +import spiceypy as spice +from spiceypy.utils.exceptions import SpiceyError + +logger = logging.getLogger(__name__) + + +def ensure_spice( + f_py: Optional[Callable] = None, time_kernels_only: bool = False +) -> Callable: + """ + Decorator/wrapper that automatically furnishes SPICE kernels. + + Parameters + ---------- + f_py : Callable + The function requiring SPICE that we are going to wrap if being used + explicitly, otherwise None, in which case ensure_spice is being used, + not as a function wrapper (see l2a_processing.py) but as a true + decorator without an explicit function argument. + time_kernels_only : bool + Specify that we only need to furnish time kernels (if SPICE_METAKERNEL + is set, we still just furnish that metakernel and assume the time + kernels are included. + + Returns + ------- + Callable + Decorated function, with spice error handling. + + Notes + ----- + Before trying to understand this piece of code, read this: + https://stackoverflow.com/questions/5929107/decorators-with-parameters/60832711#60832711 + + **Control flow overview:** + 1. Try simply calling the wrapped function naively. + * SUCCESS? Great! We're done. + * SpiceyError? Go to step 2. + + 2. Furnish metakernel at SPICE_METAKERNEL + * SUCCESS? Great, return the original function again (so it can be + re-run). + * KeyError? Seems like SPICE_METAKERNEL isn't set, no problem. Go to + step 3. + + 3. Did we get the parameter time_kernels_only=True? + --> YES? We only need LSK and SCLK kernels to run this function. Go fetch + those and furnish and return the original function (so it can be re-run). + --> NO? Dang. This is sort of the end of the line. Re-raise the error + generated from the failed spiceypy function call but add a better + message to it. + + Examples + -------- + There are three ways to use this object + + 1. A decorator with no arguments + >>> @ensure_spice + ... def my_spicey_func(a, b): + ... pass + + 2. A decorator with parameters. This is useful + if we only need the latest SCLK and LSK kernels for the function involved. + >>> @ensure_spice(time_kernels_only=True) + ... def my_spicey_time_func(a, b): + ... pass + + 3. An explicit wrapper function, providing a dynamically set value for + parameters, e.g. time_kernels_only + >>> wrapped = ensure_spice(spicey_func, time_kernels_only=True) + ... result = wrapped(*args, **kwargs) + """ + if f_py and not callable(f_py): + raise ValueError( + f"Received a non-callable object {f_py} as the f_py argument to" + f"ensure_spice. f_py must be a callable object." + ) + + def _decorator(func: Callable[..., Callable]) -> Callable: + """ + Decorate or wrap input function depending on how ensure_spice is used. + + Parameters + ---------- + func : Callable + The function to be decorated/wrapped. + + Returns + ------- + Callable + If used as a function wrapper, the decorated function is returned. + """ + + @functools.wraps(func) + def wrapper_ensure_spice(*args: Any, **kwargs: Any) -> Any: + """ + Wrap the function that ensure_spice is used on. + + Parameters + ---------- + *args : list + The positional arguments passed to the decorated function. + **kwargs + The keyword arguments passed to the decorated function. + + Returns + ------- + Object + Output from wrapped function. + """ + try: + # Step 1. + return func( + *args, **kwargs + ) # Naive first try. Maybe SPICE is already furnished. + except SpiceyError as spicey_err: + try: + # Step 2. + metakernel_path = os.environ["SPICE_METAKERNEL"] + spice.furnsh(metakernel_path) + except KeyError: + # TODO: An additional step that was used on EMUS was to get + # a custom metakernel from the SDC API based on an input + # time range. + if time_kernels_only: + # Step 3. + # TODO: Decide if this is useful for IMAP. Possible + # implementation could include downloading + # the most recent leapsecond kernel from NAIF (see: + # https://lasp.colorado.edu/nucleus/projects/LIBSDC/repos/libera_utils/browse/libera_utils/spice_utils.py + # for LIBERA implementation of downloading and caching + # kernels) and finding the most recent IMAP clock + # kernel in EFS. + raise NotImplementedError from spicey_err + else: + raise SpiceyError( + "When calling a function requiring SPICE, we failed" + "to load a metakernel. SPICE_METAKERNEL is not set," + "and time_kernels_only is not set to True" + ) from spicey_err + return func(*args, **kwargs) + + return wrapper_ensure_spice + + # Note: This return was originally implemented as a ternary operator, but + # this caused mypy to fail due to this bug: + # https://github.com/python/mypy/issues/4134 + if callable(f_py): + return _decorator(f_py) + else: + return _decorator diff --git a/imap_processing/tests/conftest.py b/imap_processing/tests/conftest.py index 4a7c9bd76..b9adc63e3 100644 --- a/imap_processing/tests/conftest.py +++ b/imap_processing/tests/conftest.py @@ -1,7 +1,11 @@ """Global pytest configuration for the package.""" +import re + import imap_data_access +import numpy as np import pytest +import spiceypy as spice from imap_processing import imap_module_directory @@ -18,3 +22,106 @@ def _set_global_config(monkeypatch, tmp_path): @pytest.fixture(scope="session") def imap_tests_path(): return imap_module_directory / "tests" + + +# Furnishing fixtures for testing kernels +# --------------------------------------- +@pytest.fixture(autouse=True) +def _autoclear_spice(): + """Automatically clears out all SPICE remnants after every single test to + prevent the kernel pool from interfering with future tests. Option autouse + ensures this is run after every test.""" + yield + spice.kclear() + + +@pytest.fixture(scope="session") +def spice_test_data_path(imap_tests_path): + return imap_tests_path / "spice/test_data" + + +@pytest.fixture() +def furnish_test_lsk(spice_test_data_path): + """Furnishes (temporarily) the testing LSK""" + test_lsk = spice_test_data_path / "naif0012.tls" + spice.furnsh(test_lsk) + yield test_lsk + spice.kclear() + + +@pytest.fixture() +def furnish_sclk(spice_test_data_path): + """Furnishes (temporarily) the SCLK for JPSS stored in the package data directory""" + test_sclk = spice_test_data_path / "imap_sclk_0000.tsc" + spice.furnsh(test_sclk) + yield test_sclk + spice.kclear() + + +@pytest.fixture() +def use_test_metakernel(monkeypatch, spice_test_data_path): + """For the whole test session, set the SPICE_METAKERNEL environment variable + Prime the test metakernel by creating it from the template metakernel + (allows using absolute paths on any dev system)""" + + def make_metakernel_from_kernels(metakernel, kernels): + """Helper function that writes a test metakernel from a list of filenames""" + with open(metakernel, "w") as mk: + mk.writelines( + [ + "\n", + "\\begintext\n", + "\n", + "This is a temporary metakernel for imap_processing" + " unit and integration testing.\n", + "\n", + "\\begindata\n", + "\n", + "KERNELS_TO_LOAD = (\n", + ] + ) + # Put single quotes around every kernel name + kernels_with_quotes = [" '" + kern + "'" for kern in kernels] + # Add a comma and EOL to the end of each kernel path except the last. + formated_kernels = [kern + ",\n" for kern in kernels_with_quotes[0:-1]] + # Add ')' to the last kernel + formated_kernels.append(kernels_with_quotes[-1] + "\n)\n\n") + mk.writelines(formated_kernels) + + def get_test_kernels_to_load(): + """ + Helper function for grabbing a list of kernel filenames from the test + metakernel template. This is necessary in order to get absolute paths on + any system. Formats the absolute paths using the test data path fixture + value. + """ + test_metakernel = spice_test_data_path / "imap_test_metakernel.template" + kernels_to_load = [] + max_line_length = 80 + with open(test_metakernel) as mk: + for k in mk: + kernel = k.rstrip("\n").format( + **{"SPICE_TEST_DATA_PATH": str(spice_test_data_path.absolute())} + ) + while len(kernel) > 0: + if len(kernel) <= max_line_length: + kernels_to_load.append(kernel) + break + else: + slash_positions = np.array( + [m.start() for m in re.finditer("/", kernel)] + ) + stop_idx = ( + slash_positions[slash_positions < max_line_length - 1].max() + + 1 + ) + kernels_to_load.append(kernel[0:stop_idx] + "+") + kernel = kernel[stop_idx:] + return kernels_to_load + + metakernel_path = imap_data_access.config["DATA_DIR"] / "imap_2024_v001.tm" + kernels_to_load = get_test_kernels_to_load() + make_metakernel_from_kernels(metakernel_path, kernels_to_load) + monkeypatch.setenv("SPICE_METAKERNEL", str(metakernel_path)) + yield str(metakernel_path) + spice.kclear() diff --git a/tools/tests/test_data/spice/imap_sclk_0000.tsc b/imap_processing/tests/spice/test_data/imap_sclk_0000.tsc similarity index 100% rename from tools/tests/test_data/spice/imap_sclk_0000.tsc rename to imap_processing/tests/spice/test_data/imap_sclk_0000.tsc diff --git a/imap_processing/tests/spice/test_data/imap_test_metakernel.template b/imap_processing/tests/spice/test_data/imap_test_metakernel.template new file mode 100644 index 000000000..b4a5d9f82 --- /dev/null +++ b/imap_processing/tests/spice/test_data/imap_test_metakernel.template @@ -0,0 +1,2 @@ +{SPICE_TEST_DATA_PATH}/imap_sclk_0000.tsc +{SPICE_TEST_DATA_PATH}/naif0012.tls \ No newline at end of file diff --git a/tools/tests/test_data/spice/naif0012.tls b/imap_processing/tests/spice/test_data/naif0012.tls similarity index 100% rename from tools/tests/test_data/spice/naif0012.tls rename to imap_processing/tests/spice/test_data/naif0012.tls diff --git a/imap_processing/tests/spice/test_kernels.py b/imap_processing/tests/spice/test_kernels.py index 059d0f231..c8ce926ad 100644 --- a/imap_processing/tests/spice/test_kernels.py +++ b/imap_processing/tests/spice/test_kernels.py @@ -1 +1,69 @@ """Tests coverage for imap_processing/spice/kernels.py""" + +import pytest +import spiceypy as spice +from spiceypy.utils.exceptions import SpiceyError + +from imap_processing.spice import kernels + + +@kernels.ensure_spice +def single_wrap_et2utc(et, fmt, prec): + """Directly decorate a spice function with ensure_spice for use in tests""" + return spice.et2utc(et, fmt, prec) + + +@kernels.ensure_spice +def double_wrap_et2utc(et, fmt, prec): + """Decorate a spice function twice with ensure_spice for use in tests. This + simulates some decorated outer functions that call lower level functions + that are already decorated.""" + return single_wrap_et2utc(et, fmt, prec) + + +@kernels.ensure_spice(time_kernels_only=True) +def single_wrap_et2utc_tk_only(et, fmt, prec): + """Directly wrap a spice function with optional time_kernels_only set True""" + return spice.et2utc(et, fmt, prec) + + +@kernels.ensure_spice(time_kernels_only=True) +def double_wrap_et2utc_tk_only(et, fmt, prec): + """Decorate a spice function twice with ensure_spice for use in tests. This + simulates some decorated outer functions that call lower level functions + that are already decorated.""" + return single_wrap_et2utc(et, fmt, prec) + + +@pytest.mark.parametrize( + "func", + [ + single_wrap_et2utc, + single_wrap_et2utc_tk_only, + double_wrap_et2utc, + double_wrap_et2utc_tk_only, + ], +) +def test_ensure_spice_emus_mk_path(func, use_test_metakernel): + """Test functionality of ensure spice with SPICE_METAKERNEL set""" + assert func(577365941.184, "ISOC", 3) == "2018-04-18T23:24:31.998" + + +def test_ensure_spice_time_kernels(): + """Test functionality of ensure spice with timekernels set""" + wrapped = kernels.ensure_spice(spice.et2utc, time_kernels_only=True) + # TODO: Update/remove this test when a decision has been made about + # whether IMAP will use the time_kernels_only functionality and the + # ensure_spice decorator has been update. + with pytest.raises(NotImplementedError): + _ = wrapped(577365941.184, "ISOC", 3) == "2018-04-18T23:24:31.998" + + +def test_ensure_spice_key_error(): + """Test functionality of ensure spice when all branches fail""" + wrapped = kernels.ensure_spice(spice.et2utc) + # The ensure_spice decorator should raise a SpiceyError when all attempts to + # furnish a set of kernels with sufficient coverage for the spiceypy + # functions that it decorates. + with pytest.raises(SpiceyError): + _ = wrapped(577365941.184, "ISOC", 3) == "2018-04-18T23:24:31.998" diff --git a/tools/tests/unit/test_spice_examples.py b/tools/tests/unit/test_spice_examples.py index d998a3008..d47a607cd 100644 --- a/tools/tests/unit/test_spice_examples.py +++ b/tools/tests/unit/test_spice_examples.py @@ -4,6 +4,7 @@ import pytest import spiceypy as spice +from imap_processing import imap_module_directory from tools.spice.spice_examples import ( _get_particle_velocity, build_annotated_events, @@ -29,6 +30,12 @@ def kernels(kernel_directory): kernels = list_files_with_extensions( kernel_directory, [".tsc", ".tls", ".tf", ".bsp", ".ck"] ) + # Some kernels were moved into imap_processing package + kernels.extend( + list_files_with_extensions( + imap_module_directory / "tests/spice/test_data", [".tsc", ".tls"] + ) + ) return kernels From f3b49d082dfda37e22b0c4bd79eaf356b2d504e7 Mon Sep 17 00:00:00 2001 From: Sean Hoyt Date: Tue, 20 Aug 2024 11:00:25 -0600 Subject: [PATCH 3/7] Updated/Combined Lo XTCE (#754) * updated lo xtce * updated test_decom for new xtce generation format --- .../lo/packet_definitions/P_ILO_APP_NHK.xml | 1204 ---- .../lo/packet_definitions/P_ILO_APP_SHK.xml | 208 - .../lo/packet_definitions/P_ILO_AUTO.xml | 125 - .../lo/packet_definitions/P_ILO_BOOT_HK.xml | 358 -- .../packet_definitions/P_ILO_BOOT_MEMDMP.xml | 110 - .../P_ILO_DIAG_BULK_HVPS.xml | 219 - .../lo/packet_definitions/P_ILO_DIAG_CDH.xml | 425 -- .../lo/packet_definitions/P_ILO_DIAG_IFB.xml | 431 -- .../lo/packet_definitions/P_ILO_DIAG_PCC.xml | 193 - .../packet_definitions/P_ILO_DIAG_TOF_BD.xml | 349 -- .../lo/packet_definitions/P_ILO_EVTMSG.xml | 152 - .../lo/packet_definitions/P_ILO_MEMDMP.xml | 110 - .../lo/packet_definitions/P_ILO_RAW_CNT.xml | 435 -- .../lo/packet_definitions/P_ILO_RAW_DE.xml | 114 - .../lo/packet_definitions/P_ILO_RAW_STAR.xml | 5212 ----------------- .../lo/packet_definitions/P_ILO_SCI_CNT.xml | 96 - .../lo/packet_definitions/P_ILO_SCI_DE.xml | 105 - .../lo/packet_definitions/P_ILO_SPIN.xml | 1241 ---- .../lo/packet_definitions/P_ILO_STAR.xml | 102 - .../lo/packet_definitions/lo_xtce.xml | 3541 +++++++++++ imap_processing/tests/test_decom.py | 31 +- 21 files changed, 3562 insertions(+), 11199 deletions(-) delete mode 100644 imap_processing/lo/packet_definitions/P_ILO_APP_NHK.xml delete mode 100644 imap_processing/lo/packet_definitions/P_ILO_APP_SHK.xml delete mode 100644 imap_processing/lo/packet_definitions/P_ILO_AUTO.xml delete mode 100644 imap_processing/lo/packet_definitions/P_ILO_BOOT_HK.xml delete mode 100644 imap_processing/lo/packet_definitions/P_ILO_BOOT_MEMDMP.xml delete mode 100644 imap_processing/lo/packet_definitions/P_ILO_DIAG_BULK_HVPS.xml delete mode 100644 imap_processing/lo/packet_definitions/P_ILO_DIAG_CDH.xml delete mode 100644 imap_processing/lo/packet_definitions/P_ILO_DIAG_IFB.xml delete mode 100644 imap_processing/lo/packet_definitions/P_ILO_DIAG_PCC.xml delete mode 100644 imap_processing/lo/packet_definitions/P_ILO_DIAG_TOF_BD.xml delete mode 100644 imap_processing/lo/packet_definitions/P_ILO_EVTMSG.xml delete mode 100644 imap_processing/lo/packet_definitions/P_ILO_MEMDMP.xml delete mode 100644 imap_processing/lo/packet_definitions/P_ILO_RAW_CNT.xml delete mode 100644 imap_processing/lo/packet_definitions/P_ILO_RAW_DE.xml delete mode 100644 imap_processing/lo/packet_definitions/P_ILO_RAW_STAR.xml delete mode 100644 imap_processing/lo/packet_definitions/P_ILO_SCI_CNT.xml delete mode 100644 imap_processing/lo/packet_definitions/P_ILO_SCI_DE.xml delete mode 100644 imap_processing/lo/packet_definitions/P_ILO_SPIN.xml delete mode 100644 imap_processing/lo/packet_definitions/P_ILO_STAR.xml create mode 100644 imap_processing/lo/packet_definitions/lo_xtce.xml diff --git a/imap_processing/lo/packet_definitions/P_ILO_APP_NHK.xml b/imap_processing/lo/packet_definitions/P_ILO_APP_NHK.xml deleted file mode 100644 index d7e3fb2ab..000000000 --- a/imap_processing/lo/packet_definitions/P_ILO_APP_NHK.xml +++ /dev/null @@ -1,1204 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CCSDS Packet Version Number (always 0) - - - CCSDS Packet Type Indicator (0=telemetry) - - - CCSDS Packet Secondary Header Flag (always 1) - - - CCSDS Packet Application Process ID - - - CCSDS Packet Grouping Flags (3=not part of group) - - - CCSDS Packet Sequence Count (increments with each new packet) - - - CCSDS Packet Length (number of bytes after Packet length minus 1) - - - CCSDS Secondary Header MET - - - Current operating mode - - - Accepted commands count - - - Rejected commands count - - - Last accepted command opcode - - - ITF Error count - - - Watchdog reset count - - - System Temperature 1: MDM25P – 14 Temperature - - - System Temperature 2: MDM25P – 15 Temperature - - - System Temperature 3: MDM25P – 16 Temperature - - - LO temperature monitor - - - HVPS temperature monitor - - - LVPS Temperature 1: LVPS – 12V Temperature - - - LVPS Temperature 2: LVPS – 5V Temperature - - - LVPS Temperature 3: LVPS – +3.3V Temperature - - - LVPS – Digital V1: LVPS – +3.3V - - - LVPS – Digital V2: LVPS – +5V - - - LVPS – Digital V3: LVPS – -5V - - - LVPS – Digital V4: LVPS – +12V - - - LVPS – Digital V5: LVPS – -12V - - - LVPS – Digital I1: LVPS – +3.3V Current - - - LVPS – Digital I2: LVPS – +5V Current - - - LVPS – Digital I3: LVPS – -5V Current - - - LVPS – Digital I4: LVPS – +12V Current - - - LVPS – Digital I5: LVPS – -12V Current - - - CDH – + 1.5V - - - CDH – +1.8V - - - CDH – +3.3V - - - CDH – +12V - - - CDH – -12V - - - CDH – +5V - - - CDH – Analog Ref: CDH – +5V ADC - - - CDH temperature 1 monitor - - - CDH temperature 2 monitor - - - CDH temperature 3 monitor - - - CDH temperature 4 monitor - - - Bulk HVPS Control Enable status - - - Bulk HVPS Status command parity error status - - - Bulk HVPS Status command frame error status - - - Bulk HVPS Status telemetry parity error status - - - Bulk HVPS Status telemetry frame error status - - - Bulk HVPS Status timeout error status - - - Bulk HVPS Status count error status - - - Spare for alignment - - - Bulk HVPS Status command count - - - Bulk HVPS Status master enable status - - - Bulk HVPS Status HV disable plug status - - - Bulk HVPS Status HV limit plug status - - - Bulk HVPS Status Power On Reset status - - - Bulk HVPS Status Power Failure Reset status - - - Bulk HVPS Status Software Reset status - - - Bulk HVPS Bulk enable status, includes DEF_NEG, DEF_POS, and PMT_BIAS - - - Bulk HVPS ESA_POS enable status - - - Bulk HVPS ESA_NEG disable status - - - Spare for alignment - - - Bulk HVPS raw DAC value, ESA_NEG - - - Bulk HVPS raw DAC value, ESA_POS - - - Bulk HVPS raw DAC value, DEF_NEG - - - Bulk HVPS raw DAC value, DEF_POS - - - Bulk HVPS raw DAC value, PMT_BIAS - - - Bulk HVPS ADC1 enable status - - - Bulk HVPS ADC1 mode - - - Bulk HVPS ADC1 channel select - - - Bulk HVPS ADC2 enable status - - - Bulk HVPS ADC2 mode - - - Spare for alignment - - - Bulk HVPS ADC2 channel select - - - Spare for alignment - - - Bulk HVPS ADC1 wait count - - - Bulk HVPS ADC2 wait count - - - Bulk HVPS Bulk voltage - - - Bulk HVPS ESA_NEG voltage - - - Bulk HVPS ESA_POS voltage - - - Bulk HVPS DEF_NEG voltage - - - Bulk HVPS DEF_POS voltage - - - Bulk HVPS PMT voltage - - - Bulk HVPS PMT current - - - Bulk HVPS Bulk current - - - Bulk HVPS DEF_NEG current - - - Bulk HVPS DEF_POS current - - - Bulk HVPS ADC Reference 1 voltage - - - Bulk HVPS ADC Reference 2 voltage - - - Bulk HVPS positive 12V rail voltage - - - Bulk HVPS negative 12V rail voltage - - - Bulk HVPS 3p3 rail voltage - - - Bulk HVPS 1p5 rail voltage - - - Spare for alignment - - - Memory operation state - - - Memory dump state - - - Spin count - - - Missed PPS from Spacecraft count - - - CPU utilization percentage - - - Single bit EDAC errors are injected - - - Double bit EDAC errors are injected - - - FIFO overflow - - - FIFO underflow - - - FIFO full - - - FIFO half full - - - FIFO empty - - - Single bit EDAC error occurred - - - Double bit EDAC error occurred - - - Parity error - - - Frame error - - - Single bit EDAC errors are injected - - - Double bit EDAC errors are injectded - - - FIFO overflow - - - FIFO underflow - - - FIFO full - - - FIFO half full - - - FIFO empty - - - Single bit EDAC error occurred - - - Double bit EDAC error occurred - - - Loopback, telemetry data is looped to command FIFO - - - Spare for alignment - - - Spin bin index - - - Spare for alignment - - - Spin period - - - Heater 1 status - - - Heater 2 status - - - Instrument switched power output +/- 12V status - - - Instrument switched power output analog 5V status - - - Instrument switched power output digital 5V and 3P3V status - - - Error status if an IFB an attempt to write a command before interface was ready - - - CDH IFB interface status - - - Star sensor FIFO underflow - - - Star sensor FIFO overflow - - - Star sensor FIFO full - - - Star sensor FIFO half full - - - Star sensor FIFO empty - - - IFB ADC telemetry packet received - - - IFB ADC telemetry timeout error - - - IFB ADC telemetry ID error - - - IFB ADC telemetry frame error - - - IFB telemetry packet received - - - IFB telemetry timeout error - - - IFB telemetry ID error - - - IFB telemetry frame error - - - Any TOF Board telemetry packet received - - - TOF Board ADC telemetry packet recevied - - - TOF Board register telemetry packet recevied - - - TOF Board rate counter telemetry packet received - - - TOF Board direct event telemetry packet received - - - TOF Board telemetry timeout error - - - TOF Board telemetry ID error - - - TOF Board telemetry frame error - - - Direct event time tag roll over status - - - Direct event time tag status - - - Spare for alignment - - - Direct event time tag counter - - - Spare for alignment - - - Direct event FIFO count - - - Spare for alignment - - - Direct event FIFO overflow - - - Direct event FIFO underflow - - - Direct event FIFO full - - - Direct event FIFO half full - - - Direct event FIFO empty - - - Pivot platform interface status - - - Pivot platform interface telemetry timeout error - - - Pivot platform interface telemetry parity error - - - Pivot platform interface telemetry packet received - - - IFB High Voltage disable plug status - - - IFB High Voltage limit plug status - - - Spare for alignment - - - IFB command counter - - - IFB internal mux selection - - - IFB AC clock de-assert status - - - IFB oscope mode status - - - IFB star sync status - - - IFB telmetry state - - - Spare for alignment - - - IFB Data Interval - - - TOF HVPS sync clock state - - - TOF HVPS PAC state - - - TOF HVPS MCP state - - - TOF Board LV state - - - Spare for alignment - - - TOF HVPS PAC VSET DAC - - - TOF HVPS PAC overcurrent protection - - - TOF HVPS MCP VSET DAC - - - TOF HVPS MCP overcurrent protection - - - Star sensor offset adjust - - - IFB oscope channel 1 selection - - - IFB oscope channel 0 selection - - - IFB temperature hot spot between FPGA and 2P5V regulator - - - IFB temperature cold spot at board corner between J1 and J2 - - - IFB 5V voltage - - - IFB 3P3V voltage - - - IFB +12V voltage - - - IFB -12V voltage - - - TOF Board LV current - - - TOF Board LV voltage - - - TOF Board LV temperature - - - MCP current - - - MCP voltage - - - MCP temperature - - - PAC current - - - PAC voltage - - - PAC temperature - - - TOF Board command error counter - - - TOF Board CFD voltage - - - TOF Board preamp temperature - - - TOF Board regulator temperature - - - MCP current - - - MCP voltage - - - TOF Board current - - - TOF Board +5V voltage - - - TOF Board +6V Voltage - - - Anode A threshold - - - Anode B0 threshold - - - Anode B3 threshold - - - Anode C threshold - - - TOF Board Control telemetry state - - - TOF Board Control direct event telemetry state - - - TOF Board Control valid TOF3 required - - - TOF Board Control valid TOF2 required - - - TOF Board Control valid TOF1 required - - - TOF Board Control valid TOF0 required - - - TOF Board Stimulus Control Anode C state - - - TOF Board Stimulus Control Anode C pulse state - - - TOF Board Stimulus Control Anode B3 state - - - TOF Board Stimulus Control Anode B3 pulse state - - - TOF Board Stimulus Control Anode B0 state - - - TOF Board Stimulus Control Anode B0 pulse state - - - TOF Board Stimulus Control Anode A state - - - TOF Board Stimulus Control Anode A pulse state - - - Spare for alignment - - - TOF Board Stimulus Config frequency - - - TOF Board Stimulus Config delay - - - TOF Board TOF3 threshold - - - TOF Board TOF2 threshold - - - TOF Board TOF1 threshold - - - TOF Board TOF0 threshold - - - TOF3 veto - - - TOF2 veto - - - TOF1 veto - - - TOF0 veto - - - Spare for alignment - - - Pivot platform ADC primary coarse pot - - - Pivot platform ADC primary fine pot - - - Pivot platform ADC redundant coarse pot - - - Pivot platform ADC redundant fine pot - - - Pivot platform ADC actuator temperature - - - Pivot platform ADC board temperature - - - Pivtot platform ADC primary motor current - - - Pivtot platform ADC redundant motor current - - - Pivot platform primary cumulative count - - - Pivot platform primary cumulative count sign - - - Pivot platform redundant cumulative count - - - Pivot platform redundant cumulative count sign - - - Pivot platform primary current step count - - - Pivot platform redundant current step count - - - Pivot platform primary current setpoint - - - Pivot platform redundant current setpoint - - - Pivot platform primary port active - motion in progress status - - - Pivot platform primary port powered - powered idle state - - - Pivot platform primary port micro-stepping status - - - Pivot platform primary acceleration profiling status - - - Pivot platform redundant port active - motion in progress status - - - Pivot platform redundant port powered - powered idle state - - - Pivot platform redundant port micro-stepping status - - - Pivot platform redundant acceleration profiling status - - - Pivot platform stall status - - - TBD - Placeholder for Macro status - - - Indicates whether any CATEGORY 1 limits have triggered - Indicates whether any CATEGORY 1 limits have triggered. 2 bits: 0: No triggers; 1: One trigger, 2: Two triggers, 3: More than two triggers - - - Indicates whether any CATEGORY 2 limits have triggered - - - Indicates whether any CATEGORY 3 limits have triggered - - - Indicates whether any CATEGORY 4 limits have triggered - - - Indicates whether any CATEGORY 5 limits have triggered - - - Indicates whether any CATEGORY 6 limits have triggered - - - Indicates whether any CATEGORY 7 limits have triggered - - - Indicates whether any CATEGORY 8 limits have triggered - - - Indicates whether the most recent trigger was a minimum or maximum limit - - - Indicates the ID of the most recent FDC trigger - - - Indicates the action that was taken for the most recent FDC trigger - - - Spare for alignment - - - CRC-16 Checksum - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/imap_processing/lo/packet_definitions/P_ILO_APP_SHK.xml b/imap_processing/lo/packet_definitions/P_ILO_APP_SHK.xml deleted file mode 100644 index 0a38f7305..000000000 --- a/imap_processing/lo/packet_definitions/P_ILO_APP_SHK.xml +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 352 - - - - - - - - 432 - - - - - - - CCSDS Packet Version Number (always 0) - - - CCSDS Packet Type Indicator (0=telemetry) - - - CCSDS Packet Secondary Header Flag (always 1) - - - CCSDS Packet Application Process ID - - - CCSDS Packet Grouping Flags (3=not part of group) - - - CCSDS Packet Sequence Count (increments with each new packet) - - - CCSDS Packet Length (number of bytes after Packet length minus 1) - - - CCSDS Secondary Header MET - CCSDS Secondary Header MET - - - ILO_APP_SHK.BOARD_TYPE - ILO_APP_SHK.CDH_JUMPER_REG - - - ILO_APP_SHK.RESET_REASON_SOFT - ILO_APP_SHK.RESET_REASON_SOFT - - - ILO_APP_SHK.RESET_REASON_FPGA_WDOG - ILO_APP_SHK.RESET_REASON_FPGA_WDOG - - - ILO_APP_SHK.RESET_REASON_CPU_WDOG - ILO_APP_SHK.RESET_REASON_CPU_WDOG - - - ILO_APP_SHK.RESET_REASON_PFO - ILO_APP_SHK.RESET_REASON_PFO - - - ILO_APP_SHK.RESET_REASON_PFO - ILO_APP_SHK.RESET_REASON_PFO - - - ILO_APP_SHK.CPU_WDOG_STATE - ILO_APP_SHK.CPU_WDOG_STATE - - - ILO_APP_SHK.FPGA_WDOG_STATE - ILO_APP_SHK.FPGA_WDOG_STATE - - - ILO_APP_SHK.WDOG_CNT - ILO_APP_SHK.WDOG_CNT - - - ILO_APP_SHK.INSTR_ID - ILO_APP_SHK.INSTR_ID - - - ILO_APP_SHK.CDH_FPGA_VERSION - ILO_APP_SHK.CDH_FPGA_VERSION - - - ILO_APP_SHK.IFB_FPGA_VERSION - ILO_APP_SHK.IFB_FPGA_VERSION - - - ILO_APP_SHK.BULK_HVPS_VERSION - ILO_APP_SHK.BULK_HVPS_VERSION - - - ILO_APP_SHK.FSW_VERSION - ILO_APP_SHK.FSW_VERSION - - - ILO_APP_SHK.TABLE_VERSION - ILO_APP_SHK.TABLE_VERSION - - - ILO_APP_SHK.SCI_LUT_VERSION - ILO_APP_SHK.SCI_LUT_VERSION - - - ILO_APP_SHK.SELECTED_IMG - ILO_APP_SHK.SELECTED_IMG - - - ILO_APP_SHK.FSW_VERSION_STR - ILO_APP_SHK.FSW_VERSION_STR - - - ILO_APP_SHK.ENG_LUT_VERSION_STR - ILO_APP_SHK.ENG_LUT_VERSION_STR - - - ILO_APP_SHK.SCI_LUT_VERSION_STR - ILO_APP_SHK.SCI_LUT_VERSION_STR - - - ILO_APP_SHK.SPARE - ILO_APP_SHK.SPARE - - - ILO_APP_SHK.CHKSUM - ILO_APP_SHK.CHKSUM - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/imap_processing/lo/packet_definitions/P_ILO_AUTO.xml b/imap_processing/lo/packet_definitions/P_ILO_AUTO.xml deleted file mode 100644 index 504e69a9b..000000000 --- a/imap_processing/lo/packet_definitions/P_ILO_AUTO.xml +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CCSDS Packet Version Number (always 0) - - - CCSDS Packet Type Indicator (0=telemetry) - - - CCSDS Packet Secondary Header Flag (always 1) - - - CCSDS Packet Application Process ID - - - CCSDS Packet Grouping Flags (3=not part of group) - - - CCSDS Packet Sequence Count (increments with each new packet) - - - CCSDS Packet Length (number of bytes after Packet length minus 1) - - - CCSDS Secondary Header MET - CCSDS Secondary Header MET - - - spare - spare - - - Power cycle request - Power cycle request - - - Power off request - Power off request - - - Whether FSW heater control is enabled - Whether FSW heater control is enabled - - - Current state of Heater 1 output - Current state of Heater 1 output - - - Current state of Heater 1 output - Current state of Heater 1 output - - - spare - spare - - - 16-bit CRC checksum - CRC-16 Checksum - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/imap_processing/lo/packet_definitions/P_ILO_BOOT_HK.xml b/imap_processing/lo/packet_definitions/P_ILO_BOOT_HK.xml deleted file mode 100644 index e66d12514..000000000 --- a/imap_processing/lo/packet_definitions/P_ILO_BOOT_HK.xml +++ /dev/null @@ -1,358 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CCSDS Packet Version Number (always 0) - - - CCSDS Packet Type Indicator (0=telemetry) - - - CCSDS Packet Secondary Header Flag (always 1) - - - CCSDS Packet Application Process ID - - - CCSDS Packet Grouping Flags (3=not part of group) - - - CCSDS Packet Sequence Count (increments with each new packet) - - - CCSDS Packet Length (number of bytes after Packet length minus 1) - - - CCSDS Secondary header, mission elapsed time - CCSDS Secondary header, mission elapsed time - - - Boot FSW version - Boot FSW version - - - Number of boot attempts - Number of boot attempts - - - Built-In-Self-Test status - Built-In-Self-Test status - - - Built-In-Self-Test Address bus fail mask - Built-In-Self-Test Address bus fail mask - - - Built-In-Self-Test Data bus fail mask - Built-In-Self-Test Data bus fail mask - - - Built-In-Self-Test memory fail first location - Built-In-Self-Test memory fail first location - - - Built-In-Self-Test memory fail last location - Built-In-Self-Test memory fail last location - - - Built-In-Self-Test memory map - Built-In-Self-Test memory map - - - Built-In-Self-Test memory error count - Built-In-Self-Test memory error count - - - App FSW image 1 checksum status - App FSW image 1 checksum status - - - App FSW image 2 checksum status - App FSW image 2 checksum status - - - Spare for alignment - Spare for alignment - - - Instrument ID - Instrument ID - - - Spare for alignment - Spare for alignment - - - CDH FPGA version - CDH FPGA version - - - High voltage limit plug status - High voltage limit plug status - - - High voltage disable plug status - High voltage disable plug status - - - Front panel door disable plug status - Front panel door disable plug status - - - Spare for alignment - Spare for alignment - - - System temperature monitor 1 - System temperature monitor 1 - - - System temperature monitor 2 - System temperature monitor 2 - - - System temperature monitor 3 - System temperature monitor 3 - - - LVPS temperature monitor 1 - LVPS temperature monitor 1 - - - LVPS temperature monitor 2 - LVPS temperature monitor 2 - - - LVPS temperature monitor 3 - LVPS temperature monitor 3 - - - LVPS voltage monitor 1 - LVPS voltage monitor 1 - - - LVPS voltage monitor 2 - LVPS voltage monitor 2 - - - LVPS voltage monitor 3 - LVPS voltage monitor 3 - - - LVPS voltage monitor 4 - LVPS voltage monitor 4 - - - LVPS voltage monitor 5 - LVPS voltage monitor 5 - - - LVPS current monitor 1 - LVPS current monitor 1 - - - LVPS current monitor 2 - LVPS current monitor 2 - - - LVPS current monitor 3 - LVPS current monitor 3 - - - LVPS current monitor 4 - LVPS current monitor 4 - - - LVPS current monitor 5 - LVPS current monitor 5 - - - CDH 1.5V voltage monitor - CDH 1.5V voltage monitor - - - CDH 1.8V voltage monitor - CDH 1.8V voltage monitor - - - CDH 3.3V voltage monitor - CDH 3.3V voltage monitor - - - CDH +12V voltage monitor - CDH +12V voltage monitor - - - CDH -12V voltage monitor - CDH -12V voltage monitor - - - CDH 5V voltage monitor - CDH 5V voltage monitor - - - CDH analog ref voltage monitor - CDH analog ref voltage monitor - - - CDH temperature 1 monitor - CDH temperature 1 monitor - - - CDH temperature 2 monitor - CDH temperature 2 monitor - - - CDH temperature 3 monitor - CDH temperature 3 monitor - - - CDH temperature 4 monitor - CDH temperature 4 monitor - - - Current operating mode - Current operating mode - - - Accepted commands count - Accepted commands count - - - Executed commands count - Executed commands count - - - Rejected commands count - Rejected commands count - - - Accepted command opcode - Accepted command opcode - - - Command result - Command result - - - ITF error counter - ITF error counter - - - 16-bit CRC checksum - 16-bit CRC checksum - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/imap_processing/lo/packet_definitions/P_ILO_BOOT_MEMDMP.xml b/imap_processing/lo/packet_definitions/P_ILO_BOOT_MEMDMP.xml deleted file mode 100644 index 6fc270443..000000000 --- a/imap_processing/lo/packet_definitions/P_ILO_BOOT_MEMDMP.xml +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CCSDS Packet Version Number (always 0) - - - CCSDS Packet Type Indicator (0=telemetry) - - - CCSDS Packet Secondary Header Flag (always 1) - - - CCSDS Packet Application Process ID - - - CCSDS Packet Grouping Flags (3=not part of group) - - - CCSDS Packet Sequence Count (increments with each new packet) - - - CCSDS Packet Length (number of bytes after Packet length minus 1) - - - CCSDS Secondary header, mission elapsed time - CCSDS Secondary header, mission elapsed time - - - Starting address of memory dump - Starting address of memory dump - - - Byte length - Byte length - - - Memory dump data - Memory dump data - - - 16-bit CRC checksum - 16-bit CRC checksum - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/imap_processing/lo/packet_definitions/P_ILO_DIAG_BULK_HVPS.xml b/imap_processing/lo/packet_definitions/P_ILO_DIAG_BULK_HVPS.xml deleted file mode 100644 index ab1af68d2..000000000 --- a/imap_processing/lo/packet_definitions/P_ILO_DIAG_BULK_HVPS.xml +++ /dev/null @@ -1,219 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CCSDS Packet Version Number (always 0) - - - CCSDS Packet Type Indicator (0=telemetry) - - - CCSDS Packet Secondary Header Flag (always 1) - - - CCSDS Packet Application Process ID - - - CCSDS Packet Grouping Flags (3=not part of group) - - - CCSDS Packet Sequence Count (increments with each new packet) - - - CCSDS Packet Length (number of bytes after Packet length minus 1) - - - CCSDS Secondary Header MET - CCSDS Secondary Header MET - - - ILO_DIAG_BULK_HVPS.VERSION_REG - ILO_DIAG_BULK_HVPS.VERSION_REG - - - ILO_DIAG_BULK_HVPS.STATUS_REG - ILO_DIAG_BULK_HVPS.STATUS_REG - - - ILO_DIAG_BULK_HVPS.GPO_REG - ILO_DIAG_BULK_HVPS.GPO_REG - - - ILO_DIAG_BULK_HVPS.DAC0_REG - ILO_DIAG_BULK_HVPS.DAC0_REG - - - ILO_DIAG_BULK_HVPS.DAC1_REG - ILO_DIAG_BULK_HVPS.DAC1_REG - - - ILO_DIAG_BULK_HVPS.DAC2_REG - ILO_DIAG_BULK_HVPS.DAC2_REG - - - ILO_DIAG_BULK_HVPS.DAC3_REG - ILO_DIAG_BULK_HVPS.DAC3_REG - - - ILO_DIAG_BULK_HVPS.DAC4_REG - ILO_DIAG_BULK_HVPS.DAC4_REG - - - ILO_DIAG_BULK_HVPS.ADC_CTRL_STATUS_REG - ILO_DIAG_BULK_HVPS.ADC_CTRL_STATUS_REG - - - ILO_DIAG_BULK_HVPS.ADC1_WAIT_CNT_REG - ILO_DIAG_BULK_HVPS.ADC1_WAIT_CNT_REG - - - ILO_DIAG_BULK_HVPS.ADC2_WAIT_CNT_REG - ILO_DIAG_BULK_HVPS.ADC2_WAIT_CNT_REG - - - ILO_DIAG_BULK_HVPS.HVPS_BULK_VMON - ILO_DIAG_BULK_HVPS.HVPS_BULK_VMON - - - ILO_DIAG_BULK_HVPS.U_NEG_VMON - ILO_DIAG_BULK_HVPS.U_NEG_VMON - - - ILO_DIAG_BULK_HVPS.U_POS_VMON - ILO_DIAG_BULK_HVPS.U_POS_VMON - - - ILO_DIAG_BULK_HVPS.DEF_NEG_VMON - ILO_DIAG_BULK_HVPS.DEF_NEG_VMON - - - ILO_DIAG_BULK_HVPS.DEF_POS_VMON - ILO_DIAG_BULK_HVPS.DEF_POS_VMON - - - ILO_DIAG_BULK_HVPS.PMT_VMON - ILO_DIAG_BULK_HVPS.PMT_VMON - - - ILO_DIAG_BULK_HVPS.PMT_IMON - ILO_DIAG_BULK_HVPS.PMT_IMON - - - ILO_DIAG_BULK_HVPS.BULK_IMON - ILO_DIAG_BULK_HVPS.BULK_IMON - - - ILO_DIAG_BULK_HVPS.DEF_NEG_IMON - ILO_DIAG_BULK_HVPS.DEF_NEG_IMON - - - ILO_DIAG_BULK_HVPS.DEF_POS_IMON - ILO_DIAG_BULK_HVPS.DEF_POS_IMON - - - ILO_DIAG_BULK_HVPS.REF1_VMON - ILO_DIAG_BULK_HVPS.REF1_VMON - - - ILO_DIAG_BULK_HVPS.REF2_VMON - ILO_DIAG_BULK_HVPS.REF2_VMON - - - ILO_DIAG_BULK_HVPS.P12P0_VMON - ILO_DIAG_BULK_HVPS.P12P0_VMON - - - ILO_DIAG_BULK_HVPS.N12P0_VMON - ILO_DIAG_BULK_HVPS.N12P0_VMON - - - ILO_DIAG_BULK_HVPS.P3P3_VMON - ILO_DIAG_BULK_HVPS.P3P3_VMON - - - ILO_DIAG_BULK_HVPS.P1P5_VMON - ILO_DIAG_BULK_HVPS.P1P5_VMON - - - 16-bit CRC checksum - 16-bit CRC checksum - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/imap_processing/lo/packet_definitions/P_ILO_DIAG_CDH.xml b/imap_processing/lo/packet_definitions/P_ILO_DIAG_CDH.xml deleted file mode 100644 index 9b2613378..000000000 --- a/imap_processing/lo/packet_definitions/P_ILO_DIAG_CDH.xml +++ /dev/null @@ -1,425 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CCSDS Packet Version Number (always 0) - - - CCSDS Packet Type Indicator (0=telemetry) - - - CCSDS Packet Secondary Header Flag (always 1) - - - CCSDS Packet Application Process ID - - - CCSDS Packet Grouping Flags (3=not part of group) - - - CCSDS Packet Sequence Count (increments with each new packet) - - - CCSDS Packet Length (number of bytes after Packet length minus 1) - - - CCSDS Secondary Header MET - - - CDH Control registers - Jumper - - - CDH Control registers - Reset - - - CDH Control registers - Watchdog - - - CDH Control registers - Control and Status (lower two bytes) - - - CDH Scratchpad registers - 1 - - - CDH Scratchpad registers - 2 - - - CDH CPU UART Clock Buad - - - CDH Tick Timers - Tick Timers Control and Status - - - CDH Tick Timers - Tick Timer n Reload Count - - - CDH Tick Timers - Tick Timer n Counter - - - CDH MET Control - MET Control - - - CDH MET Control - MET Status - - - CDH MET Control - MET Coarse Counter - - - CDH MET Control - MET Fine Counter - - - MDM25P_14_T - - - MDM25P_15_T - - - MDM25P_16_T - - - LO_T - - - HVPS_T - - - LVPS_12V_T - - - LVPS_5V_T - - - LVPS_3P3V_T - - - LVPS_3P3V - - - LVPS_5V - - - LVPS_N5V - - - LVPS_12V - - - LVPS_N12V - - - LVPS_3P3V_I - - - LVPS_5V_I - - - LVPS_N5V_I - - - LVPS_12V_I - - - LVPS_N12V_I - - - CDH_1P5V - - - CDH_1P8V - - - CDH_3P3V - - - CDH_12V - - - CDH_N12V - - - CDH_5V - - - CDH_5V_ADC - - - CDH_PROCESSOR_T - - - CDH_1P8V_LDO_T - - - CDH_1P5V_LDO_T - - - CDH_SDRAM_T - - - CDH ADC Control and Status - - - CDH Spacecraft Data Interface - Spacecraft Command FIFO Control and Status - - - CDH Spacecraft Data Interface - Spacecraft Telemetry FIFO Control and Status - - - CDH Interrupts - Interrupt Level - - - CDH Interrupts - Interrupt Pending - - - CDH Interrupts - Interrupt Enable - - - CDH Spin - Spin Enable and Status - - - CDH Spin - Spin Bin Period - - - CDH Spin - Spin Bin Index - - - CDH Spin - Spin Period - - - CDH Spin - Spin Period Timer - - - CDH Spin - Spin Period Timer at Next 1PPS - - - CDH Spin - Spin Time Stamp Seconds - - - CDH Spin - Spin Time Stamp Subseconds - - - CDH External Loopback - Loopback Control - - - CDH External Loopback - Loopback Status - - - CDH External Loopback - Loopback Transmit - - - CDH External Loopback - Loopback Receive - - - CDH Discrete IO - - - CDH Heater Control - Heater Control - - - CDH Heater Control - Heater Status - - - CDH Instrument Power Control - Instrument Power Control - - - CDH Instrument Power Control - Instrument Power Status - - - ILO_DIAG_CDH.IFB_INTERFACE_CTRL_STATUS_REG - - - ILO_DIAG_CDH.IFB_INTERFACE_CMD_REG - - - ILO_DIAG_CDH.IFB_ADC_TLM_STATUS_REG - - - ILO_DIAG_CDH.IFB_REG_TLM_STATUS_REG - - - ILO_DIAG_CDH.TOF_INTERFACE_STATUS_REG - - - ILO_DIAG_CDH.DE_TIME_TAG_RESOLUTION_REG - - - ILO_DIAG_CDH.DE_TIME_TAG_CTRL_STATUS_REG - - - ILO_DIAG_CDH.DE_FIFO_CTRL_STATUS_REG - - - ILO_DIAG_CDH.FEE_RESET_STATUS_REG - - - ILO_DIAG_CDH.FEE_RESET_CMD_REG - - - ILO_DIAG_CDH.FEE_RESET_DURATION_REG - - - ILO_DIAG_CDH.SPIN_PULSE_DURATION_REG - - - ILO_DIAG_CDH.HVPS_CTRL_REG - - - ILO_DIAG_CDH.HVPS_STATUS_REG - - - ILO_DIAG_CDH.HVPS_CMD_REG - - - ILO_DIAG_CDH.PIVOT_INTERFACE_CTRL_REG - - - ILO_DIAG_CDH.PIVOT_INTERFACE_STATUS_REG - - - ILO_DIAG_CDH.PIVOT_CMD_DATA_REG - - - ILO_DIAG_CDH.PIVOT_CMD_OPCODE_REG - - - 16-bit CRC checksum - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/imap_processing/lo/packet_definitions/P_ILO_DIAG_IFB.xml b/imap_processing/lo/packet_definitions/P_ILO_DIAG_IFB.xml deleted file mode 100644 index 155ac3fe2..000000000 --- a/imap_processing/lo/packet_definitions/P_ILO_DIAG_IFB.xml +++ /dev/null @@ -1,431 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CCSDS Packet Version Number (always 0) - - - CCSDS Packet Type Indicator (0=telemetry) - - - CCSDS Packet Secondary Header Flag (always 1) - - - CCSDS Packet Application Process ID - - - CCSDS Packet Grouping Flags (3=not part of group) - - - CCSDS Packet Sequence Count (increments with each new packet) - - - CCSDS Packet Length (number of bytes after Packet length minus 1) - - - CCSDS Secondary Header MET - CCSDS Secondary Header MET - - - spare - spare - - - IFB Command register write error - A set bit indicates that an attempt was made to write to the IFB Command register when the -interface was not ready to accept new commands. The bit is cleared by a write of ‘1’ to the bit -location. An attempted write may compromise previously written command. - - - spare - spare - - - ILO Interface is enabled - A set bit indicates that the LO Interface is enabled. A clear bit puts the interface in the reset -state and could be used as a soft reset for the interface logic. - - - spare - spare - - - IFB register data interface status packet received - IFB register data interface status packet received - - - spare - spare - - - IFB register data interface status time out error - IFB register data interface status time out error - - - IFB register data interface status ID error - IFB register data interface status ID error - - - IFB register data interface status framing error - IFB register data interface status framing error - - - spare - spare - - - Star sensor FIFOunderflow flag - Star sensor FIFOunderflow flag - - - Star sensor FIFO overflow flag - Star sensor FIFO overflow flag - - - Star sensor FIFO full flag - Star sensor FIFO full flag - - - Star sensor FIFO half-full flag - Star sensor FIFO half-full flag - - - Star sensor FIFO emplty flag - Star sensor FIFO emplty flag - - - spare - spare - - - Valid packet received - Valid packet received - - - spare - spare - - - Entire packet has not been received within a 1 ms window - Entire packet has not been received within a 1 ms window - - - Packet with an incorrect ID has been received - Packet with an incorrect ID has been received - - - Framing error detected - Framing error detected - - - FPGA version (hard-coded constant) - FPGA version (hard-coded constant) - - - spare - spare - - - Status of HV disable plug signal - Status of HV disable plug signal - - - Status of HV limit signal - Status of HV limit signal - - - Status of IFB jumper field - Status of IFB jumper field - - - Roll over counter of every command received - Roll over counter of every command received - - - spare - spare - - - Selects the auxiliary ADC internal 8-channel mux input - Selects the auxiliary ADC internal 8-channel mux input - - - 1' to deassert adc_sclk and adc_cs_n signals. '0' for normal ADC operation - '1' to deassert adc_sclk and adc_cs_n signals. '0' for normal ADC operation. - - - '1' to select oscope mode. '0' for normal operation. - '1' to select oscope mode. '0' for normal operation. - - - Spin_pulse synchronization from ICE - 1' to synchronize IFB ADC Telemetry to spin_pulse from ICE. '0' to ignore state of spin_pulse. - - - IFB ADC and REG Telemetry to ICE enable - '1' to enable IFB ADC and REG Telemetry to ICE. '0' to disable IFB ADC and REG Telemetry to ICE. - - - Sets the IFB ADC telemetry primary cadence interval - Sets the IFB ADC telemetry primary cadence interval - - - 11' to disable TOF HVPS sync clock - 11' to disable TOF HVPS sync clock - - - 11' to enable PAC HV Supply - 11' to enable PAC HV Supply - - - 11' to enable MCP HV Supply - 11' to enable MCP HV Supply - - - 11' to enable TOF Board LV Supply - 11' to enable TOF Board LV Supply - - - 11' to disable TOF HVPS sync clock - 11' to disable TOF HVPS sync clock - - - 11' to enable PAC HV Supply - 11' to enable PAC HV Supply - - - 11' to enable MCP HV Supply - 11' to enable MCP HV Supply - - - 11' to enable TOF Board LV Supply - 11' to enable TOF Board LV Supply - - - Enables 5V reference to PAC HV supply - Enables 5V reference to PAC HV supply - - - Enables 5V reference to PAC HV supply - Enables 5V reference to PAC HV supply - - - Enables 5V reference to MCP HV supply - Enables 5V reference to MCP HV supply - - - Enables 5V reference to MCP HV supply - Enables 5V reference to MCP HV supply - - - Star sensor offset adjust - Star sensor offset adjust - - - Oscope channel 1 ADC channel select - Oscope channel 1 ADC channel select - - - Oscope channel 0 ADC channel select - Oscope channel 0 ADC channel select - - - - IFB temperature (hot spot between FPGA and 2.5V regulator) - IFB temperature (hot spot between FPGA and 2.5V regulator) - - - IFB temperature (cold spot at board corner between J1 and J2) - IFB temperature (cold spot at board corner between J1 and J2) - - - IFB +5V voltage monitor - IFB +5V voltage monitor - - - IFB +3.3V voltage monitor - IFB +3.3V voltage monitor - - - IFB +12V voltage monitor - IFB +12V voltage monitor - - - IFB -12V voltage monitor - IFB -12V voltage monitor - - - LV supply primary side current - LV supply primary side current - - - LV supply primary side voltage - LV supply primary side voltage - - - LV temperature - LV temperature - - - MCP primary side current - MCP primary side current - - - MCP primary side voltage - MCP primary side voltage - - - MCP temperature - MCP temperature - - - PAC primary side current - PAC primary side current - - - PAC primary side voltage - PAC primary side voltage - - - PAC temperature - PAC temperature - - - spare - spare - - - packet checksum - packet checksum - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/imap_processing/lo/packet_definitions/P_ILO_DIAG_PCC.xml b/imap_processing/lo/packet_definitions/P_ILO_DIAG_PCC.xml deleted file mode 100644 index b1f65c5fe..000000000 --- a/imap_processing/lo/packet_definitions/P_ILO_DIAG_PCC.xml +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CCSDS Packet Version Number (always 0) - - - CCSDS Packet Type Indicator (0=telemetry) - - - CCSDS Packet Secondary Header Flag (always 1) - - - CCSDS Packet Application Process ID - - - CCSDS Packet Grouping Flags (3=not part of group) - - - CCSDS Packet Sequence Count (increments with each new packet) - - - CCSDS Packet Length (number of bytes after Packet length minus 1) - - - CCSDS Secondary Header MET - CCSDS Secondary Header MET - - - Primary motor coarse pot - Primary motor coarse pot - - - Primary motor fine pot - Primary motor fine pot - - - Redundant motor coarse pot - Redundant motor coarse pot - - - Redundant motor fine pot - Redundant motor fine pot - - - Actuator temperature - Actuator temperature - - - PCC Board temperature - PCC Board temperature - - - Primary motor current - Primary motor current - - - Redundant motor current - Redundant motor current - - - Cummulative step count - Cumulative Step Count (Primary) - - - Cumulative step count sign enumeration - 0x2B = Positive -0x2D = Negative - - - Cummulative step count - Cumulative Step Count (Redundant) - - - Cumulative step count sign enumeration - 0x2B = Positive -0x2D = Negative - - - Primary motor axis countdown counter - Primary motor axis countdown counter - - - Redundant motor axis countdown counter - Redundant motor axis countdown counter - - - Current setpoint value - 0x31 = 500ma -0x32 = 600ma -0x33 = 700ma -0x34 = 800ma -0x35 = 900ma -0x36 = 1000ma -0x37 = 1500ma -0x38 = 2000ma - - - Current setpoint value - 0x31 = 500ma -0x32 = 600ma -0x33 = 700ma -0x34 = 800ma -0x35 = 900ma -0x36 = 1000ma -0x37 = 1500ma -0x38 = 2000ma - - - PCC Status Byte - PCC Status Byte - - - ILO_DIAG_PCC.SPARE - ILO_DIAG_PCC.SPARE - - - 16-bit CRC checksum - 16-bit CRC checksum - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/imap_processing/lo/packet_definitions/P_ILO_DIAG_TOF_BD.xml b/imap_processing/lo/packet_definitions/P_ILO_DIAG_TOF_BD.xml deleted file mode 100644 index 2f3c58ea1..000000000 --- a/imap_processing/lo/packet_definitions/P_ILO_DIAG_TOF_BD.xml +++ /dev/null @@ -1,349 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CCSDS Packet Version Number (always 0) - - - CCSDS Packet Type Indicator (0=telemetry) - - - CCSDS Packet Secondary Header Flag (always 1) - - - CCSDS Packet Application Process ID - - - CCSDS Packet Grouping Flags (3=not part of group) - - - CCSDS Packet Sequence Count (increments with each new packet) - - - CCSDS Packet Length (number of bytes after Packet length minus 1) - - - CCSDS Secondary Header MET - - - Spare - Spare - - - A set bit indicates that a packet has been received over the TOF interface - A set bit indicates that a packet has been received over the TOF interface - - - A set bit indicates that a valid TOF packet containing ADC data has been received - A set bit indicates that a valid TOF packet containing ADC data has been received - - - A set bit indicates that a valid TOF register packet has been received - A set bit indicates that a valid TOF register packet has been received - - - A set bit indicates that a valid TOF rate count packet has been received - A set bit indicates that a valid TOF rate count packet has been received - - - A set bit indicates that a valid TOF direct event packet has been received - A set bit indicates that a valid TOF direct event packet has been received - - - Spare - Spare - - - A set bit indicates that entire packet has not been received within a 1 ms window - A set bit indicates that entire packet has not been received within a 1 ms window - - - A set bit indicates that a packet with an incorrect ID has been received - A set bit indicates that a packet with an incorrect ID has been received - - - A set bit indicates that a framing error has been detected - Sets anonde threshold - - - A TOF Board 6-bit cmd_error counter resides in the TOF Board FPGA and is incremented with the -occurrence of a greater than 1ms timeout between a potential address/data pair. The counter rolls-over -and is only reset at power up. The counter resides in the tof_id 0x80 TOF Board Telemetry packet. - A TOF Board 6-bit cmd_error counter resides in the TOF Board FPGA and is incremented with the -occurrence of a greater than 1ms timeout between a potential address/data pair. The counter rolls-over -and is only reset at power up. The counter resides in the tof_id 0x80 TOF Board Telemetry packet. - - - TOF Board Constant Fraction Discriminator monitor - TOF Board Constant Fraction Discriminator monitor - - - TOF Board preamp temperature - TOF Board preamp temperature - - - TOF Board regulator temperature - TOF Board regulator temperature - - - TOF Board monitor of MCP Current - TOF Board monitor of MCP Current - - - TOF Board monitor of MCP Voltage - TOF Board monitor of MCP Voltage - - - TOF Board current monitor - TOF Board current monitor - - - TOF Board +5V voltage monitor - TOF Board +5V voltage monitor - - - TOF Board +6V voltage monitor - TOF Board +6V voltage monitor - - - Sets anode A threshold - Sets anonde threshold - - - Sets anode B0 threshold - Sets anonde threshold - - - Sets anode B3 threshold - Sets anonde threshold - - - Sets anode C threshold - Sets anonde threshold - - - 1' to enable TOF Board Telemetry to ICE. '0' to disable all TOF Board Telemetry to ICE. - 1' to enable TOF Board Telemetry to ICE. '0' to disable all TOF Board Telemetry to ICE. - - - 1' to enable TOF Board Direct Event Telemetry to ICE. '0' to disable all TOF Board Direct Event Telemetry to ICE - 1' to enable TOF Board Direct Event Telemetry to ICE. '0' to disable all TOF Board Direct Event Telemetry to ICE - - - Spare - Spare - - - If tof_reqd bit = '1' then the tof chip must have valid time-of-flight for a Direct Event to be processed - If tof_reqd bit = '1' then the tof chip must have valid time-of-flight for a Direct Event to be processed - - - If tof_reqd bit = '1' then the tof chip must have valid time-of-flight for a Direct Event to be processed - If tof_reqd bit = '1' then the tof chip must have valid time-of-flight for a Direct Event to be processed - - - If tof_reqd bit = '1' then the tof chip must have valid time-of-flight for a Direct Event to be processed - If tof_reqd bit = '1' then the tof chip must have valid time-of-flight for a Direct Event to be processed - - - If tof_reqd bit = '1' then the tof chip must have valid time-of-flight for a Direct Event to be processed - If tof_reqd bit = '1' then the tof chip must have valid time-of-flight for a Direct Event to be processed - - - 1' to enable anode C stimulation - '1' to enable anode stimulation - - - '1" to generate a "start" pulse. '0' to generate a "stop" pulse. - '1" to generate a "start" pulse. '0' to generate a "stop" pulse. - - - 1' to enable anode B3 stimulation - '1' to enable anode stimulation - - - '1" to generate a "start" pulse. '0' to generate a "stop" pulse. - '1" to generate a "start" pulse. '0' to generate a "stop" pulse. - - - 1' to enable anode B0 stimulation - '1' to enable anode stimulation - - - '1" to generate a "start" pulse. '0' to generate a "stop" pulse. - '1" to generate a "start" pulse. '0' to generate a "stop" pulse. - - - 1' to enable anode A stimulation - '1' to enable anode stimulation - - - '1" to generate a "start" pulse. '0' to generate a "stop" pulse. - '1" to generate a "start" pulse. '0' to generate a "stop" pulse. - - - Sets stimulation frequency - Sets stimulation frequency -stim freq [events/s] = stim_freq reg value + 1 0x0 = 1event/s 0x8 = 9events/s 0xF = 16events/s - - - Sets time-of-flight - Sets time-of-flight -stim delay [ns] = stim_delay reg value * 20.8ns 0x0 = 0ns 0x8 = 166.4ns 0xF = 312ns - - - TOF3 values greater than the registered value are suppressed from further processing - TOF3 values greater than the registered value are suppressed from further processing - - - TOF2 values greater than the registered value are suppressed from further processing - TOF2 values greater than the registered value are suppressed from further processing - - - TOF1 values greater than the registered value are suppressed from further processing - TOF1 values greater than the registered value are suppressed from further processing - - - TOF0 values greater than the registered value are suppressed from further processing - TOF0 values greater than the registered value are suppressed from further processing - - - Spare - Spare - - - TOF3 alone vetoed when enabled - TOF3 alone vetoed when enabled - - - TOF2 alone vetoed when enabled - TOF2 alone vetoed when enabled - - - TOF1 alone vetoed when enabled - TOF1 alone vetoed when enabled - - - TOF0 alone vetoed when enabled - TOF0 alone vetoed when enabled - - - Checksum - Checksum - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/imap_processing/lo/packet_definitions/P_ILO_EVTMSG.xml b/imap_processing/lo/packet_definitions/P_ILO_EVTMSG.xml deleted file mode 100644 index db53ac4ee..000000000 --- a/imap_processing/lo/packet_definitions/P_ILO_EVTMSG.xml +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CCSDS Packet Version Number (always 0) - - - CCSDS Packet Type Indicator (0=telemetry) - - - CCSDS Packet Secondary Header Flag (always 1) - - - CCSDS Packet Application Process ID - - - CCSDS Packet Grouping Flags (3=not part of group) - - - CCSDS Packet Sequence Count (increments with each new packet) - - - CCSDS Packet Length (number of bytes after Packet length minus 1) - - - CCSDS Secondary Header MET - CCSDS Secondary Header MET - - - Number of queued event messages - Number of queued event messages - - - Event time seconds - Event time seconds - - - Event time subseconds - Event time subseconds - - - Event ID - Describes an unusual or unexpected occurrence, completion of a required action, or a one-time informative packet - - - Event parameter 1 - Parameter describing error depends on error code - - - Event parameter 2 - Parameter describing error depends on error code - - - Event parameter 3 - Parameter describing error depends on error code - - - Event parameter 4 - Parameter describing error depends on error code - - - Event parameter 5 - Parameter describing error depends on error code - - - Event parameter 6 - Parameter describing error depends on error code - - - Event parameter 7 - Parameter describing error depends on error code - - - Event parameter 8 - Parameter describing error depends on error code - - - Event parameter 9 - Parameter describing error depends on error code - - - 16-bit CRC checksum - 16-bit CRC checksum - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/imap_processing/lo/packet_definitions/P_ILO_MEMDMP.xml b/imap_processing/lo/packet_definitions/P_ILO_MEMDMP.xml deleted file mode 100644 index c01d1cb7f..000000000 --- a/imap_processing/lo/packet_definitions/P_ILO_MEMDMP.xml +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CCSDS Packet Version Number (always 0) - - - CCSDS Packet Type Indicator (0=telemetry) - - - CCSDS Packet Secondary Header Flag (always 1) - - - CCSDS Packet Application Process ID - - - CCSDS Packet Grouping Flags (3=not part of group) - - - CCSDS Packet Sequence Count (increments with each new packet) - - - CCSDS Packet Length (number of bytes after Packet length minus 1) - - - CCSDS Secondary header, mission elapsed time - CCSDS Secondary header, mission elapsed time - - - Starting address of memory dump - Starting address of memory dump - - - Data length - Data length - - - Memory dump data - Memory dump data - - - 16-bit CRC checksum - 16-bit CRC checksum - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/imap_processing/lo/packet_definitions/P_ILO_RAW_CNT.xml b/imap_processing/lo/packet_definitions/P_ILO_RAW_CNT.xml deleted file mode 100644 index dc597ee2a..000000000 --- a/imap_processing/lo/packet_definitions/P_ILO_RAW_CNT.xml +++ /dev/null @@ -1,435 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CCSDS Packet Version Number (always 0) - - - CCSDS Packet Type Indicator (0=telemetry) - - - CCSDS Packet Secondary Header Flag (always 1) - - - CCSDS Packet Application Process ID - - - CCSDS Packet Grouping Flags (3=not part of group) - - - CCSDS Packet Sequence Count (increments with each new packet) - - - CCSDS Packet Length (number of bytes after Packet length minus 1) - - - CCSDS Secondary Header MET - CCSDS Secondary Header MET - - - Mission Elapsed Time subsecond - Mission Elapsed Time subsecond, recorded every spin bin - - - Electron, anode A, single - Electron, anode A, single - -[16 bits]x[6 azimuth] - - - Electron, anode C, single - Electron, anode C, single - -[16 bits]x[6 azimuth] - - - Ion, anode B0, single - Ion, anode B0, single - -[16 bits]x[6 azimuth] - - - Ion, anode B3, single - Ion, anode B3, single - -[16 bits]x[6 azimuth] - - - Electron anode A / Ion anode B0, TOF0 - Electron anode A / Ion anode B0, TOF0 - -[16 bits]x[6 azimuth] - - - Electron anode C / Ion anode B3, TOF1 - Electron anode C / Ion anode B3, TOF1 - -[16 bits]x[6 azimuth] - - - Electron anode A / Ion anode C, TOF2 - Electron anode A / Ion anode C, TOF2 - -[16 bits]x[6 azimuth] - - - Ion anode B0 / Ion anode B3, TOF3 - Ion anode B0 / Ion anode B3, TOF3 - -[16 bits]x[6 azimuth] - - - Subsector 0 triples accumulation time - Subsector 0 triples accumulation time - - - Subsector 1 triples accumulation time - Subsector 1 triples accumulation time - - - Subsector 2 triples accumulation time - Subsector 2 triples accumulation time - - - Subsector 3 triples accumulation time - Subsector 3 triples accumulation time - - - Subsector 4 triples accumulation time - Subsector 4 triples accumulation time - - - Subsector 5 triples accumulation time - Subsector 5 triples accumulation time - - - Subsector 6 triples accumulation time - Subsector 6 triples accumulation time - - - Subsector 7 triples accumulation time - Subsector 7 triples accumulation time - - - Subsector 8 triples accumulation time - Subsector 8 triples accumulation time - - - Subsector 9 triples accumulation time - Subsector 9 triples accumulation time - - - Subsector 0 TOF0 (AB0) & TOF1 (CB3) - Subsector 0 TOF0 (AB0) & TOF1 (CB3) - - - Subsector 1 TOF0 (AB0) & TOF1 (CB3) - Subsector 1 TOF0 (AB0) & TOF1 (CB3) - - - Subsector 2 TOF0 (AB0) & TOF1 (CB3) - Subsector 2 TOF0 (AB0) & TOF1 (CB3) - - - Subsector 3 TOF0 (AB0) & TOF1 (CB3) - Subsector 3 TOF0 (AB0) & TOF1 (CB3) - - - Subsector 4 TOF0 (AB0) & TOF1 (CB3) - Subsector 4 TOF0 (AB0) & TOF1 (CB3) - - - Subsector 5 TOF0 (AB0) & TOF1 (CB3) - Subsector 5 TOF0 (AB0) & TOF1 (CB3) - - - Subsector 6 TOF0 (AB0) & TOF1 (CB3) - Subsector 6 TOF0 (AB0) & TOF1 (CB3) - - - Subsector 7 TOF0 (AB0) & TOF1 (CB3) - Subsector 7 TOF0 (AB0) & TOF1 (CB3) - - - Subsector 8 TOF0 (AB0) & TOF1 (CB3) - Subsector 8 TOF0 (AB0) & TOF1 (CB3) - - - Subsector 9 TOF0 (AB0) & TOF1 (CB3) - Subsector 9 TOF0 (AB0) & TOF1 (CB3) - - - Subsector 0 TOF0 (AB0) & TOF2 (AC) - Subsector 0 TOF0 (AB0) & TOF2 (AC) - - - Subsector 1 TOF0 (AB0) & TOF2 (AC) - Subsector 1 TOF0 (AB0) & TOF2 (AC) - - - Subsector 2 TOF0 (AB0) & TOF2 (AC) - Subsector 2 TOF0 (AB0) & TOF2 (AC) - - - Subsector 3 TOF0 (AB0) & TOF2 (AC) - Subsector 3 TOF0 (AB0) & TOF2 (AC) - - - Subsector 4 TOF0 (AB0) & TOF2 (AC) - Subsector 4 TOF0 (AB0) & TOF2 (AC) - - - Subsector 5 TOF0 (AB0) & TOF2 (AC) - Subsector 5 TOF0 (AB0) & TOF2 (AC) - - - Subsector 6 TOF0 (AB0) & TOF2 (AC) - Subsector 6 TOF0 (AB0) & TOF2 (AC) - - - Subsector 7 TOF0 (AB0) & TOF2 (AC) - Subsector 7 TOF0 (AB0) & TOF2 (AC) - - - Subsector 8 TOF0 (AB0) & TOF2 (AC) - Subsector 8 TOF0 (AB0) & TOF2 (AC) - - - Subsector 9 TOF0 (AB0) & TOF2 (AC) - Subsector 9 TOF0 (AB0) & TOF2 (AC) - - - Subsector 0 TOF1 (CB3) & TOF2 (AC) - Subsector 0 TOF1 (CB3) & TOF2 (AC) - - - Subsector 1 TOF1 (CB3) & TOF2 (AC) - Subsector 1 TOF1 (CB3) & TOF2 (AC) - - - Subsector 2 TOF1 (CB3) & TOF2 (AC) - Subsector 2 TOF1 (CB3) & TOF2 (AC) - - - Subsector 3 TOF1 (CB3) & TOF2 (AC) - Subsector 3 TOF1 (CB3) & TOF2 (AC) - - - Subsector 4 TOF1 (CB3) & TOF2 (AC) - Subsector 4 TOF1 (CB3) & TOF2 (AC) - - - Subsector 5 TOF1 (CB3) & TOF2 (AC) - Subsector 5 TOF1 (CB3) & TOF2 (AC) - - - Subsector 6 TOF1 (CB3) & TOF2 (AC) - Subsector 6 TOF1 (CB3) & TOF2 (AC) - - - Subsector 7 TOF1 (CB3) & TOF2 (AC) - Subsector 7 TOF1 (CB3) & TOF2 (AC) - - - Subsector 8 TOF1 (CB3) & TOF2 (AC) - Subsector 8 TOF1 (CB3) & TOF2 (AC) - - - Subsector 9 TOF1 (CB3) & TOF2 (AC) - Subsector 9 TOF1 (CB3) & TOF2 (AC) - - - Subsector 0 TOF0 (AB0) & TOF1 (CB3) & TOF2 (AC) & TOF3 (B0B3) - Subsector 0 TOF0 (AB0) & TOF1 (CB3) & TOF2 (AC) & TOF3 (B0B3) - - - Subsector 1 TOF0 (AB0) & TOF1 (CB3) & TOF2 (AC) & TOF3 (B0B3) - Subsector 1 TOF0 (AB0) & TOF1 (CB3) & TOF2 (AC) & TOF3 (B0B3) - - - Subsector 2 TOF0 (AB0) & TOF1 (CB3) & TOF2 (AC) & TOF3 (B0B3) - Subsector 2 TOF0 (AB0) & TOF1 (CB3) & TOF2 (AC) & TOF3 (B0B3) - - - Subsector 3 TOF0 (AB0) & TOF1 (CB3) & TOF2 (AC) & TOF3 (B0B3) - Subsector 3 TOF0 (AB0) & TOF1 (CB3) & TOF2 (AC) & TOF3 (B0B3) - - - Subsector 4 TOF0 (AB0) & TOF1 (CB3) & TOF2 (AC) & TOF3 (B0B3) - Subsector 4 TOF0 (AB0) & TOF1 (CB3) & TOF2 (AC) & TOF3 (B0B3) - - - Subsector 5 TOF0 (AB0) & TOF1 (CB3) & TOF2 (AC) & TOF3 (B0B3) - Subsector 5 TOF0 (AB0) & TOF1 (CB3) & TOF2 (AC) & TOF3 (B0B3) - - - Subsector 6 TOF0 (AB0) & TOF1 (CB3) & TOF2 (AC) & TOF3 (B0B3) - Subsector 6 TOF0 (AB0) & TOF1 (CB3) & TOF2 (AC) & TOF3 (B0B3) - - - Subsector 7 TOF0 (AB0) & TOF1 (CB3) & TOF2 (AC) & TOF3 (B0B3) - Subsector 7 TOF0 (AB0) & TOF1 (CB3) & TOF2 (AC) & TOF3 (B0B3) - - - Subsector 8 TOF0 (AB0) & TOF1 (CB3) & TOF2 (AC) & TOF3 (B0B3) - Subsector 8 TOF0 (AB0) & TOF1 (CB3) & TOF2 (AC) & TOF3 (B0B3) - - - Subsector 9 TOF0 (AB0) & TOF1 (CB3) & TOF2 (AC) & TOF3 (B0B3) - Subsector 9 TOF0 (AB0) & TOF1 (CB3) & TOF2 (AC) & TOF3 (B0B3) - - - TOF0 value less than TOF0 threshold setting - TOF0 value less than TOF0 threshold setting -[16 bits]x[6 azimuth] - - - TOF1 value less than TOF1 threshold setting - TOF1 value less than TOF1 threshold setting -[16 bits]x[6 azimuth] - - - TOF2 value less than TOF2 threshold setting - TOF2 value less than TOF2 threshold setting - - -[16 bits]x[6 azimuth] - - - TOF3 value less than TOF3 threshold setting - TOF3 value less than TOF3 threshold setting - -[16 bits]x[6 azimuth] - - - PAC Voltage - PAC Voltage - - - MCP Voltage - MCP Voltage - - - 16-bit CRC checksum - 16-bit CRC checksum - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/imap_processing/lo/packet_definitions/P_ILO_RAW_DE.xml b/imap_processing/lo/packet_definitions/P_ILO_RAW_DE.xml deleted file mode 100644 index 03f6f73e0..000000000 --- a/imap_processing/lo/packet_definitions/P_ILO_RAW_DE.xml +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 20480 - - - - - - - CCSDS Packet Version Number (always 0) - - - CCSDS Packet Type Indicator (0=telemetry) - - - CCSDS Packet Secondary Header Flag (always 1) - - - CCSDS Packet Application Process ID - - - CCSDS Packet Grouping Flags (3=not part of group) - - - CCSDS Packet Sequence Count (increments with each new packet) - - - CCSDS Packet Length (number of bytes after Packet length minus 1) - - - CCSDS Secondary Header MET - CCSDS Secondary Header MET - - - TOF HVPS PAC voltage - TOF HVPS PAC voltage - - - TOF HVPS MCP voltage - TOF HVPS MCP voltage - - - Number of events in packet - Number of events in packet - - - RAW DE Data - - - 16-bit CRC checksum - 16-bit CRC checksum - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/imap_processing/lo/packet_definitions/P_ILO_RAW_STAR.xml b/imap_processing/lo/packet_definitions/P_ILO_RAW_STAR.xml deleted file mode 100644 index 4eeca4318..000000000 --- a/imap_processing/lo/packet_definitions/P_ILO_RAW_STAR.xml +++ /dev/null @@ -1,5212 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CCSDS Packet Version Number (always 0) - - - CCSDS Packet Type Indicator (0=telemetry) - - - CCSDS Packet Secondary Header Flag (always 1) - - - CCSDS Packet Application Process ID - - - CCSDS Packet Grouping Flags (3=not part of group) - - - CCSDS Packet Sequence Count (increments with each new packet) - - - CCSDS Packet Length (number of bytes after Packet length minus 1) - - - CCSDS Secondary Header MET - CCSDS Secondary Header MET - - - Number of star sensor samples - Number of star sensor samples - - - Star Sensor FIFO Data raw 12 bit index 0 - Star Sensor FIFO Data raw 12 bit index 0 - - - Star Sensor FIFO Data raw 12 bit index 1 - Star Sensor FIFO Data raw 12 bit index 1 - - - Star Sensor FIFO Data raw 12 bit index 2 - Star Sensor FIFO Data raw 12 bit index 2 - - - Star Sensor FIFO Data raw 12 bit index 3 - Star Sensor FIFO Data raw 12 bit index 3 - - - Star Sensor FIFO Data raw 12 bit index 4 - Star Sensor FIFO Data raw 12 bit index 4 - - - Star Sensor FIFO Data raw 12 bit index 5 - Star Sensor FIFO Data raw 12 bit index 5 - - - Star Sensor FIFO Data raw 12 bit index 6 - Star Sensor FIFO Data raw 12 bit index 6 - - - Star Sensor FIFO Data raw 12 bit index 7 - Star Sensor FIFO Data raw 12 bit index 7 - - - Star Sensor FIFO Data raw 12 bit index 8 - Star Sensor FIFO Data raw 12 bit index 8 - - - Star Sensor FIFO Data raw 12 bit index 9 - Star Sensor FIFO Data raw 12 bit index 9 - - - Star Sensor FIFO Data raw 12 bit index 10 - Star Sensor FIFO Data raw 12 bit index 10 - - - Star Sensor FIFO Data raw 12 bit index 11 - Star Sensor FIFO Data raw 12 bit index 11 - - - Star Sensor FIFO Data raw 12 bit index 12 - Star Sensor FIFO Data raw 12 bit index 12 - - - Star Sensor FIFO Data raw 12 bit index 13 - Star Sensor FIFO Data raw 12 bit index 13 - - - Star Sensor FIFO Data raw 12 bit index 14 - Star Sensor FIFO Data raw 12 bit index 14 - - - Star Sensor FIFO Data raw 12 bit index 15 - Star Sensor FIFO Data raw 12 bit index 15 - - - Star Sensor FIFO Data raw 12 bit index 16 - Star Sensor FIFO Data raw 12 bit index 16 - - - Star Sensor FIFO Data raw 12 bit index 17 - Star Sensor FIFO Data raw 12 bit index 17 - - - Star Sensor FIFO Data raw 12 bit index 18 - Star Sensor FIFO Data raw 12 bit index 18 - - - Star Sensor FIFO Data raw 12 bit index 19 - Star Sensor FIFO Data raw 12 bit index 19 - - - Star Sensor FIFO Data raw 12 bit index 20 - Star Sensor FIFO Data raw 12 bit index 20 - - - Star Sensor FIFO Data raw 12 bit index 21 - Star Sensor FIFO Data raw 12 bit index 21 - - - Star Sensor FIFO Data raw 12 bit index 22 - Star Sensor FIFO Data raw 12 bit index 22 - - - Star Sensor FIFO Data raw 12 bit index 23 - Star Sensor FIFO Data raw 12 bit index 23 - - - Star Sensor FIFO Data raw 12 bit index 24 - Star Sensor FIFO Data raw 12 bit index 24 - - - Star Sensor FIFO Data raw 12 bit index 25 - Star Sensor FIFO Data raw 12 bit index 25 - - - Star Sensor FIFO Data raw 12 bit index 26 - Star Sensor FIFO Data raw 12 bit index 26 - - - Star Sensor FIFO Data raw 12 bit index 27 - Star Sensor FIFO Data raw 12 bit index 27 - - - Star Sensor FIFO Data raw 12 bit index 28 - Star Sensor FIFO Data raw 12 bit index 28 - - - Star Sensor FIFO Data raw 12 bit index 29 - Star Sensor FIFO Data raw 12 bit index 29 - - - Star Sensor FIFO Data raw 12 bit index 30 - Star Sensor FIFO Data raw 12 bit index 30 - - - Star Sensor FIFO Data raw 12 bit index 31 - Star Sensor FIFO Data raw 12 bit index 31 - - - Star Sensor FIFO Data raw 12 bit index 32 - Star Sensor FIFO Data raw 12 bit index 32 - - - Star Sensor FIFO Data raw 12 bit index 33 - Star Sensor FIFO Data raw 12 bit index 33 - - - Star Sensor FIFO Data raw 12 bit index 34 - Star Sensor FIFO Data raw 12 bit index 34 - - - Star Sensor FIFO Data raw 12 bit index 35 - Star Sensor FIFO Data raw 12 bit index 35 - - - Star Sensor FIFO Data raw 12 bit index 36 - Star Sensor FIFO Data raw 12 bit index 36 - - - Star Sensor FIFO Data raw 12 bit index 37 - Star Sensor FIFO Data raw 12 bit index 37 - - - Star Sensor FIFO Data raw 12 bit index 38 - Star Sensor FIFO Data raw 12 bit index 38 - - - Star Sensor FIFO Data raw 12 bit index 39 - Star Sensor FIFO Data raw 12 bit index 39 - - - Star Sensor FIFO Data raw 12 bit index 40 - Star Sensor FIFO Data raw 12 bit index 40 - - - Star Sensor FIFO Data raw 12 bit index 41 - Star Sensor FIFO Data raw 12 bit index 41 - - - Star Sensor FIFO Data raw 12 bit index 42 - Star Sensor FIFO Data raw 12 bit index 42 - - - Star Sensor FIFO Data raw 12 bit index 43 - Star Sensor FIFO Data raw 12 bit index 43 - - - Star Sensor FIFO Data raw 12 bit index 44 - Star Sensor FIFO Data raw 12 bit index 44 - - - Star Sensor FIFO Data raw 12 bit index 45 - Star Sensor FIFO Data raw 12 bit index 45 - - - Star Sensor FIFO Data raw 12 bit index 46 - Star Sensor FIFO Data raw 12 bit index 46 - - - Star Sensor FIFO Data raw 12 bit index 47 - Star Sensor FIFO Data raw 12 bit index 47 - - - Star Sensor FIFO Data raw 12 bit index 48 - Star Sensor FIFO Data raw 12 bit index 48 - - - Star Sensor FIFO Data raw 12 bit index 49 - Star Sensor FIFO Data raw 12 bit index 49 - - - Star Sensor FIFO Data raw 12 bit index 50 - Star Sensor FIFO Data raw 12 bit index 50 - - - Star Sensor FIFO Data raw 12 bit index 51 - Star Sensor FIFO Data raw 12 bit index 51 - - - Star Sensor FIFO Data raw 12 bit index 52 - Star Sensor FIFO Data raw 12 bit index 52 - - - Star Sensor FIFO Data raw 12 bit index 53 - Star Sensor FIFO Data raw 12 bit index 53 - - - Star Sensor FIFO Data raw 12 bit index 54 - Star Sensor FIFO Data raw 12 bit index 54 - - - Star Sensor FIFO Data raw 12 bit index 55 - Star Sensor FIFO Data raw 12 bit index 55 - - - Star Sensor FIFO Data raw 12 bit index 56 - Star Sensor FIFO Data raw 12 bit index 56 - - - Star Sensor FIFO Data raw 12 bit index 57 - Star Sensor FIFO Data raw 12 bit index 57 - - - Star Sensor FIFO Data raw 12 bit index 58 - Star Sensor FIFO Data raw 12 bit index 58 - - - Star Sensor FIFO Data raw 12 bit index 59 - Star Sensor FIFO Data raw 12 bit index 59 - - - Star Sensor FIFO Data raw 12 bit index 60 - Star Sensor FIFO Data raw 12 bit index 60 - - - Star Sensor FIFO Data raw 12 bit index 61 - Star Sensor FIFO Data raw 12 bit index 61 - - - Star Sensor FIFO Data raw 12 bit index 62 - Star Sensor FIFO Data raw 12 bit index 62 - - - Star Sensor FIFO Data raw 12 bit index 63 - Star Sensor FIFO Data raw 12 bit index 63 - - - Star Sensor FIFO Data raw 12 bit index 64 - Star Sensor FIFO Data raw 12 bit index 64 - - - Star Sensor FIFO Data raw 12 bit index 65 - Star Sensor FIFO Data raw 12 bit index 65 - - - Star Sensor FIFO Data raw 12 bit index 66 - Star Sensor FIFO Data raw 12 bit index 66 - - - Star Sensor FIFO Data raw 12 bit index 67 - Star Sensor FIFO Data raw 12 bit index 67 - - - Star Sensor FIFO Data raw 12 bit index 68 - Star Sensor FIFO Data raw 12 bit index 68 - - - Star Sensor FIFO Data raw 12 bit index 69 - Star Sensor FIFO Data raw 12 bit index 69 - - - Star Sensor FIFO Data raw 12 bit index 70 - Star Sensor FIFO Data raw 12 bit index 70 - - - Star Sensor FIFO Data raw 12 bit index 71 - Star Sensor FIFO Data raw 12 bit index 71 - - - Star Sensor FIFO Data raw 12 bit index 72 - Star Sensor FIFO Data raw 12 bit index 72 - - - Star Sensor FIFO Data raw 12 bit index 73 - Star Sensor FIFO Data raw 12 bit index 73 - - - Star Sensor FIFO Data raw 12 bit index 74 - Star Sensor FIFO Data raw 12 bit index 74 - - - Star Sensor FIFO Data raw 12 bit index 75 - Star Sensor FIFO Data raw 12 bit index 75 - - - Star Sensor FIFO Data raw 12 bit index 76 - Star Sensor FIFO Data raw 12 bit index 76 - - - Star Sensor FIFO Data raw 12 bit index 77 - Star Sensor FIFO Data raw 12 bit index 77 - - - Star Sensor FIFO Data raw 12 bit index 78 - Star Sensor FIFO Data raw 12 bit index 78 - - - Star Sensor FIFO Data raw 12 bit index 79 - Star Sensor FIFO Data raw 12 bit index 79 - - - Star Sensor FIFO Data raw 12 bit index 80 - Star Sensor FIFO Data raw 12 bit index 80 - - - Star Sensor FIFO Data raw 12 bit index 81 - Star Sensor FIFO Data raw 12 bit index 81 - - - Star Sensor FIFO Data raw 12 bit index 82 - Star Sensor FIFO Data raw 12 bit index 82 - - - Star Sensor FIFO Data raw 12 bit index 83 - Star Sensor FIFO Data raw 12 bit index 83 - - - Star Sensor FIFO Data raw 12 bit index 84 - Star Sensor FIFO Data raw 12 bit index 84 - - - Star Sensor FIFO Data raw 12 bit index 85 - Star Sensor FIFO Data raw 12 bit index 85 - - - Star Sensor FIFO Data raw 12 bit index 86 - Star Sensor FIFO Data raw 12 bit index 86 - - - Star Sensor FIFO Data raw 12 bit index 87 - Star Sensor FIFO Data raw 12 bit index 87 - - - Star Sensor FIFO Data raw 12 bit index 88 - Star Sensor FIFO Data raw 12 bit index 88 - - - Star Sensor FIFO Data raw 12 bit index 89 - Star Sensor FIFO Data raw 12 bit index 89 - - - Star Sensor FIFO Data raw 12 bit index 90 - Star Sensor FIFO Data raw 12 bit index 90 - - - Star Sensor FIFO Data raw 12 bit index 91 - Star Sensor FIFO Data raw 12 bit index 91 - - - Star Sensor FIFO Data raw 12 bit index 92 - Star Sensor FIFO Data raw 12 bit index 92 - - - Star Sensor FIFO Data raw 12 bit index 93 - Star Sensor FIFO Data raw 12 bit index 93 - - - Star Sensor FIFO Data raw 12 bit index 94 - Star Sensor FIFO Data raw 12 bit index 94 - - - Star Sensor FIFO Data raw 12 bit index 95 - Star Sensor FIFO Data raw 12 bit index 95 - - - Star Sensor FIFO Data raw 12 bit index 96 - Star Sensor FIFO Data raw 12 bit index 96 - - - Star Sensor FIFO Data raw 12 bit index 97 - Star Sensor FIFO Data raw 12 bit index 97 - - - Star Sensor FIFO Data raw 12 bit index 98 - Star Sensor FIFO Data raw 12 bit index 98 - - - Star Sensor FIFO Data raw 12 bit index 99 - Star Sensor FIFO Data raw 12 bit index 99 - - - Star Sensor FIFO Data raw 12 bit index 100 - Star Sensor FIFO Data raw 12 bit index 100 - - - Star Sensor FIFO Data raw 12 bit index 101 - Star Sensor FIFO Data raw 12 bit index 101 - - - Star Sensor FIFO Data raw 12 bit index 102 - Star Sensor FIFO Data raw 12 bit index 102 - - - Star Sensor FIFO Data raw 12 bit index 103 - Star Sensor FIFO Data raw 12 bit index 103 - - - Star Sensor FIFO Data raw 12 bit index 104 - Star Sensor FIFO Data raw 12 bit index 104 - - - Star Sensor FIFO Data raw 12 bit index 105 - Star Sensor FIFO Data raw 12 bit index 105 - - - Star Sensor FIFO Data raw 12 bit index 106 - Star Sensor FIFO Data raw 12 bit index 106 - - - Star Sensor FIFO Data raw 12 bit index 107 - Star Sensor FIFO Data raw 12 bit index 107 - - - Star Sensor FIFO Data raw 12 bit index 108 - Star Sensor FIFO Data raw 12 bit index 108 - - - Star Sensor FIFO Data raw 12 bit index 109 - Star Sensor FIFO Data raw 12 bit index 109 - - - Star Sensor FIFO Data raw 12 bit index 110 - Star Sensor FIFO Data raw 12 bit index 110 - - - Star Sensor FIFO Data raw 12 bit index 111 - Star Sensor FIFO Data raw 12 bit index 111 - - - Star Sensor FIFO Data raw 12 bit index 112 - Star Sensor FIFO Data raw 12 bit index 112 - - - Star Sensor FIFO Data raw 12 bit index 113 - Star Sensor FIFO Data raw 12 bit index 113 - - - Star Sensor FIFO Data raw 12 bit index 114 - Star Sensor FIFO Data raw 12 bit index 114 - - - Star Sensor FIFO Data raw 12 bit index 115 - Star Sensor FIFO Data raw 12 bit index 115 - - - Star Sensor FIFO Data raw 12 bit index 116 - Star Sensor FIFO Data raw 12 bit index 116 - - - Star Sensor FIFO Data raw 12 bit index 117 - Star Sensor FIFO Data raw 12 bit index 117 - - - Star Sensor FIFO Data raw 12 bit index 118 - Star Sensor FIFO Data raw 12 bit index 118 - - - Star Sensor FIFO Data raw 12 bit index 119 - Star Sensor FIFO Data raw 12 bit index 119 - - - Star Sensor FIFO Data raw 12 bit index 120 - Star Sensor FIFO Data raw 12 bit index 120 - - - Star Sensor FIFO Data raw 12 bit index 121 - Star Sensor FIFO Data raw 12 bit index 121 - - - Star Sensor FIFO Data raw 12 bit index 122 - Star Sensor FIFO Data raw 12 bit index 122 - - - Star Sensor FIFO Data raw 12 bit index 123 - Star Sensor FIFO Data raw 12 bit index 123 - - - Star Sensor FIFO Data raw 12 bit index 124 - Star Sensor FIFO Data raw 12 bit index 124 - - - Star Sensor FIFO Data raw 12 bit index 125 - Star Sensor FIFO Data raw 12 bit index 125 - - - Star Sensor FIFO Data raw 12 bit index 126 - Star Sensor FIFO Data raw 12 bit index 126 - - - Star Sensor FIFO Data raw 12 bit index 127 - Star Sensor FIFO Data raw 12 bit index 127 - - - Star Sensor FIFO Data raw 12 bit index 128 - Star Sensor FIFO Data raw 12 bit index 128 - - - Star Sensor FIFO Data raw 12 bit index 129 - Star Sensor FIFO Data raw 12 bit index 129 - - - Star Sensor FIFO Data raw 12 bit index 130 - Star Sensor FIFO Data raw 12 bit index 130 - - - Star Sensor FIFO Data raw 12 bit index 131 - Star Sensor FIFO Data raw 12 bit index 131 - - - Star Sensor FIFO Data raw 12 bit index 132 - Star Sensor FIFO Data raw 12 bit index 132 - - - Star Sensor FIFO Data raw 12 bit index 133 - Star Sensor FIFO Data raw 12 bit index 133 - - - Star Sensor FIFO Data raw 12 bit index 134 - Star Sensor FIFO Data raw 12 bit index 134 - - - Star Sensor FIFO Data raw 12 bit index 135 - Star Sensor FIFO Data raw 12 bit index 135 - - - Star Sensor FIFO Data raw 12 bit index 136 - Star Sensor FIFO Data raw 12 bit index 136 - - - Star Sensor FIFO Data raw 12 bit index 137 - Star Sensor FIFO Data raw 12 bit index 137 - - - Star Sensor FIFO Data raw 12 bit index 138 - Star Sensor FIFO Data raw 12 bit index 138 - - - Star Sensor FIFO Data raw 12 bit index 139 - Star Sensor FIFO Data raw 12 bit index 139 - - - Star Sensor FIFO Data raw 12 bit index 140 - Star Sensor FIFO Data raw 12 bit index 140 - - - Star Sensor FIFO Data raw 12 bit index 141 - Star Sensor FIFO Data raw 12 bit index 141 - - - Star Sensor FIFO Data raw 12 bit index 142 - Star Sensor FIFO Data raw 12 bit index 142 - - - Star Sensor FIFO Data raw 12 bit index 143 - Star Sensor FIFO Data raw 12 bit index 143 - - - Star Sensor FIFO Data raw 12 bit index 144 - Star Sensor FIFO Data raw 12 bit index 144 - - - Star Sensor FIFO Data raw 12 bit index 145 - Star Sensor FIFO Data raw 12 bit index 145 - - - Star Sensor FIFO Data raw 12 bit index 146 - Star Sensor FIFO Data raw 12 bit index 146 - - - Star Sensor FIFO Data raw 12 bit index 147 - Star Sensor FIFO Data raw 12 bit index 147 - - - Star Sensor FIFO Data raw 12 bit index 148 - Star Sensor FIFO Data raw 12 bit index 148 - - - Star Sensor FIFO Data raw 12 bit index 149 - Star Sensor FIFO Data raw 12 bit index 149 - - - Star Sensor FIFO Data raw 12 bit index 150 - Star Sensor FIFO Data raw 12 bit index 150 - - - Star Sensor FIFO Data raw 12 bit index 151 - Star Sensor FIFO Data raw 12 bit index 151 - - - Star Sensor FIFO Data raw 12 bit index 152 - Star Sensor FIFO Data raw 12 bit index 152 - - - Star Sensor FIFO Data raw 12 bit index 153 - Star Sensor FIFO Data raw 12 bit index 153 - - - Star Sensor FIFO Data raw 12 bit index 154 - Star Sensor FIFO Data raw 12 bit index 154 - - - Star Sensor FIFO Data raw 12 bit index 155 - Star Sensor FIFO Data raw 12 bit index 155 - - - Star Sensor FIFO Data raw 12 bit index 156 - Star Sensor FIFO Data raw 12 bit index 156 - - - Star Sensor FIFO Data raw 12 bit index 157 - Star Sensor FIFO Data raw 12 bit index 157 - - - Star Sensor FIFO Data raw 12 bit index 158 - Star Sensor FIFO Data raw 12 bit index 158 - - - Star Sensor FIFO Data raw 12 bit index 159 - Star Sensor FIFO Data raw 12 bit index 159 - - - Star Sensor FIFO Data raw 12 bit index 160 - Star Sensor FIFO Data raw 12 bit index 160 - - - Star Sensor FIFO Data raw 12 bit index 161 - Star Sensor FIFO Data raw 12 bit index 161 - - - Star Sensor FIFO Data raw 12 bit index 162 - Star Sensor FIFO Data raw 12 bit index 162 - - - Star Sensor FIFO Data raw 12 bit index 163 - Star Sensor FIFO Data raw 12 bit index 163 - - - Star Sensor FIFO Data raw 12 bit index 164 - Star Sensor FIFO Data raw 12 bit index 164 - - - Star Sensor FIFO Data raw 12 bit index 165 - Star Sensor FIFO Data raw 12 bit index 165 - - - Star Sensor FIFO Data raw 12 bit index 166 - Star Sensor FIFO Data raw 12 bit index 166 - - - Star Sensor FIFO Data raw 12 bit index 167 - Star Sensor FIFO Data raw 12 bit index 167 - - - Star Sensor FIFO Data raw 12 bit index 168 - Star Sensor FIFO Data raw 12 bit index 168 - - - Star Sensor FIFO Data raw 12 bit index 169 - Star Sensor FIFO Data raw 12 bit index 169 - - - Star Sensor FIFO Data raw 12 bit index 170 - Star Sensor FIFO Data raw 12 bit index 170 - - - Star Sensor FIFO Data raw 12 bit index 171 - Star Sensor FIFO Data raw 12 bit index 171 - - - Star Sensor FIFO Data raw 12 bit index 172 - Star Sensor FIFO Data raw 12 bit index 172 - - - Star Sensor FIFO Data raw 12 bit index 173 - Star Sensor FIFO Data raw 12 bit index 173 - - - Star Sensor FIFO Data raw 12 bit index 174 - Star Sensor FIFO Data raw 12 bit index 174 - - - Star Sensor FIFO Data raw 12 bit index 175 - Star Sensor FIFO Data raw 12 bit index 175 - - - Star Sensor FIFO Data raw 12 bit index 176 - Star Sensor FIFO Data raw 12 bit index 176 - - - Star Sensor FIFO Data raw 12 bit index 177 - Star Sensor FIFO Data raw 12 bit index 177 - - - Star Sensor FIFO Data raw 12 bit index 178 - Star Sensor FIFO Data raw 12 bit index 178 - - - Star Sensor FIFO Data raw 12 bit index 179 - Star Sensor FIFO Data raw 12 bit index 179 - - - Star Sensor FIFO Data raw 12 bit index 180 - Star Sensor FIFO Data raw 12 bit index 180 - - - Star Sensor FIFO Data raw 12 bit index 181 - Star Sensor FIFO Data raw 12 bit index 181 - - - Star Sensor FIFO Data raw 12 bit index 182 - Star Sensor FIFO Data raw 12 bit index 182 - - - Star Sensor FIFO Data raw 12 bit index 183 - Star Sensor FIFO Data raw 12 bit index 183 - - - Star Sensor FIFO Data raw 12 bit index 184 - Star Sensor FIFO Data raw 12 bit index 184 - - - Star Sensor FIFO Data raw 12 bit index 185 - Star Sensor FIFO Data raw 12 bit index 185 - - - Star Sensor FIFO Data raw 12 bit index 186 - Star Sensor FIFO Data raw 12 bit index 186 - - - Star Sensor FIFO Data raw 12 bit index 187 - Star Sensor FIFO Data raw 12 bit index 187 - - - Star Sensor FIFO Data raw 12 bit index 188 - Star Sensor FIFO Data raw 12 bit index 188 - - - Star Sensor FIFO Data raw 12 bit index 189 - Star Sensor FIFO Data raw 12 bit index 189 - - - Star Sensor FIFO Data raw 12 bit index 190 - Star Sensor FIFO Data raw 12 bit index 190 - - - Star Sensor FIFO Data raw 12 bit index 191 - Star Sensor FIFO Data raw 12 bit index 191 - - - Star Sensor FIFO Data raw 12 bit index 192 - Star Sensor FIFO Data raw 12 bit index 192 - - - Star Sensor FIFO Data raw 12 bit index 193 - Star Sensor FIFO Data raw 12 bit index 193 - - - Star Sensor FIFO Data raw 12 bit index 194 - Star Sensor FIFO Data raw 12 bit index 194 - - - Star Sensor FIFO Data raw 12 bit index 195 - Star Sensor FIFO Data raw 12 bit index 195 - - - Star Sensor FIFO Data raw 12 bit index 196 - Star Sensor FIFO Data raw 12 bit index 196 - - - Star Sensor FIFO Data raw 12 bit index 197 - Star Sensor FIFO Data raw 12 bit index 197 - - - Star Sensor FIFO Data raw 12 bit index 198 - Star Sensor FIFO Data raw 12 bit index 198 - - - Star Sensor FIFO Data raw 12 bit index 199 - Star Sensor FIFO Data raw 12 bit index 199 - - - Star Sensor FIFO Data raw 12 bit index 200 - Star Sensor FIFO Data raw 12 bit index 200 - - - Star Sensor FIFO Data raw 12 bit index 201 - Star Sensor FIFO Data raw 12 bit index 201 - - - Star Sensor FIFO Data raw 12 bit index 202 - Star Sensor FIFO Data raw 12 bit index 202 - - - Star Sensor FIFO Data raw 12 bit index 203 - Star Sensor FIFO Data raw 12 bit index 203 - - - Star Sensor FIFO Data raw 12 bit index 204 - Star Sensor FIFO Data raw 12 bit index 204 - - - Star Sensor FIFO Data raw 12 bit index 205 - Star Sensor FIFO Data raw 12 bit index 205 - - - Star Sensor FIFO Data raw 12 bit index 206 - Star Sensor FIFO Data raw 12 bit index 206 - - - Star Sensor FIFO Data raw 12 bit index 207 - Star Sensor FIFO Data raw 12 bit index 207 - - - Star Sensor FIFO Data raw 12 bit index 208 - Star Sensor FIFO Data raw 12 bit index 208 - - - Star Sensor FIFO Data raw 12 bit index 209 - Star Sensor FIFO Data raw 12 bit index 209 - - - Star Sensor FIFO Data raw 12 bit index 210 - Star Sensor FIFO Data raw 12 bit index 210 - - - Star Sensor FIFO Data raw 12 bit index 211 - Star Sensor FIFO Data raw 12 bit index 211 - - - Star Sensor FIFO Data raw 12 bit index 212 - Star Sensor FIFO Data raw 12 bit index 212 - - - Star Sensor FIFO Data raw 12 bit index 213 - Star Sensor FIFO Data raw 12 bit index 213 - - - Star Sensor FIFO Data raw 12 bit index 214 - Star Sensor FIFO Data raw 12 bit index 214 - - - Star Sensor FIFO Data raw 12 bit index 215 - Star Sensor FIFO Data raw 12 bit index 215 - - - Star Sensor FIFO Data raw 12 bit index 216 - Star Sensor FIFO Data raw 12 bit index 216 - - - Star Sensor FIFO Data raw 12 bit index 217 - Star Sensor FIFO Data raw 12 bit index 217 - - - Star Sensor FIFO Data raw 12 bit index 218 - Star Sensor FIFO Data raw 12 bit index 218 - - - Star Sensor FIFO Data raw 12 bit index 219 - Star Sensor FIFO Data raw 12 bit index 219 - - - Star Sensor FIFO Data raw 12 bit index 220 - Star Sensor FIFO Data raw 12 bit index 220 - - - Star Sensor FIFO Data raw 12 bit index 221 - Star Sensor FIFO Data raw 12 bit index 221 - - - Star Sensor FIFO Data raw 12 bit index 222 - Star Sensor FIFO Data raw 12 bit index 222 - - - Star Sensor FIFO Data raw 12 bit index 223 - Star Sensor FIFO Data raw 12 bit index 223 - - - Star Sensor FIFO Data raw 12 bit index 224 - Star Sensor FIFO Data raw 12 bit index 224 - - - Star Sensor FIFO Data raw 12 bit index 225 - Star Sensor FIFO Data raw 12 bit index 225 - - - Star Sensor FIFO Data raw 12 bit index 226 - Star Sensor FIFO Data raw 12 bit index 226 - - - Star Sensor FIFO Data raw 12 bit index 227 - Star Sensor FIFO Data raw 12 bit index 227 - - - Star Sensor FIFO Data raw 12 bit index 228 - Star Sensor FIFO Data raw 12 bit index 228 - - - Star Sensor FIFO Data raw 12 bit index 229 - Star Sensor FIFO Data raw 12 bit index 229 - - - Star Sensor FIFO Data raw 12 bit index 230 - Star Sensor FIFO Data raw 12 bit index 230 - - - Star Sensor FIFO Data raw 12 bit index 231 - Star Sensor FIFO Data raw 12 bit index 231 - - - Star Sensor FIFO Data raw 12 bit index 232 - Star Sensor FIFO Data raw 12 bit index 232 - - - Star Sensor FIFO Data raw 12 bit index 233 - Star Sensor FIFO Data raw 12 bit index 233 - - - Star Sensor FIFO Data raw 12 bit index 234 - Star Sensor FIFO Data raw 12 bit index 234 - - - Star Sensor FIFO Data raw 12 bit index 235 - Star Sensor FIFO Data raw 12 bit index 235 - - - Star Sensor FIFO Data raw 12 bit index 236 - Star Sensor FIFO Data raw 12 bit index 236 - - - Star Sensor FIFO Data raw 12 bit index 237 - Star Sensor FIFO Data raw 12 bit index 237 - - - Star Sensor FIFO Data raw 12 bit index 238 - Star Sensor FIFO Data raw 12 bit index 238 - - - Star Sensor FIFO Data raw 12 bit index 239 - Star Sensor FIFO Data raw 12 bit index 239 - - - Star Sensor FIFO Data raw 12 bit index 240 - Star Sensor FIFO Data raw 12 bit index 240 - - - Star Sensor FIFO Data raw 12 bit index 241 - Star Sensor FIFO Data raw 12 bit index 241 - - - Star Sensor FIFO Data raw 12 bit index 242 - Star Sensor FIFO Data raw 12 bit index 242 - - - Star Sensor FIFO Data raw 12 bit index 243 - Star Sensor FIFO Data raw 12 bit index 243 - - - Star Sensor FIFO Data raw 12 bit index 244 - Star Sensor FIFO Data raw 12 bit index 244 - - - Star Sensor FIFO Data raw 12 bit index 245 - Star Sensor FIFO Data raw 12 bit index 245 - - - Star Sensor FIFO Data raw 12 bit index 246 - Star Sensor FIFO Data raw 12 bit index 246 - - - Star Sensor FIFO Data raw 12 bit index 247 - Star Sensor FIFO Data raw 12 bit index 247 - - - Star Sensor FIFO Data raw 12 bit index 248 - Star Sensor FIFO Data raw 12 bit index 248 - - - Star Sensor FIFO Data raw 12 bit index 249 - Star Sensor FIFO Data raw 12 bit index 249 - - - Star Sensor FIFO Data raw 12 bit index 250 - Star Sensor FIFO Data raw 12 bit index 250 - - - Star Sensor FIFO Data raw 12 bit index 251 - Star Sensor FIFO Data raw 12 bit index 251 - - - Star Sensor FIFO Data raw 12 bit index 252 - Star Sensor FIFO Data raw 12 bit index 252 - - - Star Sensor FIFO Data raw 12 bit index 253 - Star Sensor FIFO Data raw 12 bit index 253 - - - Star Sensor FIFO Data raw 12 bit index 254 - Star Sensor FIFO Data raw 12 bit index 254 - - - Star Sensor FIFO Data raw 12 bit index 255 - Star Sensor FIFO Data raw 12 bit index 255 - - - Star Sensor FIFO Data raw 12 bit index 256 - Star Sensor FIFO Data raw 12 bit index 256 - - - Star Sensor FIFO Data raw 12 bit index 257 - Star Sensor FIFO Data raw 12 bit index 257 - - - Star Sensor FIFO Data raw 12 bit index 258 - Star Sensor FIFO Data raw 12 bit index 258 - - - Star Sensor FIFO Data raw 12 bit index 259 - Star Sensor FIFO Data raw 12 bit index 259 - - - Star Sensor FIFO Data raw 12 bit index 260 - Star Sensor FIFO Data raw 12 bit index 260 - - - Star Sensor FIFO Data raw 12 bit index 261 - Star Sensor FIFO Data raw 12 bit index 261 - - - Star Sensor FIFO Data raw 12 bit index 262 - Star Sensor FIFO Data raw 12 bit index 262 - - - Star Sensor FIFO Data raw 12 bit index 263 - Star Sensor FIFO Data raw 12 bit index 263 - - - Star Sensor FIFO Data raw 12 bit index 264 - Star Sensor FIFO Data raw 12 bit index 264 - - - Star Sensor FIFO Data raw 12 bit index 265 - Star Sensor FIFO Data raw 12 bit index 265 - - - Star Sensor FIFO Data raw 12 bit index 266 - Star Sensor FIFO Data raw 12 bit index 266 - - - Star Sensor FIFO Data raw 12 bit index 267 - Star Sensor FIFO Data raw 12 bit index 267 - - - Star Sensor FIFO Data raw 12 bit index 268 - Star Sensor FIFO Data raw 12 bit index 268 - - - Star Sensor FIFO Data raw 12 bit index 269 - Star Sensor FIFO Data raw 12 bit index 269 - - - Star Sensor FIFO Data raw 12 bit index 270 - Star Sensor FIFO Data raw 12 bit index 270 - - - Star Sensor FIFO Data raw 12 bit index 271 - Star Sensor FIFO Data raw 12 bit index 271 - - - Star Sensor FIFO Data raw 12 bit index 272 - Star Sensor FIFO Data raw 12 bit index 272 - - - Star Sensor FIFO Data raw 12 bit index 273 - Star Sensor FIFO Data raw 12 bit index 273 - - - Star Sensor FIFO Data raw 12 bit index 274 - Star Sensor FIFO Data raw 12 bit index 274 - - - Star Sensor FIFO Data raw 12 bit index 275 - Star Sensor FIFO Data raw 12 bit index 275 - - - Star Sensor FIFO Data raw 12 bit index 276 - Star Sensor FIFO Data raw 12 bit index 276 - - - Star Sensor FIFO Data raw 12 bit index 277 - Star Sensor FIFO Data raw 12 bit index 277 - - - Star Sensor FIFO Data raw 12 bit index 278 - Star Sensor FIFO Data raw 12 bit index 278 - - - Star Sensor FIFO Data raw 12 bit index 279 - Star Sensor FIFO Data raw 12 bit index 279 - - - Star Sensor FIFO Data raw 12 bit index 280 - Star Sensor FIFO Data raw 12 bit index 280 - - - Star Sensor FIFO Data raw 12 bit index 281 - Star Sensor FIFO Data raw 12 bit index 281 - - - Star Sensor FIFO Data raw 12 bit index 282 - Star Sensor FIFO Data raw 12 bit index 282 - - - Star Sensor FIFO Data raw 12 bit index 283 - Star Sensor FIFO Data raw 12 bit index 283 - - - Star Sensor FIFO Data raw 12 bit index 284 - Star Sensor FIFO Data raw 12 bit index 284 - - - Star Sensor FIFO Data raw 12 bit index 285 - Star Sensor FIFO Data raw 12 bit index 285 - - - Star Sensor FIFO Data raw 12 bit index 286 - Star Sensor FIFO Data raw 12 bit index 286 - - - Star Sensor FIFO Data raw 12 bit index 287 - Star Sensor FIFO Data raw 12 bit index 287 - - - Star Sensor FIFO Data raw 12 bit index 288 - Star Sensor FIFO Data raw 12 bit index 288 - - - Star Sensor FIFO Data raw 12 bit index 289 - Star Sensor FIFO Data raw 12 bit index 289 - - - Star Sensor FIFO Data raw 12 bit index 290 - Star Sensor FIFO Data raw 12 bit index 290 - - - Star Sensor FIFO Data raw 12 bit index 291 - Star Sensor FIFO Data raw 12 bit index 291 - - - Star Sensor FIFO Data raw 12 bit index 292 - Star Sensor FIFO Data raw 12 bit index 292 - - - Star Sensor FIFO Data raw 12 bit index 293 - Star Sensor FIFO Data raw 12 bit index 293 - - - Star Sensor FIFO Data raw 12 bit index 294 - Star Sensor FIFO Data raw 12 bit index 294 - - - Star Sensor FIFO Data raw 12 bit index 295 - Star Sensor FIFO Data raw 12 bit index 295 - - - Star Sensor FIFO Data raw 12 bit index 296 - Star Sensor FIFO Data raw 12 bit index 296 - - - Star Sensor FIFO Data raw 12 bit index 297 - Star Sensor FIFO Data raw 12 bit index 297 - - - Star Sensor FIFO Data raw 12 bit index 298 - Star Sensor FIFO Data raw 12 bit index 298 - - - Star Sensor FIFO Data raw 12 bit index 299 - Star Sensor FIFO Data raw 12 bit index 299 - - - Star Sensor FIFO Data raw 12 bit index 300 - Star Sensor FIFO Data raw 12 bit index 300 - - - Star Sensor FIFO Data raw 12 bit index 301 - Star Sensor FIFO Data raw 12 bit index 301 - - - Star Sensor FIFO Data raw 12 bit index 302 - Star Sensor FIFO Data raw 12 bit index 302 - - - Star Sensor FIFO Data raw 12 bit index 303 - Star Sensor FIFO Data raw 12 bit index 303 - - - Star Sensor FIFO Data raw 12 bit index 304 - Star Sensor FIFO Data raw 12 bit index 304 - - - Star Sensor FIFO Data raw 12 bit index 305 - Star Sensor FIFO Data raw 12 bit index 305 - - - Star Sensor FIFO Data raw 12 bit index 306 - Star Sensor FIFO Data raw 12 bit index 306 - - - Star Sensor FIFO Data raw 12 bit index 307 - Star Sensor FIFO Data raw 12 bit index 307 - - - Star Sensor FIFO Data raw 12 bit index 308 - Star Sensor FIFO Data raw 12 bit index 308 - - - Star Sensor FIFO Data raw 12 bit index 309 - Star Sensor FIFO Data raw 12 bit index 309 - - - Star Sensor FIFO Data raw 12 bit index 310 - Star Sensor FIFO Data raw 12 bit index 310 - - - Star Sensor FIFO Data raw 12 bit index 311 - Star Sensor FIFO Data raw 12 bit index 311 - - - Star Sensor FIFO Data raw 12 bit index 312 - Star Sensor FIFO Data raw 12 bit index 312 - - - Star Sensor FIFO Data raw 12 bit index 313 - Star Sensor FIFO Data raw 12 bit index 313 - - - Star Sensor FIFO Data raw 12 bit index 314 - Star Sensor FIFO Data raw 12 bit index 314 - - - Star Sensor FIFO Data raw 12 bit index 315 - Star Sensor FIFO Data raw 12 bit index 315 - - - Star Sensor FIFO Data raw 12 bit index 316 - Star Sensor FIFO Data raw 12 bit index 316 - - - Star Sensor FIFO Data raw 12 bit index 317 - Star Sensor FIFO Data raw 12 bit index 317 - - - Star Sensor FIFO Data raw 12 bit index 318 - Star Sensor FIFO Data raw 12 bit index 318 - - - Star Sensor FIFO Data raw 12 bit index 319 - Star Sensor FIFO Data raw 12 bit index 319 - - - Star Sensor FIFO Data raw 12 bit index 320 - Star Sensor FIFO Data raw 12 bit index 320 - - - Star Sensor FIFO Data raw 12 bit index 321 - Star Sensor FIFO Data raw 12 bit index 321 - - - Star Sensor FIFO Data raw 12 bit index 322 - Star Sensor FIFO Data raw 12 bit index 322 - - - Star Sensor FIFO Data raw 12 bit index 323 - Star Sensor FIFO Data raw 12 bit index 323 - - - Star Sensor FIFO Data raw 12 bit index 324 - Star Sensor FIFO Data raw 12 bit index 324 - - - Star Sensor FIFO Data raw 12 bit index 325 - Star Sensor FIFO Data raw 12 bit index 325 - - - Star Sensor FIFO Data raw 12 bit index 326 - Star Sensor FIFO Data raw 12 bit index 326 - - - Star Sensor FIFO Data raw 12 bit index 327 - Star Sensor FIFO Data raw 12 bit index 327 - - - Star Sensor FIFO Data raw 12 bit index 328 - Star Sensor FIFO Data raw 12 bit index 328 - - - Star Sensor FIFO Data raw 12 bit index 329 - Star Sensor FIFO Data raw 12 bit index 329 - - - Star Sensor FIFO Data raw 12 bit index 330 - Star Sensor FIFO Data raw 12 bit index 330 - - - Star Sensor FIFO Data raw 12 bit index 331 - Star Sensor FIFO Data raw 12 bit index 331 - - - Star Sensor FIFO Data raw 12 bit index 332 - Star Sensor FIFO Data raw 12 bit index 332 - - - Star Sensor FIFO Data raw 12 bit index 333 - Star Sensor FIFO Data raw 12 bit index 333 - - - Star Sensor FIFO Data raw 12 bit index 334 - Star Sensor FIFO Data raw 12 bit index 334 - - - Star Sensor FIFO Data raw 12 bit index 335 - Star Sensor FIFO Data raw 12 bit index 335 - - - Star Sensor FIFO Data raw 12 bit index 336 - Star Sensor FIFO Data raw 12 bit index 336 - - - Star Sensor FIFO Data raw 12 bit index 337 - Star Sensor FIFO Data raw 12 bit index 337 - - - Star Sensor FIFO Data raw 12 bit index 338 - Star Sensor FIFO Data raw 12 bit index 338 - - - Star Sensor FIFO Data raw 12 bit index 339 - Star Sensor FIFO Data raw 12 bit index 339 - - - Star Sensor FIFO Data raw 12 bit index 340 - Star Sensor FIFO Data raw 12 bit index 340 - - - Star Sensor FIFO Data raw 12 bit index 341 - Star Sensor FIFO Data raw 12 bit index 341 - - - Star Sensor FIFO Data raw 12 bit index 342 - Star Sensor FIFO Data raw 12 bit index 342 - - - Star Sensor FIFO Data raw 12 bit index 343 - Star Sensor FIFO Data raw 12 bit index 343 - - - Star Sensor FIFO Data raw 12 bit index 344 - Star Sensor FIFO Data raw 12 bit index 344 - - - Star Sensor FIFO Data raw 12 bit index 345 - Star Sensor FIFO Data raw 12 bit index 345 - - - Star Sensor FIFO Data raw 12 bit index 346 - Star Sensor FIFO Data raw 12 bit index 346 - - - Star Sensor FIFO Data raw 12 bit index 347 - Star Sensor FIFO Data raw 12 bit index 347 - - - Star Sensor FIFO Data raw 12 bit index 348 - Star Sensor FIFO Data raw 12 bit index 348 - - - Star Sensor FIFO Data raw 12 bit index 349 - Star Sensor FIFO Data raw 12 bit index 349 - - - Star Sensor FIFO Data raw 12 bit index 350 - Star Sensor FIFO Data raw 12 bit index 350 - - - Star Sensor FIFO Data raw 12 bit index 351 - Star Sensor FIFO Data raw 12 bit index 351 - - - Star Sensor FIFO Data raw 12 bit index 352 - Star Sensor FIFO Data raw 12 bit index 352 - - - Star Sensor FIFO Data raw 12 bit index 353 - Star Sensor FIFO Data raw 12 bit index 353 - - - Star Sensor FIFO Data raw 12 bit index 354 - Star Sensor FIFO Data raw 12 bit index 354 - - - Star Sensor FIFO Data raw 12 bit index 355 - Star Sensor FIFO Data raw 12 bit index 355 - - - Star Sensor FIFO Data raw 12 bit index 356 - Star Sensor FIFO Data raw 12 bit index 356 - - - Star Sensor FIFO Data raw 12 bit index 357 - Star Sensor FIFO Data raw 12 bit index 357 - - - Star Sensor FIFO Data raw 12 bit index 358 - Star Sensor FIFO Data raw 12 bit index 358 - - - Star Sensor FIFO Data raw 12 bit index 359 - Star Sensor FIFO Data raw 12 bit index 359 - - - Star Sensor FIFO Data raw 12 bit index 360 - Star Sensor FIFO Data raw 12 bit index 360 - - - Star Sensor FIFO Data raw 12 bit index 361 - Star Sensor FIFO Data raw 12 bit index 361 - - - Star Sensor FIFO Data raw 12 bit index 362 - Star Sensor FIFO Data raw 12 bit index 362 - - - Star Sensor FIFO Data raw 12 bit index 363 - Star Sensor FIFO Data raw 12 bit index 363 - - - Star Sensor FIFO Data raw 12 bit index 364 - Star Sensor FIFO Data raw 12 bit index 364 - - - Star Sensor FIFO Data raw 12 bit index 365 - Star Sensor FIFO Data raw 12 bit index 365 - - - Star Sensor FIFO Data raw 12 bit index 366 - Star Sensor FIFO Data raw 12 bit index 366 - - - Star Sensor FIFO Data raw 12 bit index 367 - Star Sensor FIFO Data raw 12 bit index 367 - - - Star Sensor FIFO Data raw 12 bit index 368 - Star Sensor FIFO Data raw 12 bit index 368 - - - Star Sensor FIFO Data raw 12 bit index 369 - Star Sensor FIFO Data raw 12 bit index 369 - - - Star Sensor FIFO Data raw 12 bit index 370 - Star Sensor FIFO Data raw 12 bit index 370 - - - Star Sensor FIFO Data raw 12 bit index 371 - Star Sensor FIFO Data raw 12 bit index 371 - - - Star Sensor FIFO Data raw 12 bit index 372 - Star Sensor FIFO Data raw 12 bit index 372 - - - Star Sensor FIFO Data raw 12 bit index 373 - Star Sensor FIFO Data raw 12 bit index 373 - - - Star Sensor FIFO Data raw 12 bit index 374 - Star Sensor FIFO Data raw 12 bit index 374 - - - Star Sensor FIFO Data raw 12 bit index 375 - Star Sensor FIFO Data raw 12 bit index 375 - - - Star Sensor FIFO Data raw 12 bit index 376 - Star Sensor FIFO Data raw 12 bit index 376 - - - Star Sensor FIFO Data raw 12 bit index 377 - Star Sensor FIFO Data raw 12 bit index 377 - - - Star Sensor FIFO Data raw 12 bit index 378 - Star Sensor FIFO Data raw 12 bit index 378 - - - Star Sensor FIFO Data raw 12 bit index 379 - Star Sensor FIFO Data raw 12 bit index 379 - - - Star Sensor FIFO Data raw 12 bit index 380 - Star Sensor FIFO Data raw 12 bit index 380 - - - Star Sensor FIFO Data raw 12 bit index 381 - Star Sensor FIFO Data raw 12 bit index 381 - - - Star Sensor FIFO Data raw 12 bit index 382 - Star Sensor FIFO Data raw 12 bit index 382 - - - Star Sensor FIFO Data raw 12 bit index 383 - Star Sensor FIFO Data raw 12 bit index 383 - - - Star Sensor FIFO Data raw 12 bit index 384 - Star Sensor FIFO Data raw 12 bit index 384 - - - Star Sensor FIFO Data raw 12 bit index 385 - Star Sensor FIFO Data raw 12 bit index 385 - - - Star Sensor FIFO Data raw 12 bit index 386 - Star Sensor FIFO Data raw 12 bit index 386 - - - Star Sensor FIFO Data raw 12 bit index 387 - Star Sensor FIFO Data raw 12 bit index 387 - - - Star Sensor FIFO Data raw 12 bit index 388 - Star Sensor FIFO Data raw 12 bit index 388 - - - Star Sensor FIFO Data raw 12 bit index 389 - Star Sensor FIFO Data raw 12 bit index 389 - - - Star Sensor FIFO Data raw 12 bit index 390 - Star Sensor FIFO Data raw 12 bit index 390 - - - Star Sensor FIFO Data raw 12 bit index 391 - Star Sensor FIFO Data raw 12 bit index 391 - - - Star Sensor FIFO Data raw 12 bit index 392 - Star Sensor FIFO Data raw 12 bit index 392 - - - Star Sensor FIFO Data raw 12 bit index 393 - Star Sensor FIFO Data raw 12 bit index 393 - - - Star Sensor FIFO Data raw 12 bit index 394 - Star Sensor FIFO Data raw 12 bit index 394 - - - Star Sensor FIFO Data raw 12 bit index 395 - Star Sensor FIFO Data raw 12 bit index 395 - - - Star Sensor FIFO Data raw 12 bit index 396 - Star Sensor FIFO Data raw 12 bit index 396 - - - Star Sensor FIFO Data raw 12 bit index 397 - Star Sensor FIFO Data raw 12 bit index 397 - - - Star Sensor FIFO Data raw 12 bit index 398 - Star Sensor FIFO Data raw 12 bit index 398 - - - Star Sensor FIFO Data raw 12 bit index 399 - Star Sensor FIFO Data raw 12 bit index 399 - - - Star Sensor FIFO Data raw 12 bit index 400 - Star Sensor FIFO Data raw 12 bit index 400 - - - Star Sensor FIFO Data raw 12 bit index 401 - Star Sensor FIFO Data raw 12 bit index 401 - - - Star Sensor FIFO Data raw 12 bit index 402 - Star Sensor FIFO Data raw 12 bit index 402 - - - Star Sensor FIFO Data raw 12 bit index 403 - Star Sensor FIFO Data raw 12 bit index 403 - - - Star Sensor FIFO Data raw 12 bit index 404 - Star Sensor FIFO Data raw 12 bit index 404 - - - Star Sensor FIFO Data raw 12 bit index 405 - Star Sensor FIFO Data raw 12 bit index 405 - - - Star Sensor FIFO Data raw 12 bit index 406 - Star Sensor FIFO Data raw 12 bit index 406 - - - Star Sensor FIFO Data raw 12 bit index 407 - Star Sensor FIFO Data raw 12 bit index 407 - - - Star Sensor FIFO Data raw 12 bit index 408 - Star Sensor FIFO Data raw 12 bit index 408 - - - Star Sensor FIFO Data raw 12 bit index 409 - Star Sensor FIFO Data raw 12 bit index 409 - - - Star Sensor FIFO Data raw 12 bit index 410 - Star Sensor FIFO Data raw 12 bit index 410 - - - Star Sensor FIFO Data raw 12 bit index 411 - Star Sensor FIFO Data raw 12 bit index 411 - - - Star Sensor FIFO Data raw 12 bit index 412 - Star Sensor FIFO Data raw 12 bit index 412 - - - Star Sensor FIFO Data raw 12 bit index 413 - Star Sensor FIFO Data raw 12 bit index 413 - - - Star Sensor FIFO Data raw 12 bit index 414 - Star Sensor FIFO Data raw 12 bit index 414 - - - Star Sensor FIFO Data raw 12 bit index 415 - Star Sensor FIFO Data raw 12 bit index 415 - - - Star Sensor FIFO Data raw 12 bit index 416 - Star Sensor FIFO Data raw 12 bit index 416 - - - Star Sensor FIFO Data raw 12 bit index 417 - Star Sensor FIFO Data raw 12 bit index 417 - - - Star Sensor FIFO Data raw 12 bit index 418 - Star Sensor FIFO Data raw 12 bit index 418 - - - Star Sensor FIFO Data raw 12 bit index 419 - Star Sensor FIFO Data raw 12 bit index 419 - - - Star Sensor FIFO Data raw 12 bit index 420 - Star Sensor FIFO Data raw 12 bit index 420 - - - Star Sensor FIFO Data raw 12 bit index 421 - Star Sensor FIFO Data raw 12 bit index 421 - - - Star Sensor FIFO Data raw 12 bit index 422 - Star Sensor FIFO Data raw 12 bit index 422 - - - Star Sensor FIFO Data raw 12 bit index 423 - Star Sensor FIFO Data raw 12 bit index 423 - - - Star Sensor FIFO Data raw 12 bit index 424 - Star Sensor FIFO Data raw 12 bit index 424 - - - Star Sensor FIFO Data raw 12 bit index 425 - Star Sensor FIFO Data raw 12 bit index 425 - - - Star Sensor FIFO Data raw 12 bit index 426 - Star Sensor FIFO Data raw 12 bit index 426 - - - Star Sensor FIFO Data raw 12 bit index 427 - Star Sensor FIFO Data raw 12 bit index 427 - - - Star Sensor FIFO Data raw 12 bit index 428 - Star Sensor FIFO Data raw 12 bit index 428 - - - Star Sensor FIFO Data raw 12 bit index 429 - Star Sensor FIFO Data raw 12 bit index 429 - - - Star Sensor FIFO Data raw 12 bit index 430 - Star Sensor FIFO Data raw 12 bit index 430 - - - Star Sensor FIFO Data raw 12 bit index 431 - Star Sensor FIFO Data raw 12 bit index 431 - - - Star Sensor FIFO Data raw 12 bit index 432 - Star Sensor FIFO Data raw 12 bit index 432 - - - Star Sensor FIFO Data raw 12 bit index 433 - Star Sensor FIFO Data raw 12 bit index 433 - - - Star Sensor FIFO Data raw 12 bit index 434 - Star Sensor FIFO Data raw 12 bit index 434 - - - Star Sensor FIFO Data raw 12 bit index 435 - Star Sensor FIFO Data raw 12 bit index 435 - - - Star Sensor FIFO Data raw 12 bit index 436 - Star Sensor FIFO Data raw 12 bit index 436 - - - Star Sensor FIFO Data raw 12 bit index 437 - Star Sensor FIFO Data raw 12 bit index 437 - - - Star Sensor FIFO Data raw 12 bit index 438 - Star Sensor FIFO Data raw 12 bit index 438 - - - Star Sensor FIFO Data raw 12 bit index 439 - Star Sensor FIFO Data raw 12 bit index 439 - - - Star Sensor FIFO Data raw 12 bit index 440 - Star Sensor FIFO Data raw 12 bit index 440 - - - Star Sensor FIFO Data raw 12 bit index 441 - Star Sensor FIFO Data raw 12 bit index 441 - - - Star Sensor FIFO Data raw 12 bit index 442 - Star Sensor FIFO Data raw 12 bit index 442 - - - Star Sensor FIFO Data raw 12 bit index 443 - Star Sensor FIFO Data raw 12 bit index 443 - - - Star Sensor FIFO Data raw 12 bit index 444 - Star Sensor FIFO Data raw 12 bit index 444 - - - Star Sensor FIFO Data raw 12 bit index 445 - Star Sensor FIFO Data raw 12 bit index 445 - - - Star Sensor FIFO Data raw 12 bit index 446 - Star Sensor FIFO Data raw 12 bit index 446 - - - Star Sensor FIFO Data raw 12 bit index 447 - Star Sensor FIFO Data raw 12 bit index 447 - - - Star Sensor FIFO Data raw 12 bit index 448 - Star Sensor FIFO Data raw 12 bit index 448 - - - Star Sensor FIFO Data raw 12 bit index 449 - Star Sensor FIFO Data raw 12 bit index 449 - - - Star Sensor FIFO Data raw 12 bit index 450 - Star Sensor FIFO Data raw 12 bit index 450 - - - Star Sensor FIFO Data raw 12 bit index 451 - Star Sensor FIFO Data raw 12 bit index 451 - - - Star Sensor FIFO Data raw 12 bit index 452 - Star Sensor FIFO Data raw 12 bit index 452 - - - Star Sensor FIFO Data raw 12 bit index 453 - Star Sensor FIFO Data raw 12 bit index 453 - - - Star Sensor FIFO Data raw 12 bit index 454 - Star Sensor FIFO Data raw 12 bit index 454 - - - Star Sensor FIFO Data raw 12 bit index 455 - Star Sensor FIFO Data raw 12 bit index 455 - - - Star Sensor FIFO Data raw 12 bit index 456 - Star Sensor FIFO Data raw 12 bit index 456 - - - Star Sensor FIFO Data raw 12 bit index 457 - Star Sensor FIFO Data raw 12 bit index 457 - - - Star Sensor FIFO Data raw 12 bit index 458 - Star Sensor FIFO Data raw 12 bit index 458 - - - Star Sensor FIFO Data raw 12 bit index 459 - Star Sensor FIFO Data raw 12 bit index 459 - - - Star Sensor FIFO Data raw 12 bit index 460 - Star Sensor FIFO Data raw 12 bit index 460 - - - Star Sensor FIFO Data raw 12 bit index 461 - Star Sensor FIFO Data raw 12 bit index 461 - - - Star Sensor FIFO Data raw 12 bit index 462 - Star Sensor FIFO Data raw 12 bit index 462 - - - Star Sensor FIFO Data raw 12 bit index 463 - Star Sensor FIFO Data raw 12 bit index 463 - - - Star Sensor FIFO Data raw 12 bit index 464 - Star Sensor FIFO Data raw 12 bit index 464 - - - Star Sensor FIFO Data raw 12 bit index 465 - Star Sensor FIFO Data raw 12 bit index 465 - - - Star Sensor FIFO Data raw 12 bit index 466 - Star Sensor FIFO Data raw 12 bit index 466 - - - Star Sensor FIFO Data raw 12 bit index 467 - Star Sensor FIFO Data raw 12 bit index 467 - - - Star Sensor FIFO Data raw 12 bit index 468 - Star Sensor FIFO Data raw 12 bit index 468 - - - Star Sensor FIFO Data raw 12 bit index 469 - Star Sensor FIFO Data raw 12 bit index 469 - - - Star Sensor FIFO Data raw 12 bit index 470 - Star Sensor FIFO Data raw 12 bit index 470 - - - Star Sensor FIFO Data raw 12 bit index 471 - Star Sensor FIFO Data raw 12 bit index 471 - - - Star Sensor FIFO Data raw 12 bit index 472 - Star Sensor FIFO Data raw 12 bit index 472 - - - Star Sensor FIFO Data raw 12 bit index 473 - Star Sensor FIFO Data raw 12 bit index 473 - - - Star Sensor FIFO Data raw 12 bit index 474 - Star Sensor FIFO Data raw 12 bit index 474 - - - Star Sensor FIFO Data raw 12 bit index 475 - Star Sensor FIFO Data raw 12 bit index 475 - - - Star Sensor FIFO Data raw 12 bit index 476 - Star Sensor FIFO Data raw 12 bit index 476 - - - Star Sensor FIFO Data raw 12 bit index 477 - Star Sensor FIFO Data raw 12 bit index 477 - - - Star Sensor FIFO Data raw 12 bit index 478 - Star Sensor FIFO Data raw 12 bit index 478 - - - Star Sensor FIFO Data raw 12 bit index 479 - Star Sensor FIFO Data raw 12 bit index 479 - - - Star Sensor FIFO Data raw 12 bit index 480 - Star Sensor FIFO Data raw 12 bit index 480 - - - Star Sensor FIFO Data raw 12 bit index 481 - Star Sensor FIFO Data raw 12 bit index 481 - - - Star Sensor FIFO Data raw 12 bit index 482 - Star Sensor FIFO Data raw 12 bit index 482 - - - Star Sensor FIFO Data raw 12 bit index 483 - Star Sensor FIFO Data raw 12 bit index 483 - - - Star Sensor FIFO Data raw 12 bit index 484 - Star Sensor FIFO Data raw 12 bit index 484 - - - Star Sensor FIFO Data raw 12 bit index 485 - Star Sensor FIFO Data raw 12 bit index 485 - - - Star Sensor FIFO Data raw 12 bit index 486 - Star Sensor FIFO Data raw 12 bit index 486 - - - Star Sensor FIFO Data raw 12 bit index 487 - Star Sensor FIFO Data raw 12 bit index 487 - - - Star Sensor FIFO Data raw 12 bit index 488 - Star Sensor FIFO Data raw 12 bit index 488 - - - Star Sensor FIFO Data raw 12 bit index 489 - Star Sensor FIFO Data raw 12 bit index 489 - - - Star Sensor FIFO Data raw 12 bit index 490 - Star Sensor FIFO Data raw 12 bit index 490 - - - Star Sensor FIFO Data raw 12 bit index 491 - Star Sensor FIFO Data raw 12 bit index 491 - - - Star Sensor FIFO Data raw 12 bit index 492 - Star Sensor FIFO Data raw 12 bit index 492 - - - Star Sensor FIFO Data raw 12 bit index 493 - Star Sensor FIFO Data raw 12 bit index 493 - - - Star Sensor FIFO Data raw 12 bit index 494 - Star Sensor FIFO Data raw 12 bit index 494 - - - Star Sensor FIFO Data raw 12 bit index 495 - Star Sensor FIFO Data raw 12 bit index 495 - - - Star Sensor FIFO Data raw 12 bit index 496 - Star Sensor FIFO Data raw 12 bit index 496 - - - Star Sensor FIFO Data raw 12 bit index 497 - Star Sensor FIFO Data raw 12 bit index 497 - - - Star Sensor FIFO Data raw 12 bit index 498 - Star Sensor FIFO Data raw 12 bit index 498 - - - Star Sensor FIFO Data raw 12 bit index 499 - Star Sensor FIFO Data raw 12 bit index 499 - - - Star Sensor FIFO Data raw 12 bit index 500 - Star Sensor FIFO Data raw 12 bit index 500 - - - Star Sensor FIFO Data raw 12 bit index 501 - Star Sensor FIFO Data raw 12 bit index 501 - - - Star Sensor FIFO Data raw 12 bit index 502 - Star Sensor FIFO Data raw 12 bit index 502 - - - Star Sensor FIFO Data raw 12 bit index 503 - Star Sensor FIFO Data raw 12 bit index 503 - - - Star Sensor FIFO Data raw 12 bit index 504 - Star Sensor FIFO Data raw 12 bit index 504 - - - Star Sensor FIFO Data raw 12 bit index 505 - Star Sensor FIFO Data raw 12 bit index 505 - - - Star Sensor FIFO Data raw 12 bit index 506 - Star Sensor FIFO Data raw 12 bit index 506 - - - Star Sensor FIFO Data raw 12 bit index 507 - Star Sensor FIFO Data raw 12 bit index 507 - - - Star Sensor FIFO Data raw 12 bit index 508 - Star Sensor FIFO Data raw 12 bit index 508 - - - Star Sensor FIFO Data raw 12 bit index 509 - Star Sensor FIFO Data raw 12 bit index 509 - - - Star Sensor FIFO Data raw 12 bit index 510 - Star Sensor FIFO Data raw 12 bit index 510 - - - Star Sensor FIFO Data raw 12 bit index 511 - Star Sensor FIFO Data raw 12 bit index 511 - - - Star Sensor FIFO Data raw 12 bit index 512 - Star Sensor FIFO Data raw 12 bit index 512 - - - Star Sensor FIFO Data raw 12 bit index 513 - Star Sensor FIFO Data raw 12 bit index 513 - - - Star Sensor FIFO Data raw 12 bit index 514 - Star Sensor FIFO Data raw 12 bit index 514 - - - Star Sensor FIFO Data raw 12 bit index 515 - Star Sensor FIFO Data raw 12 bit index 515 - - - Star Sensor FIFO Data raw 12 bit index 516 - Star Sensor FIFO Data raw 12 bit index 516 - - - Star Sensor FIFO Data raw 12 bit index 517 - Star Sensor FIFO Data raw 12 bit index 517 - - - Star Sensor FIFO Data raw 12 bit index 518 - Star Sensor FIFO Data raw 12 bit index 518 - - - Star Sensor FIFO Data raw 12 bit index 519 - Star Sensor FIFO Data raw 12 bit index 519 - - - Star Sensor FIFO Data raw 12 bit index 520 - Star Sensor FIFO Data raw 12 bit index 520 - - - Star Sensor FIFO Data raw 12 bit index 521 - Star Sensor FIFO Data raw 12 bit index 521 - - - Star Sensor FIFO Data raw 12 bit index 522 - Star Sensor FIFO Data raw 12 bit index 522 - - - Star Sensor FIFO Data raw 12 bit index 523 - Star Sensor FIFO Data raw 12 bit index 523 - - - Star Sensor FIFO Data raw 12 bit index 524 - Star Sensor FIFO Data raw 12 bit index 524 - - - Star Sensor FIFO Data raw 12 bit index 525 - Star Sensor FIFO Data raw 12 bit index 525 - - - Star Sensor FIFO Data raw 12 bit index 526 - Star Sensor FIFO Data raw 12 bit index 526 - - - Star Sensor FIFO Data raw 12 bit index 527 - Star Sensor FIFO Data raw 12 bit index 527 - - - Star Sensor FIFO Data raw 12 bit index 528 - Star Sensor FIFO Data raw 12 bit index 528 - - - Star Sensor FIFO Data raw 12 bit index 529 - Star Sensor FIFO Data raw 12 bit index 529 - - - Star Sensor FIFO Data raw 12 bit index 530 - Star Sensor FIFO Data raw 12 bit index 530 - - - Star Sensor FIFO Data raw 12 bit index 531 - Star Sensor FIFO Data raw 12 bit index 531 - - - Star Sensor FIFO Data raw 12 bit index 532 - Star Sensor FIFO Data raw 12 bit index 532 - - - Star Sensor FIFO Data raw 12 bit index 533 - Star Sensor FIFO Data raw 12 bit index 533 - - - Star Sensor FIFO Data raw 12 bit index 534 - Star Sensor FIFO Data raw 12 bit index 534 - - - Star Sensor FIFO Data raw 12 bit index 535 - Star Sensor FIFO Data raw 12 bit index 535 - - - Star Sensor FIFO Data raw 12 bit index 536 - Star Sensor FIFO Data raw 12 bit index 536 - - - Star Sensor FIFO Data raw 12 bit index 537 - Star Sensor FIFO Data raw 12 bit index 537 - - - Star Sensor FIFO Data raw 12 bit index 538 - Star Sensor FIFO Data raw 12 bit index 538 - - - Star Sensor FIFO Data raw 12 bit index 539 - Star Sensor FIFO Data raw 12 bit index 539 - - - Star Sensor FIFO Data raw 12 bit index 540 - Star Sensor FIFO Data raw 12 bit index 540 - - - Star Sensor FIFO Data raw 12 bit index 541 - Star Sensor FIFO Data raw 12 bit index 541 - - - Star Sensor FIFO Data raw 12 bit index 542 - Star Sensor FIFO Data raw 12 bit index 542 - - - Star Sensor FIFO Data raw 12 bit index 543 - Star Sensor FIFO Data raw 12 bit index 543 - - - Star Sensor FIFO Data raw 12 bit index 544 - Star Sensor FIFO Data raw 12 bit index 544 - - - Star Sensor FIFO Data raw 12 bit index 545 - Star Sensor FIFO Data raw 12 bit index 545 - - - Star Sensor FIFO Data raw 12 bit index 546 - Star Sensor FIFO Data raw 12 bit index 546 - - - Star Sensor FIFO Data raw 12 bit index 547 - Star Sensor FIFO Data raw 12 bit index 547 - - - Star Sensor FIFO Data raw 12 bit index 548 - Star Sensor FIFO Data raw 12 bit index 548 - - - Star Sensor FIFO Data raw 12 bit index 549 - Star Sensor FIFO Data raw 12 bit index 549 - - - Star Sensor FIFO Data raw 12 bit index 550 - Star Sensor FIFO Data raw 12 bit index 550 - - - Star Sensor FIFO Data raw 12 bit index 551 - Star Sensor FIFO Data raw 12 bit index 551 - - - Star Sensor FIFO Data raw 12 bit index 552 - Star Sensor FIFO Data raw 12 bit index 552 - - - Star Sensor FIFO Data raw 12 bit index 553 - Star Sensor FIFO Data raw 12 bit index 553 - - - Star Sensor FIFO Data raw 12 bit index 554 - Star Sensor FIFO Data raw 12 bit index 554 - - - Star Sensor FIFO Data raw 12 bit index 555 - Star Sensor FIFO Data raw 12 bit index 555 - - - Star Sensor FIFO Data raw 12 bit index 556 - Star Sensor FIFO Data raw 12 bit index 556 - - - Star Sensor FIFO Data raw 12 bit index 557 - Star Sensor FIFO Data raw 12 bit index 557 - - - Star Sensor FIFO Data raw 12 bit index 558 - Star Sensor FIFO Data raw 12 bit index 558 - - - Star Sensor FIFO Data raw 12 bit index 559 - Star Sensor FIFO Data raw 12 bit index 559 - - - Star Sensor FIFO Data raw 12 bit index 560 - Star Sensor FIFO Data raw 12 bit index 560 - - - Star Sensor FIFO Data raw 12 bit index 561 - Star Sensor FIFO Data raw 12 bit index 561 - - - Star Sensor FIFO Data raw 12 bit index 562 - Star Sensor FIFO Data raw 12 bit index 562 - - - Star Sensor FIFO Data raw 12 bit index 563 - Star Sensor FIFO Data raw 12 bit index 563 - - - Star Sensor FIFO Data raw 12 bit index 564 - Star Sensor FIFO Data raw 12 bit index 564 - - - Star Sensor FIFO Data raw 12 bit index 565 - Star Sensor FIFO Data raw 12 bit index 565 - - - Star Sensor FIFO Data raw 12 bit index 566 - Star Sensor FIFO Data raw 12 bit index 566 - - - Star Sensor FIFO Data raw 12 bit index 567 - Star Sensor FIFO Data raw 12 bit index 567 - - - Star Sensor FIFO Data raw 12 bit index 568 - Star Sensor FIFO Data raw 12 bit index 568 - - - Star Sensor FIFO Data raw 12 bit index 569 - Star Sensor FIFO Data raw 12 bit index 569 - - - Star Sensor FIFO Data raw 12 bit index 570 - Star Sensor FIFO Data raw 12 bit index 570 - - - Star Sensor FIFO Data raw 12 bit index 571 - Star Sensor FIFO Data raw 12 bit index 571 - - - Star Sensor FIFO Data raw 12 bit index 572 - Star Sensor FIFO Data raw 12 bit index 572 - - - Star Sensor FIFO Data raw 12 bit index 573 - Star Sensor FIFO Data raw 12 bit index 573 - - - Star Sensor FIFO Data raw 12 bit index 574 - Star Sensor FIFO Data raw 12 bit index 574 - - - Star Sensor FIFO Data raw 12 bit index 575 - Star Sensor FIFO Data raw 12 bit index 575 - - - Star Sensor FIFO Data raw 12 bit index 576 - Star Sensor FIFO Data raw 12 bit index 576 - - - Star Sensor FIFO Data raw 12 bit index 577 - Star Sensor FIFO Data raw 12 bit index 577 - - - Star Sensor FIFO Data raw 12 bit index 578 - Star Sensor FIFO Data raw 12 bit index 578 - - - Star Sensor FIFO Data raw 12 bit index 579 - Star Sensor FIFO Data raw 12 bit index 579 - - - Star Sensor FIFO Data raw 12 bit index 580 - Star Sensor FIFO Data raw 12 bit index 580 - - - Star Sensor FIFO Data raw 12 bit index 581 - Star Sensor FIFO Data raw 12 bit index 581 - - - Star Sensor FIFO Data raw 12 bit index 582 - Star Sensor FIFO Data raw 12 bit index 582 - - - Star Sensor FIFO Data raw 12 bit index 583 - Star Sensor FIFO Data raw 12 bit index 583 - - - Star Sensor FIFO Data raw 12 bit index 584 - Star Sensor FIFO Data raw 12 bit index 584 - - - Star Sensor FIFO Data raw 12 bit index 585 - Star Sensor FIFO Data raw 12 bit index 585 - - - Star Sensor FIFO Data raw 12 bit index 586 - Star Sensor FIFO Data raw 12 bit index 586 - - - Star Sensor FIFO Data raw 12 bit index 587 - Star Sensor FIFO Data raw 12 bit index 587 - - - Star Sensor FIFO Data raw 12 bit index 588 - Star Sensor FIFO Data raw 12 bit index 588 - - - Star Sensor FIFO Data raw 12 bit index 589 - Star Sensor FIFO Data raw 12 bit index 589 - - - Star Sensor FIFO Data raw 12 bit index 590 - Star Sensor FIFO Data raw 12 bit index 590 - - - Star Sensor FIFO Data raw 12 bit index 591 - Star Sensor FIFO Data raw 12 bit index 591 - - - Star Sensor FIFO Data raw 12 bit index 592 - Star Sensor FIFO Data raw 12 bit index 592 - - - Star Sensor FIFO Data raw 12 bit index 593 - Star Sensor FIFO Data raw 12 bit index 593 - - - Star Sensor FIFO Data raw 12 bit index 594 - Star Sensor FIFO Data raw 12 bit index 594 - - - Star Sensor FIFO Data raw 12 bit index 595 - Star Sensor FIFO Data raw 12 bit index 595 - - - Star Sensor FIFO Data raw 12 bit index 596 - Star Sensor FIFO Data raw 12 bit index 596 - - - Star Sensor FIFO Data raw 12 bit index 597 - Star Sensor FIFO Data raw 12 bit index 597 - - - Star Sensor FIFO Data raw 12 bit index 598 - Star Sensor FIFO Data raw 12 bit index 598 - - - Star Sensor FIFO Data raw 12 bit index 599 - Star Sensor FIFO Data raw 12 bit index 599 - - - Star Sensor FIFO Data raw 12 bit index 600 - Star Sensor FIFO Data raw 12 bit index 600 - - - Star Sensor FIFO Data raw 12 bit index 601 - Star Sensor FIFO Data raw 12 bit index 601 - - - Star Sensor FIFO Data raw 12 bit index 602 - Star Sensor FIFO Data raw 12 bit index 602 - - - Star Sensor FIFO Data raw 12 bit index 603 - Star Sensor FIFO Data raw 12 bit index 603 - - - Star Sensor FIFO Data raw 12 bit index 604 - Star Sensor FIFO Data raw 12 bit index 604 - - - Star Sensor FIFO Data raw 12 bit index 605 - Star Sensor FIFO Data raw 12 bit index 605 - - - Star Sensor FIFO Data raw 12 bit index 606 - Star Sensor FIFO Data raw 12 bit index 606 - - - Star Sensor FIFO Data raw 12 bit index 607 - Star Sensor FIFO Data raw 12 bit index 607 - - - Star Sensor FIFO Data raw 12 bit index 608 - Star Sensor FIFO Data raw 12 bit index 608 - - - Star Sensor FIFO Data raw 12 bit index 609 - Star Sensor FIFO Data raw 12 bit index 609 - - - Star Sensor FIFO Data raw 12 bit index 610 - Star Sensor FIFO Data raw 12 bit index 610 - - - Star Sensor FIFO Data raw 12 bit index 611 - Star Sensor FIFO Data raw 12 bit index 611 - - - Star Sensor FIFO Data raw 12 bit index 612 - Star Sensor FIFO Data raw 12 bit index 612 - - - Star Sensor FIFO Data raw 12 bit index 613 - Star Sensor FIFO Data raw 12 bit index 613 - - - Star Sensor FIFO Data raw 12 bit index 614 - Star Sensor FIFO Data raw 12 bit index 614 - - - Star Sensor FIFO Data raw 12 bit index 615 - Star Sensor FIFO Data raw 12 bit index 615 - - - Star Sensor FIFO Data raw 12 bit index 616 - Star Sensor FIFO Data raw 12 bit index 616 - - - Star Sensor FIFO Data raw 12 bit index 617 - Star Sensor FIFO Data raw 12 bit index 617 - - - Star Sensor FIFO Data raw 12 bit index 618 - Star Sensor FIFO Data raw 12 bit index 618 - - - Star Sensor FIFO Data raw 12 bit index 619 - Star Sensor FIFO Data raw 12 bit index 619 - - - Star Sensor FIFO Data raw 12 bit index 620 - Star Sensor FIFO Data raw 12 bit index 620 - - - Star Sensor FIFO Data raw 12 bit index 621 - Star Sensor FIFO Data raw 12 bit index 621 - - - Star Sensor FIFO Data raw 12 bit index 622 - Star Sensor FIFO Data raw 12 bit index 622 - - - Star Sensor FIFO Data raw 12 bit index 623 - Star Sensor FIFO Data raw 12 bit index 623 - - - Star Sensor FIFO Data raw 12 bit index 624 - Star Sensor FIFO Data raw 12 bit index 624 - - - Star Sensor FIFO Data raw 12 bit index 625 - Star Sensor FIFO Data raw 12 bit index 625 - - - Star Sensor FIFO Data raw 12 bit index 626 - Star Sensor FIFO Data raw 12 bit index 626 - - - Star Sensor FIFO Data raw 12 bit index 627 - Star Sensor FIFO Data raw 12 bit index 627 - - - Star Sensor FIFO Data raw 12 bit index 628 - Star Sensor FIFO Data raw 12 bit index 628 - - - Star Sensor FIFO Data raw 12 bit index 629 - Star Sensor FIFO Data raw 12 bit index 629 - - - Star Sensor FIFO Data raw 12 bit index 630 - Star Sensor FIFO Data raw 12 bit index 630 - - - Star Sensor FIFO Data raw 12 bit index 631 - Star Sensor FIFO Data raw 12 bit index 631 - - - Star Sensor FIFO Data raw 12 bit index 632 - Star Sensor FIFO Data raw 12 bit index 632 - - - Star Sensor FIFO Data raw 12 bit index 633 - Star Sensor FIFO Data raw 12 bit index 633 - - - Star Sensor FIFO Data raw 12 bit index 634 - Star Sensor FIFO Data raw 12 bit index 634 - - - Star Sensor FIFO Data raw 12 bit index 635 - Star Sensor FIFO Data raw 12 bit index 635 - - - Star Sensor FIFO Data raw 12 bit index 636 - Star Sensor FIFO Data raw 12 bit index 636 - - - Star Sensor FIFO Data raw 12 bit index 637 - Star Sensor FIFO Data raw 12 bit index 637 - - - Star Sensor FIFO Data raw 12 bit index 638 - Star Sensor FIFO Data raw 12 bit index 638 - - - Star Sensor FIFO Data raw 12 bit index 639 - Star Sensor FIFO Data raw 12 bit index 639 - - - Star Sensor FIFO Data raw 12 bit index 640 - Star Sensor FIFO Data raw 12 bit index 640 - - - Star Sensor FIFO Data raw 12 bit index 641 - Star Sensor FIFO Data raw 12 bit index 641 - - - Star Sensor FIFO Data raw 12 bit index 642 - Star Sensor FIFO Data raw 12 bit index 642 - - - Star Sensor FIFO Data raw 12 bit index 643 - Star Sensor FIFO Data raw 12 bit index 643 - - - Star Sensor FIFO Data raw 12 bit index 644 - Star Sensor FIFO Data raw 12 bit index 644 - - - Star Sensor FIFO Data raw 12 bit index 645 - Star Sensor FIFO Data raw 12 bit index 645 - - - Star Sensor FIFO Data raw 12 bit index 646 - Star Sensor FIFO Data raw 12 bit index 646 - - - Star Sensor FIFO Data raw 12 bit index 647 - Star Sensor FIFO Data raw 12 bit index 647 - - - Star Sensor FIFO Data raw 12 bit index 648 - Star Sensor FIFO Data raw 12 bit index 648 - - - Star Sensor FIFO Data raw 12 bit index 649 - Star Sensor FIFO Data raw 12 bit index 649 - - - Star Sensor FIFO Data raw 12 bit index 650 - Star Sensor FIFO Data raw 12 bit index 650 - - - Star Sensor FIFO Data raw 12 bit index 651 - Star Sensor FIFO Data raw 12 bit index 651 - - - Star Sensor FIFO Data raw 12 bit index 652 - Star Sensor FIFO Data raw 12 bit index 652 - - - Star Sensor FIFO Data raw 12 bit index 653 - Star Sensor FIFO Data raw 12 bit index 653 - - - Star Sensor FIFO Data raw 12 bit index 654 - Star Sensor FIFO Data raw 12 bit index 654 - - - Star Sensor FIFO Data raw 12 bit index 655 - Star Sensor FIFO Data raw 12 bit index 655 - - - Star Sensor FIFO Data raw 12 bit index 656 - Star Sensor FIFO Data raw 12 bit index 656 - - - Star Sensor FIFO Data raw 12 bit index 657 - Star Sensor FIFO Data raw 12 bit index 657 - - - Star Sensor FIFO Data raw 12 bit index 658 - Star Sensor FIFO Data raw 12 bit index 658 - - - Star Sensor FIFO Data raw 12 bit index 659 - Star Sensor FIFO Data raw 12 bit index 659 - - - Star Sensor FIFO Data raw 12 bit index 660 - Star Sensor FIFO Data raw 12 bit index 660 - - - Star Sensor FIFO Data raw 12 bit index 661 - Star Sensor FIFO Data raw 12 bit index 661 - - - Star Sensor FIFO Data raw 12 bit index 662 - Star Sensor FIFO Data raw 12 bit index 662 - - - Star Sensor FIFO Data raw 12 bit index 663 - Star Sensor FIFO Data raw 12 bit index 663 - - - Star Sensor FIFO Data raw 12 bit index 664 - Star Sensor FIFO Data raw 12 bit index 664 - - - Star Sensor FIFO Data raw 12 bit index 665 - Star Sensor FIFO Data raw 12 bit index 665 - - - Star Sensor FIFO Data raw 12 bit index 666 - Star Sensor FIFO Data raw 12 bit index 666 - - - Star Sensor FIFO Data raw 12 bit index 667 - Star Sensor FIFO Data raw 12 bit index 667 - - - Star Sensor FIFO Data raw 12 bit index 668 - Star Sensor FIFO Data raw 12 bit index 668 - - - Star Sensor FIFO Data raw 12 bit index 669 - Star Sensor FIFO Data raw 12 bit index 669 - - - Star Sensor FIFO Data raw 12 bit index 670 - Star Sensor FIFO Data raw 12 bit index 670 - - - Star Sensor FIFO Data raw 12 bit index 671 - Star Sensor FIFO Data raw 12 bit index 671 - - - Star Sensor FIFO Data raw 12 bit index 672 - Star Sensor FIFO Data raw 12 bit index 672 - - - Star Sensor FIFO Data raw 12 bit index 673 - Star Sensor FIFO Data raw 12 bit index 673 - - - Star Sensor FIFO Data raw 12 bit index 674 - Star Sensor FIFO Data raw 12 bit index 674 - - - Star Sensor FIFO Data raw 12 bit index 675 - Star Sensor FIFO Data raw 12 bit index 675 - - - Star Sensor FIFO Data raw 12 bit index 676 - Star Sensor FIFO Data raw 12 bit index 676 - - - Star Sensor FIFO Data raw 12 bit index 677 - Star Sensor FIFO Data raw 12 bit index 677 - - - Star Sensor FIFO Data raw 12 bit index 678 - Star Sensor FIFO Data raw 12 bit index 678 - - - Star Sensor FIFO Data raw 12 bit index 679 - Star Sensor FIFO Data raw 12 bit index 679 - - - Star Sensor FIFO Data raw 12 bit index 680 - Star Sensor FIFO Data raw 12 bit index 680 - - - Star Sensor FIFO Data raw 12 bit index 681 - Star Sensor FIFO Data raw 12 bit index 681 - - - Star Sensor FIFO Data raw 12 bit index 682 - Star Sensor FIFO Data raw 12 bit index 682 - - - Star Sensor FIFO Data raw 12 bit index 683 - Star Sensor FIFO Data raw 12 bit index 683 - - - Star Sensor FIFO Data raw 12 bit index 684 - Star Sensor FIFO Data raw 12 bit index 684 - - - Star Sensor FIFO Data raw 12 bit index 685 - Star Sensor FIFO Data raw 12 bit index 685 - - - Star Sensor FIFO Data raw 12 bit index 686 - Star Sensor FIFO Data raw 12 bit index 686 - - - Star Sensor FIFO Data raw 12 bit index 687 - Star Sensor FIFO Data raw 12 bit index 687 - - - Star Sensor FIFO Data raw 12 bit index 688 - Star Sensor FIFO Data raw 12 bit index 688 - - - Star Sensor FIFO Data raw 12 bit index 689 - Star Sensor FIFO Data raw 12 bit index 689 - - - Star Sensor FIFO Data raw 12 bit index 690 - Star Sensor FIFO Data raw 12 bit index 690 - - - Star Sensor FIFO Data raw 12 bit index 691 - Star Sensor FIFO Data raw 12 bit index 691 - - - Star Sensor FIFO Data raw 12 bit index 692 - Star Sensor FIFO Data raw 12 bit index 692 - - - Star Sensor FIFO Data raw 12 bit index 693 - Star Sensor FIFO Data raw 12 bit index 693 - - - Star Sensor FIFO Data raw 12 bit index 694 - Star Sensor FIFO Data raw 12 bit index 694 - - - Star Sensor FIFO Data raw 12 bit index 695 - Star Sensor FIFO Data raw 12 bit index 695 - - - Star Sensor FIFO Data raw 12 bit index 696 - Star Sensor FIFO Data raw 12 bit index 696 - - - Star Sensor FIFO Data raw 12 bit index 697 - Star Sensor FIFO Data raw 12 bit index 697 - - - Star Sensor FIFO Data raw 12 bit index 698 - Star Sensor FIFO Data raw 12 bit index 698 - - - Star Sensor FIFO Data raw 12 bit index 699 - Star Sensor FIFO Data raw 12 bit index 699 - - - Star Sensor FIFO Data raw 12 bit index 700 - Star Sensor FIFO Data raw 12 bit index 700 - - - Star Sensor FIFO Data raw 12 bit index 701 - Star Sensor FIFO Data raw 12 bit index 701 - - - Star Sensor FIFO Data raw 12 bit index 702 - Star Sensor FIFO Data raw 12 bit index 702 - - - Star Sensor FIFO Data raw 12 bit index 703 - Star Sensor FIFO Data raw 12 bit index 703 - - - Star Sensor FIFO Data raw 12 bit index 704 - Star Sensor FIFO Data raw 12 bit index 704 - - - Star Sensor FIFO Data raw 12 bit index 705 - Star Sensor FIFO Data raw 12 bit index 705 - - - Star Sensor FIFO Data raw 12 bit index 706 - Star Sensor FIFO Data raw 12 bit index 706 - - - Star Sensor FIFO Data raw 12 bit index 707 - Star Sensor FIFO Data raw 12 bit index 707 - - - Star Sensor FIFO Data raw 12 bit index 708 - Star Sensor FIFO Data raw 12 bit index 708 - - - Star Sensor FIFO Data raw 12 bit index 709 - Star Sensor FIFO Data raw 12 bit index 709 - - - Star Sensor FIFO Data raw 12 bit index 710 - Star Sensor FIFO Data raw 12 bit index 710 - - - Star Sensor FIFO Data raw 12 bit index 711 - Star Sensor FIFO Data raw 12 bit index 711 - - - Star Sensor FIFO Data raw 12 bit index 712 - Star Sensor FIFO Data raw 12 bit index 712 - - - Star Sensor FIFO Data raw 12 bit index 713 - Star Sensor FIFO Data raw 12 bit index 713 - - - Star Sensor FIFO Data raw 12 bit index 714 - Star Sensor FIFO Data raw 12 bit index 714 - - - Star Sensor FIFO Data raw 12 bit index 715 - Star Sensor FIFO Data raw 12 bit index 715 - - - Star Sensor FIFO Data raw 12 bit index 716 - Star Sensor FIFO Data raw 12 bit index 716 - - - Star Sensor FIFO Data raw 12 bit index 717 - Star Sensor FIFO Data raw 12 bit index 717 - - - Star Sensor FIFO Data raw 12 bit index 718 - Star Sensor FIFO Data raw 12 bit index 718 - - - Star Sensor FIFO Data raw 12 bit index 719 - Star Sensor FIFO Data raw 12 bit index 719 - - - Star Sensor FIFO Data raw 12 bit index 720 - Star Sensor FIFO Data raw 12 bit index 720 - - - Star Sensor FIFO Data raw 12 bit index 721 - Star Sensor FIFO Data raw 12 bit index 721 - - - Star Sensor FIFO Data raw 12 bit index 722 - Star Sensor FIFO Data raw 12 bit index 722 - - - Star Sensor FIFO Data raw 12 bit index 723 - Star Sensor FIFO Data raw 12 bit index 723 - - - Star Sensor FIFO Data raw 12 bit index 724 - Star Sensor FIFO Data raw 12 bit index 724 - - - Star Sensor FIFO Data raw 12 bit index 725 - Star Sensor FIFO Data raw 12 bit index 725 - - - Star Sensor FIFO Data raw 12 bit index 726 - Star Sensor FIFO Data raw 12 bit index 726 - - - Star Sensor FIFO Data raw 12 bit index 727 - Star Sensor FIFO Data raw 12 bit index 727 - - - Star Sensor FIFO Data raw 12 bit index 728 - Star Sensor FIFO Data raw 12 bit index 728 - - - Star Sensor FIFO Data raw 12 bit index 729 - Star Sensor FIFO Data raw 12 bit index 729 - - - Star Sensor FIFO Data raw 12 bit index 730 - Star Sensor FIFO Data raw 12 bit index 730 - - - Star Sensor FIFO Data raw 12 bit index 731 - Star Sensor FIFO Data raw 12 bit index 731 - - - Star Sensor FIFO Data raw 12 bit index 732 - Star Sensor FIFO Data raw 12 bit index 732 - - - Star Sensor FIFO Data raw 12 bit index 733 - Star Sensor FIFO Data raw 12 bit index 733 - - - Star Sensor FIFO Data raw 12 bit index 734 - Star Sensor FIFO Data raw 12 bit index 734 - - - Star Sensor FIFO Data raw 12 bit index 735 - Star Sensor FIFO Data raw 12 bit index 735 - - - Star Sensor FIFO Data raw 12 bit index 736 - Star Sensor FIFO Data raw 12 bit index 736 - - - Star Sensor FIFO Data raw 12 bit index 737 - Star Sensor FIFO Data raw 12 bit index 737 - - - Star Sensor FIFO Data raw 12 bit index 738 - Star Sensor FIFO Data raw 12 bit index 738 - - - Star Sensor FIFO Data raw 12 bit index 739 - Star Sensor FIFO Data raw 12 bit index 739 - - - Star Sensor FIFO Data raw 12 bit index 740 - Star Sensor FIFO Data raw 12 bit index 740 - - - Star Sensor FIFO Data raw 12 bit index 741 - Star Sensor FIFO Data raw 12 bit index 741 - - - Star Sensor FIFO Data raw 12 bit index 742 - Star Sensor FIFO Data raw 12 bit index 742 - - - Star Sensor FIFO Data raw 12 bit index 743 - Star Sensor FIFO Data raw 12 bit index 743 - - - Star Sensor FIFO Data raw 12 bit index 744 - Star Sensor FIFO Data raw 12 bit index 744 - - - Star Sensor FIFO Data raw 12 bit index 745 - Star Sensor FIFO Data raw 12 bit index 745 - - - Star Sensor FIFO Data raw 12 bit index 746 - Star Sensor FIFO Data raw 12 bit index 746 - - - Star Sensor FIFO Data raw 12 bit index 747 - Star Sensor FIFO Data raw 12 bit index 747 - - - Star Sensor FIFO Data raw 12 bit index 748 - Star Sensor FIFO Data raw 12 bit index 748 - - - Star Sensor FIFO Data raw 12 bit index 749 - Star Sensor FIFO Data raw 12 bit index 749 - - - Star Sensor FIFO Data raw 12 bit index 750 - Star Sensor FIFO Data raw 12 bit index 750 - - - Star Sensor FIFO Data raw 12 bit index 751 - Star Sensor FIFO Data raw 12 bit index 751 - - - Star Sensor FIFO Data raw 12 bit index 752 - Star Sensor FIFO Data raw 12 bit index 752 - - - Star Sensor FIFO Data raw 12 bit index 753 - Star Sensor FIFO Data raw 12 bit index 753 - - - Star Sensor FIFO Data raw 12 bit index 754 - Star Sensor FIFO Data raw 12 bit index 754 - - - Star Sensor FIFO Data raw 12 bit index 755 - Star Sensor FIFO Data raw 12 bit index 755 - - - Star Sensor FIFO Data raw 12 bit index 756 - Star Sensor FIFO Data raw 12 bit index 756 - - - Star Sensor FIFO Data raw 12 bit index 757 - Star Sensor FIFO Data raw 12 bit index 757 - - - Star Sensor FIFO Data raw 12 bit index 758 - Star Sensor FIFO Data raw 12 bit index 758 - - - Star Sensor FIFO Data raw 12 bit index 759 - Star Sensor FIFO Data raw 12 bit index 759 - - - Star Sensor FIFO Data raw 12 bit index 760 - Star Sensor FIFO Data raw 12 bit index 760 - - - Star Sensor FIFO Data raw 12 bit index 761 - Star Sensor FIFO Data raw 12 bit index 761 - - - Star Sensor FIFO Data raw 12 bit index 762 - Star Sensor FIFO Data raw 12 bit index 762 - - - Star Sensor FIFO Data raw 12 bit index 763 - Star Sensor FIFO Data raw 12 bit index 763 - - - Star Sensor FIFO Data raw 12 bit index 764 - Star Sensor FIFO Data raw 12 bit index 764 - - - Star Sensor FIFO Data raw 12 bit index 765 - Star Sensor FIFO Data raw 12 bit index 765 - - - Star Sensor FIFO Data raw 12 bit index 766 - Star Sensor FIFO Data raw 12 bit index 766 - - - Star Sensor FIFO Data raw 12 bit index 767 - Star Sensor FIFO Data raw 12 bit index 767 - - - Star Sensor FIFO Data raw 12 bit index 768 - Star Sensor FIFO Data raw 12 bit index 768 - - - Star Sensor FIFO Data raw 12 bit index 769 - Star Sensor FIFO Data raw 12 bit index 769 - - - Star Sensor FIFO Data raw 12 bit index 770 - Star Sensor FIFO Data raw 12 bit index 770 - - - Star Sensor FIFO Data raw 12 bit index 771 - Star Sensor FIFO Data raw 12 bit index 771 - - - Star Sensor FIFO Data raw 12 bit index 772 - Star Sensor FIFO Data raw 12 bit index 772 - - - Star Sensor FIFO Data raw 12 bit index 773 - Star Sensor FIFO Data raw 12 bit index 773 - - - Star Sensor FIFO Data raw 12 bit index 774 - Star Sensor FIFO Data raw 12 bit index 774 - - - Star Sensor FIFO Data raw 12 bit index 775 - Star Sensor FIFO Data raw 12 bit index 775 - - - Star Sensor FIFO Data raw 12 bit index 776 - Star Sensor FIFO Data raw 12 bit index 776 - - - Star Sensor FIFO Data raw 12 bit index 777 - Star Sensor FIFO Data raw 12 bit index 777 - - - Star Sensor FIFO Data raw 12 bit index 778 - Star Sensor FIFO Data raw 12 bit index 778 - - - Star Sensor FIFO Data raw 12 bit index 779 - Star Sensor FIFO Data raw 12 bit index 779 - - - Star Sensor FIFO Data raw 12 bit index 780 - Star Sensor FIFO Data raw 12 bit index 780 - - - Star Sensor FIFO Data raw 12 bit index 781 - Star Sensor FIFO Data raw 12 bit index 781 - - - Star Sensor FIFO Data raw 12 bit index 782 - Star Sensor FIFO Data raw 12 bit index 782 - - - Star Sensor FIFO Data raw 12 bit index 783 - Star Sensor FIFO Data raw 12 bit index 783 - - - Star Sensor FIFO Data raw 12 bit index 784 - Star Sensor FIFO Data raw 12 bit index 784 - - - Star Sensor FIFO Data raw 12 bit index 785 - Star Sensor FIFO Data raw 12 bit index 785 - - - Star Sensor FIFO Data raw 12 bit index 786 - Star Sensor FIFO Data raw 12 bit index 786 - - - Star Sensor FIFO Data raw 12 bit index 787 - Star Sensor FIFO Data raw 12 bit index 787 - - - Star Sensor FIFO Data raw 12 bit index 788 - Star Sensor FIFO Data raw 12 bit index 788 - - - Star Sensor FIFO Data raw 12 bit index 789 - Star Sensor FIFO Data raw 12 bit index 789 - - - Star Sensor FIFO Data raw 12 bit index 790 - Star Sensor FIFO Data raw 12 bit index 790 - - - Star Sensor FIFO Data raw 12 bit index 791 - Star Sensor FIFO Data raw 12 bit index 791 - - - Star Sensor FIFO Data raw 12 bit index 792 - Star Sensor FIFO Data raw 12 bit index 792 - - - Star Sensor FIFO Data raw 12 bit index 793 - Star Sensor FIFO Data raw 12 bit index 793 - - - Star Sensor FIFO Data raw 12 bit index 794 - Star Sensor FIFO Data raw 12 bit index 794 - - - Star Sensor FIFO Data raw 12 bit index 795 - Star Sensor FIFO Data raw 12 bit index 795 - - - Star Sensor FIFO Data raw 12 bit index 796 - Star Sensor FIFO Data raw 12 bit index 796 - - - Star Sensor FIFO Data raw 12 bit index 797 - Star Sensor FIFO Data raw 12 bit index 797 - - - Star Sensor FIFO Data raw 12 bit index 798 - Star Sensor FIFO Data raw 12 bit index 798 - - - Star Sensor FIFO Data raw 12 bit index 799 - Star Sensor FIFO Data raw 12 bit index 799 - - - Star Sensor FIFO Data raw 12 bit index 800 - Star Sensor FIFO Data raw 12 bit index 800 - - - Star Sensor FIFO Data raw 12 bit index 801 - Star Sensor FIFO Data raw 12 bit index 801 - - - Star Sensor FIFO Data raw 12 bit index 802 - Star Sensor FIFO Data raw 12 bit index 802 - - - Star Sensor FIFO Data raw 12 bit index 803 - Star Sensor FIFO Data raw 12 bit index 803 - - - Star Sensor FIFO Data raw 12 bit index 804 - Star Sensor FIFO Data raw 12 bit index 804 - - - Star Sensor FIFO Data raw 12 bit index 805 - Star Sensor FIFO Data raw 12 bit index 805 - - - Star Sensor FIFO Data raw 12 bit index 806 - Star Sensor FIFO Data raw 12 bit index 806 - - - Star Sensor FIFO Data raw 12 bit index 807 - Star Sensor FIFO Data raw 12 bit index 807 - - - Star Sensor FIFO Data raw 12 bit index 808 - Star Sensor FIFO Data raw 12 bit index 808 - - - Star Sensor FIFO Data raw 12 bit index 809 - Star Sensor FIFO Data raw 12 bit index 809 - - - Star Sensor FIFO Data raw 12 bit index 810 - Star Sensor FIFO Data raw 12 bit index 810 - - - Star Sensor FIFO Data raw 12 bit index 811 - Star Sensor FIFO Data raw 12 bit index 811 - - - Star Sensor FIFO Data raw 12 bit index 812 - Star Sensor FIFO Data raw 12 bit index 812 - - - Star Sensor FIFO Data raw 12 bit index 813 - Star Sensor FIFO Data raw 12 bit index 813 - - - Star Sensor FIFO Data raw 12 bit index 814 - Star Sensor FIFO Data raw 12 bit index 814 - - - Star Sensor FIFO Data raw 12 bit index 815 - Star Sensor FIFO Data raw 12 bit index 815 - - - Star Sensor FIFO Data raw 12 bit index 816 - Star Sensor FIFO Data raw 12 bit index 816 - - - Star Sensor FIFO Data raw 12 bit index 817 - Star Sensor FIFO Data raw 12 bit index 817 - - - Star Sensor FIFO Data raw 12 bit index 818 - Star Sensor FIFO Data raw 12 bit index 818 - - - Star Sensor FIFO Data raw 12 bit index 819 - Star Sensor FIFO Data raw 12 bit index 819 - - - Star Sensor FIFO Data raw 12 bit index 820 - Star Sensor FIFO Data raw 12 bit index 820 - - - Star Sensor FIFO Data raw 12 bit index 821 - Star Sensor FIFO Data raw 12 bit index 821 - - - Star Sensor FIFO Data raw 12 bit index 822 - Star Sensor FIFO Data raw 12 bit index 822 - - - Star Sensor FIFO Data raw 12 bit index 823 - Star Sensor FIFO Data raw 12 bit index 823 - - - Star Sensor FIFO Data raw 12 bit index 824 - Star Sensor FIFO Data raw 12 bit index 824 - - - Star Sensor FIFO Data raw 12 bit index 825 - Star Sensor FIFO Data raw 12 bit index 825 - - - Star Sensor FIFO Data raw 12 bit index 826 - Star Sensor FIFO Data raw 12 bit index 826 - - - Star Sensor FIFO Data raw 12 bit index 827 - Star Sensor FIFO Data raw 12 bit index 827 - - - Star Sensor FIFO Data raw 12 bit index 828 - Star Sensor FIFO Data raw 12 bit index 828 - - - Star Sensor FIFO Data raw 12 bit index 829 - Star Sensor FIFO Data raw 12 bit index 829 - - - Star Sensor FIFO Data raw 12 bit index 830 - Star Sensor FIFO Data raw 12 bit index 830 - - - Star Sensor FIFO Data raw 12 bit index 831 - Star Sensor FIFO Data raw 12 bit index 831 - - - Star Sensor FIFO Data raw 12 bit index 832 - Star Sensor FIFO Data raw 12 bit index 832 - - - Star Sensor FIFO Data raw 12 bit index 833 - Star Sensor FIFO Data raw 12 bit index 833 - - - Star Sensor FIFO Data raw 12 bit index 834 - Star Sensor FIFO Data raw 12 bit index 834 - - - Star Sensor FIFO Data raw 12 bit index 835 - Star Sensor FIFO Data raw 12 bit index 835 - - - Star Sensor FIFO Data raw 12 bit index 836 - Star Sensor FIFO Data raw 12 bit index 836 - - - Star Sensor FIFO Data raw 12 bit index 837 - Star Sensor FIFO Data raw 12 bit index 837 - - - Star Sensor FIFO Data raw 12 bit index 838 - Star Sensor FIFO Data raw 12 bit index 838 - - - Star Sensor FIFO Data raw 12 bit index 839 - Star Sensor FIFO Data raw 12 bit index 839 - - - Star Sensor FIFO Data raw 12 bit index 840 - Star Sensor FIFO Data raw 12 bit index 840 - - - Star Sensor FIFO Data raw 12 bit index 841 - Star Sensor FIFO Data raw 12 bit index 841 - - - Star Sensor FIFO Data raw 12 bit index 842 - Star Sensor FIFO Data raw 12 bit index 842 - - - Star Sensor FIFO Data raw 12 bit index 843 - Star Sensor FIFO Data raw 12 bit index 843 - - - Star Sensor FIFO Data raw 12 bit index 844 - Star Sensor FIFO Data raw 12 bit index 844 - - - Star Sensor FIFO Data raw 12 bit index 845 - Star Sensor FIFO Data raw 12 bit index 845 - - - Star Sensor FIFO Data raw 12 bit index 846 - Star Sensor FIFO Data raw 12 bit index 846 - - - Star Sensor FIFO Data raw 12 bit index 847 - Star Sensor FIFO Data raw 12 bit index 847 - - - Star Sensor FIFO Data raw 12 bit index 848 - Star Sensor FIFO Data raw 12 bit index 848 - - - Star Sensor FIFO Data raw 12 bit index 849 - Star Sensor FIFO Data raw 12 bit index 849 - - - Star Sensor FIFO Data raw 12 bit index 850 - Star Sensor FIFO Data raw 12 bit index 850 - - - Star Sensor FIFO Data raw 12 bit index 851 - Star Sensor FIFO Data raw 12 bit index 851 - - - Star Sensor FIFO Data raw 12 bit index 852 - Star Sensor FIFO Data raw 12 bit index 852 - - - Star Sensor FIFO Data raw 12 bit index 853 - Star Sensor FIFO Data raw 12 bit index 853 - - - Star Sensor FIFO Data raw 12 bit index 854 - Star Sensor FIFO Data raw 12 bit index 854 - - - Star Sensor FIFO Data raw 12 bit index 855 - Star Sensor FIFO Data raw 12 bit index 855 - - - Star Sensor FIFO Data raw 12 bit index 856 - Star Sensor FIFO Data raw 12 bit index 856 - - - Star Sensor FIFO Data raw 12 bit index 857 - Star Sensor FIFO Data raw 12 bit index 857 - - - Star Sensor FIFO Data raw 12 bit index 858 - Star Sensor FIFO Data raw 12 bit index 858 - - - Star Sensor FIFO Data raw 12 bit index 859 - Star Sensor FIFO Data raw 12 bit index 859 - - - Star Sensor FIFO Data raw 12 bit index 860 - Star Sensor FIFO Data raw 12 bit index 860 - - - Star Sensor FIFO Data raw 12 bit index 861 - Star Sensor FIFO Data raw 12 bit index 861 - - - Star Sensor FIFO Data raw 12 bit index 862 - Star Sensor FIFO Data raw 12 bit index 862 - - - Star Sensor FIFO Data raw 12 bit index 863 - Star Sensor FIFO Data raw 12 bit index 863 - - - Star Sensor FIFO Data raw 12 bit index 864 - Star Sensor FIFO Data raw 12 bit index 864 - - - Star Sensor FIFO Data raw 12 bit index 865 - Star Sensor FIFO Data raw 12 bit index 865 - - - Star Sensor FIFO Data raw 12 bit index 866 - Star Sensor FIFO Data raw 12 bit index 866 - - - Star Sensor FIFO Data raw 12 bit index 867 - Star Sensor FIFO Data raw 12 bit index 867 - - - Star Sensor FIFO Data raw 12 bit index 868 - Star Sensor FIFO Data raw 12 bit index 868 - - - Star Sensor FIFO Data raw 12 bit index 869 - Star Sensor FIFO Data raw 12 bit index 869 - - - Star Sensor FIFO Data raw 12 bit index 870 - Star Sensor FIFO Data raw 12 bit index 870 - - - Star Sensor FIFO Data raw 12 bit index 871 - Star Sensor FIFO Data raw 12 bit index 871 - - - Star Sensor FIFO Data raw 12 bit index 872 - Star Sensor FIFO Data raw 12 bit index 872 - - - Star Sensor FIFO Data raw 12 bit index 873 - Star Sensor FIFO Data raw 12 bit index 873 - - - Star Sensor FIFO Data raw 12 bit index 874 - Star Sensor FIFO Data raw 12 bit index 874 - - - Star Sensor FIFO Data raw 12 bit index 875 - Star Sensor FIFO Data raw 12 bit index 875 - - - Star Sensor FIFO Data raw 12 bit index 876 - Star Sensor FIFO Data raw 12 bit index 876 - - - Star Sensor FIFO Data raw 12 bit index 877 - Star Sensor FIFO Data raw 12 bit index 877 - - - Star Sensor FIFO Data raw 12 bit index 878 - Star Sensor FIFO Data raw 12 bit index 878 - - - Star Sensor FIFO Data raw 12 bit index 879 - Star Sensor FIFO Data raw 12 bit index 879 - - - Star Sensor FIFO Data raw 12 bit index 880 - Star Sensor FIFO Data raw 12 bit index 880 - - - Star Sensor FIFO Data raw 12 bit index 881 - Star Sensor FIFO Data raw 12 bit index 881 - - - Star Sensor FIFO Data raw 12 bit index 882 - Star Sensor FIFO Data raw 12 bit index 882 - - - Star Sensor FIFO Data raw 12 bit index 883 - Star Sensor FIFO Data raw 12 bit index 883 - - - Star Sensor FIFO Data raw 12 bit index 884 - Star Sensor FIFO Data raw 12 bit index 884 - - - Star Sensor FIFO Data raw 12 bit index 885 - Star Sensor FIFO Data raw 12 bit index 885 - - - Star Sensor FIFO Data raw 12 bit index 886 - Star Sensor FIFO Data raw 12 bit index 886 - - - Star Sensor FIFO Data raw 12 bit index 887 - Star Sensor FIFO Data raw 12 bit index 887 - - - Star Sensor FIFO Data raw 12 bit index 888 - Star Sensor FIFO Data raw 12 bit index 888 - - - Star Sensor FIFO Data raw 12 bit index 889 - Star Sensor FIFO Data raw 12 bit index 889 - - - Star Sensor FIFO Data raw 12 bit index 890 - Star Sensor FIFO Data raw 12 bit index 890 - - - Star Sensor FIFO Data raw 12 bit index 891 - Star Sensor FIFO Data raw 12 bit index 891 - - - Star Sensor FIFO Data raw 12 bit index 892 - Star Sensor FIFO Data raw 12 bit index 892 - - - Star Sensor FIFO Data raw 12 bit index 893 - Star Sensor FIFO Data raw 12 bit index 893 - - - Star Sensor FIFO Data raw 12 bit index 894 - Star Sensor FIFO Data raw 12 bit index 894 - - - Star Sensor FIFO Data raw 12 bit index 895 - Star Sensor FIFO Data raw 12 bit index 895 - - - Star Sensor FIFO Data raw 12 bit index 896 - Star Sensor FIFO Data raw 12 bit index 896 - - - Star Sensor FIFO Data raw 12 bit index 897 - Star Sensor FIFO Data raw 12 bit index 897 - - - Star Sensor FIFO Data raw 12 bit index 898 - Star Sensor FIFO Data raw 12 bit index 898 - - - Star Sensor FIFO Data raw 12 bit index 899 - Star Sensor FIFO Data raw 12 bit index 899 - - - Star Sensor FIFO Data raw 12 bit index 900 - Star Sensor FIFO Data raw 12 bit index 900 - - - Star Sensor FIFO Data raw 12 bit index 901 - Star Sensor FIFO Data raw 12 bit index 901 - - - Star Sensor FIFO Data raw 12 bit index 902 - Star Sensor FIFO Data raw 12 bit index 902 - - - Star Sensor FIFO Data raw 12 bit index 903 - Star Sensor FIFO Data raw 12 bit index 903 - - - Star Sensor FIFO Data raw 12 bit index 904 - Star Sensor FIFO Data raw 12 bit index 904 - - - Star Sensor FIFO Data raw 12 bit index 905 - Star Sensor FIFO Data raw 12 bit index 905 - - - Star Sensor FIFO Data raw 12 bit index 906 - Star Sensor FIFO Data raw 12 bit index 906 - - - Star Sensor FIFO Data raw 12 bit index 907 - Star Sensor FIFO Data raw 12 bit index 907 - - - Star Sensor FIFO Data raw 12 bit index 908 - Star Sensor FIFO Data raw 12 bit index 908 - - - Star Sensor FIFO Data raw 12 bit index 909 - Star Sensor FIFO Data raw 12 bit index 909 - - - Star Sensor FIFO Data raw 12 bit index 910 - Star Sensor FIFO Data raw 12 bit index 910 - - - Star Sensor FIFO Data raw 12 bit index 911 - Star Sensor FIFO Data raw 12 bit index 911 - - - Star Sensor FIFO Data raw 12 bit index 912 - Star Sensor FIFO Data raw 12 bit index 912 - - - Star Sensor FIFO Data raw 12 bit index 913 - Star Sensor FIFO Data raw 12 bit index 913 - - - Star Sensor FIFO Data raw 12 bit index 914 - Star Sensor FIFO Data raw 12 bit index 914 - - - Star Sensor FIFO Data raw 12 bit index 915 - Star Sensor FIFO Data raw 12 bit index 915 - - - Star Sensor FIFO Data raw 12 bit index 916 - Star Sensor FIFO Data raw 12 bit index 916 - - - Star Sensor FIFO Data raw 12 bit index 917 - Star Sensor FIFO Data raw 12 bit index 917 - - - Star Sensor FIFO Data raw 12 bit index 918 - Star Sensor FIFO Data raw 12 bit index 918 - - - Star Sensor FIFO Data raw 12 bit index 919 - Star Sensor FIFO Data raw 12 bit index 919 - - - Star Sensor FIFO Data raw 12 bit index 920 - Star Sensor FIFO Data raw 12 bit index 920 - - - Star Sensor FIFO Data raw 12 bit index 921 - Star Sensor FIFO Data raw 12 bit index 921 - - - Star Sensor FIFO Data raw 12 bit index 922 - Star Sensor FIFO Data raw 12 bit index 922 - - - Star Sensor FIFO Data raw 12 bit index 923 - Star Sensor FIFO Data raw 12 bit index 923 - - - Star Sensor FIFO Data raw 12 bit index 924 - Star Sensor FIFO Data raw 12 bit index 924 - - - Star Sensor FIFO Data raw 12 bit index 925 - Star Sensor FIFO Data raw 12 bit index 925 - - - Star Sensor FIFO Data raw 12 bit index 926 - Star Sensor FIFO Data raw 12 bit index 926 - - - Star Sensor FIFO Data raw 12 bit index 927 - Star Sensor FIFO Data raw 12 bit index 927 - - - Star Sensor FIFO Data raw 12 bit index 928 - Star Sensor FIFO Data raw 12 bit index 928 - - - Star Sensor FIFO Data raw 12 bit index 929 - Star Sensor FIFO Data raw 12 bit index 929 - - - Star Sensor FIFO Data raw 12 bit index 930 - Star Sensor FIFO Data raw 12 bit index 930 - - - Star Sensor FIFO Data raw 12 bit index 931 - Star Sensor FIFO Data raw 12 bit index 931 - - - Star Sensor FIFO Data raw 12 bit index 932 - Star Sensor FIFO Data raw 12 bit index 932 - - - Star Sensor FIFO Data raw 12 bit index 933 - Star Sensor FIFO Data raw 12 bit index 933 - - - Star Sensor FIFO Data raw 12 bit index 934 - Star Sensor FIFO Data raw 12 bit index 934 - - - Star Sensor FIFO Data raw 12 bit index 935 - Star Sensor FIFO Data raw 12 bit index 935 - - - Star Sensor FIFO Data raw 12 bit index 936 - Star Sensor FIFO Data raw 12 bit index 936 - - - Star Sensor FIFO Data raw 12 bit index 937 - Star Sensor FIFO Data raw 12 bit index 937 - - - Star Sensor FIFO Data raw 12 bit index 938 - Star Sensor FIFO Data raw 12 bit index 938 - - - Star Sensor FIFO Data raw 12 bit index 939 - Star Sensor FIFO Data raw 12 bit index 939 - - - Star Sensor FIFO Data raw 12 bit index 940 - Star Sensor FIFO Data raw 12 bit index 940 - - - Star Sensor FIFO Data raw 12 bit index 941 - Star Sensor FIFO Data raw 12 bit index 941 - - - Star Sensor FIFO Data raw 12 bit index 942 - Star Sensor FIFO Data raw 12 bit index 942 - - - Star Sensor FIFO Data raw 12 bit index 943 - Star Sensor FIFO Data raw 12 bit index 943 - - - Star Sensor FIFO Data raw 12 bit index 944 - Star Sensor FIFO Data raw 12 bit index 944 - - - Star Sensor FIFO Data raw 12 bit index 945 - Star Sensor FIFO Data raw 12 bit index 945 - - - Star Sensor FIFO Data raw 12 bit index 946 - Star Sensor FIFO Data raw 12 bit index 946 - - - Star Sensor FIFO Data raw 12 bit index 947 - Star Sensor FIFO Data raw 12 bit index 947 - - - Star Sensor FIFO Data raw 12 bit index 948 - Star Sensor FIFO Data raw 12 bit index 948 - - - Star Sensor FIFO Data raw 12 bit index 949 - Star Sensor FIFO Data raw 12 bit index 949 - - - Star Sensor FIFO Data raw 12 bit index 950 - Star Sensor FIFO Data raw 12 bit index 950 - - - Star Sensor FIFO Data raw 12 bit index 951 - Star Sensor FIFO Data raw 12 bit index 951 - - - Star Sensor FIFO Data raw 12 bit index 952 - Star Sensor FIFO Data raw 12 bit index 952 - - - Star Sensor FIFO Data raw 12 bit index 953 - Star Sensor FIFO Data raw 12 bit index 953 - - - Star Sensor FIFO Data raw 12 bit index 954 - Star Sensor FIFO Data raw 12 bit index 954 - - - Star Sensor FIFO Data raw 12 bit index 955 - Star Sensor FIFO Data raw 12 bit index 955 - - - Star Sensor FIFO Data raw 12 bit index 956 - Star Sensor FIFO Data raw 12 bit index 956 - - - Star Sensor FIFO Data raw 12 bit index 957 - Star Sensor FIFO Data raw 12 bit index 957 - - - Star Sensor FIFO Data raw 12 bit index 958 - Star Sensor FIFO Data raw 12 bit index 958 - - - Star Sensor FIFO Data raw 12 bit index 959 - Star Sensor FIFO Data raw 12 bit index 959 - - - Star Sensor FIFO Data raw 12 bit index 960 - Star Sensor FIFO Data raw 12 bit index 960 - - - Star Sensor FIFO Data raw 12 bit index 961 - Star Sensor FIFO Data raw 12 bit index 961 - - - Star Sensor FIFO Data raw 12 bit index 962 - Star Sensor FIFO Data raw 12 bit index 962 - - - Star Sensor FIFO Data raw 12 bit index 963 - Star Sensor FIFO Data raw 12 bit index 963 - - - Star Sensor FIFO Data raw 12 bit index 964 - Star Sensor FIFO Data raw 12 bit index 964 - - - Star Sensor FIFO Data raw 12 bit index 965 - Star Sensor FIFO Data raw 12 bit index 965 - - - Star Sensor FIFO Data raw 12 bit index 966 - Star Sensor FIFO Data raw 12 bit index 966 - - - Star Sensor FIFO Data raw 12 bit index 967 - Star Sensor FIFO Data raw 12 bit index 967 - - - Star Sensor FIFO Data raw 12 bit index 968 - Star Sensor FIFO Data raw 12 bit index 968 - - - Star Sensor FIFO Data raw 12 bit index 969 - Star Sensor FIFO Data raw 12 bit index 969 - - - Star Sensor FIFO Data raw 12 bit index 970 - Star Sensor FIFO Data raw 12 bit index 970 - - - Star Sensor FIFO Data raw 12 bit index 971 - Star Sensor FIFO Data raw 12 bit index 971 - - - Star Sensor FIFO Data raw 12 bit index 972 - Star Sensor FIFO Data raw 12 bit index 972 - - - Star Sensor FIFO Data raw 12 bit index 973 - Star Sensor FIFO Data raw 12 bit index 973 - - - Star Sensor FIFO Data raw 12 bit index 974 - Star Sensor FIFO Data raw 12 bit index 974 - - - Star Sensor FIFO Data raw 12 bit index 975 - Star Sensor FIFO Data raw 12 bit index 975 - - - Star Sensor FIFO Data raw 12 bit index 976 - Star Sensor FIFO Data raw 12 bit index 976 - - - Star Sensor FIFO Data raw 12 bit index 977 - Star Sensor FIFO Data raw 12 bit index 977 - - - Star Sensor FIFO Data raw 12 bit index 978 - Star Sensor FIFO Data raw 12 bit index 978 - - - Star Sensor FIFO Data raw 12 bit index 979 - Star Sensor FIFO Data raw 12 bit index 979 - - - Star Sensor FIFO Data raw 12 bit index 980 - Star Sensor FIFO Data raw 12 bit index 980 - - - Star Sensor FIFO Data raw 12 bit index 981 - Star Sensor FIFO Data raw 12 bit index 981 - - - Star Sensor FIFO Data raw 12 bit index 982 - Star Sensor FIFO Data raw 12 bit index 982 - - - Star Sensor FIFO Data raw 12 bit index 983 - Star Sensor FIFO Data raw 12 bit index 983 - - - Star Sensor FIFO Data raw 12 bit index 984 - Star Sensor FIFO Data raw 12 bit index 984 - - - Star Sensor FIFO Data raw 12 bit index 985 - Star Sensor FIFO Data raw 12 bit index 985 - - - Star Sensor FIFO Data raw 12 bit index 986 - Star Sensor FIFO Data raw 12 bit index 986 - - - Star Sensor FIFO Data raw 12 bit index 987 - Star Sensor FIFO Data raw 12 bit index 987 - - - Star Sensor FIFO Data raw 12 bit index 988 - Star Sensor FIFO Data raw 12 bit index 988 - - - Star Sensor FIFO Data raw 12 bit index 989 - Star Sensor FIFO Data raw 12 bit index 989 - - - Star Sensor FIFO Data raw 12 bit index 990 - Star Sensor FIFO Data raw 12 bit index 990 - - - Star Sensor FIFO Data raw 12 bit index 991 - Star Sensor FIFO Data raw 12 bit index 991 - - - Star Sensor FIFO Data raw 12 bit index 992 - Star Sensor FIFO Data raw 12 bit index 992 - - - Star Sensor FIFO Data raw 12 bit index 993 - Star Sensor FIFO Data raw 12 bit index 993 - - - Star Sensor FIFO Data raw 12 bit index 994 - Star Sensor FIFO Data raw 12 bit index 994 - - - Star Sensor FIFO Data raw 12 bit index 995 - Star Sensor FIFO Data raw 12 bit index 995 - - - Star Sensor FIFO Data raw 12 bit index 996 - Star Sensor FIFO Data raw 12 bit index 996 - - - Star Sensor FIFO Data raw 12 bit index 997 - Star Sensor FIFO Data raw 12 bit index 997 - - - Star Sensor FIFO Data raw 12 bit index 998 - Star Sensor FIFO Data raw 12 bit index 998 - - - Star Sensor FIFO Data raw 12 bit index 999 - Star Sensor FIFO Data raw 12 bit index 999 - - - Star Sensor FIFO Data raw 12 bit index 1000 - Star Sensor FIFO Data raw 12 bit index 1000 - - - Star Sensor FIFO Data raw 12 bit index 1001 - Star Sensor FIFO Data raw 12 bit index 1001 - - - Star Sensor FIFO Data raw 12 bit index 1002 - Star Sensor FIFO Data raw 12 bit index 1002 - - - Star Sensor FIFO Data raw 12 bit index 1003 - Star Sensor FIFO Data raw 12 bit index 1003 - - - Star Sensor FIFO Data raw 12 bit index 1004 - Star Sensor FIFO Data raw 12 bit index 1004 - - - Star Sensor FIFO Data raw 12 bit index 1005 - Star Sensor FIFO Data raw 12 bit index 1005 - - - Star Sensor FIFO Data raw 12 bit index 1006 - Star Sensor FIFO Data raw 12 bit index 1006 - - - Star Sensor FIFO Data raw 12 bit index 1007 - Star Sensor FIFO Data raw 12 bit index 1007 - - - Star Sensor FIFO Data raw 12 bit index 1008 - Star Sensor FIFO Data raw 12 bit index 1008 - - - Star Sensor FIFO Data raw 12 bit index 1009 - Star Sensor FIFO Data raw 12 bit index 1009 - - - Star Sensor FIFO Data raw 12 bit index 1010 - Star Sensor FIFO Data raw 12 bit index 1010 - - - Star Sensor FIFO Data raw 12 bit index 1011 - Star Sensor FIFO Data raw 12 bit index 1011 - - - Star Sensor FIFO Data raw 12 bit index 1012 - Star Sensor FIFO Data raw 12 bit index 1012 - - - Star Sensor FIFO Data raw 12 bit index 1013 - Star Sensor FIFO Data raw 12 bit index 1013 - - - Star Sensor FIFO Data raw 12 bit index 1014 - Star Sensor FIFO Data raw 12 bit index 1014 - - - Star Sensor FIFO Data raw 12 bit index 1015 - Star Sensor FIFO Data raw 12 bit index 1015 - - - Star Sensor FIFO Data raw 12 bit index 1016 - Star Sensor FIFO Data raw 12 bit index 1016 - - - Star Sensor FIFO Data raw 12 bit index 1017 - Star Sensor FIFO Data raw 12 bit index 1017 - - - Star Sensor FIFO Data raw 12 bit index 1018 - Star Sensor FIFO Data raw 12 bit index 1018 - - - Star Sensor FIFO Data raw 12 bit index 1019 - Star Sensor FIFO Data raw 12 bit index 1019 - - - Star Sensor FIFO Data raw 12 bit index 1020 - Star Sensor FIFO Data raw 12 bit index 1020 - - - Star Sensor FIFO Data raw 12 bit index 1021 - Star Sensor FIFO Data raw 12 bit index 1021 - - - Star Sensor FIFO Data raw 12 bit index 1022 - Star Sensor FIFO Data raw 12 bit index 1022 - - - Star Sensor FIFO Data raw 12 bit index 1023 - Star Sensor FIFO Data raw 12 bit index 1023 - - - 16-bit CRC checksum - 16-bit CRC checksum - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/imap_processing/lo/packet_definitions/P_ILO_SCI_CNT.xml b/imap_processing/lo/packet_definitions/P_ILO_SCI_CNT.xml deleted file mode 100644 index 2067e7a21..000000000 --- a/imap_processing/lo/packet_definitions/P_ILO_SCI_CNT.xml +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 26880 - - - - - - - CCSDS Packet Version Number (always 0) - - - CCSDS Packet Type Indicator (0=telemetry) - - - CCSDS Packet Secondary Header Flag (always 1) - - - CCSDS Packet Application Process ID - - - CCSDS Packet Grouping Flags (3=not part of group) - - - CCSDS Packet Sequence Count (increments with each new packet) - - - CCSDS Packet Length (number of bytes after Packet length minus 1) - - - CCSDS Secondary Header MET - CCSDS Secondary Header MET - - - Science Count Data - - - 16-bit CRC checksum - 16-bit CRC checksum - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/imap_processing/lo/packet_definitions/P_ILO_SCI_DE.xml b/imap_processing/lo/packet_definitions/P_ILO_SCI_DE.xml deleted file mode 100644 index 3cfffcec1..000000000 --- a/imap_processing/lo/packet_definitions/P_ILO_SCI_DE.xml +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CCSDS Packet Version Number (always 0) - - - CCSDS Packet Type Indicator (0=telemetry) - - - CCSDS Packet Secondary Header Flag (always 1) - - - CCSDS Packet Application Process ID - - - CCSDS Packet Grouping Flags (3=not part of group) - - - CCSDS Packet Sequence Count (increments with each new packet) - - - CCSDS Packet Length (number of bytes after Packet length minus 1) - - - CCSDS Secondary Header MET - CCSDS Secondary Header MET - - - Number of direct events - Number of direct events - - - TOF Direct Event Time Tagged data - See table 7 of Section 4.2.1 for sizing and see Table 8 and table 9 in section 4.2.1.2 (PHA Event Compression and Packing by ICE) of IMAP-Lo Data Flow document - - - 16-bit CRC checksum - 16-bit CRC checksum - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/imap_processing/lo/packet_definitions/P_ILO_SPIN.xml b/imap_processing/lo/packet_definitions/P_ILO_SPIN.xml deleted file mode 100644 index fd917dc15..000000000 --- a/imap_processing/lo/packet_definitions/P_ILO_SPIN.xml +++ /dev/null @@ -1,1241 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CCSDS Packet Version Number (always 0) - - - CCSDS Packet Type Indicator (0=telemetry) - - - CCSDS Packet Secondary Header Flag (always 1) - - - CCSDS Packet Application Process ID - - - CCSDS Packet Grouping Flags (3=not part of group) - - - CCSDS Packet Sequence Count (increments with each new packet) - - - CCSDS Packet Length (number of bytes after Packet length minus 1) - - - CCSDS Secondary Header MET - CCSDS Secondary Header MET - - - Number of spins completed - Number of spins completed - - - Spare for alignment - Spare for alignment - - - Acquisition end whole seconds - Acquisition end whole seconds - - - Acquisition end subseconds - Acquisition end subseconds - - - Spare for alignment - Spare for alignment - - - Spin Start Whole Seconds, index 0 - Spin Start Whole Seconds, index 0 - - - Spin Start Sub Seconds, index 0 - Spin Start Sub Seconds, index 0 - - - ESA_P DAC, index 0 - ESA_P DAC, index 0 - - - ESA_N DAC, index 0 - ESA_N DAC, index 0 - - - Valid Spin Period, index 0 - Valid Spin Period, index 0 - - - Valid Spin Phase, index 0 - Valid Spin Phase, index 0 - - - Spin Period Source, index 0 - Spin Period Source, index 0 - - - Reserved, index 0 - Reserved, index 0 - - - Spin Start Whole Seconds, index 1 - Spin Start Whole Seconds, index 1 - - - Spin Start Sub Seconds, index 1 - Spin Start Sub Seconds, index 1 - - - ESA_P DAC, index 1 - ESA_P DAC, index 1 - - - ESA_N DAC, index 1 - ESA_N DAC, index 1 - - - Valid Spin Period, index 1 - Valid Spin Period, index 1 - - - Valid Spin Phase, index 1 - Valid Spin Phase, index 1 - - - Spin Period Source, index 1 - Spin Period Source, index 1 - - - Reserved, index 1 - Reserved, index 1 - - - Spin Start Whole Seconds, index 2 - Spin Start Whole Seconds, index 2 - - - Spin Start Sub Seconds, index 2 - Spin Start Sub Seconds, index 2 - - - ESA_P DAC, index 2 - ESA_P DAC, index 2 - - - ESA_N DAC, index 2 - ESA_N DAC, index 2 - - - Valid Spin Period, index 2 - Valid Spin Period, index 2 - - - Valid Spin Phase, index 2 - Valid Spin Phase, index 2 - - - Spin Period Source, index 2 - Spin Period Source, index 2 - - - Reserved, index 2 - Reserved, index 2 - - - Spin Start Whole Seconds, index 3 - Spin Start Whole Seconds, index 3 - - - Spin Start Sub Seconds, index 3 - Spin Start Sub Seconds, index 3 - - - ESA_P DAC, index 3 - ESA_P DAC, index 3 - - - ESA_N DAC, index 3 - ESA_N DAC, index 3 - - - Valid Spin Period, index 3 - Valid Spin Period, index 3 - - - Valid Spin Phase, index 3 - Valid Spin Phase, index 3 - - - Spin Period Source, index 3 - Spin Period Source, index 3 - - - Reserved, index 3 - Reserved, index 3 - - - Spin Start Whole Seconds, index 4 - Spin Start Whole Seconds, index 4 - - - Spin Start Sub Seconds, index 4 - Spin Start Sub Seconds, index 4 - - - ESA_P DAC, index 4 - ESA_P DAC, index 4 - - - ESA_N DAC, index 4 - ESA_N DAC, index 4 - - - Valid Spin Period, index 4 - Valid Spin Period, index 4 - - - Valid Spin Phase, index 4 - Valid Spin Phase, index 4 - - - Spin Period Source, index 4 - Spin Period Source, index 4 - - - Reserved, index 4 - Reserved, index 4 - - - Spin Start Whole Seconds, index 5 - Spin Start Whole Seconds, index 5 - - - Spin Start Sub Seconds, index 5 - Spin Start Sub Seconds, index 5 - - - ESA_P DAC, index 5 - ESA_P DAC, index 5 - - - ESA_N DAC, index 5 - ESA_N DAC, index 5 - - - Valid Spin Period, index 5 - Valid Spin Period, index 5 - - - Valid Spin Phase, index 5 - Valid Spin Phase, index 5 - - - Spin Period Source, index 5 - Spin Period Source, index 5 - - - Reserved, index 5 - Reserved, index 5 - - - Spin Start Whole Seconds, index 6 - Spin Start Whole Seconds, index 6 - - - Spin Start Sub Seconds, index 6 - Spin Start Sub Seconds, index 6 - - - ESA_P DAC, index 6 - ESA_P DAC, index 6 - - - ESA_N DAC, index 6 - ESA_N DAC, index 6 - - - Valid Spin Period, index 6 - Valid Spin Period, index 6 - - - Valid Spin Phase, index 6 - Valid Spin Phase, index 6 - - - Spin Period Source, index 6 - Spin Period Source, index 6 - - - Reserved, index 6 - Reserved, index 6 - - - Spin Start Whole Seconds, index 7 - Spin Start Whole Seconds, index 7 - - - Spin Start Sub Seconds, index 7 - Spin Start Sub Seconds, index 7 - - - ESA_P DAC, index 7 - ESA_P DAC, index 7 - - - ESA_N DAC, index 7 - ESA_N DAC, index 7 - - - Valid Spin Period, index 7 - Valid Spin Period, index 7 - - - Valid Spin Phase, index 7 - Valid Spin Phase, index 7 - - - Spin Period Source, index 7 - Spin Period Source, index 7 - - - Reserved, index 7 - Reserved, index 7 - - - Spin Start Whole Seconds, index 8 - Spin Start Whole Seconds, index 8 - - - Spin Start Sub Seconds, index 8 - Spin Start Sub Seconds, index 8 - - - ESA_P DAC, index 8 - ESA_P DAC, index 8 - - - ESA_N DAC, index 8 - ESA_N DAC, index 8 - - - Valid Spin Period, index 8 - Valid Spin Period, index 8 - - - Valid Spin Phase, index 8 - Valid Spin Phase, index 8 - - - Spin Period Source, index 8 - Spin Period Source, index 8 - - - Reserved, index 8 - Reserved, index 8 - - - Spin Start Whole Seconds, index 9 - Spin Start Whole Seconds, index 9 - - - Spin Start Sub Seconds, index 9 - Spin Start Sub Seconds, index 9 - - - ESA_P DAC, index 9 - ESA_P DAC, index 9 - - - ESA_N DAC, index 9 - ESA_N DAC, index 9 - - - Valid Spin Period, index 9 - Valid Spin Period, index 9 - - - Valid Spin Phase, index 9 - Valid Spin Phase, index 9 - - - Spin Period Source, index 9 - Spin Period Source, index 9 - - - Reserved, index 9 - Reserved, index 9 - - - Spin Start Whole Seconds, index 10 - Spin Start Whole Seconds, index 10 - - - Spin Start Sub Seconds, index 10 - Spin Start Sub Seconds, index 10 - - - ESA_P DAC, index 10 - ESA_P DAC, index 10 - - - ESA_N DAC, index 10 - ESA_N DAC, index 10 - - - Valid Spin Period, index 10 - Valid Spin Period, index 10 - - - Valid Spin Phase, index 10 - Valid Spin Phase, index 10 - - - Spin Period Source, index 10 - Spin Period Source, index 10 - - - Reserved, index 10 - Reserved, index 10 - - - Spin Start Whole Seconds, index 11 - Spin Start Whole Seconds, index 11 - - - Spin Start Sub Seconds, index 11 - Spin Start Sub Seconds, index 11 - - - ESA_P DAC, index 11 - ESA_P DAC, index 11 - - - ESA_N DAC, index 11 - ESA_N DAC, index 11 - - - Valid Spin Period, index 11 - Valid Spin Period, index 11 - - - Valid Spin Phase, index 11 - Valid Spin Phase, index 11 - - - Spin Period Source, index 11 - Spin Period Source, index 11 - - - Reserved, index 11 - Reserved, index 11 - - - Spin Start Whole Seconds, index 12 - Spin Start Whole Seconds, index 12 - - - Spin Start Sub Seconds, index 12 - Spin Start Sub Seconds, index 12 - - - ESA_P DAC, index 12 - ESA_P DAC, index 12 - - - ESA_N DAC, index 12 - ESA_N DAC, index 12 - - - Valid Spin Period, index 12 - Valid Spin Period, index 12 - - - Valid Spin Phase, index 12 - Valid Spin Phase, index 12 - - - Spin Period Source, index 12 - Spin Period Source, index 12 - - - Reserved, index 12 - Reserved, index 12 - - - Spin Start Whole Seconds, index 13 - Spin Start Whole Seconds, index 13 - - - Spin Start Sub Seconds, index 13 - Spin Start Sub Seconds, index 13 - - - ESA_P DAC, index 13 - ESA_P DAC, index 13 - - - ESA_N DAC, index 13 - ESA_N DAC, index 13 - - - Valid Spin Period, index 13 - Valid Spin Period, index 13 - - - Valid Spin Phase, index 13 - Valid Spin Phase, index 13 - - - Spin Period Source, index 13 - Spin Period Source, index 13 - - - Reserved, index 13 - Reserved, index 13 - - - Spin Start Whole Seconds, index 14 - Spin Start Whole Seconds, index 14 - - - Spin Start Sub Seconds, index 14 - Spin Start Sub Seconds, index 14 - - - ESA_P DAC, index 14 - ESA_P DAC, index 14 - - - ESA_N DAC, index 14 - ESA_N DAC, index 14 - - - Valid Spin Period, index 14 - Valid Spin Period, index 14 - - - Valid Spin Phase, index 14 - Valid Spin Phase, index 14 - - - Spin Period Source, index 14 - Spin Period Source, index 14 - - - Reserved, index 14 - Reserved, index 14 - - - Spin Start Whole Seconds, index 15 - Spin Start Whole Seconds, index 15 - - - Spin Start Sub Seconds, index 15 - Spin Start Sub Seconds, index 15 - - - ESA_P DAC, index 15 - ESA_P DAC, index 15 - - - ESA_N DAC, index 15 - ESA_N DAC, index 15 - - - Valid Spin Period, index 15 - Valid Spin Period, index 15 - - - Valid Spin Phase, index 15 - Valid Spin Phase, index 15 - - - Spin Period Source, index 15 - Spin Period Source, index 15 - - - Reserved, index 15 - Reserved, index 15 - - - Spin Start Whole Seconds, index 16 - Spin Start Whole Seconds, index 16 - - - Spin Start Sub Seconds, index 16 - Spin Start Sub Seconds, index 16 - - - ESA_P DAC, index 16 - ESA_P DAC, index 16 - - - ESA_N DAC, index 16 - ESA_N DAC, index 16 - - - Valid Spin Period, index 16 - Valid Spin Period, index 16 - - - Valid Spin Phase, index 16 - Valid Spin Phase, index 16 - - - Spin Period Source, index 16 - Spin Period Source, index 16 - - - Reserved, index 16 - Reserved, index 16 - - - Spin Start Whole Seconds, index 17 - Spin Start Whole Seconds, index 17 - - - Spin Start Sub Seconds, index 17 - Spin Start Sub Seconds, index 17 - - - ESA_P DAC, index 17 - ESA_P DAC, index 17 - - - ESA_N DAC, index 17 - ESA_N DAC, index 17 - - - Valid Spin Period, index 17 - Valid Spin Period, index 17 - - - Valid Spin Phase, index 17 - Valid Spin Phase, index 17 - - - Spin Period Source, index 17 - Spin Period Source, index 17 - - - Reserved, index 17 - Reserved, index 17 - - - Spin Start Whole Seconds, index 18 - Spin Start Whole Seconds, index 18 - - - Spin Start Sub Seconds, index 18 - Spin Start Sub Seconds, index 18 - - - ESA_P DAC, index 18 - ESA_P DAC, index 18 - - - ESA_N DAC, index 18 - ESA_N DAC, index 18 - - - Valid Spin Period, index 18 - Valid Spin Period, index 18 - - - Valid Spin Phase, index 18 - Valid Spin Phase, index 18 - - - Spin Period Source, index 18 - Spin Period Source, index 18 - - - Reserved, index 18 - Reserved, index 18 - - - Spin Start Whole Seconds, index 19 - Spin Start Whole Seconds, index 19 - - - Spin Start Sub Seconds, index 19 - Spin Start Sub Seconds, index 19 - - - ESA_P DAC, index 19 - ESA_P DAC, index 19 - - - ESA_N DAC, index 19 - ESA_N DAC, index 19 - - - Valid Spin Period, index 19 - Valid Spin Period, index 19 - - - Valid Spin Phase, index 19 - Valid Spin Phase, index 19 - - - Spin Period Source, index 19 - Spin Period Source, index 19 - - - Reserved, index 19 - Reserved, index 19 - - - Spin Start Whole Seconds, index 20 - Spin Start Whole Seconds, index 20 - - - Spin Start Sub Seconds, index 20 - Spin Start Sub Seconds, index 20 - - - ESA_P DAC, index 20 - ESA_P DAC, index 20 - - - ESA_N DAC, index 20 - ESA_N DAC, index 20 - - - Valid Spin Period, index 20 - Valid Spin Period, index 20 - - - Valid Spin Phase, index 20 - Valid Spin Phase, index 20 - - - Spin Period Source, index 20 - Spin Period Source, index 20 - - - Reserved, index 20 - Reserved, index 20 - - - Spin Start Whole Seconds, index 21 - Spin Start Whole Seconds, index 21 - - - Spin Start Sub Seconds, index 21 - Spin Start Sub Seconds, index 21 - - - ESA_P DAC, index 21 - ESA_P DAC, index 21 - - - ESA_N DAC, index 21 - ESA_N DAC, index 21 - - - Valid Spin Period, index 21 - Valid Spin Period, index 21 - - - Valid Spin Phase, index 21 - Valid Spin Phase, index 21 - - - Spin Period Source, index 21 - Spin Period Source, index 21 - - - Reserved, index 21 - Reserved, index 21 - - - Spin Start Whole Seconds, index 22 - Spin Start Whole Seconds, index 22 - - - Spin Start Sub Seconds, index 22 - Spin Start Sub Seconds, index 22 - - - ESA_P DAC, index 22 - ESA_P DAC, index 22 - - - ESA_N DAC, index 22 - ESA_N DAC, index 22 - - - Valid Spin Period, index 22 - Valid Spin Period, index 22 - - - Valid Spin Phase, index 22 - Valid Spin Phase, index 22 - - - Spin Period Source, index 22 - Spin Period Source, index 22 - - - Reserved, index 22 - Reserved, index 22 - - - Spin Start Whole Seconds, index 23 - Spin Start Whole Seconds, index 23 - - - Spin Start Sub Seconds, index 23 - Spin Start Sub Seconds, index 23 - - - ESA_P DAC, index 23 - ESA_P DAC, index 23 - - - ESA_N DAC, index 23 - ESA_N DAC, index 23 - - - Valid Spin Period, index 23 - Valid Spin Period, index 23 - - - Valid Spin Phase, index 23 - Valid Spin Phase, index 23 - - - Spin Period Source, index 23 - Spin Period Source, index 23 - - - Reserved, index 23 - Reserved, index 23 - - - Spin Start Whole Seconds, index 24 - Spin Start Whole Seconds, index 24 - - - Spin Start Sub Seconds, index 24 - Spin Start Sub Seconds, index 24 - - - ESA_P DAC, index 24 - ESA_P DAC, index 24 - - - ESA_N DAC, index 24 - ESA_N DAC, index 24 - - - Valid Spin Period, index 24 - Valid Spin Period, index 24 - - - Valid Spin Phase, index 24 - Valid Spin Phase, index 24 - - - Spin Period Source, index 24 - Spin Period Source, index 24 - - - Reserved, index 24 - Reserved, index 24 - - - Spin Start Whole Seconds, index 25 - Spin Start Whole Seconds, index 25 - - - Spin Start Sub Seconds, index 25 - Spin Start Sub Seconds, index 25 - - - ESA_P DAC, index 25 - ESA_P DAC, index 25 - - - ESA_N DAC, index 25 - ESA_N DAC, index 25 - - - Valid Spin Period, index 25 - Valid Spin Period, index 25 - - - Valid Spin Phase, index 25 - Valid Spin Phase, index 25 - - - Spin Period Source, index 25 - Spin Period Source, index 25 - - - Reserved, index 25 - Reserved, index 25 - - - Spin Start Whole Seconds, index 26 - Spin Start Whole Seconds, index 26 - - - Spin Start Sub Seconds, index 26 - Spin Start Sub Seconds, index 26 - - - ESA_P DAC, index 26 - ESA_P DAC, index 26 - - - ESA_N DAC, index 26 - ESA_N DAC, index 26 - - - Valid Spin Period, index 26 - Valid Spin Period, index 26 - - - Valid Spin Phase, index 26 - Valid Spin Phase, index 26 - - - Spin Period Source, index 26 - Spin Period Source, index 26 - - - Reserved, index 26 - Reserved, index 26 - - - Spin Start Whole Seconds, index 27 - Spin Start Whole Seconds, index 27 - - - Spin Start Sub Seconds, index 27 - Spin Start Sub Seconds, index 27 - - - ESA_P DAC, index 27 - ESA_P DAC, index 27 - - - ESA_N DAC, index 27 - ESA_N DAC, index 27 - - - Valid Spin Period, index 27 - Valid Spin Period, index 27 - - - Valid Spin Phase, index 27 - Valid Spin Phase, index 27 - - - Spin Period Source, index 27 - Spin Period Source, index 27 - - - Reserved, index 27 - Reserved, index 27 - - - 16-bit CRC checksum - 16-bit CRC checksum - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/imap_processing/lo/packet_definitions/P_ILO_STAR.xml b/imap_processing/lo/packet_definitions/P_ILO_STAR.xml deleted file mode 100644 index 2a7e5b923..000000000 --- a/imap_processing/lo/packet_definitions/P_ILO_STAR.xml +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5760 - - - - - - - CCSDS Packet Version Number (always 0) - - - CCSDS Packet Type Indicator (0=telemetry) - - - CCSDS Packet Secondary Header Flag (always 1) - - - CCSDS Packet Application Process ID - - - CCSDS Packet Grouping Flags (3=not part of group) - - - CCSDS Packet Sequence Count (increments with each new packet) - - - CCSDS Packet Length (number of bytes after Packet length minus 1) - - - CCSDS Secondary Header MET - CCSDS Secondary Header MET - - - Number of star sensor samples - Number of star sensor samples - - - Star Sensor Data - Start Sensor Data - - - 16-bit CRC checksum - 16-bit CRC checksum - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/imap_processing/lo/packet_definitions/lo_xtce.xml b/imap_processing/lo/packet_definitions/lo_xtce.xml new file mode 100644 index 000000000..410c6cfcb --- /dev/null +++ b/imap_processing/lo/packet_definitions/lo_xtce.xml @@ -0,0 +1,3541 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CCSDS Packet Version Number (always 0) + + + CCSDS Packet Type Indicator (0=telemetry) + + + CCSDS Packet Secondary Header Flag (always 1) + + + CCSDS Packet Application Process ID + + + CCSDS Packet Grouping Flags (3=not part of group) + + + CCSDS Packet Sequence Count (increments with each new packet) + + + CCSDS Packet Length (number of bytes after Packet length minus 1) + + + CCSDS Secondary header, mission elapsed time + + + Boot FSW version + + + Number of boot attempts + + + Built-In-Self-Test status + + + Built-In-Self-Test Address bus fail mask + + + Built-In-Self-Test Data bus fail mask + + + Built-In-Self-Test memory fail first location + + + Built-In-Self-Test memory fail last location + + + Built-In-Self-Test memory map + + + Built-In-Self-Test memory error count + + + App FSW image 1 checksum status + + + App FSW image 2 checksum status + + + Spare for alignment + + + Instrument ID + + + Spare for alignment + + + CDH FPGA version + + + High voltage plug status + + + Front panel door disable plug status + + + Spare for alignment + + + + System temperature monitor 1 + + + + System temperature monitor 2 + + + + System temperature monitor 3 + + + + LVPS temperature monitor 1 + + + + LVPS temperature monitor 2 + + + + LVPS temperature monitor 3 + + + + LVPS voltage monitor 1 + + + + LVPS voltage monitor 2 + + + + LVPS voltage monitor 3 + + + + LVPS voltage monitor 4 + + + + LVPS voltage monitor 5 + + + + LVPS current monitor 1 + + + + LVPS current monitor 2 + + + + LVPS current monitor 3 + + + + LVPS current monitor 4 + + + + LVPS current monitor 5 + + + + CDH 1.5V voltage monitor + + + + CDH 1.8V voltage monitor + + + + CDH 3.3V voltage monitor + + + + CDH +12V voltage monitor + + + + CDH -12V voltage monitor + + + + CDH 5V voltage monitor + + + + CDH analog ref voltage monitor + + + + CDH temperature 1 monitor + + + + CDH temperature 2 monitor + + + + CDH temperature 3 monitor + + + + CDH temperature 4 monitor + + + Current operating mode + + + Accepted commands count + + + Executed commands count + + + Rejected commands count + + + Accepted command opcode + + + Command result + + + ITF error counter + + + 16-bit CRC checksum + + + CCSDS Secondary Header MET + + + ILO_APP_SHK.CDH_JUMPER_REG + + + ILO_APP_SHK.RESET_REASON_SOFT + + + ILO_APP_SHK.RESET_REASON_FPGA_WDOG + + + ILO_APP_SHK.RESET_REASON_CPU_WDOG + + + ILO_APP_SHK.RESET_REASON_PFO + + + ILO_APP_SHK.RESET_REASON_PFO + + + ILO_APP_SHK.CPU_WDOG_STATE + + + ILO_APP_SHK.FPGA_WDOG_STATE + + + ILO_APP_SHK.WDOG_CNT + + + ILO_APP_SHK.INSTR_ID + + + ILO_APP_SHK.CDH_FPGA_VERSION + + + ILO_APP_SHK.IFB_FPGA_VERSION + + + ILO_APP_SHK.BULK_HVPS_VERSION + + + ILO_APP_SHK.FSW_VERSION + + + ILO_APP_SHK.SELECTED_IMG + + + ILO_APP_SHK.FSW_VERSION_STR + + + ILO_APP_SHK.ENG_LUT_VERSION_STR + + + ILO_APP_SHK.SCI_LUT_VERSION_STR + + + SDRAM address of scratch buffer address + + + ILO_APP_SHK.SPARE + + + ILO_APP_SHK.CHKSUM + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CCSDS Secondary Header MET + + + + 16-bit CRC checksum + + + CCSDS Secondary Header MET + + + Number of direct events + + + Passes through the raw data + + + See table 7 of Section 4.2.1 for sizing and see Table 8 and table 9 in section 4.2.1.2 (PHA Event Compression and Packing by ICE) of IMAP-Lo Data Flow document + + + 16-bit CRC checksum + + + CCSDS Secondary Header MET + + + Number of star sensor samples + + + Binary Star Sensor Data + + + 16-bit CRC checksum + + + CCSDS Secondary Header MET + + + Number of spins completed + + + Acquisition start whole seconds + + + Acquisition start subseconds + + + Acquisition end whole seconds + + + Acquisition end subseconds + + + Binary Spin data + + + 16 bit CRC checksum + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/imap_processing/tests/test_decom.py b/imap_processing/tests/test_decom.py index dea3644aa..2bd1d88f3 100644 --- a/imap_processing/tests/test_decom.py +++ b/imap_processing/tests/test_decom.py @@ -14,13 +14,13 @@ def test_ccsds_header(xtce_document): # Define what is expected in the XTCE document header_keys = [ - ("VERSION", "UINT3"), - ("TYPE", "UINT1"), - ("SEC_HDR_FLG", "UINT1"), - ("PKT_APID", "UINT11"), - ("SEQ_FLGS", "UINT2"), - ("SRC_SEQ_CTR", "UINT14"), - ("PKT_LEN", "UINT16"), + ("VERSION", "3"), + ("TYPE", "1"), + ("SEC_HDR_FLG", "1"), + ("PKT_APID", "11"), + ("SEQ_FLGS", "2"), + ("SRC_SEQ_CTR", "14"), + ("PKT_LEN", "16"), ] header_entry_list = ( "" @@ -40,12 +40,23 @@ def test_ccsds_header(xtce_document): # Check that each header key is defined as a Parameter for key in header_keys: - assert ( - f'' + f"\n\t\t\t\t" + f'' in document ) + assert any((old_xtce_gen, new_xtce_gen)) + # Check that the header is defined as a SequenceContainer in the XTCE file # First remove discrepancies in whitespace, tabs, and newlines header_entry_list = ( From 0135dcc0729df946cd758dcc095f5c2c183b93b5 Mon Sep 17 00:00:00 2001 From: Greg Lucas Date: Tue, 20 Aug 2024 11:57:24 -0600 Subject: [PATCH 4/7] MNT: Enable numpy 2+ installs (#758) Numpy 2 is more strict about the overflow math calculations, so we needed to update a few cases to handle that as well. --- imap_processing/cdf/config/imap_hi_variable_attrs.yaml | 1 - imap_processing/mag/l1a/mag_l1a_data.py | 4 ++++ poetry.lock | 2 +- pyproject.toml | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/imap_processing/cdf/config/imap_hi_variable_attrs.yaml b/imap_processing/cdf/config/imap_hi_variable_attrs.yaml index a450acc34..f71c96e57 100644 --- a/imap_processing/cdf/config/imap_hi_variable_attrs.yaml +++ b/imap_processing/cdf/config/imap_hi_variable_attrs.yaml @@ -287,7 +287,6 @@ hi_de_nominal_bin: <<: *default_uint8 CATDESC: Corresponding histogram angle bin for this Direct Event FIELDNAM: Histogram Bin Number - FILLVAL: 511 FORMAT: I2 LABLAXIS: Hist Bin \# VALIDMIN: 0 diff --git a/imap_processing/mag/l1a/mag_l1a_data.py b/imap_processing/mag/l1a/mag_l1a_data.py index 58130b9d6..b808d66c7 100644 --- a/imap_processing/mag/l1a/mag_l1a_data.py +++ b/imap_processing/mag/l1a/mag_l1a_data.py @@ -336,6 +336,10 @@ def to_signed16(n: int) -> int: primary_vectors = [] secondary_vectors = [] + # To avoid overflows, we need to cast the potentially 8 bit signed integers to + # int32 before the bitshifting operations below. + vector_data = vector_data.astype(np.int32) + # Since the vectors are stored as 50 bit chunks but accessed via hex (4 bit # chunks) there is some shifting required for processing the bytes. # However, from a bit processing perspective, the first 48 bits of each 50 bit diff --git a/poetry.lock b/poetry.lock index 4f8f4bb36..83c5479d1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1747,4 +1747,4 @@ tools = ["openpyxl", "pandas"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<4" -content-hash = "28cbb877e15c362c80541a8cebd35f12575cd86802c902505b4db1f65640d37e" +content-hash = "f750033025b765826c827adb1142fd59444e13a985755c2a6efc3a207348a959" diff --git a/pyproject.toml b/pyproject.toml index df0ef2a95..598c512e7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,7 +38,7 @@ space_packet_parser = ">=4.2.0" spiceypy = ">=6.0.0" xarray = '>=2023.0.0' pyyaml = "^6.0.1" -numpy = "^1.26.4" +numpy = "<=3" # Optional dependencies numpydoc = {version="^1.5.0", optional=true} From 87ede4dfdfac521b478cf611e9e8fa0084ba2f1d Mon Sep 17 00:00:00 2001 From: Greg Lucas Date: Fri, 23 Aug 2024 14:24:00 -0600 Subject: [PATCH 5/7] DOC: Update XTCE generator documentation (#766) --- .../tools/xtce-generator.rst | 210 ++++++++++++------ 1 file changed, 146 insertions(+), 64 deletions(-) diff --git a/docs/source/code-documentation/tools/xtce-generator.rst b/docs/source/code-documentation/tools/xtce-generator.rst index 452746a8d..cc16f5066 100644 --- a/docs/source/code-documentation/tools/xtce-generator.rst +++ b/docs/source/code-documentation/tools/xtce-generator.rst @@ -1,84 +1,166 @@ .. _xtce_generator: -Generating Telemetry XML with Python Script -=========================================== +XML Telemetric and Command Exchange (XTCE) +========================================== -Here is some info on `XTCE `_. This Green -Book introduces the main concepts of XML Telemetric and Command Exchange (XTCE), a -telemetry and telecommand database format for spacecraft monitoring -and control. +The `XTCE green book `_. +introduces the main concepts and specifications of XTCE. +The XTCE format is a specification for spacecraft monitoring and control data transfer. +It can be used to define how packets can be sent and received from the spacecraft, +which we then unpack on the ground using the XTCE format. -General -------- - -This document provides steps and information on how to use -`xtce_generator_template.py` script as a base for users to generate -telemetry XML files. The script is designed to simplify the process of creating -telemetry definitions for various packet types. - -The script is located in the `tools/xtce_generation` directory. The script is called -`xtce_generator_template.py`. The script is a ``template`` that can be modified to -generate telemetry XML files for different packet types. Your new file should be -called `xtce_generator_yourinstrument.py`. -An example of how to use the script is `xtce_generator_codice.py` which is also -located in the `tools/xtce_generation` directory. Before you Start ---------------- Generating XTCEs is only done whenever packet definitions get updated, and thus it -is not a part of the main processing package. To use it there are a few extra -dependencies like ``pandas`` that you can install with +is not regularly run as a part of processing. To use it there are a few extra +dependencies (like ``openpyxl`` for reading excel spreadsheets) that you +can install with the tools extra. .. code:: + # with poetry poetry install --extras tools + # or with pip + pip install imap_processing[tools] How to Use ---------- -Define the instrument name in the `main()` function by setting the `instrument_name` -variable to the name of your instrument. - -.. code:: - - instrument_name = "your_instrument_name" - -In the code, file paths are being configured. Make sure to change the file paths to -match your instrument's file structure. - -.. code:: - - current_directory = Path(__file__).parent - module_path = f"{current_directory}/../../imap_processing" - # This is the path of the output directory - packet_definition_path = f"{module_path}/{instrument_name}/packet_definitions" - # This is the path to the excel file that contains the telemetry definitions - path_to_excel_file = f"{current_directory}/your_packet.xlsx" - -Define packet names and `Application Process Identifiers (APIDs) -`_. -The packet names are **case sensitive** meaning the the packet names need to be exactly -what the tabs of the spreadsheet are. APID's must match the names and apIds in the -packet definition file. You can use as many packet names and apIds as you want. -The APID should be an integer (not hexadecimal). -Follow the format below. - -.. code:: - - packets = { - # Define packet names and associated Application IDs (apId) - "your_packet_A": ####, - "your_packet_B": ####, - # ... (other packet definitions) - } - -Generating Telemetry XML Files -------------------------------- - -Once you have your xtce processing file defined, you can run it with the -following command: +There is a command line utility ``imap_xtce`` that can be used to generate XTCE files +that is installed with the ``imap_processing`` package. +The utility takes in an excel file and generates XTCE files for each packet definition +in the excel file. If you don't provide an output file, it will generate the XTCE file +with the same name as the input Excel file but with the extension changed to ``.xml``. .. code:: - python xtce_generator_instrument_name.py + imap_xtce path/to/excel_packet_file.xlsx --output path/to/output_packet_definition.xml + + +Spreadsheet definitions +----------------------- + +The XTCE generator uses an excel spreadsheet to define the packet structure. +This is a commonly used spreadsheet format at the Laboratory for Atmospheric and Space Physics (LASP). +The required tabs are ``Subsystem``, ``Packets``, and whatever packet names you have. + +Subsystem tab +~~~~~~~~~~~~~ + +The ``Subsystem`` tab is used to define the instrument name and last updated date of the packet data. + +.. list-table:: Subsystem + :header-rows: 1 + + * - infoField + - infoValue + * - subsystem + - MY_INSTRUMENT + * - sheetReleaseDate + - 01/01/2010 + * - sheetReleaseRev + - 1.2.3 + +Packets tab +~~~~~~~~~~~ + +The packets tab contains the list of packets that you want to include within your XTCE +packet definition. You can remove rows from this to control which individual packet tabs +are read in later. The ``packetName`` column defines which other tabs to read in. So in +the following table, the generator will read in the ``MY_INSTRUMENT_HK`` and +``MY_INSTRUMENT_SCI`` tabs that contain the packet definitions. + +.. note:: + The generator will also work with tabs prefixed with ``P_``, so ``P_MY_INSTRUMENT_HK`` and + ``P_MY_INSTRUMENT_SCI`` tab names would also work. + +.. list-table:: Packets + :header-rows: 1 + + * - packetName + - apId + * - MY_INSTRUMENT_HK + - 123 + * - MY_INSTRUMENT_SCI + - 124 + +Individual packet tabs +~~~~~~~~~~~~~~~~~~~~~~ + +Each packet tab contains the contents that will create the XTCE packet definition. +The required columns are ``packetName``, ``mnemonic``, ``lengthInBits``, ``dataType``, +``convertAs``, with optional ``shortDescription`` and ``longDescription`` columns. + +Within the XTCE definition, the variable names will be ``packetName.mnemonic`` separated +with a period for easier distinguishing between packets and variables. For example, +the table below would have this XTCE parameter definition ``MY_INSTRUMENT_HK.VARIABLE1_UINT`` +for the first variable. If an analog conversion is required, the ``convertAs`` column +should be set to ``ANALOG``, which will then look at the ``AnalogConversions`` tab for +the conversion details. + +.. list-table:: MY_INSTRUMENT_HK + :header-rows: 1 + + * - packetName + - mnemonic + - lengthInBits + - dataType + - convertAs + - shortDescription + - longDescription + * - MY_INSTRUMENT_HK + - VARIABLE1_UINT + - 3 + - UINT + - NONE + - My short variable description + - My verbose variable description + * - MY_INSTRUMENT_HK + - VARIABLE2_CONVERTED + - 3 + - UINT + - ANALOG + - Apply an analog conversion + - + * - MY_INSTRUMENT_HK + - VARIABLE_LENGTH_BINARY_SCIENCE + - 100 + - BYTE + - NONE + - + - This variable size will be dynamic and based on the packet size + +AnalogConversions tab (optional) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Packet parsing can also apply analog conversions to the data being read in. +For example, to change from a raw unsigned integer value to a temperature in Kelvin. +The ``AnalogConversions`` tab is used to define these conversions. +It currently only supports unsegmented polynomial conversions, and looks for the +coefficients defined from ``c0`` to ``c7`` to define the order of the polynomial. + +.. list-table:: AnalogConversions + :header-rows: 1 + + * - packetName + - mnemonic + - c0 + - c1 + - c2 + - c3 + - c4 + - c5 + - c6 + - c7 + * - MY_INSTRUMENT_HK + - VARIABLE2_CONVERTED + - 123.456 + - 0.234 + - + - + - + - + - + - From 8ef0cb632c6896fa210b57aa7704646c30e5af6d Mon Sep 17 00:00:00 2001 From: Laura Sandoval <46567335+laspsandoval@users.noreply.github.com> Date: Tue, 27 Aug 2024 10:06:51 -0600 Subject: [PATCH 6/7] Pointing frame code (#759) * pointing frame code --- imap_processing/spice/kernels.py | 237 +++ .../spice/test_data/imap_science_0001.tf | 171 ++ ...p_sim_ck_2hr_2secsampling_with_nutation.bc | Bin 0 -> 293888 bytes .../tests/spice/test_data/imap_wkcp.tf | 1806 +++++++++++++++++ imap_processing/tests/spice/test_kernels.py | 115 +- 5 files changed, 2322 insertions(+), 7 deletions(-) create mode 100644 imap_processing/tests/spice/test_data/imap_science_0001.tf create mode 100644 imap_processing/tests/spice/test_data/imap_sim_ck_2hr_2secsampling_with_nutation.bc create mode 100644 imap_processing/tests/spice/test_data/imap_wkcp.tf diff --git a/imap_processing/spice/kernels.py b/imap_processing/spice/kernels.py index 2d4e21154..6f7ce1492 100644 --- a/imap_processing/spice/kernels.py +++ b/imap_processing/spice/kernels.py @@ -3,9 +3,14 @@ import functools import logging import os +from collections.abc import Generator +from contextlib import contextmanager +from pathlib import Path from typing import Any, Callable, Optional +import numpy as np import spiceypy as spice +from numpy.typing import NDArray from spiceypy.utils.exceptions import SpiceyError logger = logging.getLogger(__name__) @@ -156,3 +161,235 @@ def wrapper_ensure_spice(*args: Any, **kwargs: Any) -> Any: return _decorator(f_py) else: return _decorator + + +@contextmanager +def spice_ck_file(pointing_frame_path: str) -> Generator[int, None, None]: + """ + Context manager for handling SPICE CK files. + + Parameters + ---------- + pointing_frame_path : str + Path to the CK file. + + Yields + ------ + handle : int + Handle to the opened CK file. + """ + handle = spice.ckopn(pointing_frame_path, "CK", 0) + try: + yield handle + finally: + spice.ckcls(handle) + + +@ensure_spice +def create_pointing_frame(pointing_frame_path: Optional[Path] = None) -> Path: + """ + Create the pointing frame. + + Parameters + ---------- + pointing_frame_path : Path + Directory of where pointing frame will be saved. + + Returns + ------- + pointing_frame_path : Path + Path to pointing frame. + + References + ---------- + https://numpydoc.readthedocs.io/en/latest/format.html#references + """ + ck_kernel, _, _, _ = spice.kdata(0, "ck") + + # Get timerange for the pointing frame kernel. + et_start, et_end, et_times = _get_et_times(ck_kernel) + # Create a rotation matrix + rotation_matrix = _create_rotation_matrix(et_times) + + # Convert the rotation matrix to a quaternion. + # https://spiceypy.readthedocs.io/en/main/documentation.html#spiceypy.spiceypy.m2q + q_avg = spice.m2q(rotation_matrix) + + # TODO: come up with naming convention. + if pointing_frame_path is None: + pointing_frame_path = Path(ck_kernel).parent / "imap_dps.bc" + + # Open a new CK file, returning the handle of the opened file. + # https://spiceypy.readthedocs.io/en/main/documentation.html#spiceypy.spiceypy.ckopn + with spice_ck_file(str(pointing_frame_path)) as handle: + # Get the SCLK ID. + # https://spiceypy.readthedocs.io/en/main/documentation.html#spiceypy.spiceypy.gipool + id_imap_sclk = spice.gipool("CK_-43000_SCLK", 0, 1) + # https://spiceypy.readthedocs.io/en/main/documentation.html#spiceypy.spiceypy.sce2c + # Convert start and end times to SCLK. + sclk_begtim = spice.sce2c(int(id_imap_sclk), et_start) + sclk_endtim = spice.sce2c(int(id_imap_sclk), et_end) + + # Get the pointing frame ID. + # https://spiceypy.readthedocs.io/en/main/documentation.html#spiceypy.spiceypy.gipool + id_imap_dps = spice.gipool("FRAME_IMAP_DPS", 0, 1) + # TODO: Figure out how to write new pointings to same CK kernel. + # Create the pointing frame kernel. + # https://spiceypy.readthedocs.io/en/main/documentation.html#spiceypy.spiceypy.ckw02 + spice.ckw02( + # Handle of an open CK file. + handle, + # Start time of the segment. + sclk_begtim, + # End time of the segment. + sclk_endtim, + # Pointing frame ID. + int(id_imap_dps), + # Reference frame. + "ECLIPJ2000", # Reference frame + # Identifier. + "IMAP_DPS", + # Number of pointing intervals. + 1, + # Start times of individual pointing records within segment. + # Since there is only a single record this is equal to sclk_begtim. + np.array([sclk_begtim]), + # End times of individual pointing records within segment. + # Since there is only a single record this is equal to sclk_endtim. + np.array([sclk_endtim]), # Single stop time + # Average quaternion. + q_avg, + # 0.0 Angular rotation terms. + np.array([0.0, 0.0, 0.0]), + # Rates (seconds per tick) at which the quaternion and + # angular velocity change. + np.array([1.0]), + ) + + return pointing_frame_path + + +@ensure_spice +def _get_et_times(ck_kernel: str) -> tuple[float, float, np.ndarray]: + """ + Get times for pointing start and stop. + + Parameters + ---------- + ck_kernel : str + Path of ck_kernel used to create the pointing frame. + + Returns + ------- + et_start : float + Pointing start time. + et_end : float + Pointing end time. + et_times : numpy.ndarray + Array of times between et_start and et_end. + """ + # Get the spacecraft ID. + # https://spiceypy.readthedocs.io/en/main/documentation.html#spiceypy.spiceypy.gipool + id_imap_spacecraft = spice.gipool("FRAME_IMAP_SPACECRAFT", 0, 1) + + # TODO: Queried pointing start and stop times here. + # TODO removing the @ensure_spice decorator when using the repointing table. + + # Get the coverage window + # https://spiceypy.readthedocs.io/en/main/documentation.html#spiceypy.spiceypy.ckcov + cover = spice.ckcov(ck_kernel, int(id_imap_spacecraft), True, "SEGMENT", 0, "TDB") + # https://spiceypy.readthedocs.io/en/main/documentation.html#spiceypy.spiceypy.wnfetd + et_start, et_end = spice.wnfetd(cover, 0) + # 1 spin/15 seconds; 10 quaternions / spin + num_samples = (et_end - et_start) / 15 * 10 + et_times = np.linspace(et_start, et_end, int(num_samples)) + + return et_start, et_end, et_times + + +@ensure_spice +def _average_quaternions(et_times: np.ndarray) -> NDArray: + """ + Average the quaternions. + + Parameters + ---------- + et_times : numpy.ndarray + Array of times between et_start and et_end. + + Returns + ------- + q_avg : np.ndarray + Average quaternion. + """ + aggregate = np.zeros((4, 4)) + for tdb in et_times: + # we use a quick and dirty method here for grabbing the quaternions + # from the attitude kernel. Depending on how well the kernel input + # data is built and sampled, there may or may not be aliasing with this + # approach. If it turns out that we need to pull the quaternions + # directly from the CK there are several routines that exist to do this + # but it's not straight forward. We'll revisit this if needed. + + # Rotation matrix from IMAP spacecraft frame to ECLIPJ2000. + # https://spiceypy.readthedocs.io/en/main/documentation.html#spiceypy.spiceypy.pxform + body_rots = spice.pxform("IMAP_SPACECRAFT", "ECLIPJ2000", tdb) + # Convert rotation matrix to quaternion. + # https://spiceypy.readthedocs.io/en/main/documentation.html#spiceypy.spiceypy.m2q + body_quat = spice.m2q(body_rots) + + # Standardize the quaternion so that they may be compared. + body_quat = body_quat * np.sign(body_quat[0]) + # Aggregate quaternions into a single matrix. + aggregate += np.outer(body_quat, body_quat) + + # Reference: "On Averaging Rotations". + # Link: https://link.springer.com/content/pdf/10.1023/A:1011129215388.pdf + aggregate /= len(et_times) + + # Compute eigen values and vectors of the matrix A + # Eigenvalues tell you how much "influence" each + # direction (eigenvector) has. + # The largest eigenvalue corresponds to the direction + # that has the most influence. + # The eigenvector corresponding to the largest + # eigenvalue points in the direction that has the most + # combined rotation influence. + eigvals, eigvecs = np.linalg.eig(aggregate) + # q0: The scalar part of the quaternion. + # q1, q2, q3: The vector part of the quaternion. + q_avg = eigvecs[:, np.argmax(eigvals)] + + return q_avg + + +def _create_rotation_matrix(et_times: np.ndarray) -> NDArray: + """ + Create a rotation matrix. + + Parameters + ---------- + et_times : numpy.ndarray + Array of times between et_start and et_end. + + Returns + ------- + rotation_matrix : np.ndarray + Rotation matrix. + """ + # Averaged quaternions. + q_avg = _average_quaternions(et_times) + + # Converts the averaged quaternion (q_avg) into a rotation matrix + # and get inertial z axis. + # https://spiceypy.readthedocs.io/en/main/documentation.html#spiceypy.spiceypy.q2m + z_avg = spice.q2m(list(q_avg))[:, 2] + # y_avg is perpendicular to both z_avg and the standard Z-axis. + y_avg = np.cross(z_avg, [0, 0, 1]) + # x_avg is perpendicular to y_avg and z_avg. + x_avg = np.cross(y_avg, z_avg) + + # Construct the rotation matrix from x_avg, y_avg, z_avg + rotation_matrix = np.asarray([x_avg, y_avg, z_avg]) + + return rotation_matrix diff --git a/imap_processing/tests/spice/test_data/imap_science_0001.tf b/imap_processing/tests/spice/test_data/imap_science_0001.tf new file mode 100644 index 000000000..c7caa49ac --- /dev/null +++ b/imap_processing/tests/spice/test_data/imap_science_0001.tf @@ -0,0 +1,171 @@ +KPL/FK + +Interstellar Mapping and Acceleration Probe Dynamic Frames Kernel +======================================================================== + + This kernel contains SPICE frame definitions to support the IMAP mission. + + To be consistent with conventions prior to the mission name change + from Solar Probe Plus (SPP) to Parker Solar Probe (PSP) in 2017, frame + names and other text IDs are prefixed with the legacy acronym, SPP. + +Version and Date +--------------------------------------------------------------- + + The TEXT_KERNEL_ID stores version information of loaded project text + kernels. Each entry associated with the keyword is a string that + consists of four parts: the kernel name, version, entry date, and type. + + SPP Dynamic Frame Kernel Version: + + \begindata + + TEXT_KERNEL_ID = 'IMAP_DYNAMIC_FRAMES V1.0.0 2024-XXXX-NN FK' + + \begintext + + + Version 1.0.0 -- April 10, 2024 -- Nick Dutton (JHU/APL) + + +References +--------------------------------------------------------------- + + 1. NAIF SPICE `Kernel Pool Required Reading' + + 2. NAIF SPICE `Frames Required Reading' + + 3. Email from Scott Turner, received May 2, 2018, containing + attachment InstrumentFrames.pptx, by Martha Kusterer dated + Sept. 19, 2017 + + 4. msgr_dyn_v600.tf, in Planetary Data System (PDS) + data set MESS-E/V/H-SPICE-6-V1.0 + + 5. stereo_rtn.tf, at + ftp://sohoftp.nascom.nasa.gov/solarsoft/stereo/gen/data/spice + + 6. heliospheric.tf, at + ftp://sohoftp.nascom.nasa.gov/solarsoft/stereo/gen/data/spice/gen + + 7. Email from Scott Turner received May 11, 2018 containing notes + taken from the science team meeting on the same date. + + 8. Snodgrass, H.B., Ulrich, R.K., 1990, Rotation of Doppler features + in the solar photosphere. Astrophys. J. 351, 309. doi:10.1086/168467 + + +Contact Information +--------------------------------------------------------------- + + Direct questions, comments, or concerns about the contents of this + kernel to: + + Scott Turner, JHUAPL, (443)778-1693, Scott.Turner@jhuapl.edu + + or + + Lillian Nguyen, JHUAPL (443)778-5477, Lillian.Nguyen@jhuapl.edu + + or + + Douglas Rodgers, JHUAPL (443)778-4228, Douglas.Rodgers@jhuapl.edu + + +Implementation Notes +--------------------------------------------------------------- + + This file is used by the SPICE system as follows: programs that make use + of this frame kernel must `load' the kernel normally during program + initialization. Loading the kernel associates the data items with + their names in a data structure called the `kernel pool'. The SPICELIB + routine FURNSH loads a kernel into the pool as shown below: + + FORTRAN: (SPICELIB) + + CALL FURNSH ( frame_kernel_name ) + + C: (CSPICE) + + furnsh_c ( frame_kernel_name ); + + IDL: (ICY) + + cspice_furnsh, frame_kernel_name + + MATLAB: (MICE) + + cspice_furnsh ( frame_kernel_name ) + + This file was created and may be updated with a text editor or word + processor. + + +IMAP Dynamic Frames +--------------------------------------------------------------- + + This frame kernel defines a series of dynamic frames listed in [3] + that support Parker Solar Probe data reduction and analysis. All + of the frame names defined by this kernel are prefixed with 'SPP_' + (the legacy mission name acronym as described in the leading paragraph + of this file) to avoid conflict with alternative definitions not + specific to the project. Further, the project-specific ID codes + -96900 to -96999 have been set aside to support these dynamic frames. + + The following dynamic frames are defined in this kernel file: + + Frame Name Relative To Type NAIF ID + ====================== =================== ======= ======= + + Earth Based Frames: + ------------------ + EARTH_FIXED IAU_EARTH FIXED + IMAP_RTN J2000 DYNAMIC -96900 + SPP_GSE J2000 DYNAMIC -96901 + + Mercury Based Frames: + ------------------ + SPP_MSO J2000 DYNAMIC -96903 + + Venus Based Frames: + ------------------ + SPP_VSO J2000 DYNAMIC -96904 + + Sun Based Frames: + ------------------ + SPP_HG J2000 DYNAMIC -96910 + SPP_HCI J2000 DYNAMIC -96911 + SPP_HEE J2000 DYNAMIC -96912 + SPP_HEEQ J2000 DYNAMIC -96913 + SPP_RTN J2000 DYNAMIC -96914 + SPP_HERTN J2000 DYNAMIC -96915 + SPP_HGI J2000 DYNAMIC -96916 + SPP_HGDOPP J2000 DYNAMIC -96917 + SPP_HGMAG J2000 DYNAMIC -96918 + SPP_HGSPEC J2000 DYNAMIC -96919 + + + + \begindata + + NAIF_BODY_NAME += ( 'IMAP_DPS' ) + NAIF_BODY_CODE += ( -43901 ) + + + + \begintext + +DPS Frame + +\begindata + + FRAME_IMAP_DPS = -43901 + FRAME_-43901_NAME = 'IMAP_DPS' + FRAME_-43901_CLASS = 3 + FRAME_-43901_CLASS_ID = -43901 + FRAME_-43901_CENTER = -43 + CK_-43901_SCLK = -43 + + \begintext + +END OF FILE diff --git a/imap_processing/tests/spice/test_data/imap_sim_ck_2hr_2secsampling_with_nutation.bc b/imap_processing/tests/spice/test_data/imap_sim_ck_2hr_2secsampling_with_nutation.bc new file mode 100644 index 0000000000000000000000000000000000000000..97459719a9d9679a2437df098464c88b3e702baa GIT binary patch literal 293888 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%0A9;NJHh{k08_W4F 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ðZLH&2n{@&;h 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

-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 literal 0 HcmV?d00001 diff --git a/imap_processing/tests/spice/test_data/imap_wkcp.tf b/imap_processing/tests/spice/test_data/imap_wkcp.tf new file mode 100644 index 000000000..10ceb4ddf --- /dev/null +++ b/imap_processing/tests/spice/test_data/imap_wkcp.tf @@ -0,0 +1,1806 @@ +KPL/FK + +Interstellar Mapping and Acceleration Probe Frames Kernel +======================================================================== + + This frames kernel contains the current set of coordinate frame + definitions for the Interstellar Mapping and Acceleration Probe + (IMAP) spacecraft, structures, and science instruments. + + This kernel also contains NAIF ID/name mapping for the IMAP + instruments. + + +Version and Date +======================================================================== + + The TEXT_KERNEL_ID stores version information of loaded project text + kernels. Each entry associated with the keyword is a string that + consists of four parts: the kernel name, version, entry date, and + type. For example, the frames kernel might have an entry as follows: + + + TEXT_KERNEL_ID += 'IMAP_FRAMES V1.0.0 2024-XXXX-NN FK' + | | | | + | | | | + KERNEL NAME <-------+ | | | + | | V + VERSION <------+ | KERNEL TYPE + | + V + ENTRY DATE + + + Interstellar Mapping and Acceleration Probe Frames Kernel Version: + + \begindata + + TEXT_KERNEL_ID += 'IMAP_FRAMES V1.0.0 2024-XXXX-NN FK' + + \begintext + + Version 1.0.0 -- XXXX NN, 2024 -- Douglas Rodgers + Lillian Nguyen + Nicholas Dutton + + Initial complete release. Frame/Body codes for thrusters redefined + + Version 0.0.1 -- July 9, 2021 -- Ian Wick Murphy + + Modifying dart_008.tf to add basic IMAP frame components. This + includes IMAP, IMAP_THRUSTER, and CK/SCLK IDs. Also adding a place + holder for the IMAP-Lo instrument with the ID -43001 and IMAP_LO + name. Future work includes adding more detailed instrument frames, + and reaching out to mechanical for an "official" IMAP_SPACECRAFT + frame definition. + + +References +======================================================================== + + 1. "Frames Required Reading" + + 2. "Kernel Pool Required Reading" + + 3. "C-Kernel Required Reading" + + 4. "7516-9067: IMAP Mechanical Interface Control Document", + Johns Hopkins Applied Physics Laboratory + + 5. "7516-9050: IMAP Coordinate Frame & Technical Definitions Doc.", + Johns Hopkins Applied Physics Laboratory + + 6. "7516-0011: IMAP Mechanical Interface Control Drawing", + [EXPORT CONTROLLED], Johns Hopkins Applied Physics Laboratory + + 7. "7523-0008: IMAP ULTRA Mechanical Interface Control Drawing", + [EXPORT CONTROLLED], Johns Hopkins Applied Physics Laboratory + + 8. "058991000: IMAP SWAPI Mechanical Interface Control Drawing", + Princeton University Space Physics + + 9. "GLOWS-CBK-DWG-2020-08-25-019-v4.4: IMAP GLOWS Mechanical + Interface Control Drawing", Centrum Badag Kosmicznych, Polska + Akademia Nauks + + 10. Responses from IMAP instrument teams on their base frame axis + definitions, received in email. + + +Contact Information +======================================================================== + + Douglas Rodgers, JHU/APL, Douglas.Rodgers@jhuapl.edu + + Lillian Nguyen, JHU/APL, Lillian.Nguyen@jhuapl.edu + + Nicholas Dutton, JHU/APL, Nicholas.Dutton@jhuapl.edu + + Ian Wick Murphy, JHU/APL, Ian.Murphy@jhuapl.edu + + +Implementation Notes +======================================================================== + + This file is used by the SPICE system as follows: programs that make + use of this frame kernel must `load' the kernel, normally during + program initialization. Loading the kernel associates the data items + with their names in a data structure called the `kernel pool'. The + SPICELIB routine FURNSH loads a kernel into the pool as shown below: + + FORTRAN: (SPICELIB) + + CALL FURNSH ( frame_kernel_name ) + + C: (CSPICE) + + furnsh_c ( frame_kernel_name ); + + IDL: (ICY) + + cspice_furnsh, frame_kernel_name + + MATLAB: (MICE) + + cspice_furnsh ( frame_kernel_name ) + + This file was created and may be updated with a text editor or word + processor. + + +IMAP NAIF ID Codes -- Definitions +======================================================================== + + This section contains name to NAIF ID mappings for the IMAP mission. + Once the contents of this file are loaded into the KERNEL POOL, these + mappings become available within SPICE, making it possible to use + names instead of ID code in high level SPICE routine calls. + + \begindata + + NAIF_BODY_NAME += ( 'IMAP' ) + NAIF_BODY_CODE += ( -43 ) + + NAIF_BODY_NAME += ( 'IMAP_SPACECRAFT' ) + NAIF_BODY_CODE += ( -43000 ) + + NAIF_BODY_NAME += ( 'IMAP_THRUSTER_A1' ) + NAIF_BODY_CODE += ( -43010 ) + + NAIF_BODY_NAME += ( 'IMAP_THRUSTER_A2' ) + NAIF_BODY_CODE += ( -43011 ) + + NAIF_BODY_NAME += ( 'IMAP_THRUSTER_A3' ) + NAIF_BODY_CODE += ( -43012 ) + + NAIF_BODY_NAME += ( 'IMAP_THRUSTER_A4' ) + NAIF_BODY_CODE += ( -43013 ) + + NAIF_BODY_NAME += ( 'IMAP_THRUSTER_R1' ) + NAIF_BODY_CODE += ( -43020 ) + + NAIF_BODY_NAME += ( 'IMAP_THRUSTER_R2' ) + NAIF_BODY_CODE += ( -43021 ) + + NAIF_BODY_NAME += ( 'IMAP_THRUSTER_R3' ) + NAIF_BODY_CODE += ( -43022 ) + + NAIF_BODY_NAME += ( 'IMAP_THRUSTER_R4' ) + NAIF_BODY_CODE += ( -43023 ) + + NAIF_BODY_NAME += ( 'IMAP_THRUSTER_R5' ) + NAIF_BODY_CODE += ( -43024 ) + + NAIF_BODY_NAME += ( 'IMAP_THRUSTER_R6' ) + NAIF_BODY_CODE += ( -43025 ) + + NAIF_BODY_NAME += ( 'IMAP_THRUSTER_R7' ) + NAIF_BODY_CODE += ( -43026 ) + + NAIF_BODY_NAME += ( 'IMAP_THRUSTER_R8' ) + NAIF_BODY_CODE += ( -43027 ) + + NAIF_BODY_NAME += ( 'IMAP_SUN_SENSOR_PZ' ) + NAIF_BODY_CODE += ( -42030 ) + + NAIF_BODY_NAME += ( 'IMAP_SUN_SENSOR_MZ' ) + NAIF_BODY_CODE += ( -42031 ) + + NAIF_BODY_NAME += ( 'IMAP_STAR_TRACKER_PX' ) + NAIF_BODY_CODE += ( -42040 ) + + NAIF_BODY_NAME += ( 'IMAP_STAR_TRACKER_MX' ) + NAIF_BODY_CODE += ( -42041 ) + + NAIF_BODY_NAME += ( 'IMAP_LOW_GAIN_ANTENNA' ) + NAIF_BODY_CODE += ( -42050 ) + + NAIF_BODY_NAME += ( 'IMAP_MED_GAIN_ANTENNA' ) + NAIF_BODY_CODE += ( -42051 ) + + NAIF_BODY_NAME += ( 'IMAP_NUTATION_DAMPER_01' ) + NAIF_BODY_CODE += ( -42060 ) + + NAIF_BODY_NAME += ( 'IMAP_NUTATION_DAMPER_02' ) + NAIF_BODY_CODE += ( -42061 ) + + NAIF_BODY_NAME += ( 'IMAP_LO_ENA_SENSOR' ) + NAIF_BODY_CODE += ( -42102 ) + + NAIF_BODY_NAME += ( 'IMAP_LO_STAR_SENSOR' ) + NAIF_BODY_CODE += ( -42103 ) + + NAIF_BODY_NAME += ( 'IMAP_HI_45' ) + NAIF_BODY_CODE += ( -42150 ) + + NAIF_BODY_NAME += ( 'IMAP_HI_90' ) + NAIF_BODY_CODE += ( -42175 ) + + NAIF_BODY_NAME += ( 'IMAP_ULTRA_45' ) + NAIF_BODY_CODE += ( -42200 ) + + NAIF_BODY_NAME += ( 'IMAP_ULTRA_90' ) + NAIF_BODY_CODE += ( -42225 ) + + NAIF_BODY_NAME += ( 'IMAP_MAG' ) + NAIF_BODY_CODE += ( -42250 ) + + NAIF_BODY_NAME += ( 'IMAP_SWE_DETECTOR_P63' ) + NAIF_BODY_CODE += ( -42301 ) + + NAIF_BODY_NAME += ( 'IMAP_SWE_DETECTOR_P42' ) + NAIF_BODY_CODE += ( -42302 ) + + NAIF_BODY_NAME += ( 'IMAP_SWE_DETECTOR_P21' ) + NAIF_BODY_CODE += ( -42303 ) + + NAIF_BODY_NAME += ( 'IMAP_SWE_DETECTOR_000' ) + NAIF_BODY_CODE += ( -42304 ) + + NAIF_BODY_NAME += ( 'IMAP_SWE_DETECTOR_M21' ) + NAIF_BODY_CODE += ( -42305 ) + + NAIF_BODY_NAME += ( 'IMAP_SWE_DETECTOR_M42' ) + NAIF_BODY_CODE += ( -42306 ) + + NAIF_BODY_NAME += ( 'IMAP_SWE_DETECTOR_M63' ) + NAIF_BODY_CODE += ( -42307 ) + + NAIF_BODY_NAME += ( 'IMAP_SWAPI_APERTURE_L' ) + NAIF_BODY_CODE += ( -42351 ) + + NAIF_BODY_NAME += ( 'IMAP_SWAPI_APERTURE_R' ) + NAIF_BODY_CODE += ( -42352 ) + + NAIF_BODY_NAME += ( 'IMAP_SWAPI_SUNGLASSES' ) + NAIF_BODY_CODE += ( -42353 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_LO_APERTURE_01' ) + NAIF_BODY_CODE += ( -42401 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_LO_APERTURE_02' ) + NAIF_BODY_CODE += ( -42402 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_LO_APERTURE_03' ) + NAIF_BODY_CODE += ( -42403 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_LO_APERTURE_04' ) + NAIF_BODY_CODE += ( -42404 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_LO_APERTURE_05' ) + NAIF_BODY_CODE += ( -42405 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_LO_APERTURE_06' ) + NAIF_BODY_CODE += ( -42406 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_LO_APERTURE_07' ) + NAIF_BODY_CODE += ( -42407 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_LO_APERTURE_08' ) + NAIF_BODY_CODE += ( -42408 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_LO_APERTURE_09' ) + NAIF_BODY_CODE += ( -42409 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_LO_APERTURE_10' ) + NAIF_BODY_CODE += ( -42410 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_LO_APERTURE_11' ) + NAIF_BODY_CODE += ( -42411 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_LO_APERTURE_12' ) + NAIF_BODY_CODE += ( -42412 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_LO_APERTURE_13' ) + NAIF_BODY_CODE += ( -42413 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_LO_APERTURE_14' ) + NAIF_BODY_CODE += ( -42414 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_LO_APERTURE_15' ) + NAIF_BODY_CODE += ( -42415 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_LO_APERTURE_16' ) + NAIF_BODY_CODE += ( -42416 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_LO_APERTURE_17' ) + NAIF_BODY_CODE += ( -42417 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_LO_APERTURE_18' ) + NAIF_BODY_CODE += ( -42418 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_LO_APERTURE_19' ) + NAIF_BODY_CODE += ( -42419 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_LO_APERTURE_20' ) + NAIF_BODY_CODE += ( -42420 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_LO_APERTURE_21' ) + NAIF_BODY_CODE += ( -42421 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_LO_APERTURE_22' ) + NAIF_BODY_CODE += ( -42422 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_LO_APERTURE_23' ) + NAIF_BODY_CODE += ( -42423 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_LO_APERTURE_24' ) + NAIF_BODY_CODE += ( -42424 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_HI_APERTURE_01' ) + NAIF_BODY_CODE += ( -42425 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_HI_APERTURE_02' ) + NAIF_BODY_CODE += ( -42426 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_HI_APERTURE_03' ) + NAIF_BODY_CODE += ( -42427 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_HI_APERTURE_04' ) + NAIF_BODY_CODE += ( -42428 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_HI_APERTURE_05' ) + NAIF_BODY_CODE += ( -42429 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_HI_APERTURE_06' ) + NAIF_BODY_CODE += ( -42430 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_HI_APERTURE_07' ) + NAIF_BODY_CODE += ( -42431 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_HI_APERTURE_08' ) + NAIF_BODY_CODE += ( -42432 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_HI_APERTURE_09' ) + NAIF_BODY_CODE += ( -42433 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_HI_APERTURE_10' ) + NAIF_BODY_CODE += ( -42434 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_HI_APERTURE_11' ) + NAIF_BODY_CODE += ( -42435 ) + + NAIF_BODY_NAME += ( 'IMAP_CODICE_HI_APERTURE_12' ) + NAIF_BODY_CODE += ( -42436 ) + + NAIF_BODY_NAME += ( 'IMAP_HIT_L1_APERTURE_01' ) + NAIF_BODY_CODE += ( -42501 ) + + NAIF_BODY_NAME += ( 'IMAP_HIT_L1_APERTURE_02' ) + NAIF_BODY_CODE += ( -42502 ) + + NAIF_BODY_NAME += ( 'IMAP_HIT_L1_APERTURE_03' ) + NAIF_BODY_CODE += ( -42503 ) + + NAIF_BODY_NAME += ( 'IMAP_HIT_L1_APERTURE_04' ) + NAIF_BODY_CODE += ( -42504 ) + + NAIF_BODY_NAME += ( 'IMAP_HIT_L1_APERTURE_05' ) + NAIF_BODY_CODE += ( -42505 ) + + NAIF_BODY_NAME += ( 'IMAP_HIT_L1_APERTURE_06' ) + NAIF_BODY_CODE += ( -42506 ) + + NAIF_BODY_NAME += ( 'IMAP_HIT_L1_APERTURE_07' ) + NAIF_BODY_CODE += ( -42507 ) + + NAIF_BODY_NAME += ( 'IMAP_HIT_L1_APERTURE_08' ) + NAIF_BODY_CODE += ( -42508 ) + + NAIF_BODY_NAME += ( 'IMAP_HIT_L1_APERTURE_09' ) + NAIF_BODY_CODE += ( -42509 ) + + NAIF_BODY_NAME += ( 'IMAP_HIT_L1_APERTURE_10' ) + NAIF_BODY_CODE += ( -42510 ) + + NAIF_BODY_NAME += ( 'IMAP_IDEX_DETECTOR' ) + NAIF_BODY_CODE += ( -42701 ) + + NAIF_BODY_NAME += ( 'IMAP_IDEX_FULL_SCIENCE' ) + NAIF_BODY_CODE += ( -42702 ) + + NAIF_BODY_NAME += ( 'IMAP_GLOWS' ) + NAIF_BODY_CODE += ( -42750 ) + + \begintext + + +IMAP NAIF ID Codes -- Definitions +======================================================================== + + The ID codes -43900 to -43999 have been reserved for the IMAP dynamic + frames kernel and are not utilized in this file. + + The following frames are defined in this kernel file: + + Frame Name Relative To Type NAIF ID + ========================== =============== ======= ======= + + Spacecraft (000-099) + -------------------------- + IMAP_SPACECRAFT J2000 CK -43000 + IMAP_THRUSTER_A1 IMAP_SPACECRAFT FIXED -43010 + IMAP_THRUSTER_A2 IMAP_SPACECRAFT FIXED -43011 + IMAP_THRUSTER_A3 IMAP_SPACECRAFT FIXED -43012 + IMAP_THRUSTER_A4 IMAP_SPACECRAFT FIXED -43013 + IMAP_THRUSTER_R1 IMAP_SPACECRAFT FIXED -43020 + IMAP_THRUSTER_R2 IMAP_SPACECRAFT FIXED -43021 + IMAP_THRUSTER_R3 IMAP_SPACECRAFT FIXED -43022 + IMAP_THRUSTER_R4 IMAP_SPACECRAFT FIXED -43023 + IMAP_THRUSTER_R5 IMAP_SPACECRAFT FIXED -43024 + IMAP_THRUSTER_R6 IMAP_SPACECRAFT FIXED -43025 + IMAP_THRUSTER_R7 IMAP_SPACECRAFT FIXED -43026 + IMAP_THRUSTER_R8 IMAP_SPACECRAFT FIXED -43027 + IMAP_SUN_SENSOR_PZ IMAP_SPACECRAFT FIXED -42030 + IMAP_SUN_SENSOR_MZ IMAP_SPACECRAFT FIXED -42031 + IMAP_STAR_TRACKER_PX IMAP_SPACECRAFT FIXED -42040 + IMAP_STAR_TRACKER_MX IMAP_SPACECRAFT FIXED -42041 + IMAP_LOW_GAIN_ANTENNA IMAP_SPACECRAFT FIXED -42050 + IMAP_MED_GAIN_ANTENNA IMAP_SPACECRAFT FIXED -42051 + IMAP_NUTATION_DAMPER_01 IMAP_SPACECRAFT FIXED -42060 + IMAP_NUTATION_DAMPER_02 IMAP_SPACECRAFT FIXED -42061 + + IMAP-Lo (100-149) + -------------------------- + IMAP_LO_BASE IMAP_SPACECRAFT FIXED -42100 + IMAP_LO_PIVOT IMAP_LO_BASE CK -42101 + IMAP_LO_ENA_SENSOR IMAP_LO_PIVOT FIXED -42102 + IMAP_LO_STAR_SENSOR IMAP_LO_PIVOT FIXED -42103 + + IMAP-Hi (150-199) + -------------------------- + IMAP_HI_45 IMAP_SPACECRAFT FIXED -42150 + IMAP_HI_90 IMAP_SPACECRAFT FIXED -42175 + + IMAP-Ultra (200-249) + -------------------------- + IMAP_ULTRA_45 IMAP_SPACECRAFT FIXED -42200 + IMAP_ULTRA_90 IMAP_SPACECRAFT FIXED -42225 + + MAG (250-299) + -------------------------- + IMAP_MAG IMAP_SPACECRAFT FIXED -42250 + + SWE (300-349) + -------------------------- + IMAP_SWE IMAP_SPACECRAFT FIXED -42300 + IMAP_SWE_DETECTOR_P63 IMAP_SWE FIXED -42301 + IMAP_SWE_DETECTOR_P42 IMAP_SWE FIXED -42302 + IMAP_SWE_DETECTOR_P21 IMAP_SWE FIXED -42303 + IMAP_SWE_DETECTOR_000 IMAP_SWE FIXED -42304 + IMAP_SWE_DETECTOR_M21 IMAP_SWE FIXED -42305 + IMAP_SWE_DETECTOR_M42 IMAP_SWE FIXED -42306 + IMAP_SWE_DETECTOR_M63 IMAP_SWE FIXED -42307 + + SWAPI (350-399) + -------------------------- + IMAP_SWAPI IMAP_SPACECRAFT FIXED -42350 + IMAP_SWAPI_APERTURE_L IMAP_SWAPI FIXED -42351 + IMAP_SWAPI_APERTURE_R IMAP_SWAPI FIXED -42352 + IMAP_SWAPI_SUNGLASSES IMAP_SWAPI FIXED -42353 + + CODICE (400-499) + -------------------------- + IMAP_CODICE IMAP_SPACECRAFT FIXED -42400 + IMAP_CODICE_LO_APERTURE_01 IMAP_CODICE FIXED -42401 + IMAP_CODICE_LO_APERTURE_02 IMAP_CODICE FIXED -42402 + IMAP_CODICE_LO_APERTURE_03 IMAP_CODICE FIXED -42403 + IMAP_CODICE_LO_APERTURE_04 IMAP_CODICE FIXED -42404 + IMAP_CODICE_LO_APERTURE_05 IMAP_CODICE FIXED -42405 + IMAP_CODICE_LO_APERTURE_06 IMAP_CODICE FIXED -42406 + IMAP_CODICE_LO_APERTURE_07 IMAP_CODICE FIXED -42407 + IMAP_CODICE_LO_APERTURE_08 IMAP_CODICE FIXED -42408 + IMAP_CODICE_LO_APERTURE_09 IMAP_CODICE FIXED -42409 + IMAP_CODICE_LO_APERTURE_10 IMAP_CODICE FIXED -42410 + IMAP_CODICE_LO_APERTURE_11 IMAP_CODICE FIXED -42411 + IMAP_CODICE_LO_APERTURE_12 IMAP_CODICE FIXED -42412 + IMAP_CODICE_LO_APERTURE_13 IMAP_CODICE FIXED -42413 + IMAP_CODICE_LO_APERTURE_14 IMAP_CODICE FIXED -42414 + IMAP_CODICE_LO_APERTURE_15 IMAP_CODICE FIXED -42415 + IMAP_CODICE_LO_APERTURE_16 IMAP_CODICE FIXED -42416 + IMAP_CODICE_LO_APERTURE_17 IMAP_CODICE FIXED -42417 + IMAP_CODICE_LO_APERTURE_18 IMAP_CODICE FIXED -42418 + IMAP_CODICE_LO_APERTURE_19 IMAP_CODICE FIXED -42419 + IMAP_CODICE_LO_APERTURE_20 IMAP_CODICE FIXED -42420 + IMAP_CODICE_LO_APERTURE_21 IMAP_CODICE FIXED -42421 + IMAP_CODICE_LO_APERTURE_22 IMAP_CODICE FIXED -42422 + IMAP_CODICE_LO_APERTURE_23 IMAP_CODICE FIXED -42423 + IMAP_CODICE_LO_APERTURE_24 IMAP_CODICE FIXED -42424 + IMAP_CODICE_HI_APERTURE_01 IMAP_CODICE FIXED -42425 + IMAP_CODICE_HI_APERTURE_02 IMAP_CODICE FIXED -42426 + IMAP_CODICE_HI_APERTURE_03 IMAP_CODICE FIXED -42427 + IMAP_CODICE_HI_APERTURE_04 IMAP_CODICE FIXED -42428 + IMAP_CODICE_HI_APERTURE_05 IMAP_CODICE FIXED -42429 + IMAP_CODICE_HI_APERTURE_06 IMAP_CODICE FIXED -42430 + IMAP_CODICE_HI_APERTURE_07 IMAP_CODICE FIXED -42431 + IMAP_CODICE_HI_APERTURE_08 IMAP_CODICE FIXED -42432 + IMAP_CODICE_HI_APERTURE_09 IMAP_CODICE FIXED -42433 + IMAP_CODICE_HI_APERTURE_10 IMAP_CODICE FIXED -42434 + IMAP_CODICE_HI_APERTURE_11 IMAP_CODICE FIXED -42435 + IMAP_CODICE_HI_APERTURE_12 IMAP_CODICE FIXED -42436 + + HIT (500-699) + -------------------------- + IMAP_HIT IMAP_SPACECRAFT FIXED -42500 + IMAP_HIT_L1_APERTURE_01 IMAP_HIT FIXED -42501 + IMAP_HIT_L1_APERTURE_02 IMAP_HIT FIXED -42502 + IMAP_HIT_L1_APERTURE_03 IMAP_HIT FIXED -42503 + IMAP_HIT_L1_APERTURE_04 IMAP_HIT FIXED -42504 + IMAP_HIT_L1_APERTURE_05 IMAP_HIT FIXED -42505 + IMAP_HIT_L1_APERTURE_06 IMAP_HIT FIXED -42506 + IMAP_HIT_L1_APERTURE_07 IMAP_HIT FIXED -42507 + IMAP_HIT_L1_APERTURE_08 IMAP_HIT FIXED -42508 + IMAP_HIT_L1_APERTURE_09 IMAP_HIT FIXED -42509 + IMAP_HIT_L1_APERTURE_10 IMAP_HIT FIXED -42510 + + IDEX (700-749) + -------------------------- + IMAP_IDEX IMAP_SPACECRAFT FIXED -42700 + IMAP_IDEX_DETECTOR IMAP_IDEX FIXED -42701 + IMAP_IDEX_FULL_SCIENCE IMAP_IDEX FIXED -42702 + + GLOWS (750-799) + -------------------------- + IMAP_GLOWS IMAP_SPACECRAFT FIXED -42750 + + +IMAP Frame Tree +======================================================================== + + The diagram below illustrates the IMAP frame hierarchy: + + J2000 + | + |<---ck + | + IMAP_SPACECRAFT + | + IMAP_THRUSTER_A1 + | + |... + | + IMAP_THRUSTER_A4 + | + IMAP_THRUSTER_R1 + | + |... + | + IMAP_THRUSTER_R8 + | + IMAP_SUN_SENSOR_PZ + | + IMAP_SUN_SENSOR_MZ + | + IMAP_STAR_TRACKER_PX + | + IMAP_STAR_TRACKER_MX + | + IMAP_LOW_GAIN_ANTENNA + | + IMAP_MED_GAIN_ANTENNA + | + IMAP_NUTATION_DAMPER_01 + | + IMAP_NUTATION_DAMPER_02 + | + IMAP_LO_BASE + | | + | |<---ck + | | + | IMAP_LO_PIVOT + | | + | IMAP_LO_ENA_SENSOR + | | + | IMAP_LO_STAR_SENSOR + | + IMAP_HI_45 + | + IMAP_HI_90 + | + IMAP_ULTRA_45 + | + IMAP_ULTRA_90 + | + IMAP_MAG + | + IMAP_SWE + | | + | IMAP_SWE_DETECTOR_P63 + | | + | IMAP_SWE_DETECTOR_P42 + | | + | IMAP_SWE_DETECTOR_P21 + | | + | IMAP_SWE_DETECTOR_000 + | | + | IMAP_SWE_DETECTOR_M21 + | | + | IMAP_SWE_DETECTOR_M42 + | | + | IMAP_SWE_DETECTOR_M63 + | + IMAP_SWAPI + | | + | IMAP_SWAPI_APERTURE_L + | | + | IMAP_SWAPI_APERTURE_R + | | + | IMAP_SWAPI_SUNGLASSES + | + IMAP_CODICE + | | + | IMAP_CODICE_LO_APERTURE_01 + | | + | |... + | | + | IMAP_CODICE_LO_APERTURE_24 + | | + | IMAP_CODICE_HI_APERTURE_01 + | | + | |... + | | + | IMAP_CODICE_HI_APERTURE_12 + | + IMAP_HIT + | | + | IMAP_HIT_L1_APERTURE_01 + | | + | |... + | | + | IMAP_HIT_L1_APERTURE_10 + | + IMAP_IDEX + | | + | IMAP_IDEX_DETECTOR + | | + | IMAP_IDEX_FULL_SCIENCE + | + IMAP_GLOWS + + +IMAP Spacecraft Frame +======================================================================== + + The orientation of the spacecraft body frame with respect to an + inertial frame, J2000 for IMAP, is provided by a C-kernel (see [3] + for details). + + The spacecraft coordinate frames are defined by the IMAP control + documents (see [4,5], NB, figure 2.2). There are two frames described + there: Observatory Mechanical Design Reference Frame (most relevant) + and Observatory Pointing and Dynamics Reference Frame (less relevant + for this frame kernel). + + + Observatory Mechanical Design Reference Frame (IMAP_SPACECRAFT) + --------------------------------------------------------------------- + + If not explicitly stated, references to 'spacecraft mechanical frame' + 'spacecraft frame', or 'S/C frame' will refer to this frame. + + All instruments and component placements and orientations are defined + using this coordinate frame reference. + + Origin: Center of the launch vehicle adapter ring at the + observatory/launch vehicle interface plane + + +Z axis: Perpendicular to the launch vehicle interface plane pointed + in the direction of the top deck (runs through the center + of the central cylinder structure element) + + +Y axis: Direction of the vector orthogonal to the +Z axis and + parallel to the deployed MAG boom + + +X axis: The third orthogonal axis defined using an X, Y, Z ordered + right hand rule + + NB: The Observatory Pointing and Dynamics Reference Frame is also + defined in [5]. It is identical to the observatory mechanical design + reference frame, but with the origin translated to the observatory + center of mass (which changes with boom deployment and fuel usage). + The offset difference between the mechanical and dynamic frame is + within the uncertainty range of the ephemeris, so the mechanical + design frame is used here for definiteness. + + Three different views [5,6] of the spacecraft with labeled components + are presented below for illustrative purposes. + + + IMAP -Z Bottom View (Figure 3-2 in [5], G-G in [6] rotated 180°) + --------------------------------------------------------------------- + --------- + | +X axis | -------------------- + --------- | +Z axis facing Sun | + . | into page | + /|\ -------------------- + | + | + | + _ + HI 45 /`~~__HI 90 `+ direction of + , = .^ - /_ ``-. '. positive + .+ + `^~/ ./ ~ rotation + ^ + + . -- ' `` \ _-~ \ + _ / ',= ' \~'` \ IMAP \ + ULTRA /' '-_ .~ ' \,.=.. \ LO \|/ + 90 / ~ _,.,_ + + \ ' + / ,~' +' `'+ + + \ + / ~^ .' , = .'. '- ='' -`` --------- + ^/ / , = . + + \ \~'` | +Y axis |-----> + | . + + + + . \ --------- ___ + | | + + ' = ' | \--------------------| | + SWAPI| | ' = ', - . | /--------------------|___| + _+_: ' + + ' / MAG boom + \_ __\__ \ + + / /^*~, + + | SWE '. ' = ' .' ULTRA / + `~-' '~..,___,..~' 45 /~,* + _\ / /~,*` + * / CODICE ^*._/ *` HIT + *\ _/`. / + * / /~ _ _ ,.-^-., _ _ _ / + '=' + + + GLOWS + + + '-.,.-' + IDEX + + + IMAP +X Side View (F-F in [6]) + --------------------------------------------------------------------- + --------- + | +Z axis | + --------- --------------------- + . | +X axis out of page | + /|\ --------------------- + | LGA + __________________|______|^|_________ ___ + SWAPI|__________________|__________________|====================| | + #|-| | | .-==-, | / MAG boom '---' + #|-| {|## | | / \ | | + | {|## | |{ HI 90 }| IMAP LO| + | {|## | _.._ | \ / | _., | + | ULTRA | / \ | `-==-' | / __`',| + | 90 | \ HI 45/ | | \ \_\ ;| + | | '----` | | ~._ + | + '-------------------|----------/--------' + | | \_________O_________/ | | ----------------> + |__| ----------- /_\ --------- + STAR | S/C FRAME | MGA | +Y axis | + TRACKERS | ORIGIN | --------- + ----------- + + + IMAP -X Side View (C-C in [6]) + --------------------------------------------------------------------- + --------- + | +Z axis | + ------------------- --------- + | +X axis into page | . + ------------------- /|\ + LGA | + ___ _________|^|______|__________________ + | |====================|__________________|_____________ __ _|SWAPI + '---' MAG boom \ __ | | | // \ /--|# + |( )=|__|| | | \\__/ \--|# + | HIT | _|_ IDEX | CODICE | + | | ,.' | '., | | + | ____ | [ \ | / ] | SWE| + ULTRA ##',', |,.'|'.,| GLOWS (#)| + 45 ####'. + | + \\(O) |-|| + '----####/----- + | + --------------' + <---------------- | | \______'-.O.-'______/ | | + --------- /_\ ----------- |__| + | +Y axis | MGA | S/C FRAME | STAR + --------- | ORIGIN | TRACKERS + ----------- + + + IMAP Component Location and Orientation + --------------------------------------------------------------------- + + Payload and subsystem component locations are specified[5,6] in the + Observatory Mechanical Design Reference Frame (described above). + Boresights are defined in azimuth and elevation (and resultant + direction cosign matrices) of these angles[6] in the same reference + frame. The azimuth and elevation angle diagram is provided below. + + In general, descriptions in this kernel treat the +Z direction as + "up" and the -Z direction as "down." Locations referred to as "above" + are generally closer to the Sun, and vice versa for "below." The + "upper" side of the spacecraft is the plane of the solar panels, + while the "lower" side may refer to the area near the adapter ring. + If ambiguity could arise, more thorough descriptions will be used. + + + Toward Sun + + +Z axis + . + | + . + | + . Component + | Location/ + . Orientation + | @ + Toward . .'| + MAG | +` | + .~ '` Boom S/C . .` \ | + .~ '` FRAME |.` : | + / ~'` ORIGIN O | | + *--- .~ '` \ Elevation + .~ '` \ | | + .~ '` \ ; |~ + .~ '\ \ / | ^~ + +Y axis \ \ + | ^~ + '. '~, \ | ^~ + '~ Azimuth \ | ^~ + '~. `^~-> \| -X axis + ' ~ ., _ _ ,.~ + ``'`` + + + \begindata + + FRAME_IMAP_SPACECRAFT = -43000 + FRAME_-43000_NAME = 'IMAP_SPACECRAFT' + FRAME_-43000_CLASS = 3 + FRAME_-43000_CLASS_ID = -43000 + FRAME_-43000_CENTER = -43 + CK_-43000_SCLK = -43 + CK_-43000_SPK = -43 + + \begintext + + +IMAP Thruster Frames +======================================================================== + + There are four axial (A) thrusters and eight radial (R) thrusters on + IMAP[6]. The table below shows the thruster positions defined in the + spacecraft frame[6], at the intersection of the thrust axis and the + nozzle exit plane. The unit direction vectors listed in the table + below point in the direction of the thruster exhaust. The positional + information is captured in the IMAP structure SPK, while the + orientation information is captured here. + + + Thruster ID X (mm) Y (mm) Z (mm) UnitDir (X,Y,Z) + ---------------- ------ -------- -------- ------- --------------- + IMAP_THRUSTER_A1 -43010 1007.28 516.50 1312.40 ( 0, 0, 1 ) + IMAP_THRUSTER_A2 -43011 -1007.28 -516.50 1312.40 ( 0, 0, 1 ) + IMAP_THRUSTER_A3 -43012 -1007.28 -516.50 101.77 ( 0, 0, -1 ) + IMAP_THRUSTER_A4 -43013 1007.28 516.50 101.77 ( 0, 0, -1 ) + IMAP_THRUSTER_R1 -43020 -126.90 1237.78 841.12 (-0.5, 0.866,0) + IMAP_THRUSTER_R2 -43021 126.90 -1237.78 841.12 ( 0.5,-0.866,0) + IMAP_THRUSTER_R3 -43022 -1008.49 728.79 841.12 (-0.5, 0.866,0) + IMAP_THRUSTER_R4 -43023 1008.49 -728.79 841.12 ( 0.5,-0.866,0) + IMAP_THRUSTER_R5 -43024 -126.90 1237.78 447.42 (-0.5, 0.866,0) + IMAP_THRUSTER_R6 -43025 126.90 -1237.78 447.42 ( 0.5,-0.866,0) + IMAP_THRUSTER_R7 -43026 -1008.49 728.79 447.42 (-0.5, 0.866,0) + IMAP_THRUSTER_R8 -43027 1008.49 -728.79 447.42 ( 0.5,-0.866,0) + + + Thruster Locations and Directions + --------------------------------------------------------------------- + + The four axial thrusters[6] are directed along the spacecraft Z axis, + with A1,A2 located on the +Z side of the spacecraft and A3,A4 located + on the -Z side. A1,A2 fire in the +Z direction, while A3,A4 fire in + the -Z direction. A1 and A4 are aligned in the Z direction, while + A2 and A3 are aligned but on the opposite side of the S/C as A1/A4. + + The eight radial thrusters[6] are grouped into four pairs (R1/R5, + R2/R6, R3/R7, R4/R8); each pair is aligned along the Z direction and + fire in the same direction. There are two distinct firing directions, + all perpendicular to the spacecraft Z axis: R1/R5 & R3/R7 fire toward + the +Y direction (with a slight -X component), while R2/R6 & R4/R8 + fire in the -Y direction (with a slight +X component). Thrusters + R1-R4 are located above the center of mass (towards the Sun), while + thrusters R5-R8 are located below the center of mass (away from the + Sun). The table below shows the azimuth of location and direction of + radial thrusters calculated from using thruster table above. + + + Location Azim Direction Azim + -------------- -------------- + R1/R5 5.85° 30.0° + R2/R6 180° + 5.85° 180° + 30.0° + R3/R7 54.15° 30.0° + R4/R8 180° + 54.15° 180° + 30.0° + + + +X axis +Z axis facing Sun + . into page + /|\ + | + | + | A1 (on +Z side) + A4 (on -Z side) + R4/R8 Dir /`~~__ / + '~._ , = .^ - /_ ``-. / + /~._ .+ + `^~/ .\/ + 30°| '~. + . -- ' `` @\ _-~ + - - + - - - -# R4/R8 \~'` \ + /' '-_ . \,.=.. \ + / ~ _,.,_ + + \ + R2/R6 Dir / ,~' +' `'+ + + \ + '~._ / ~^ .' , = .'. '- ='' -`` + /~._ ^/ / , = . + + \ \~'` + 30°| '~. | . + + + + . \ +Y axis -----> + - - + - - - -|# R2/R6 | + + ' = ' | \ + | | ' = ', - . | R1/R5 #._- - - - - + - - + _+_: ' + + ' / '~._ | + \_ __\__ \ + + / /^*~, '~._ / 30° + + | \ '. ' = ' .' / / '~. + `~-' '~..,___,..~' / /~,* R1/R5 Dir + _\ / /~,*` + * / \ ^*._/ *` + *\ _/`. R3/R7 #/._- - - - - + - - + * / /\@_ _ ,.-^-., _ _ _ / '~._ | + '=' | + + '~._ / 30° + | + + '~. + | '-.,.-' R3/R7 Dir + | + A2 (on +Z side) + A3 (on -Z side) + + + Axial Thruster Frames + --------------------------------------------------------------------- + + Each axial thruster has a frame defined so that the thruster exhaust + exits in the +Z' direction. The +Y' axis is chosen to lie in the + direction of the MAG boom. X' = Y' x Z' completes the frame. + + [X] [ 1 0 0 ] [X'] + [Y] = [ 0 1 0 ] [Y'] + [Z]S/C [ 0 0 1 ] [Z']Axial Thrusters A1,A2 + + [X] [ -1 0 0 ] [X'] + [Y] = [ 0 1 0 ] [Y'] + [Z]S/C [ 0 0 -1 ] [Z']Axial Thrusters A3,A4 + + + Axial Thruster + Exhaust Direction + + +Z' axis + | + | + _. -|- ._ + ,' | ', + |, | ,| + | ' -.,_|_,.- ' | + ' ' + \ / + \ / + \ / + \ / + \ / Toward + ',_,' ^~ MAG + .~ '` ^~ ^~ Boom + .~ '` ^~ ^~ + .~ '` ^~ ^~ + .~ '` ^~ ^~ \ + +X' axis ^~ --* + ^~ + ^~ + +Y' axis + + + \begindata + + FRAME_IMAP_THRUSTER_A1 = -43010 + FRAME_-43010_NAME = 'IMAP_THRUSTER_A1' + FRAME_-43010_CLASS = 4 + FRAME_-43010_CLASS_ID = -43010 + FRAME_-43010_CENTER = -43 + TKFRAME_-43010_RELATIVE = 'IMAP_SPACECRAFT' + TKFRAME_-43010_SPEC = 'MATRIX' + TKFRAME_-43010_MATRIX = ( 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1 ) + + FRAME_IMAP_THRUSTER_A2 = -43011 + FRAME_-43011_NAME = 'IMAP_THRUSTER_A2' + FRAME_-43011_CLASS = 4 + FRAME_-43011_CLASS_ID = -43011 + FRAME_-43011_CENTER = -43 + TKFRAME_-43011_RELATIVE = 'IMAP_SPACECRAFT' + TKFRAME_-43011_SPEC = 'MATRIX' + TKFRAME_-43011_MATRIX = ( 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1 ) + + FRAME_IMAP_THRUSTER_A3 = -43012 + FRAME_-43012_NAME = 'IMAP_THRUSTER_A3' + FRAME_-43012_CLASS = 4 + FRAME_-43012_CLASS_ID = -43012 + FRAME_-43012_CENTER = -43 + TKFRAME_-43012_RELATIVE = 'IMAP_SPACECRAFT' + TKFRAME_-43012_SPEC = 'MATRIX' + TKFRAME_-43012_MATRIX = ( -1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + -1 ) + + FRAME_IMAP_THRUSTER_A4 = -43013 + FRAME_-43013_NAME = 'IMAP_THRUSTER_A4' + FRAME_-43013_CLASS = 4 + FRAME_-43013_CLASS_ID = -43013 + FRAME_-43013_CENTER = -43 + TKFRAME_-43013_RELATIVE = 'IMAP_SPACECRAFT' + TKFRAME_-43013_SPEC = 'MATRIX' + TKFRAME_-43013_MATRIX = ( -1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + -1 ) + + \begintext + + + Radial Thrusters + --------------------------------------------------------------------- + + Each radial thruster has a frame defined so that the thruster exhaust + exits in the +Y' direction. The +Z' axis is chosen to lie along the + spacecraft +Z axis (toward Sun). X' = Y' x Z' completes the frame. + + [X] [ cos( 30) -sin( 30) 0 ] [X'] + [Y] = [ sin( 30) cos( 30) 0 ] [Y'] + [Z]S/C [ 0 0 1 ] [Z']Rad. Thrusters R1,R3,R5,R7 + + [X] [ cos(210) -sin(210) 0 ] [X'] + [Y] = [ sin(210) cos(210) 0 ] [Y'] + [Z]S/C [ 0 0 1 ] [Z']Rad. Thrusters R2,R4,R6,R8 + + + Toward Sun + + +Z' axis + . + | + . + | + . + | + . + Radial Thruster | + Exhaust Direction . + | + .~ '` . + /.~ '` _,,~ ~ ~ ~ ~ ~ ~ ~ | + *-- .;-. \ ~ + ,' '. ~ ^~ + ; \ ~' ^~ + | .~ '`: ~' ^~ + .~ '` | ~' ^~ + ~ '` \ ; _ ~' ^~ + +Y' axis '.,_._;-' ^~ + ^~ + -X' axis + + + \begindata + + FRAME_IMAP_THRUSTER_R1 = -43020 + FRAME_-43020_NAME = 'IMAP_THRUSTER_R1' + FRAME_-43020_CLASS = 4 + FRAME_-43020_CLASS_ID = -43020 + FRAME_-43020_CENTER = -43 + TKFRAME_-43020_RELATIVE = 'IMAP_SPACECRAFT' + TKFRAME_-43020_SPEC = 'MATRIX' + TKFRAME_-43020_MATRIX = ( 0.86602540378443865, + 0.50000000000000000, + 0.00000000000000000, + -0.50000000000000000, + 0.86602540378443865, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 1.00000000000000000 ) + + FRAME_IMAP_THRUSTER_R2 = -43021 + FRAME_-43021_NAME = 'IMAP_THRUSTER_R1' + FRAME_-43021_CLASS = 4 + FRAME_-43021_CLASS_ID = -43021 + FRAME_-43021_CENTER = -43 + TKFRAME_-43021_RELATIVE = 'IMAP_SPACECRAFT' + TKFRAME_-43021_SPEC = 'MATRIX' + TKFRAME_-43021_MATRIX = ( -0.86602540378443865, + -0.50000000000000000, + 0.00000000000000000, + 0.50000000000000000, + -0.86602540378443865, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 1.00000000000000000 ) + + FRAME_IMAP_THRUSTER_R3 = -43022 + FRAME_-43022_NAME = 'IMAP_THRUSTER_R3' + FRAME_-43022_CLASS = 4 + FRAME_-43022_CLASS_ID = -43022 + FRAME_-43022_CENTER = -43 + TKFRAME_-43022_RELATIVE = 'IMAP_SPACECRAFT' + TKFRAME_-43022_SPEC = 'MATRIX' + TKFRAME_-43022_MATRIX = ( 0.86602540378443865, + 0.50000000000000000, + 0.00000000000000000, + -0.50000000000000000, + 0.86602540378443865, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 1.00000000000000000 ) + + FRAME_IMAP_THRUSTER_R4 = -43023 + FRAME_-43023_NAME = 'IMAP_THRUSTER_R4' + FRAME_-43023_CLASS = 4 + FRAME_-43023_CLASS_ID = -43023 + FRAME_-43023_CENTER = -43 + TKFRAME_-43023_RELATIVE = 'IMAP_SPACECRAFT' + TKFRAME_-43023_SPEC = 'MATRIX' + TKFRAME_-43023_MATRIX = ( -0.86602540378443865, + -0.50000000000000000, + 0.00000000000000000, + 0.50000000000000000, + -0.86602540378443865, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 1.00000000000000000 ) + + FRAME_IMAP_THRUSTER_R5 = -43024 + FRAME_-43024_NAME = 'IMAP_THRUSTER_R5' + FRAME_-43024_CLASS = 4 + FRAME_-43024_CLASS_ID = -43024 + FRAME_-43024_CENTER = -43 + TKFRAME_-43024_RELATIVE = 'IMAP_SPACECRAFT' + TKFRAME_-43024_SPEC = 'MATRIX' + TKFRAME_-43024_MATRIX = ( 0.86602540378443865, + 0.50000000000000000, + 0.00000000000000000, + -0.50000000000000000, + 0.86602540378443865, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 1.00000000000000000 ) + + FRAME_IMAP_THRUSTER_R6 = -43025 + FRAME_-43025_NAME = 'IMAP_THRUSTER_R6' + FRAME_-43025_CLASS = 4 + FRAME_-43025_CLASS_ID = -43025 + FRAME_-43025_CENTER = -43 + TKFRAME_-43025_RELATIVE = 'IMAP_SPACECRAFT' + TKFRAME_-43025_SPEC = 'MATRIX' + TKFRAME_-43025_MATRIX = ( -0.86602540378443865, + -0.50000000000000000, + 0.00000000000000000, + 0.50000000000000000, + -0.86602540378443865, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 1.00000000000000000 ) + + FRAME_IMAP_THRUSTER_R7 = -43026 + FRAME_-43026_NAME = 'IMAP_THRUSTER_R7' + FRAME_-43026_CLASS = 4 + FRAME_-43026_CLASS_ID = -43026 + FRAME_-43026_CENTER = -43 + TKFRAME_-43026_RELATIVE = 'IMAP_SPACECRAFT' + TKFRAME_-43026_SPEC = 'MATRIX' + TKFRAME_-43026_MATRIX = ( 0.86602540378443865, + 0.50000000000000000, + 0.00000000000000000, + -0.50000000000000000, + 0.86602540378443865, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 1.00000000000000000 ) + + FRAME_IMAP_THRUSTER_R8 = -43027 + FRAME_-43027_NAME = 'IMAP_THRUSTER_R6' + FRAME_-43027_CLASS = 4 + FRAME_-43027_CLASS_ID = -43027 + FRAME_-43027_CENTER = -43 + TKFRAME_-43027_RELATIVE = 'IMAP_SPACECRAFT' + TKFRAME_-43027_SPEC = 'MATRIX' + TKFRAME_-43027_MATRIX = ( -0.86602540378443865, + -0.50000000000000000, + 0.00000000000000000, + 0.50000000000000000, + -0.86602540378443865, + 0.00000000000000000, + 0.00000000000000000, + 0.00000000000000000, + 1.00000000000000000 ) + + \begintext + + +IMAP Sun Sensor Frames +======================================================================== + + There are two digital sun sensors (DSS): one on the +Z side of the + spacecraft pointing in +Z direction, and one on the -Z side pointing + mostly in the radial direction with a mild tilt in the -Z direction. + The positional information is captured in the IMAP structure SPK, + while the orientation information is captured here. + + Each DSS has a frame defined so that the look-direction is along the + +Z' axis (toward Sun). The digital image rows and columns are aligned + with the X' and Y' axes of the frame. + + [X] [ cos(az) -sin(az) 0 ] [X'] + [Y] = [ sin(az) cos(az) 0 ] [Y'] + [Z]S/C [ 0 0 1 ] [Z']Digital Sun Sensor + + +IMAP Star Trackers Frames +======================================================================== + + +IMAP Antenna Frames +======================================================================== + + +IMAP-Lo Frames +======================================================================== + + TODO: FIX ME...The orientation of the spacecraft body frame with + respect to an inertial + frame, for IMAP - ECLIPJ2000, is provided by a C-kernel (see [3] + for details). + + This frame specifies the rotating X,Y and pointing Z coordinate body + frame. + + \begindata + + FRAME_IMAP_LO_BASE = -43100 + FRAME_-43100_NAME = 'IMAP_LO_BASE' + FRAME_-43100_CLASS = 4 + FRAME_-43100_CLASS_ID = -43100 + FRAME_-43100_CENTER = -43 + TKFRAME_-43100_SPEC = 'MATRIX' + TKFRAME_-43100_MATRIX = ( -0.866025, + 0.500000, + 0.000000, + -0.500000, + -0.866025, + 0.000000, + 0.000000, + 0.000000, + 1.000000 ) + TKFRAME_-43100_RELATIVE = 'IMAP_SPACECRAFT' + + \begintext + + +IMAP-Hi Frames +======================================================================== + + TODO: general discussion of Ultra. + + + IMAP-Hi 45 Frames + ===================================================================== + + \begindata + + FRAME_IMAP_HI_45 = -43150 + FRAME_-43150_NAME = 'IMAP_HI_45' + FRAME_-43150_CLASS = 4 + FRAME_-43150_CLASS_ID = -43150 + FRAME_-43150_CENTER = -43 + TKFRAME_-43150_SPEC = 'MATRIX' + TKFRAME_-43150_MATRIX = ( 0.066987, + -0.250000, + 0.965926, + 0.965926, + 0.258819, + 0.000000, + -0.250000, + 0.933013, + 0.258819 ) + TKFRAME_-43150_RELATIVE = 'IMAP_SPACECRAFT' + + \begintext + + + IMAP-Hi 90 Frames + ===================================================================== + + TODO: FIX ME...The orientation of the spacecraft body frame with + respect to an inertial + frame, for IMAP - ECLIPJ2000, is provided by a C-kernel (see [3] + for details). + + This frame specifies the rotating X,Y and pointing Z coordinate body + frame. + + \begindata + + FRAME_IMAP_HI_90 = -43160 + FRAME_-43160_NAME = 'IMAP_HI_90' + FRAME_-43160_CLASS = 4 + FRAME_-43160_CLASS_ID = -43160 + FRAME_-43160_CENTER = -43 + TKFRAME_-43160_SPEC = 'MATRIX' + TKFRAME_-43160_MATRIX = ( -0.668531, + 0.233315, + -0.706138, + 0.683013, + -0.183013, + -0.707107, + -0.294210, + -0.955024, + -0.037007 ) + TKFRAME_-43160_RELATIVE = 'IMAP_SPACECRAFT' + + \begintext + + +IMAP-Ultra Frames +======================================================================== + + TODO: general discussion of Ultra. + + + IMAP-Ultra 45 Frames + ===================================================================== + + TODO: add diagrams + + ULTRA-45 has the following nominal alignment to the spacecraft frame, + reference Table 1 of [6]. The azimuth and elevation angles are + illustrated in the 'IMAP I&T Component Placement' section near the top + of this document. + + azimuth | elevation + (deg) | (deg) + ---------+--------- + 127 | 15 + + The ULTRA-45 base frame is defined by the instrument team as follows [10]: + + * +Z axis is the boresight (center axis of the instrument pointing + away from the spacecraft body). + * +X axis is along the instrument slit, in the anti-sunward direction. + + The azimuth and elevation give the instrument boresight vector, +Z in + the instrument frame: + + Z = [ -sin(az) * cos(el), cos(az) * cos(el), sin(el) ] + instr + + The instrument +X axis is in the anti-sunward direction, towards the + spacecraft -Z axis: + + X = [ 0 0 -1 ] + instr + + Taking the cross product and normalizing, we arrive at the instrumet +Y + axis: + Z x X + Y = --------- + instr | Z x X | + + And adjusting X: + + Y x Z + X = --------- + instr | Y x Z | + + This definition is captured in the keywords below. + + \begindata + + FRAME_IMAP_ULTRA_45 = -43200 + FRAME_-43200_NAME = 'IMAP_ULTRA_45' + FRAME_-43200_CLASS = 4 + FRAME_-43200_CLASS_ID = -43200 + FRAME_-43200_CENTER = -43 + TKFRAME_-43200_SPEC = 'MATRIX' + TKFRAME_-43200_MATRIX = ( 0.385117954958023, + -0.593029645775782, + -0.707106781186548, + -0.838670567945424, + -0.544639035015027, + -0.000000000000000, + -0.385117954958023, + 0.593029645775783, + -0.707106781186547 ) + TKFRAME_-43200_RELATIVE = 'IMAP_SPACECRAFT' + + \begintext + + + IMAP-Ultra 45 Frames + ===================================================================== + + TODO: FIX ME...The orientation of the spacecraft body frame with + respect to an inertial + frame, for IMAP - ECLIPJ2000, is provided by a C-kernel (see [3] + for details). + + This frame specifies the rotating X,Y and pointing Z coordinate body + frame. + + \begindata + + FRAME_IMAP_ULTRA_90 = -43210 + FRAME_-43210_NAME = 'IMAP_ULTRA_90' + FRAME_-43210_CLASS = 4 + FRAME_-43210_CLASS_ID = -43210 + FRAME_-43210_CENTER = -43 + TKFRAME_-43210_SPEC = 'MATRIX' + TKFRAME_-43210_MATRIX = ( 0.000000, + 0.000000, + 1.000000, + -0.866025, + -0.500000, + 0.000000, + 0.500000, + -0.866025, + 0.000000 ) + TKFRAME_-43210_RELATIVE = 'IMAP_SPACECRAFT' + + \begintext + + +IMAP Magnetometer (MAG) Frames +======================================================================== + + TODO: FIX ME...The orientation of the spacecraft body frame with + respect to an inertial + frame, for IMAP - ECLIPJ2000, is provided by a C-kernel (see [3] + for details). + + Basically just maps Z-inst to Y-body + + This frame specifies the rotating X,Y and pointing Z coordinate body + frame. + + \begindata + + FRAME_IMAP_MAG = -43250 + FRAME_-43250_NAME = 'IMAP_MAG' + FRAME_-43250_CLASS = 4 + FRAME_-43250_CLASS_ID = -43250 + FRAME_-43250_CENTER = -43 + TKFRAME_-43250_SPEC = 'MATRIX' + TKFRAME_-43250_MATRIX = ( 0.000000, + -1.000000, + 0.000000, + -1.000000, + 0.000000, + 0.000000, + 0.000000, + 0.000000, + -1.000000 ) + TKFRAME_-43250_RELATIVE = 'IMAP_SPACECRAFT' + +\begintext + + +IMAP Solar Wind Electron (SWE) Frames +======================================================================== + + TODO: FIX ME...The orientation of the spacecraft body frame with + respect to an inertial + frame, for IMAP - ECLIPJ2000, is provided by a C-kernel (see [3] + for details). + + This frame specifies the rotating X,Y and pointing Z coordinate body + frame. + + \begindata + + FRAME_IMAP_SWE = -43300 + FRAME_-43300_NAME = 'IMAP_SWE' + FRAME_-43300_CLASS = 4 + FRAME_-43300_CLASS_ID = -43300 + FRAME_-43300_CENTER = -43 + TKFRAME_-43300_SPEC = 'MATRIX' + TKFRAME_-43300_MATRIX = ( 0.453990, + 0.891007, + 0.000000, + -0.891007, + 0.453990, + 0.000000, + 0.000000, + 0.000000, + 1.000000 ) + TKFRAME_-43300_RELATIVE = 'IMAP_SPACECRAFT' + +\begintext + + +IMAP Solar Wind and Pickup Ion (SWAPI) Frames +======================================================================== + + TODO: add diagrams + + SWAPI has the following nominal alignment to the spacecraft frame, + reference Table 1 of [6]. The azimuth and elevation angles are + illustrated in the 'IMAP I&T Component Placement' section near the top + of this document. + + azimuth | elevation + (deg) | (deg) + ---------+--------- + 168 | 0 + + The SWAPI base frame is defined in the instrument MICD [8] as follows: + + * -Z axis is the axis of symmetry of the instrument, pointing + away from the spacecraft body. + * +Y axis is along the aperture center, in the anti-sunward direction. + + The azimuth and elevation give the outward axis of symmetry, -Z in the + instrument frame: + + -Z = -[ -sin(az) * cos(el), cos(az) * cos(el), sin(el) ] + instr + + The instrument +Y axis is in the sunward direction, towards the + spacecraft +Z axis: + + Y = [ 0 0 1 ] + instr + + Taking the cross product and normalizing, we arrive at the instrumet +X + axis: + Y x Z + X = --------- + instr | Y x Z | + + And adjusting Y: + + Z x X + Y = --------- + instr | Z x X | + + This definition is captured in the keywords below. + + \begindata + + FRAME_IMAP_SWAPI = -43350 + FRAME_-43350_NAME = 'IMAP_SWAPI' + FRAME_-43350_CLASS = 4 + FRAME_-43350_CLASS_ID = -43350 + FRAME_-43350_CENTER = -43 + TKFRAME_-43350_SPEC = 'MATRIX' + TKFRAME_-43350_MATRIX = ( -0.97814760073381, + 0.20791169081776, + 0.00000000000000, + 0.00000000000000, + 0.00000000000000, + 1.00000000000000, + 0.20791169081776, + 0.97814760073381, + 0.00000000000000 ) + TKFRAME_-43350_RELATIVE = 'IMAP_SPACECRAFT' + +\begintext + + +IMAP Compact Dual Ion Composition Experiment (CoDICE) Frames +======================================================================== + + TODO: FIX ME...The orientation of the spacecraft body frame with + respect to an inertial + frame, for IMAP - ECLIPJ2000, is provided by a C-kernel (see [3] + for details). + + This frame specifies the rotating X,Y and pointing Z coordinate body + frame. + + \begindata + + FRAME_IMAP_CODICE = -43400 + FRAME_-43400_NAME = 'IMAP_CODICE' + FRAME_-43400_CLASS = 4 + FRAME_-43400_CLASS_ID = -43400 + FRAME_-43400_CENTER = -43 + TKFRAME_-43400_SPEC = 'MATRIX' + TKFRAME_-43400_MATRIX = ( 0.694626, + 0.719371, + 0.000000, + -0.719371, + 0.694626, + 0.000000, + 0.000000, + 0.000000, + 1.000000 ) + TKFRAME_-43400_RELATIVE = 'IMAP_SPACECRAFT' + +\begintext + + +IMAP High-energy Ion Telescope (HIT) Frames +======================================================================== + + TODO: FIX ME...The orientation of the spacecraft body frame with + respect to an inertial + frame, for IMAP - ECLIPJ2000, is provided by a C-kernel (see [3] + for details). + + This frame specifies the rotating X,Y and pointing Z coordinate body + frame. + + \begindata + + FRAME_IMAP_HIT = -43500 + FRAME_-43500_NAME = 'IMAP_HIT' + FRAME_-43500_CLASS = 4 + FRAME_-43500_CLASS_ID = -43500 + FRAME_-43500_CENTER = -43 + TKFRAME_-43500_SPEC = 'MATRIX' + TKFRAME_-43500_MATRIX = ( 0.866025, + 0.500000, + 0.000000, + -0.500000, + 0.866025, + 0.000000, + 0.000000, + 0.000000, + 1.000000 ) + TKFRAME_-43500_RELATIVE = 'IMAP_SPACECRAFT' + +\begintext + + +IMAP Interstellar Dust Experiment (IDEX) Frames +======================================================================== + + TODO: FIX ME...The orientation of the spacecraft body frame with + respect to an inertial + frame, for IMAP - ECLIPJ2000, is provided by a C-kernel (see [3] + for details). + + This frame specifies the rotating X,Y and pointing Z coordinate body + frame. + + \begindata + + FRAME_IMAP_IDEX = -43700 + FRAME_-43700_NAME = 'IMAP_IDEX' + FRAME_-43700_CLASS = 4 + FRAME_-43700_CLASS_ID = -43700 + FRAME_-43700_CENTER = -43 + TKFRAME_-43700_SPEC = 'MATRIX' + TKFRAME_-43700_MATRIX = ( 0.000000, + 1.000000, + 0.000000, + -0.707107, + 0.000000, + -0.707107, + -0.707107, + 0.000000, + 0.707107 ) + TKFRAME_-43700_RELATIVE = 'IMAP_SPACECRAFT' + +\begintext + + +IMAP GLObal solar Wind Structure (GLOWS) Frames +======================================================================== + + TODO: add diagrams + + GLOWS has the following nominal alignment to the spacecraft frame, + reference Table 1 of [6]. The azimuth and elevation angles are + illustrated in the 'IMAP I&T Component Placement' section near the top + of this document. + + azimuth | elevation + (deg) | (deg) + ---------+--------- + 127 | 15 + + The GLOWS base frame is defined by the instrument team as follows [10]: + + * +Z axis points in the anti-boresight direction + * +Y axis points in the anti-sunward direction. + + The azimuth and elevation give the outward axis of symmetry, -Z in the + instrument frame: + + Z = -[ -sin(az) * cos(el), cos(az) * cos(el), sin(el) ] + instr + + The instrument +Y axis is in the anti-sunward direction, towards the + spacecraft -Z axis: + + Y = [ 0 0 -1 ] + instr + + Taking the cross product and normalizing, we arrive at the instrumet +X + axis: + Y x Z + X = --------- + instr | Y x Z | + + And adjusting Y: + + Z x X + Y = --------- + instr | Z x X | + + This definition is captured in the keywords below. + + \begindata + + FRAME_IMAP_GLOWS = -43750 + FRAME_-43750_NAME = 'IMAP_GLOWS' + FRAME_-43750_CLASS = 4 + FRAME_-43750_CLASS_ID = -43750 + FRAME_-43750_CENTER = -43 + TKFRAME_-43750_SPEC = 'MATRIX' + TKFRAME_-43750_MATRIX = ( 0.60181502315205, + -0.79863551004729, + 0.00000000000000, + -0.20670208009540, + -0.15576118962056, + -0.96592582628907, + 0.77142266494622, + 0.58130867351132, + -0.25881904510252 ) + TKFRAME_-43750_RELATIVE = 'IMAP_SPACECRAFT' + +\begintext + + Generic axis + + +Z axis + . + | + . + | + . + | + . + | + . + | + . + | + .~ ~ + .~ '` ^~ + .~ '` ^~ + .~ '` ^~ + .~ '` ^~ + +X axis ^~ + ^~ + ^~ + +Y axis + +End of FK file. \ No newline at end of file diff --git a/imap_processing/tests/spice/test_kernels.py b/imap_processing/tests/spice/test_kernels.py index c8ce926ad..0edddeaba 100644 --- a/imap_processing/tests/spice/test_kernels.py +++ b/imap_processing/tests/spice/test_kernels.py @@ -1,19 +1,51 @@ """Tests coverage for imap_processing/spice/kernels.py""" +import numpy as np import pytest import spiceypy as spice from spiceypy.utils.exceptions import SpiceyError -from imap_processing.spice import kernels +from imap_processing.spice.kernels import ( + _average_quaternions, + _create_rotation_matrix, + _get_et_times, + create_pointing_frame, + ensure_spice, +) + + +@pytest.fixture() +def pointing_frame_kernels(spice_test_data_path): + """List SPICE kernels.""" + required_kernels = [ + "imap_science_0001.tf", + "imap_sclk_0000.tsc", + "imap_sim_ck_2hr_2secsampling_with_nutation.bc", + "imap_wkcp.tf", + "naif0012.tls", + ] + kernels = [str(spice_test_data_path / kernel) for kernel in required_kernels] + return kernels + + +@pytest.fixture() +def et_times(pointing_frame_kernels): + """Tests get_et_times function.""" + spice.furnsh(pointing_frame_kernels) + + file, _, _, _ = spice.kdata(0, "ck") + et_start, et_end, et_times = _get_et_times(file) + + return et_times -@kernels.ensure_spice +@ensure_spice def single_wrap_et2utc(et, fmt, prec): """Directly decorate a spice function with ensure_spice for use in tests""" return spice.et2utc(et, fmt, prec) -@kernels.ensure_spice +@ensure_spice def double_wrap_et2utc(et, fmt, prec): """Decorate a spice function twice with ensure_spice for use in tests. This simulates some decorated outer functions that call lower level functions @@ -21,13 +53,13 @@ def double_wrap_et2utc(et, fmt, prec): return single_wrap_et2utc(et, fmt, prec) -@kernels.ensure_spice(time_kernels_only=True) +@ensure_spice(time_kernels_only=True) def single_wrap_et2utc_tk_only(et, fmt, prec): """Directly wrap a spice function with optional time_kernels_only set True""" return spice.et2utc(et, fmt, prec) -@kernels.ensure_spice(time_kernels_only=True) +@ensure_spice(time_kernels_only=True) def double_wrap_et2utc_tk_only(et, fmt, prec): """Decorate a spice function twice with ensure_spice for use in tests. This simulates some decorated outer functions that call lower level functions @@ -51,7 +83,7 @@ def test_ensure_spice_emus_mk_path(func, use_test_metakernel): def test_ensure_spice_time_kernels(): """Test functionality of ensure spice with timekernels set""" - wrapped = kernels.ensure_spice(spice.et2utc, time_kernels_only=True) + wrapped = ensure_spice(spice.et2utc, time_kernels_only=True) # TODO: Update/remove this test when a decision has been made about # whether IMAP will use the time_kernels_only functionality and the # ensure_spice decorator has been update. @@ -61,9 +93,78 @@ def test_ensure_spice_time_kernels(): def test_ensure_spice_key_error(): """Test functionality of ensure spice when all branches fail""" - wrapped = kernels.ensure_spice(spice.et2utc) + wrapped = ensure_spice(spice.et2utc) # The ensure_spice decorator should raise a SpiceyError when all attempts to # furnish a set of kernels with sufficient coverage for the spiceypy # functions that it decorates. with pytest.raises(SpiceyError): _ = wrapped(577365941.184, "ISOC", 3) == "2018-04-18T23:24:31.998" + + +def test_average_quaternions(et_times, pointing_frame_kernels): + """Tests average_quaternions function.""" + spice.furnsh(pointing_frame_kernels) + q_avg = _average_quaternions(et_times) + + # Generated from MATLAB code results + q_avg_expected = np.array([-0.6611, 0.4981, -0.5019, -0.2509]) + np.testing.assert_allclose(q_avg, q_avg_expected, atol=1e-4) + + +def test_create_rotation_matrix(et_times, pointing_frame_kernels): + """Tests create_rotation_matrix function.""" + spice.furnsh(pointing_frame_kernels) + rotation_matrix = _create_rotation_matrix(et_times) + q_avg = _average_quaternions(et_times) + z_avg = spice.q2m(list(q_avg))[:, 2] + + rotation_matrix_expected = np.array( + [[0.0000, 0.0000, 1.0000], [0.9104, -0.4136, 0.0000], [0.4136, 0.9104, 0.0000]] + ) + z_avg_expected = np.array([0.4136, 0.9104, 0.0000]) + + np.testing.assert_allclose(z_avg, z_avg_expected, atol=1e-4) + np.testing.assert_allclose(rotation_matrix, rotation_matrix_expected, atol=1e-4) + + +def test_create_pointing_frame(spice_test_data_path, pointing_frame_kernels, tmp_path): + """Tests create_pointing_frame function.""" + spice.furnsh(pointing_frame_kernels) + ck_kernel, _, _, _ = spice.kdata(0, "ck") + et_start, et_end, et_times = _get_et_times(ck_kernel) + create_pointing_frame(pointing_frame_path=tmp_path / "imap_dps.bc") + + # After imap_dps.bc has been created. + dps_kernel = str(tmp_path / "imap_dps.bc") + + spice.furnsh(dps_kernel) + rotation_matrix_1 = spice.pxform("ECLIPJ2000", "IMAP_DPS", et_start + 100) + rotation_matrix_2 = spice.pxform("ECLIPJ2000", "IMAP_DPS", et_start + 1000) + + # All the rotation matrices should be the same. + assert np.array_equal(rotation_matrix_1, rotation_matrix_2) + + # Nick Dutton's MATLAB code result + rotation_matrix_expected = np.array( + [[0.0000, 0.0000, 1.0000], [0.9104, -0.4136, 0.0000], [0.4136, 0.9104, 0.0000]] + ) + np.testing.assert_allclose(rotation_matrix_1, rotation_matrix_expected, atol=1e-4) + + # Verify imap_dps.bc has been created. + assert (tmp_path / "imap_dps.bc").exists() + + +@ensure_spice +def test_et_times(pointing_frame_kernels): + """Tests get_et_times function.""" + spice.furnsh(pointing_frame_kernels) + + file, _, _, _ = spice.kdata(0, "ck") + et_start, et_end, et_times = _get_et_times(file) + + assert et_start == 802008069.184905 + assert et_end == 802015267.184906 + assert et_times[0] == et_start + assert et_times[-1] == et_end + + return et_times From 3e716926127ec39c3c3603393a271e9195c3ae68 Mon Sep 17 00:00:00 2001 From: Laura Sandoval <46567335+laspsandoval@users.noreply.github.com> Date: Tue, 27 Aug 2024 11:32:55 -0600 Subject: [PATCH 7/7] Add Pulse Height Calculations (#750) * add pulse height calculations --- .../ultra/unit/test_ultra_l1b_extended.py | 26 ++++ imap_processing/ultra/l1b/lookup_utils.py | 4 +- .../ultra/l1b/ultra_l1b_extended.py | 122 ++++++++++++++++++ 3 files changed, 151 insertions(+), 1 deletion(-) diff --git a/imap_processing/tests/ultra/unit/test_ultra_l1b_extended.py b/imap_processing/tests/ultra/unit/test_ultra_l1b_extended.py index b48c62afe..84b027666 100644 --- a/imap_processing/tests/ultra/unit/test_ultra_l1b_extended.py +++ b/imap_processing/tests/ultra/unit/test_ultra_l1b_extended.py @@ -1,12 +1,15 @@ """Tests Extended Raw Events for ULTRA L1b.""" +import numpy as np import pandas as pd import pytest from imap_processing.ultra.l1b.ultra_l1b_extended import ( + StopType, get_front_x_position, get_front_y_position, get_path_length, + get_ph_tof_and_back_positions, ) @@ -59,3 +62,26 @@ def test_get_path_length(de_dataset, yf_fixture): test_yb = df_filt["Yb"].astype("float").values r = get_path_length((test_xf, test_yf), (test_xb, test_yb), d) assert r == pytest.approx(df_filt["r"].astype("float"), abs=1e-5) + + +def test_get_ph_tof_and_back_positions( + de_dataset, + events_fsw_comparison_theta_0, +): + """Tests get_ph_tof_and_back_positions function.""" + + df = pd.read_csv(events_fsw_comparison_theta_0) + df_filt = df[df["StartType"] != -1] + + _, _, ph_xb, ph_yb = get_ph_tof_and_back_positions( + de_dataset, df_filt.Xf.astype("float").values, "ultra45" + ) + + ph_indices = np.nonzero( + np.isin(de_dataset["STOP_TYPE"], [StopType.Top.value, StopType.Bottom.value]) + )[0] + + selected_rows = df_filt.iloc[ph_indices] + + np.testing.assert_array_equal(ph_xb, selected_rows["Xb"].astype("float")) + np.testing.assert_array_equal(ph_yb, selected_rows["Yb"].astype("float")) diff --git a/imap_processing/ultra/l1b/lookup_utils.py b/imap_processing/ultra/l1b/lookup_utils.py index 08673c476..46585e959 100644 --- a/imap_processing/ultra/l1b/lookup_utils.py +++ b/imap_processing/ultra/l1b/lookup_utils.py @@ -78,7 +78,9 @@ def get_norm(dn: np.ndarray, key: str, file_label: str) -> npt.NDArray: else: tdc_norm_df = _TDC_NORM_DF_ULTRA90 - return tdc_norm_df[key].values[dn] + dn_norm = tdc_norm_df[key].iloc[dn].values + + return dn_norm def get_back_position(back_index: np.ndarray, key: str, file_label: str) -> npt.NDArray: diff --git a/imap_processing/ultra/l1b/ultra_l1b_extended.py b/imap_processing/ultra/l1b/ultra_l1b_extended.py index c977981fb..47c25b653 100644 --- a/imap_processing/ultra/l1b/ultra_l1b_extended.py +++ b/imap_processing/ultra/l1b/ultra_l1b_extended.py @@ -1,10 +1,15 @@ """Calculates Extended Raw Events for ULTRA L1b.""" +from enum import Enum + import numpy as np +import xarray from numpy import ndarray from imap_processing.ultra.l1b.lookup_utils import ( + get_back_position, get_image_params, + get_norm, get_y_adjust, ) @@ -18,6 +23,13 @@ # TODO: make lookup tables into config files. +class StopType(Enum): + """Stop Type: 1=Top, 2=Bottom.""" + + Top = 1 + Bottom = 2 + + def get_front_x_position(start_type: ndarray, start_position_tdc: ndarray) -> ndarray: """ Calculate the front xf position. @@ -111,6 +123,116 @@ def get_front_y_position(start_type: ndarray, yb: ndarray) -> tuple[ndarray, nda return np.array(d), np.array(yf) +def get_ph_tof_and_back_positions( + de_dataset: xarray.Dataset, xf: np.ndarray, sensor: str +) -> tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]: + """ + Calculate back xb, yb position and tof. + + An incoming particle may trigger pulses from one of the stop anodes. + If so, four pulses are produced, one each from the north, south, + east, and west sides. + + The Time Of Flight (tof) and the position of the particle at the + back of the sensor are measured using the timing of the pulses. + Further description is available on pages 32-33 of + IMAP-Ultra Flight Software Specification document + (7523-9009_Rev_-.pdf). + + Parameters + ---------- + de_dataset : xarray.Dataset + Data in xarray format. + xf : np.array + X front position in (hundredths of a millimeter). + Has same length as de_dataset. + sensor : str + Sensor name. + + Returns + ------- + tof : np.array + Time of flight (tenths of a nanosecond). + t2 : np.array + Particle time of flight from start to stop (tenths of a nanosecond). + xb : np.array + Back positions in x direction (hundredths of a millimeter). + yb : np.array + Back positions in y direction (hundredths of a millimeter). + """ + indices = np.nonzero( + np.isin(de_dataset["STOP_TYPE"], [StopType.Top.value, StopType.Bottom.value]) + )[0] + de_filtered = de_dataset.isel(epoch=indices) + + xf_ph = xf[indices] + + # There are mismatches between the stop TDCs, i.e., SpN, SpS, SpE, and SpW. + # This normalizes the TDCs + sp_n_norm = get_norm(de_filtered["STOP_NORTH_TDC"].data, "SpN", sensor) + sp_s_norm = get_norm(de_filtered["STOP_SOUTH_TDC"].data, "SpS", sensor) + sp_e_norm = get_norm(de_filtered["STOP_EAST_TDC"].data, "SpE", sensor) + sp_w_norm = get_norm(de_filtered["STOP_WEST_TDC"].data, "SpW", sensor) + + # Convert normalized TDC values into units of hundredths of a + # millimeter using lookup tables. + xb_index = sp_s_norm - sp_n_norm + 2047 + yb_index = sp_e_norm - sp_w_norm + 2047 + + # Convert xf to a tof offset + tofx = sp_n_norm + sp_s_norm + tofy = sp_e_norm + sp_w_norm + + # tof is the average of the two tofs measured in the X and Y directions, + # tofx and tofy + # Units in tenths of a nanosecond + t1 = tofx + tofy # /2 incorporated into scale + + xb = np.zeros(len(indices)) + yb = np.zeros(len(indices)) + + # particle_tof (t2) used later to compute etof + t2 = np.zeros(len(indices)) + tof = np.zeros(len(indices)) + + # Stop Type: 1=Top, 2=Bottom + # Convert converts normalized TDC values into units of + # hundredths of a millimeter using lookup tables. + stop_type_top = de_filtered["STOP_TYPE"].data == StopType.Top.value + xb[stop_type_top] = get_back_position(xb_index[stop_type_top], "XBkTp", sensor) + yb[stop_type_top] = get_back_position(yb_index[stop_type_top], "YBkTp", sensor) + + # Correction for the propagation delay of the start anode and other effects. + t2[stop_type_top] = get_image_params("TOFSC") * t1[ + stop_type_top + ] + get_image_params("TOFTPOFF") + tof[stop_type_top] = t2[stop_type_top] + xf_ph[stop_type_top] * get_image_params( + "XFTTOF" + ) + + stop_type_bottom = de_filtered["STOP_TYPE"].data == StopType.Bottom.value + xb[stop_type_bottom] = get_back_position( + xb_index[stop_type_bottom], "XBkBt", sensor + ) + yb[stop_type_bottom] = get_back_position( + yb_index[stop_type_bottom], "YBkBt", sensor + ) + + # Correction for the propagation delay of the start anode and other effects. + t2[stop_type_bottom] = get_image_params("TOFSC") * t1[ + stop_type_bottom + ] + get_image_params("TOFBTOFF") # 10*ns + + tof[stop_type_bottom] = t2[stop_type_bottom] + xf_ph[ + stop_type_bottom + ] * get_image_params("XFTTOF") + + # Multiply by 100 to get tenths of a nanosecond. + tof = tof * 100 + + return tof, t2, xb, yb + + def get_path_length(front_position: tuple, back_position: tuple, d: float) -> float: """ Calculate the path length.