synapse-cdm 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- synapse_cdm-1.0.0/LICENSE +201 -0
- synapse_cdm-1.0.0/NOTICE +64 -0
- synapse_cdm-1.0.0/PKG-INFO +387 -0
- synapse_cdm-1.0.0/pyproject.toml +179 -0
- synapse_cdm-1.0.0/setup.cfg +4 -0
- synapse_cdm-1.0.0/synapse_cdm/FORMAT_COVERAGE.md +10361 -0
- synapse_cdm-1.0.0/synapse_cdm/MIGRATIONS.md +973 -0
- synapse_cdm-1.0.0/synapse_cdm/README.md +351 -0
- synapse_cdm-1.0.0/synapse_cdm/__init__.py +85 -0
- synapse_cdm-1.0.0/synapse_cdm/adapter.py +234 -0
- synapse_cdm-1.0.0/synapse_cdm/adapters/__init__.py +7 -0
- synapse_cdm-1.0.0/synapse_cdm/adapters/adsb.py +2292 -0
- synapse_cdm-1.0.0/synapse_cdm/adapters/ais.py +1466 -0
- synapse_cdm-1.0.0/synapse_cdm/adapters/asterix_cat021.py +2503 -0
- synapse_cdm-1.0.0/synapse_cdm/adapters/asterix_cat034.py +1516 -0
- synapse_cdm-1.0.0/synapse_cdm/adapters/asterix_cat048.py +2427 -0
- synapse_cdm-1.0.0/synapse_cdm/adapters/cat034_codec.py +330 -0
- synapse_cdm-1.0.0/synapse_cdm/adapters/cat048_codec.py +577 -0
- synapse_cdm-1.0.0/synapse_cdm/adapters/gmtif.py +2256 -0
- synapse_cdm-1.0.0/synapse_cdm/adapters/gmtif_codec.py +430 -0
- synapse_cdm-1.0.0/synapse_cdm/adapters/legion.py +1144 -0
- synapse_cdm-1.0.0/synapse_cdm/adapters/pntmap.py +252 -0
- synapse_cdm-1.0.0/synapse_cdm/adapters/stanag4676.py +2387 -0
- synapse_cdm-1.0.0/synapse_cdm/adapters/tak.py +757 -0
- synapse_cdm-1.0.0/synapse_cdm/enums.py +86 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/README.md +119 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_position_baro_gulf_of_riga.adsb +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_position_baro_gulf_of_riga.parsed.json +21 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_position_gillham_above_50175.adsb +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_position_gillham_above_50175.parsed.json +20 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_position_gnss_height_odd.adsb +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_position_gnss_height_odd.parsed.json +20 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_position_no_position_information.adsb +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_position_no_position_information.parsed.json +20 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_position_permanent_alert.adsb +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_position_permanent_alert.parsed.json +20 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_velocity_airspeed_and_heading.adsb +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_velocity_airspeed_and_heading.parsed.json +27 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_velocity_all_unavailable.adsb +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_velocity_all_unavailable.parsed.json +27 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_velocity_ground_speed.adsb +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_velocity_ground_speed.parsed.json +27 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/aircraft_status_unlawful_interference.adsb +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/aircraft_status_unlawful_interference.parsed.json +17 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/egress/entity_fused_elsewhere.json +28 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/egress/entity_identification_no_position.json +27 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/egress/golden/entity_fused_elsewhere.adsb +2 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/egress/golden/entity_identification_no_position.adsb +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/egress/golden/track_air_patrol_three_samples.adsb +3 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/egress/track_air_patrol_three_samples.json +39 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_position_baro_gulf_of_riga.cdm.json +98 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_position_baro_gulf_of_riga.parsed.cdm.json +98 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_position_gillham_above_50175.cdm.json +99 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_position_gillham_above_50175.parsed.cdm.json +99 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_position_gnss_height_odd.cdm.json +97 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_position_gnss_height_odd.parsed.cdm.json +97 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_position_no_position_information.cdm.json +99 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_position_no_position_information.parsed.cdm.json +99 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_position_permanent_alert.cdm.json +97 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_position_permanent_alert.parsed.cdm.json +97 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_velocity_airspeed_and_heading.cdm.json +105 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_velocity_airspeed_and_heading.parsed.cdm.json +105 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_velocity_all_unavailable.cdm.json +102 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_velocity_all_unavailable.parsed.cdm.json +102 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_velocity_ground_speed.cdm.json +102 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_velocity_ground_speed.parsed.cdm.json +102 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/aircraft_status_unlawful_interference.cdm.json +91 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/aircraft_status_unlawful_interference.parsed.cdm.json +91 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/identification_light_aircraft.cdm.json +88 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/identification_light_aircraft.parsed.cdm.json +88 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/identification_point_obstacle.cdm.json +88 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/identification_point_obstacle.parsed.cdm.json +88 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/nonicao_anonymous_address.cdm.json +98 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/nonicao_anonymous_address.parsed.cdm.json +98 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/operational_status_magnetic_heading.cdm.json +99 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/operational_status_magnetic_heading.parsed.cdm.json +99 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/surface_position_riga_taxiway.cdm.json +98 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/surface_position_riga_taxiway.parsed.cdm.json +98 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/surface_position_stopped_no_track.cdm.json +103 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/surface_position_stopped_no_track.parsed.cdm.json +103 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/tisb_fine_format_relayed_track.cdm.json +98 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/tisb_fine_format_relayed_track.parsed.cdm.json +98 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/identification_light_aircraft.adsb +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/identification_light_aircraft.parsed.json +15 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/identification_point_obstacle.adsb +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/identification_point_obstacle.parsed.json +15 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/local/airborne_position_baro_gulf_of_riga.cdm.json +108 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/local/airborne_position_gillham_above_50175.cdm.json +109 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/local/airborne_position_gnss_height_odd.cdm.json +107 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/local/airborne_position_permanent_alert.cdm.json +107 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/local/nonicao_anonymous_address.cdm.json +108 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/local/surface_position_riga_taxiway.cdm.json +108 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/local/surface_position_stopped_no_track.cdm.json +113 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/local/tisb_fine_format_relayed_track.cdm.json +108 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/nonicao_anonymous_address.adsb +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/nonicao_anonymous_address.parsed.json +20 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/operational_status_magnetic_heading.adsb +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/operational_status_magnetic_heading.parsed.json +25 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/surface_position_riga_taxiway.adsb +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/surface_position_riga_taxiway.parsed.json +20 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/surface_position_stopped_no_track.adsb +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/surface_position_stopped_no_track.parsed.json +20 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/tisb_fine_format_relayed_track.adsb +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/tisb_fine_format_relayed_track.parsed.json +20 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/README.md +83 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/aid_to_navigation_off_position.nmea +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/aid_to_navigation_off_position.parsed.json +36 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/aid_to_navigation_virtual.nmea +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/aid_to_navigation_virtual.parsed.json +37 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/base_station_liepaja.nmea +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/base_station_liepaja.parsed.json +32 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/class_a_assigned_schedule_moored.nmea +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/class_a_assigned_schedule_moored.parsed.json +32 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/class_a_sentinels_no_position.nmea +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/class_a_sentinels_no_position.parsed.json +32 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/class_a_underway_gulf_of_riga.nmea +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/class_a_underway_gulf_of_riga.parsed.json +36 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/class_b_extended_named.nmea +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/class_b_extended_named.parsed.json +39 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/class_b_own_station_ventspils.nmea +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/class_b_own_station_ventspils.parsed.json +36 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/egress/entity_fused_elsewhere.json +34 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/egress/entity_static_voyage_no_position.json +37 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/egress/golden/entity_fused_elsewhere.ais.nmea +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/egress/golden/entity_static_voyage_no_position.ais.nmea +2 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/egress/golden/track_patrol_three_samples.ais.nmea +3 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/egress/track_patrol_three_samples.json +30 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/equator_zero_meridian.nmea +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/equator_zero_meridian.parsed.json +32 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/aid_to_navigation_off_position.cdm.json +117 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/aid_to_navigation_off_position.parsed.cdm.json +117 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/aid_to_navigation_virtual.cdm.json +117 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/aid_to_navigation_virtual.parsed.cdm.json +117 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/base_station_liepaja.cdm.json +112 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/base_station_liepaja.parsed.cdm.json +112 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/class_a_assigned_schedule_moored.cdm.json +112 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/class_a_assigned_schedule_moored.parsed.cdm.json +112 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/class_a_sentinels_no_position.cdm.json +109 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/class_a_sentinels_no_position.parsed.cdm.json +109 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/class_a_underway_gulf_of_riga.cdm.json +115 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/class_a_underway_gulf_of_riga.parsed.cdm.json +115 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/class_b_extended_named.cdm.json +121 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/class_b_extended_named.parsed.cdm.json +121 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/class_b_own_station_ventspils.cdm.json +115 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/class_b_own_station_ventspils.parsed.cdm.json +115 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/equator_zero_meridian.cdm.json +112 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/equator_zero_meridian.parsed.cdm.json +112 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/sart_active_distress.cdm.json +112 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/sart_active_distress.parsed.cdm.json +112 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/static_voyage_two_fragments.cdm.json +137 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/static_voyage_two_fragments.parsed.cdm.json +137 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/sart_active_distress.nmea +1 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/sart_active_distress.parsed.json +32 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/static_voyage_two_fragments.nmea +2 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/static_voyage_two_fragments.parsed.json +51 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/README.md +95 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/airborne_position_coarse_and_high_resolution.cat021 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/airborne_position_coarse_and_high_resolution.parsed.json +58 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/airborne_position_time_of_applicability.cat021 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/airborne_position_time_of_applicability.parsed.json +88 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/duplicate_address.cat021 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/duplicate_address.parsed.json +53 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/emergency_unlawful_interference.cat021 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/emergency_unlawful_interference.parsed.json +79 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/airborne_position_coarse_and_high_resolution.cdm.json +151 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/airborne_position_coarse_and_high_resolution.parsed.cdm.json +151 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/airborne_position_time_of_applicability.cdm.json +196 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/airborne_position_time_of_applicability.parsed.cdm.json +196 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/duplicate_address.cdm.json +147 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/duplicate_address.parsed.cdm.json +147 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/emergency_unlawful_interference.cdm.json +184 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/emergency_unlawful_interference.parsed.cdm.json +184 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/icao24_shared_with_adsb.cdm.json +163 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/icao24_shared_with_adsb.parsed.cdm.json +163 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/midnight_rollover_after.cdm.json +146 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/midnight_rollover_after.parsed.cdm.json +146 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/midnight_rollover_before.cdm.json +146 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/midnight_rollover_before.parsed.cdm.json +146 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/mode_five_authenticated.cdm.json +185 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/mode_five_authenticated.parsed.cdm.json +185 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/obstacle_line.cdm.json +158 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/obstacle_line.parsed.cdm.json +158 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/position_time_of_message_reception_high_precision.cdm.json +151 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/position_time_of_message_reception_high_precision.parsed.cdm.json +151 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/quality_indicators_without_mops_version.cdm.json +145 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/quality_indicators_without_mops_version.parsed.cdm.json +145 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/range_check_failed_still_translated.cdm.json +161 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/range_check_failed_still_translated.parsed.cdm.json +161 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/reserved_full_second_indication.cdm.json +157 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/reserved_full_second_indication.parsed.cdm.json +157 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/spare_bits_nonzero.cdm.json +174 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/spare_bits_nonzero.parsed.cdm.json +174 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/special_purpose_field_opaque.cdm.json +151 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/special_purpose_field_opaque.parsed.cdm.json +151 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/surface_stopped_track_invalid.cdm.json +181 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/surface_stopped_track_invalid.parsed.cdm.json +181 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/surface_vehicle_with_ref_ground_vector.cdm.json +190 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/surface_vehicle_with_ref_ground_vector.parsed.cdm.json +190 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/trajectory_intent_two_points.cdm.json +181 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/trajectory_intent_two_points.parsed.cdm.json +181 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/two_records_one_block.cdm.json +314 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/two_records_one_block.parsed.cdm.json +314 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/version_three_emergency_in_ref.cdm.json +203 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/version_three_emergency_in_ref.parsed.cdm.json +203 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/icao24_shared_with_adsb.cat021 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/icao24_shared_with_adsb.parsed.json +65 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/midnight_rollover_after.cat021 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/midnight_rollover_after.parsed.json +53 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/midnight_rollover_before.cat021 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/midnight_rollover_before.parsed.json +53 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/mode_five_authenticated.cat021 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/mode_five_authenticated.parsed.json +87 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/obstacle_line.cat021 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/obstacle_line.parsed.json +61 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/position_time_of_message_reception_high_precision.cat021 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/position_time_of_message_reception_high_precision.parsed.json +58 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/quality_indicators_without_mops_version.cat021 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/quality_indicators_without_mops_version.parsed.json +54 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/range_check_failed_still_translated.cat021 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/range_check_failed_still_translated.parsed.json +65 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/refusals/fspec_names_a_not_used_frn.cat021 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/refusals/length_disagrees_with_buffer.cat021 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/refusals/missing_mandatory_target_address.cat021 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/refusals/time_beyond_one_day.cat021 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/refusals/wrong_category.cat021 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/reserved_full_second_indication.cat021 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/reserved_full_second_indication.parsed.json +58 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/spare_bits_nonzero.cat021 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/spare_bits_nonzero.parsed.json +78 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/spec/build_fixtures.py +691 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/spec/sac_pin.json +1331 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/special_purpose_field_opaque.cat021 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/special_purpose_field_opaque.parsed.json +58 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/surface_stopped_track_invalid.cat021 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/surface_stopped_track_invalid.parsed.json +77 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/surface_vehicle_with_ref_ground_vector.cat021 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/surface_vehicle_with_ref_ground_vector.parsed.json +85 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/trajectory_intent_two_points.cat021 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/trajectory_intent_two_points.parsed.json +88 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/two_records_one_block.cat021 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/two_records_one_block.parsed.json +113 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/version_three_emergency_in_ref.cat021 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/version_three_emergency_in_ref.parsed.json +95 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/README.md +199 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/geographical_filter_polar_window.cat034 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/geographical_filter_polar_window.parsed.json +42 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/geographical_filter_polar_window.cdm.json +172 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/geographical_filter_polar_window.parsed.cdm.json +172 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/jamming_strobe_is_not_gnss.cdm.json +158 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/jamming_strobe_is_not_gnss.parsed.cdm.json +158 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/message_counts_twenty_one_types.cdm.json +373 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/message_counts_twenty_one_types.parsed.cdm.json +373 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/message_type_008.cdm.json +132 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/message_type_008.parsed.cdm.json +132 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/midnight_rollover_nearest.cdm.json +278 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/midnight_rollover_nearest.parsed.cdm.json +278 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/mode_s_jamming_strobe.cdm.json +158 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/mode_s_jamming_strobe.parsed.cdm.json +158 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/non_minimal_fspec.cdm.json +140 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/non_minimal_fspec.parsed.cdm.json +140 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/north_marker_minimal.cdm.json +140 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/north_marker_minimal.parsed.cdm.json +140 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/processing_mode_reduction_steps.cdm.json +216 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/processing_mode_reduction_steps.parsed.cdm.json +216 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/re_and_sp_carried.cdm.json +160 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/re_and_sp_carried.parsed.cdm.json +160 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/sector_crossing_with_rotation.cdm.json +163 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/sector_crossing_with_rotation.parsed.cdm.json +163 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/solar_storm_message.cdm.json +158 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/solar_storm_message.parsed.cdm.json +158 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/spare_bits_nonzero.cdm.json +321 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/spare_bits_nonzero.parsed.cdm.json +321 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/station_position_three_dimensional.cdm.json +163 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/station_position_three_dimensional.parsed.cdm.json +163 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/system_status_all_four_subfields.cdm.json +245 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/system_status_all_four_subfields.parsed.cdm.json +245 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/time_of_day_absent_where_optional.cdm.json +155 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/time_of_day_absent_where_optional.parsed.cdm.json +155 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/two_records_one_block.cdm.json +288 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/two_records_one_block.parsed.cdm.json +288 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/jamming_strobe_is_not_gnss.cat034 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/jamming_strobe_is_not_gnss.parsed.json +38 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/message_counts_twenty_one_types.cat034 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/message_counts_twenty_one_types.parsed.json +125 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/message_type_008.cat034 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/message_type_008.parsed.json +31 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/midnight_rollover_nearest.cat034 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/midnight_rollover_nearest.parsed.json +53 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/mode_s_jamming_strobe.cat034 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/mode_s_jamming_strobe.parsed.json +38 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/non_minimal_fspec.cat034 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/non_minimal_fspec.parsed.json +31 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/north_marker_minimal.cat034 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/north_marker_minimal.parsed.json +31 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/processing_mode_reduction_steps.cat034 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/processing_mode_reduction_steps.parsed.json +65 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/re_and_sp_carried.cat034 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/re_and_sp_carried.parsed.json +41 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/refusals/length_disagrees_with_buffer.cat034 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/refusals/missing_mandatory_data_source.cat034 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/refusals/wrong_category.cat034 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/sector_crossing_with_rotation.cat034 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/sector_crossing_with_rotation.parsed.json +39 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/solar_storm_message.cat034 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/solar_storm_message.parsed.json +38 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/spare_bits_nonzero.cat034 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/spare_bits_nonzero.parsed.json +113 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/spec/build_fixtures.py +421 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/spec/cat034_pin.json +414 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/station_position_three_dimensional.cat034 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/station_position_three_dimensional.parsed.json +37 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/system_status_all_four_subfields.cat034 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/system_status_all_four_subfields.parsed.json +79 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/time_of_day_absent_where_optional.cat034 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/time_of_day_absent_where_optional.parsed.json +34 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/two_records_one_block.cat034 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/two_records_one_block.parsed.json +57 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/README.md +154 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/acas_ra_active_undecoded.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/acas_ra_active_undecoded.parsed.json +109 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/bds_registers_comm_b_broadcast.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/bds_registers_comm_b_broadcast.parsed.json +75 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/derived_position_inverts_to_the_polar_values.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/derived_position_inverts_to_the_polar_values.parsed.json +87 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/end_of_track_full_items.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/end_of_track_full_items.parsed.json +96 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/end_of_track_items_omitted.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/end_of_track_items_omitted.parsed.json +60 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/field_monitor_report.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/field_monitor_report.parsed.json +67 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/flight_level_negative.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/flight_level_negative.parsed.json +64 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/fspec_longer_than_necessary.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/fspec_longer_than_necessary.parsed.json +38 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/ghost_target_still_translated.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/ghost_target_still_translated.parsed.json +79 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/acas_ra_active_undecoded.cdm.json +324 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/acas_ra_active_undecoded.parsed.cdm.json +324 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/bds_registers_comm_b_broadcast.cdm.json +235 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/bds_registers_comm_b_broadcast.parsed.cdm.json +235 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/derived_position_inverts_to_the_polar_values.cdm.json +255 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/derived_position_inverts_to_the_polar_values.parsed.cdm.json +255 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/end_of_track_full_items.cdm.json +278 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/end_of_track_full_items.parsed.cdm.json +278 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/end_of_track_items_omitted.cdm.json +210 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/end_of_track_items_omitted.parsed.cdm.json +210 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/field_monitor_report.cdm.json +213 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/field_monitor_report.parsed.cdm.json +213 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/flight_level_negative.cdm.json +202 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/flight_level_negative.parsed.cdm.json +202 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/fspec_longer_than_necessary.cdm.json +150 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/fspec_longer_than_necessary.parsed.cdm.json +150 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/ghost_target_still_translated.cdm.json +242 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/ghost_target_still_translated.parsed.cdm.json +242 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/helicopter_classification_not_read_as_a_type.cdm.json +209 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/helicopter_classification_not_read_as_a_type.parsed.cdm.json +209 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/ic_conflict_codes.cdm.json +211 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/ic_conflict_codes.parsed.cdm.json +211 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/icao24_shared_with_cat021.cdm.json +220 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/icao24_shared_with_cat021.parsed.cdm.json +220 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/injected_site_no_height_item.cdm.json +244 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/injected_site_no_height_item.parsed.cdm.json +244 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/injected_site_pressure_height_only.cdm.json +225 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/injected_site_pressure_height_only.parsed.cdm.json +225 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/injected_site_range_at_maximum.cdm.json +267 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/injected_site_range_at_maximum.parsed.cdm.json +267 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/midnight_rollover_after.cdm.json +186 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/midnight_rollover_after.parsed.cdm.json +186 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/midnight_rollover_before.cdm.json +186 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/midnight_rollover_before.parsed.cdm.json +186 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/military_emergency.cdm.json +211 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/military_emergency.parsed.cdm.json +211 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/mode_1_and_mode_2_with_confidence.cdm.json +358 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/mode_1_and_mode_2_with_confidence.parsed.cdm.json +358 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/mode_4_result_in_ref.cdm.json +227 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/mode_4_result_in_ref.parsed.cdm.json +227 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/mode_s_alert_is_not_an_emergency.cdm.json +208 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/mode_s_alert_is_not_an_emergency.parsed.cdm.json +208 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/mode_s_roll_call_track.cdm.json +317 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/mode_s_roll_call_track.parsed.cdm.json +317 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/no_detection_track_only.cdm.json +251 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/no_detection_track_only.parsed.cdm.json +251 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/no_time_item_at_all.cdm.json +199 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/no_time_item_at_all.parsed.cdm.json +199 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/plot_and_track_one_block.cdm.json +428 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/plot_and_track_one_block.parsed.cdm.json +428 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/plot_characteristics_all_subfields.cdm.json +321 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/plot_characteristics_all_subfields.parsed.cdm.json +321 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/psr_only_plot_no_identity.cdm.json +173 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/psr_only_plot_no_identity.parsed.cdm.json +173 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/psr_plot_with_track_number_only.cdm.json +223 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/psr_plot_with_track_number_only.parsed.cdm.json +223 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/psr_track_two_scans_same_track_number.cdm.json +444 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/psr_track_two_scans_same_track_number.parsed.cdm.json +444 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/radial_ambiguity_rad_invalid.cdm.json +241 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/radial_ambiguity_rad_invalid.parsed.cdm.json +241 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/radial_doppler_both_subfields.cdm.json +233 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/radial_doppler_both_subfields.parsed.cdm.json +233 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/radial_doppler_calculated.cdm.json +213 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/radial_doppler_calculated.parsed.cdm.json +213 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/reserved_expansion_field_carried.cdm.json +210 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/reserved_expansion_field_carried.parsed.cdm.json +210 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/spare_bits_nonzero.cdm.json +252 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/spare_bits_nonzero.parsed.cdm.json +252 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/special_purpose_field_opaque.cdm.json +196 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/special_purpose_field_opaque.parsed.cdm.json +196 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/three_altitudes_disagreeing.cdm.json +321 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/three_altitudes_disagreeing.parsed.cdm.json +321 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/time_of_day_exactly_86400.cdm.json +187 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/time_of_day_exactly_86400.parsed.cdm.json +187 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/track_quality_vector.cdm.json +273 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/track_quality_vector.parsed.cdm.json +273 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/two_stations_one_block.cdm.json +416 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/two_stations_one_block.parsed.cdm.json +416 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/warning_error_code_37.cdm.json +222 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/warning_error_code_37.parsed.cdm.json +222 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/warning_error_code_series.cdm.json +248 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/warning_error_code_series.parsed.cdm.json +248 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/helicopter_classification_not_read_as_a_type.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/helicopter_classification_not_read_as_a_type.parsed.json +71 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/ic_conflict_codes.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/ic_conflict_codes.parsed.json +70 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/icao24_shared_with_cat021.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/icao24_shared_with_cat021.parsed.json +70 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/injected_site_no_height_item.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/injected_site_no_height_item.parsed.json +81 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/injected_site_pressure_height_only.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/injected_site_pressure_height_only.parsed.json +71 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/injected_site_range_at_maximum.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/injected_site_range_at_maximum.parsed.json +85 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/midnight_rollover_after.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/midnight_rollover_after.parsed.json +57 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/midnight_rollover_before.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/midnight_rollover_before.parsed.json +57 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/military_emergency.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/military_emergency.parsed.json +67 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/mode_1_and_mode_2_with_confidence.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/mode_1_and_mode_2_with_confidence.parsed.json +143 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/mode_4_result_in_ref.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/mode_4_result_in_ref.parsed.json +72 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/mode_s_alert_is_not_an_emergency.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/mode_s_alert_is_not_an_emergency.parsed.json +61 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/mode_s_roll_call_track.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/mode_s_roll_call_track.parsed.json +114 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/no_detection_track_only.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/no_detection_track_only.parsed.json +80 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/no_time_item_at_all.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/no_time_item_at_all.parsed.json +59 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/plot_and_track_one_block.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/plot_and_track_one_block.parsed.json +122 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/plot_characteristics_all_subfields.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/plot_characteristics_all_subfields.parsed.json +121 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/psr_only_plot_no_identity.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/psr_only_plot_no_identity.parsed.json +45 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/psr_plot_with_track_number_only.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/psr_plot_with_track_number_only.parsed.json +67 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/psr_track_two_scans_same_track_number.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/psr_track_two_scans_same_track_number.parsed.json +125 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/radial_ambiguity_rad_invalid.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/radial_ambiguity_rad_invalid.parsed.json +79 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/radial_doppler_both_subfields.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/radial_doppler_both_subfields.parsed.json +79 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/radial_doppler_calculated.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/radial_doppler_calculated.parsed.json +70 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/refusals/descriptor_sixth_extension.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/refusals/length_disagrees_with_buffer.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/refusals/missing_mandatory_data_source.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/refusals/mode_s_target_missing_address.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/refusals/plot_characteristics_second_primary_octet.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/refusals/radial_doppler_spare_presence_bit.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/refusals/records_do_not_tile_len.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/refusals/time_of_day_one_lsb_past_86400.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/refusals/track_status_second_extent.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/refusals/trailing_fspec_fx_set.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/refusals/wrong_category.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/reserved_expansion_field_carried.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/reserved_expansion_field_carried.parsed.json +67 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/spare_bits_nonzero.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/spare_bits_nonzero.parsed.json +88 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/spec/build_fixtures.py +694 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/spec/cat048_pin.json +1478 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/special_purpose_field_opaque.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/special_purpose_field_opaque.parsed.json +62 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/three_altitudes_disagreeing.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/three_altitudes_disagreeing.parsed.json +112 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/time_of_day_exactly_86400.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/time_of_day_exactly_86400.parsed.json +57 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/track_quality_vector.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/track_quality_vector.parsed.json +97 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/two_stations_one_block.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/two_stations_one_block.parsed.json +119 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/warning_error_code_37.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/warning_error_code_37.parsed.json +71 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/warning_error_code_series.cat048 +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/warning_error_code_series.parsed.json +86 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/fft/README.md +138 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/fft/spec/fft_pin.json +191 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/README.md +102 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/delta_targets_across_the_prime_meridian.gmti +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/delta_targets_across_the_prime_meridian.parsed.json +69 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/dwell_with_no_targets_and_target_bits_set.gmti +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/dwell_with_no_targets_and_target_bits_set.parsed.json +62 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/free_text_and_test_status.gmti +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/free_text_and_test_status.parsed.json +53 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/full_mask_every_optional_group.gmti +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/full_mask_every_optional_group.parsed.json +135 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/delta_targets_across_the_prime_meridian.cdm.json +567 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/delta_targets_across_the_prime_meridian.parsed.cdm.json +567 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/dwell_with_no_targets_and_target_bits_set.cdm.json +225 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/dwell_with_no_targets_and_target_bits_set.parsed.cdm.json +225 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/free_text_and_test_status.cdm.json +209 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/free_text_and_test_status.parsed.cdm.json +209 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/full_mask_every_optional_group.cdm.json +598 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/full_mask_every_optional_group.parsed.cdm.json +598 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/hrr_signature_parked_both_time_branches.cdm.json +478 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/hrr_signature_parked_both_time_branches.parsed.cdm.json +478 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/mission_dwell_hi_res_targets.cdm.json +663 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/mission_dwell_hi_res_targets.parsed.cdm.json +663 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/multi_day_dwell_time.cdm.json +296 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/multi_day_dwell_time.parsed.cdm.json +296 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/platform_location_mixed_time_basis.cdm.json +372 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/platform_location_mixed_time_basis.parsed.cdm.json +372 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/processing_history_chain.cdm.json +204 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/processing_history_chain.parsed.cdm.json +204 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/repeated_mission_segment.cdm.json +216 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/repeated_mission_segment.parsed.cdm.json +216 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/reserved_and_extension_segments_recorded.cdm.json +329 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/reserved_and_extension_segments_recorded.parsed.cdm.json +329 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/simulated_classifications_never_flip_synthetic.cdm.json +688 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/simulated_classifications_never_flip_synthetic.parsed.cdm.json +688 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/sparse_mask_minimum_dwell.cdm.json +296 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/sparse_mask_minimum_dwell.parsed.cdm.json +296 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/synthesized_data_parks_without_refusal.cdm.json +301 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/synthesized_data_parks_without_refusal.parsed.cdm.json +301 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/tagging_device_beside_simulated_targets.cdm.json +578 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/tagging_device_beside_simulated_targets.parsed.cdm.json +578 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/tasking_segments_parked_with_job_id_zero.cdm.json +210 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/tasking_segments_parked_with_job_id_zero.parsed.cdm.json +210 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/hrr_signature_parked_both_time_branches.gmti +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/hrr_signature_parked_both_time_branches.parsed.json +113 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/mission_dwell_hi_res_targets.gmti +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/mission_dwell_hi_res_targets.parsed.json +120 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/multi_day_dwell_time.gmti +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/multi_day_dwell_time.parsed.json +56 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/platform_location_mixed_time_basis.gmti +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/platform_location_mixed_time_basis.parsed.json +85 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/processing_history_chain.gmti +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/processing_history_chain.parsed.json +60 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/repeated_mission_segment.gmti +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/repeated_mission_segment.parsed.json +72 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/reserved_and_extension_segments_recorded.gmti +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/reserved_and_extension_segments_recorded.parsed.json +70 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/simulated_classifications_never_flip_synthetic.gmti +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/simulated_classifications_never_flip_synthetic.parsed.json +72 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/sparse_mask_minimum_dwell.gmti +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/sparse_mask_minimum_dwell.parsed.json +56 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/spec/build_fixtures.py +508 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/synthesized_data_parks_without_refusal.gmti +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/synthesized_data_parks_without_refusal.parsed.json +57 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/tagging_device_beside_simulated_targets.gmti +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/tagging_device_beside_simulated_targets.parsed.json +73 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/tasking_segments_parked_with_job_id_zero.gmti +0 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/tasking_segments_parked_with_job_id_zero.parsed.json +130 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/klv/README.md +61 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/klv/spec/klv_pin.json +303 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/README.md +112 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/entity_exercise_affiliation_and_nulls.json +18 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/entity_location_ecef_gulf_of_riga.json +32 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/entity_location_lla_ventspils.json +27 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/entity_sensor_mast_riga.json +36 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/event_gunshot_detection.json +15 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/golden/entity_exercise_affiliation_and_nulls.cdm.json +64 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/golden/entity_location_ecef_gulf_of_riga.cdm.json +168 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/golden/entity_location_lla_ventspils.cdm.json +132 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/golden/entity_sensor_mast_riga.cdm.json +163 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/golden/event_gunshot_detection.cdm.json +54 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/golden/locations_list_patrol_three.cdm.json +177 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/locations_list_patrol_three.json +35 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/spec/openapi_pin.json +1098 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/README.md +75 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/amplification_zombie_beside_friend.nits.xml +98 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/amplification_zombie_beside_friend.parsed.json +130 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/cooperative_modality_is_a_gnss_fix.nits.xml +83 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/cooperative_modality_is_a_gnss_fix.parsed.json +118 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/datastream_unresolved_references.nits.xml +42 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/datastream_unresolved_references.parsed.json +62 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/detection_evidence_tree.nits.xml +194 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/detection_evidence_tree.parsed.json +310 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/ecef_track_with_velocity.nits.xml +111 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/ecef_track_with_velocity.parsed.json +169 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/exercise_faker_is_friendly.nits.xml +130 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/exercise_faker_is_friendly.parsed.json +171 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/fractional_increment_parks_raw_integers.nits.xml +101 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/fractional_increment_parks_raw_integers.parsed.json +138 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/amplification_zombie_beside_friend.nits.cdm.json +268 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/amplification_zombie_beside_friend.parsed.cdm.json +268 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/cooperative_modality_is_a_gnss_fix.nits.cdm.json +281 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/cooperative_modality_is_a_gnss_fix.parsed.cdm.json +281 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/datastream_unresolved_references.nits.cdm.json +167 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/datastream_unresolved_references.parsed.cdm.json +167 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/detection_evidence_tree.nits.cdm.json +588 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/detection_evidence_tree.parsed.cdm.json +588 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/ecef_track_with_velocity.nits.cdm.json +362 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/ecef_track_with_velocity.parsed.cdm.json +362 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/exercise_faker_is_friendly.nits.cdm.json +329 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/exercise_faker_is_friendly.parsed.cdm.json +329 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/fractional_increment_parks_raw_integers.nits.cdm.json +299 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/fractional_increment_parks_raw_integers.parsed.cdm.json +299 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/linkage_processed_track_carried.nits.cdm.json +824 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/linkage_processed_track_carried.parsed.cdm.json +824 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/local_cartesian_with_complete_cft.nits.cdm.json +403 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/local_cartesian_with_complete_cft.parsed.cdm.json +403 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/local_spherical_is_attributes_only.nits.cdm.json +329 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/local_spherical_is_attributes_only.parsed.cdm.json +329 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/motion_event_complex_polygon.nits.cdm.json +489 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/motion_event_complex_polygon.parsed.cdm.json +489 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/motion_event_tripwire.nits.cdm.json +429 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/motion_event_tripwire.parsed.cdm.json +429 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/segment_retraction_is_an_event.nits.cdm.json +439 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/segment_retraction_is_an_event.parsed.cdm.json +439 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/standalone_basic_track.nits.cdm.json +404 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/standalone_basic_track.parsed.cdm.json +404 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/three_contiguous_segments_one_track.nits.cdm.json +477 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/three_contiguous_segments_one_track.parsed.cdm.json +477 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/wgs84_velocity_with_height.nits.cdm.json +280 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/wgs84_velocity_with_height.parsed.cdm.json +280 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/wgs84_velocity_without_height.nits.cdm.json +272 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/wgs84_velocity_without_height.parsed.cdm.json +272 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/linkage_processed_track_carried.nits.xml +131 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/linkage_processed_track_carried.parsed.json +184 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/local_cartesian_with_complete_cft.nits.xml +156 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/local_cartesian_with_complete_cft.parsed.json +249 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/local_spherical_is_attributes_only.nits.xml +113 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/local_spherical_is_attributes_only.parsed.json +170 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/motion_event_complex_polygon.nits.xml +111 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/motion_event_complex_polygon.parsed.json +167 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/motion_event_tripwire.nits.xml +104 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/motion_event_tripwire.parsed.json +143 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/segment_retraction_is_an_event.nits.xml +103 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/segment_retraction_is_an_event.parsed.json +135 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/spec/build_fixtures.py +451 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/standalone_basic_track.nits.xml +138 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/standalone_basic_track.parsed.json +207 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/three_contiguous_segments_one_track.nits.xml +146 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/three_contiguous_segments_one_track.parsed.json +204 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/wgs84_velocity_with_height.nits.xml +95 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/wgs84_velocity_with_height.parsed.json +132 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/wgs84_velocity_without_height.nits.xml +95 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/wgs84_velocity_without_height.parsed.json +130 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/pntmap/equator_emitter_l5.json +19 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/pntmap/golden/equator_emitter_l5.cdm.json +77 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/pntmap/golden/jamming_gulf_of_riga.cdm.json +110 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/pntmap/golden/spoofing_no_geolocation.cdm.json +74 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/pntmap/golden/unknown_type_vendor_fields.cdm.json +84 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/pntmap/jamming_gulf_of_riga.json +27 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/pntmap/spoofing_no_geolocation.json +17 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/pntmap/unknown_type_vendor_fields.json +22 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/air_track_due_north.parsed.json +28 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/air_track_due_north.xml +16 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/bridge_installation.parsed.json +25 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/bridge_installation.xml +16 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/degraded_no_position.parsed.json +26 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/degraded_no_position.xml +15 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/egress/README.md +14 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/egress/annotation_point_unlabelled.json +19 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/egress/coa_sketch_polygon.json +29 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/egress/golden/annotation_point_unlabelled.cot.xml +8 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/egress/golden/coa_sketch_polygon.cot.xml +17 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/egress/golden/patrol_route_linestring.cot.xml +12 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/egress/patrol_route_linestring.json +28 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/equator_zero_meridian.parsed.json +24 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/equator_zero_meridian.xml +15 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/golden/air_track_due_north.cdm.json +87 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/golden/air_track_due_north.parsed.cdm.json +87 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/golden/bridge_installation.cdm.json +86 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/golden/bridge_installation.parsed.cdm.json +86 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/golden/degraded_no_position.cdm.json +82 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/golden/degraded_no_position.parsed.cdm.json +82 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/golden/equator_zero_meridian.cdm.json +82 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/golden/equator_zero_meridian.parsed.cdm.json +82 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/golden/narva_patrol.cdm.json +102 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/golden/narva_patrol.parsed.cdm.json +102 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/golden/suspect_vessel_sentinels.cdm.json +83 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/golden/suspect_vessel_sentinels.parsed.cdm.json +83 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/narva_patrol.parsed.json +40 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/narva_patrol.xml +18 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/suspect_vessel_sentinels.parsed.json +26 -0
- synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/suspect_vessel_sentinels.xml +16 -0
- synapse_cdm-1.0.0/synapse_cdm/geo.py +107 -0
- synapse_cdm-1.0.0/synapse_cdm/harness.py +518 -0
- synapse_cdm-1.0.0/synapse_cdm/ids.py +59 -0
- synapse_cdm-1.0.0/synapse_cdm/lossless.py +180 -0
- synapse_cdm-1.0.0/synapse_cdm/models.py +439 -0
- synapse_cdm-1.0.0/synapse_cdm/schemas.py +146 -0
- synapse_cdm-1.0.0/synapse_cdm/symbology.py +115 -0
- synapse_cdm-1.0.0/synapse_cdm/times.py +78 -0
- synapse_cdm-1.0.0/synapse_cdm/version.py +103 -0
- synapse_cdm-1.0.0/synapse_cdm.egg-info/PKG-INFO +387 -0
- synapse_cdm-1.0.0/synapse_cdm.egg-info/SOURCES.txt +701 -0
- synapse_cdm-1.0.0/synapse_cdm.egg-info/dependency_links.txt +1 -0
- synapse_cdm-1.0.0/synapse_cdm.egg-info/entry_points.txt +3 -0
- synapse_cdm-1.0.0/synapse_cdm.egg-info/requires.txt +5 -0
- synapse_cdm-1.0.0/synapse_cdm.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
Apache License
|
|
2
|
+
Version 2.0, January 2004
|
|
3
|
+
http://www.apache.org/licenses/
|
|
4
|
+
|
|
5
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
6
|
+
|
|
7
|
+
1. Definitions.
|
|
8
|
+
|
|
9
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
10
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
11
|
+
|
|
12
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
13
|
+
the copyright owner that is granting the License.
|
|
14
|
+
|
|
15
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
16
|
+
other entities that control, are controlled by, or are under common
|
|
17
|
+
control with that entity. For the purposes of this definition,
|
|
18
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
19
|
+
direction or management of such entity, whether by contract or
|
|
20
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
21
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
22
|
+
|
|
23
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
24
|
+
exercising permissions granted by this License.
|
|
25
|
+
|
|
26
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
27
|
+
including but not limited to software source code, documentation
|
|
28
|
+
source, and configuration files.
|
|
29
|
+
|
|
30
|
+
"Object" form shall mean any form resulting from mechanical
|
|
31
|
+
transformation or translation of a Source form, including but
|
|
32
|
+
not limited to compiled object code, generated documentation,
|
|
33
|
+
and conversions to other media types.
|
|
34
|
+
|
|
35
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
36
|
+
Object form, made available under the License, as indicated by a
|
|
37
|
+
copyright notice that is included in or attached to the work
|
|
38
|
+
(an example is provided in the Appendix below).
|
|
39
|
+
|
|
40
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
41
|
+
form, that is based on (or derived from) the Work and for which the
|
|
42
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
43
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
44
|
+
of this License, Derivative Works shall not include works that remain
|
|
45
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
46
|
+
the Work and Derivative Works thereof.
|
|
47
|
+
|
|
48
|
+
"Contribution" shall mean any work of authorship, including
|
|
49
|
+
the original version of the Work and any modifications or additions
|
|
50
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
51
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
52
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
53
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
54
|
+
means any form of electronic, verbal, or written communication sent
|
|
55
|
+
to the Licensor or its representatives, including but not limited to
|
|
56
|
+
communication on electronic mailing lists, source code control systems,
|
|
57
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
58
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
59
|
+
excluding communication that is conspicuously marked or otherwise
|
|
60
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
61
|
+
|
|
62
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
63
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
64
|
+
subsequently incorporated within the Work.
|
|
65
|
+
|
|
66
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
67
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
68
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
69
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
70
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
71
|
+
Work and such Derivative Works in Source or Object form.
|
|
72
|
+
|
|
73
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
74
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
75
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
76
|
+
(except as stated in this section) patent license to make, have made,
|
|
77
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
78
|
+
where such license applies only to those patent claims licensable
|
|
79
|
+
by such Contributor that are necessarily infringed by their
|
|
80
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
81
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
82
|
+
institute patent litigation against any entity (including a
|
|
83
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
84
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
85
|
+
or contributory patent infringement, then any patent licenses
|
|
86
|
+
granted to You under this License for that Work shall terminate
|
|
87
|
+
as of the date such litigation is filed.
|
|
88
|
+
|
|
89
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
90
|
+
Work or Derivative Works thereof in any medium, with or without
|
|
91
|
+
modifications, and in Source or Object form, provided that You
|
|
92
|
+
meet the following conditions:
|
|
93
|
+
|
|
94
|
+
(a) You must give any other recipients of the Work or
|
|
95
|
+
Derivative Works a copy of this License; and
|
|
96
|
+
|
|
97
|
+
(b) You must cause any modified files to carry prominent notices
|
|
98
|
+
stating that You changed the files; and
|
|
99
|
+
|
|
100
|
+
(c) You must retain, in the Source form of any Derivative Works
|
|
101
|
+
that You distribute, all copyright, patent, trademark, and
|
|
102
|
+
attribution notices from the Source form of the Work,
|
|
103
|
+
excluding those notices that do not pertain to any part of
|
|
104
|
+
the Derivative Works; and
|
|
105
|
+
|
|
106
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
107
|
+
distribution, then any Derivative Works that You distribute must
|
|
108
|
+
include a readable copy of the attribution notices contained
|
|
109
|
+
within such NOTICE file, excluding those notices that do not
|
|
110
|
+
pertain to any part of the Derivative Works, in at least one
|
|
111
|
+
of the following places: within a NOTICE text file distributed
|
|
112
|
+
as part of the Derivative Works; within the Source form or
|
|
113
|
+
documentation, if provided along with the Derivative Works; or,
|
|
114
|
+
within a display generated by the Derivative Works, if and
|
|
115
|
+
wherever such third-party notices normally appear. The contents
|
|
116
|
+
of the NOTICE file are for informational purposes only and
|
|
117
|
+
do not modify the License. You may add Your own attribution
|
|
118
|
+
notices within Derivative Works that You distribute, alongside
|
|
119
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
120
|
+
that such additional attribution notices cannot be construed
|
|
121
|
+
as modifying the License.
|
|
122
|
+
|
|
123
|
+
You may add Your own copyright statement to Your modifications and
|
|
124
|
+
may provide additional or different license terms and conditions
|
|
125
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
126
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
127
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
128
|
+
the conditions stated in this License.
|
|
129
|
+
|
|
130
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
131
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
132
|
+
by You to the Licensor shall be under the terms and conditions of
|
|
133
|
+
this License, without any additional terms or conditions.
|
|
134
|
+
Notwithstanding the above, nothing herein shall supersede or modify
|
|
135
|
+
the terms of any separate license agreement you may have executed
|
|
136
|
+
with Licensor regarding such Contributions.
|
|
137
|
+
|
|
138
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
139
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
140
|
+
except as required for reasonable and customary use in describing the
|
|
141
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
142
|
+
|
|
143
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
144
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
145
|
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
146
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
147
|
+
implied, including, without limitation, any warranties or conditions
|
|
148
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
149
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
150
|
+
appropriateness of using or redistributing the Work and assume any
|
|
151
|
+
risks associated with Your exercise of permissions under this License.
|
|
152
|
+
|
|
153
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
154
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
155
|
+
unless required by applicable law (such as deliberate and grossly
|
|
156
|
+
negligent acts) or agreed to in writing, shall any Contributor be
|
|
157
|
+
liable to You for damages, including any direct, indirect, special,
|
|
158
|
+
incidental, or consequential damages of any character arising as a
|
|
159
|
+
result of this License or out of the use or inability to use the
|
|
160
|
+
Work (including but not limited to damages for loss of goodwill,
|
|
161
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
162
|
+
other commercial damages or losses), even if such Contributor
|
|
163
|
+
has been advised of the possibility of such damages.
|
|
164
|
+
|
|
165
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
166
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
167
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
168
|
+
or other liability obligations and/or rights consistent with this
|
|
169
|
+
License. However, in accepting such obligations, You may act only
|
|
170
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
171
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
172
|
+
defend, and hold each Contributor harmless for any liability
|
|
173
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
174
|
+
of your accepting any such warranty or additional liability.
|
|
175
|
+
|
|
176
|
+
END OF TERMS AND CONDITIONS
|
|
177
|
+
|
|
178
|
+
APPENDIX: How to apply the Apache License to your work.
|
|
179
|
+
|
|
180
|
+
To apply the Apache License to your work, attach the following
|
|
181
|
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
182
|
+
replaced with your own identifying information. (Don't include
|
|
183
|
+
the brackets!) The text should be enclosed in the appropriate
|
|
184
|
+
comment syntax for the file format. We also recommend that a
|
|
185
|
+
file or class name and description of purpose be included on the
|
|
186
|
+
same "printed page" as the copyright notice for easier
|
|
187
|
+
identification within third-party archives.
|
|
188
|
+
|
|
189
|
+
Copyright [yyyy] [name of copyright owner]
|
|
190
|
+
|
|
191
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
192
|
+
you may not use this file except in compliance with the License.
|
|
193
|
+
You may obtain a copy of the License at
|
|
194
|
+
|
|
195
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
196
|
+
|
|
197
|
+
Unless required by applicable law or agreed to in writing, software
|
|
198
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
199
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
200
|
+
See the License for the specific language governing permissions and
|
|
201
|
+
limitations under the License.
|
synapse_cdm-1.0.0/NOTICE
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
synapsecommand-public
|
|
2
|
+
Copyright 2026 Decent Cybersecurity s.r.o.
|
|
3
|
+
|
|
4
|
+
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
|
|
5
|
+
this work except in compliance with the License. You may obtain a copy of the
|
|
6
|
+
License in the LICENSE file at the root of this repository, or at:
|
|
7
|
+
|
|
8
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
|
|
10
|
+
--------------------------------------------------------------------------------
|
|
11
|
+
WHY THIS FILE AND NOT THE APPENDIX IN LICENSE
|
|
12
|
+
|
|
13
|
+
Apache-2.0's APPENDIX is a TEMPLATE FOR PER-FILE HEADERS — "attach the following
|
|
14
|
+
boilerplate notice, with the fields enclosed by brackets replaced with your own
|
|
15
|
+
identifying information". This repository has no per-file headers: NO tracked
|
|
16
|
+
file carries an SPDX tag, and every copyright notice in the tree is in a LICENCE
|
|
17
|
+
FILE — LICENSE, this file, and DCO, whose notice is the Linux Foundation's and
|
|
18
|
+
not ours, together with the byte-identical copies of LICENSE and this file that
|
|
19
|
+
sit beside packages/cdm/pyproject.toml. Those two copies exist for one reason
|
|
20
|
+
and have no other: setuptools resolves `license-files` against the DISTRIBUTION
|
|
21
|
+
root, so without them the built wheel carries the SPDX expression Apache-2.0 and
|
|
22
|
+
not one byte of licence text — and section 4(d), below, makes carrying this file
|
|
23
|
+
a condition of redistributing the Work. A wheel on an index is a redistribution.
|
|
24
|
+
tests/test_cdm_packaging.py makes any drift from the originals a build failure,
|
|
25
|
+
which is the only reason a second copy is allowed to exist at all. The licence
|
|
26
|
+
policy is stated at the repository level instead, in README.md and
|
|
27
|
+
CONTRIBUTING.md. Filling in a
|
|
28
|
+
template for headers that will never exist is completing the wrong form.
|
|
29
|
+
|
|
30
|
+
That sentence used to read "none of its 769 tracked files", and by the day this
|
|
31
|
+
repository went public the tree held 770. A count of every file in the
|
|
32
|
+
repository is a number that goes stale on the next commit that adds one, so it
|
|
33
|
+
is a stale-count generator rather than a fact — and the count was never the
|
|
34
|
+
claim. The claim is the ABSENCE. So the absence is what is stated, and it is
|
|
35
|
+
what tests/test_cdm_publication.py enforces over every tracked file, in both
|
|
36
|
+
halves: no SPDX tag anywhere, and no copyright notice outside a licence file —
|
|
37
|
+
where the set of licence files is derived from this repository's own packaging
|
|
38
|
+
declaration rather than typed out, so a copy added for a second distribution
|
|
39
|
+
cannot be forgotten in one place and remembered in the other.
|
|
40
|
+
|
|
41
|
+
NOTICE is the file Apache-2.0 actually defines for this. Section 4(d) requires a
|
|
42
|
+
redistributor of a Work that includes a NOTICE file to carry its attribution
|
|
43
|
+
notices forward, which is precisely the effect wanted — and it is achieved
|
|
44
|
+
without editing LICENSE, whose text stays byte-identical to the canonical
|
|
45
|
+
Apache-2.0 so that GitHub's licence detection and any SPDX scanner keep
|
|
46
|
+
recognising it. A modified LICENSE is a licence tools stop being sure about.
|
|
47
|
+
|
|
48
|
+
WHY ONE YEAR AND NOT A RANGE
|
|
49
|
+
|
|
50
|
+
2026 is the year of the first commit (d798601, 2026-08-22) and the current year.
|
|
51
|
+
A range asserts a span of authorship, and there is not yet a span to assert. When
|
|
52
|
+
this repository sees a second calendar year of work the convention is to extend
|
|
53
|
+
it then — a range written in advance is a claim about the future.
|
|
54
|
+
|
|
55
|
+
WHAT THIS FILE DOES NOT COVER
|
|
56
|
+
|
|
57
|
+
The specification documents this repository PINS are not part of the Work and are
|
|
58
|
+
not covered by this licence. None of their bytes is in this repository or in its
|
|
59
|
+
history: each is recorded by SHA-256, byte count, page count, edition and source
|
|
60
|
+
URL, and the documents themselves remain under their publishers' own terms —
|
|
61
|
+
EUROCONTROL's for the ASTERIX specifications, NATO's for the STANAGs and AEDPs,
|
|
62
|
+
MISB's for the Motion Imagery Standards Profile. See the pin records under
|
|
63
|
+
packages/cdm/synapse_cdm/fixtures/*/spec/ for each document's terms as its own
|
|
64
|
+
front matter states them.
|
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: synapse-cdm
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: SynapseCommand Canonical Data Model: the four canonical objects, the adapter SDK, and the validation harness
|
|
5
|
+
Author: Decent Cybersecurity s.r.o.
|
|
6
|
+
License-Expression: Apache-2.0
|
|
7
|
+
Project-URL: Homepage, https://github.com/Decent-Cybersecurity/synapsecommand-public
|
|
8
|
+
Project-URL: Documentation, https://docs.synapsecommand.com/
|
|
9
|
+
Project-URL: Source, https://github.com/Decent-Cybersecurity/synapsecommand-public
|
|
10
|
+
Project-URL: Issues, https://github.com/Decent-Cybersecurity/synapsecommand-public/issues
|
|
11
|
+
Project-URL: Changelog, https://github.com/Decent-Cybersecurity/synapsecommand-public/blob/main/packages/cdm/synapse_cdm/MIGRATIONS.md
|
|
12
|
+
Keywords: canonical-data-model,adapter,adapter-sdk,json-schema,geospatial,cursor-on-target,asterix,stanag-4676,stanag-4607,ais,ads-b
|
|
13
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Intended Audience :: Information Technology
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
21
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
22
|
+
Classifier: Operating System :: OS Independent
|
|
23
|
+
Classifier: Topic :: Scientific/Engineering :: Information Analysis
|
|
24
|
+
Classifier: Topic :: Scientific/Engineering :: GIS
|
|
25
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
26
|
+
Classifier: Typing :: Typed
|
|
27
|
+
Requires-Python: >=3.11
|
|
28
|
+
Description-Content-Type: text/markdown
|
|
29
|
+
License-File: LICENSE
|
|
30
|
+
License-File: NOTICE
|
|
31
|
+
Requires-Dist: pydantic>=2.6
|
|
32
|
+
Requires-Dist: jsonschema>=4.0
|
|
33
|
+
Provides-Extra: test
|
|
34
|
+
Requires-Dist: pytest>=8.0; extra == "test"
|
|
35
|
+
Dynamic: license-file
|
|
36
|
+
|
|
37
|
+
# `synapse_cdm` — the Canonical Data Model and adapter framework
|
|
38
|
+
|
|
39
|
+
Ten integration adapters are shipped: PNTMAP GNSS alerts, TAK / Cursor-on-Target, AIS /
|
|
40
|
+
NMEA 0183 AIVDM, ADS-B 1090ES extended squitter, Picogrid Legion, ASTERIX category 021,
|
|
41
|
+
STANAG 4676 / AEDP-12 Edition B NITS tracks, STANAG 4607 / AEDP-4607 Edition A GMTI,
|
|
42
|
+
ASTERIX category 048 monoradar target reports, and ASTERIX category 034 monoradar service
|
|
43
|
+
messages. Without a canonical model in the middle, ten
|
|
44
|
+
adapters means forty-five translations and ten private notions of "a contact". With one, an
|
|
45
|
+
adapter is a thin translator and nothing else.
|
|
46
|
+
|
|
47
|
+
**Shipped so far:**
|
|
48
|
+
|
|
49
|
+
| Adapter | Direction | Reads / writes |
|
|
50
|
+
|---|---|---|
|
|
51
|
+
| [`pntmap`](adapters/pntmap.py) 1.0.0 | ingest | PNTMAP GNSS interference alerts (JSON) → `Entity` + `Event`. The reference adapter — read it first |
|
|
52
|
+
| [`tak`](adapters/tak.py) 1.0.0 | bidirectional | Cursor-on-Target atoms (XML) → `Entity` + `Event`; `PlanObject` → a `u-d-f` drawing, `Entity` → an atom |
|
|
53
|
+
| [`ais`](adapters/ais.py) 1.0.0 | bidirectional | AIS NMEA 0183 AIVDM/AIVDO sentences (types 1/2/3, 4, 5, 18/19, 21) → `Entity` + `Event`; `Entity` or `Track` → sentences. The sentinel-heaviest format so far, and the one with no extension point |
|
|
54
|
+
| [`adsb`](adapters/adsb.py) 1.0.0 | bidirectional | ADS-B 1090ES extended squitter frames, Mode S DF17/DF18 (type codes 1-4, 5-8, 0 and 9-18, 19, 20-22, 28, 31) → `Entity` + `Event`; `Entity` or `Track` → DF17 frames. A binary format with a CRC gate, two altitudes that are two different measurements, and no unambiguous position in a single frame |
|
|
55
|
+
| [`legion`](adapters/legion.py) 1.0.0 | ingest | Picogrid Legion Platform API v3 response documents (Entity, Track, Entity/Track Location, Locations list, Event) → `Entity` + `Event` + `Track`. The first REST upstream: transport stays with the caller, one page is one Track, and the coordinates default to geocentric metres |
|
|
56
|
+
| [`cat021`](adapters/asterix_cat021.py) 1.0.0 | bidirectional | ASTERIX category 021 ADS-B target reports, EUROCONTROL SPEC-0149-12 Ed 2.6 with the Reserved Expansion Field Ed 1.5 (all 42 data items, RE and SP) → `Entity` + `Event` **per record**; Entities or a `Track` → one data block. A time of day that carries no date, a quality vocabulary that needs another item to say what it means, and a ground station whose verdicts it carries without re-deciding |
|
|
57
|
+
| [`stanag4676`](adapters/stanag4676.py) 1.0.0 | bidirectional | STANAG 4676 / AEDP-12 **Edition B Version 2** NITS tracks — the full UML model, 48 classes and 273 attributes → an `Entity` + a `Track` per `TrackData` and an `Event` per detection, motion event, linkage and retraction; back to one STANDALONE `NITSRoot`. Six coordinate systems of which three cannot yield a position, a mandatory STANAG 4774 confidentiality label that is carried and never invented, and a format that models fusion without asking a translator to perform it. **The XML element binding is provisional** — the normative XSD is distributed through national representatives and is not pinned here |
|
|
58
|
+
| [`gmti`](adapters/gmtif.py) 1.0.0 | bidirectional | STANAG 4607 / AEDP-4607 **Edition A Version 1** GMTI packets — the packet header, the segment header and all ten defined segments, 212 fields → one `Entity` + `Track` for the **platform** and an `Entity` + `DETECTION` `Event` **per target report**; back to one packet, **byte for byte**. The first non-text wire format: seven numeric encodings on their own tested codec layer ([`gmtif_codec`](adapters/gmtif_codec.py)), existence masks that govern every subsequent field offset, and a format whose targets are detections rather than tracks — so **no target `Track` is ever emitted**, because associating reports across dwells is what a GMTI tracker does and the standard's own guide sends the reader to the sensor vendor for the rule |
|
|
59
|
+
| [`cat048`](adapters/asterix_cat048.py) 1.0.0 | bidirectional | ASTERIX category 048 monoradar target reports, EUROCONTROL SPEC-0149-4 **Edition 1.32** (all 28 UAP data items, SP and RE) → `Entity` + `Event` **per record**; Entities → one data block, **byte for byte**, on its own tested codec layer ([`cat048_codec`](adapters/cat048_codec.py)). The sensor-side complement of `cat021`, and the first adapter whose ordinary case is a `DETECTION` rather than a `TRACK_UPDATE` — a radar detects where AIS, ADS-B and CAT021 receive self-reports. **Position is derived only when the caller injects a `sensor_position`**: the format states slant range and azimuth from a station whose location it never carries, and the geodesy is not in the specification at all |
|
|
60
|
+
| [`cat034`](adapters/asterix_cat034.py) 1.0.0 | bidirectional | ASTERIX category 034 monoradar service messages, EUROCONTROL SPEC-0149-2b **Edition 1.29** (all 14 UAP FRNs, all 12 data items, RE and SP) → `Entity` + `Event` **per record**; Entities → one data block, **byte for byte**, on its own tested codec layer ([`cat034_codec`](adapters/cat034_codec.py)). **The first adapter whose primary object is the sensor itself** — every record describes the radar station, so `entity_type` is `SENSOR`, the SAC/SIC that `cat048` parks as a sensor identifier is a `SourceId` here, and no object carries `Kinematics` because the one bearing the category states is the antenna's. Table 2's M/O/X matrix is the encoding rule for eleven of the twelve items, and it is what rules out ever deriving a `Geometry` from the Generic Polar Window: the window and the station's own position are mutually exclusive across all seven message types |
|
|
61
|
+
|
|
62
|
+
external format ──▶ Adapter.to_cdm() ──▶ Entity | Event | Track | PlanObject ──▶ platform
|
|
63
|
+
platform ──▶ Adapter.from_cdm() ─▶ external format (egress, e.g. TAK)
|
|
64
|
+
|
|
65
|
+
## Quick start
|
|
66
|
+
|
|
67
|
+
**Using it.** Nothing but the package, from any directory:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
pip install synapse-cdm
|
|
71
|
+
|
|
72
|
+
python -m synapse_cdm.harness --adapter pntmap # replays the fixtures that came with it
|
|
73
|
+
python -m synapse_cdm.schemas --out ./schemas # writes the six JSON Schemas, anywhere
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
`--fixtures` is optional for an adapter this package ships: omitted, the harness asks the import
|
|
77
|
+
system where its own fixtures are and replays those, wherever the package is installed. Pass it
|
|
78
|
+
to replay your own set. Both commands also install as `cdm-harness` and `cdm-schemas`.
|
|
79
|
+
|
|
80
|
+
The wheel deliberately carries no copy of the published schemas — a third copy of a generated
|
|
81
|
+
artefact is a third thing that can go stale — so `python -m synapse_cdm.schemas --out <dir>`
|
|
82
|
+
produces them on demand instead, and they are identical to the ones the repository publishes.
|
|
83
|
+
|
|
84
|
+
**Working on it.** From a clone of the repository:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
pip install -e "packages/cdm[test]" # the package, its two deps, and pytest
|
|
88
|
+
pytest -q # the whole suite
|
|
89
|
+
python -m synapse_cdm.schemas --check --out schemas # fail if the published schemas are stale
|
|
90
|
+
python gates/wheel_install.py # and that the WHEEL is what was tested
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
`pytest.ini` puts `packages/cdm` on the path, so the suite judges the working tree rather than
|
|
94
|
+
whatever wheel happens to be in the environment. That is deliberate and it has a cost — nothing
|
|
95
|
+
in the suite exercises the artefact a partner receives — which is what `gates/wheel_install.py`
|
|
96
|
+
is for: it builds the distribution, installs it into a clean environment and runs the harness and
|
|
97
|
+
half the suite against **that**.
|
|
98
|
+
|
|
99
|
+
## The four canonical objects
|
|
100
|
+
|
|
101
|
+
| Object | Means | Key fields |
|
|
102
|
+
|---|---|---|
|
|
103
|
+
| `Entity` | something that **exists** | `entity_id`, `entity_type`, `affiliation`, `position`, `kinematics`, `valid_from/to`, `confidence`, `attributes` |
|
|
104
|
+
| `Event` | something that **happened** | `event_id`, `event_type`, `severity`, `related_entities`, `geometry`, `payload`, `observed_at`, `received_at` |
|
|
105
|
+
| `Track` | an entity's **position history** | `track_id`, `entity_id`, `samples[]`, `track_quality` |
|
|
106
|
+
| `PlanObject` | something we **push out** | `object_id`, `object_type`, `geometry`, `style`, `label`, `expires_at` |
|
|
107
|
+
|
|
108
|
+
Every one of them also carries, from `CDMBase`:
|
|
109
|
+
|
|
110
|
+
- `schema_version` — semver, in **every** serialised object (see [MIGRATIONS.md](MIGRATIONS.md));
|
|
111
|
+
- `source` — `{system, adapter, adapter_version, synthetic}`: which translator produced this;
|
|
112
|
+
- `source_ids[]` — the external identifiers the object is known by, **at least one**;
|
|
113
|
+
- `object_kind` — the discriminator, so a mixed stream can be validated without guessing;
|
|
114
|
+
- `integrity` — the PQC signature block: **designed, deliberately not implemented**.
|
|
115
|
+
|
|
116
|
+
One source payload legitimately becomes several objects. A PNTMAP alert is an
|
|
117
|
+
`INTERFERENCE_SOURCE` entity *and* a `GNSS_INTERFERENCE` event, so `to_cdm()` returns a list.
|
|
118
|
+
|
|
119
|
+
## The rules, and where each one is enforced
|
|
120
|
+
|
|
121
|
+
**1. Adapters never drop data.** A field with no canonical home goes into `Entity.attributes`
|
|
122
|
+
or `Event.payload`, parked under `source_extras` by `lossless.residual()`. Enforced: the
|
|
123
|
+
harness compares every scalar in the source payload against the CDM output and **fails** the
|
|
124
|
+
adapter on a value that appears nowhere. Values that legitimately change (a unit conversion, a
|
|
125
|
+
re-rendered timestamp) are declared in the adapter's `TRANSFORMS` with a reason, and the
|
|
126
|
+
harness **prints every declaration on every run** — an exemption is a visible line in the
|
|
127
|
+
report, not a silent skip.
|
|
128
|
+
|
|
129
|
+
**2. Adapters are pure translation.** No filtering, no enrichment, no thresholds. Each of
|
|
130
|
+
those is a decision, and a decision made inside a translator is invisible to the audit trail
|
|
131
|
+
and unattributable. The reference adapter demonstrates the rule where it is most tempting: a
|
|
132
|
+
GNSS jamming emitter gets `affiliation: UNKNOWN` unless the payload states an attribution.
|
|
133
|
+
|
|
134
|
+
**3. An unknown position is `null`, never `(0, 0)`.** Structural, not conventional:
|
|
135
|
+
`Position` requires `lat` and `lon`, so "unknown" cannot be spelled as zeros — it is spelled
|
|
136
|
+
by the absence of a `Position`. Note the mirror-image defect: `0.0` **is** a real coordinate,
|
|
137
|
+
so `if not lat` is as wrong as null-to-zero. Both directions have a fixture and a test.
|
|
138
|
+
|
|
139
|
+
**4. An unknown scalar is `None`, never `0`.** 0 kt is measured stillness, 0° is due north,
|
|
140
|
+
confidence 0 is certainty-that-*not*. A source's "value not available" sentinel (AIS sends
|
|
141
|
+
102.3 for unknown speed) is translated, never passed through.
|
|
142
|
+
|
|
143
|
+
**5. Every object states whether it is exercise data.** `source.synthetic` is required and has
|
|
144
|
+
**no default** — mislabelling exercise data as live can reach an operational picture, and
|
|
145
|
+
mislabelling live data as exercise hides it from an operator. Neither direction is safe to
|
|
146
|
+
guess, so the format makes someone state it.
|
|
147
|
+
|
|
148
|
+
**6. Identity is derived, never drawn.** `entity_id` is `uuid5(namespace, system|external_id)`
|
|
149
|
+
(`ids.py`), so the tenth report about one emitter updates one entity instead of creating a
|
|
150
|
+
tenth. It also makes golden-output tests possible at all. An adapter with no stable upstream
|
|
151
|
+
identifier must record what it keyed on (`attributes.entity_id_basis`).
|
|
152
|
+
|
|
153
|
+
**7. Time has one serialised form.** RFC 3339 UTC, exactly three decimals, always `Z` — the
|
|
154
|
+
same pattern the Track contract pins, because two timestamps meaning the same instant must
|
|
155
|
+
compare equal as *strings* in golden diffs and chain hashes. `received_at` comes from an
|
|
156
|
+
injected clock; adapter code never calls `datetime.now()`.
|
|
157
|
+
|
|
158
|
+
## Writing the next adapter
|
|
159
|
+
|
|
160
|
+
Read `adapters/pntmap.py` first — every rule above appears in it at least once. Then read
|
|
161
|
+
`adapters/ais.py` if your format is binary, packs several fields into one wire value, or spells
|
|
162
|
+
"unknown" as an in-band number — it has ten such sentinels, one of which (draught 0.0) is also
|
|
163
|
+
a plausible reading, and it is the one adapter whose egress format has nowhere to park a field
|
|
164
|
+
it cannot map. Or read `adapters/tak.py`, which is where the awkward cases live: XML rather than JSON, a bidirectional
|
|
165
|
+
`from_cdm()`, a source sentinel that must become null, an enum collapse that has to stay
|
|
166
|
+
recoverable, and the two fixture forms an XML adapter needs in order to be checked at all.
|
|
167
|
+
|
|
168
|
+
Read `adapters/adsb.py` for the case where the format does not give you the value at all. Three
|
|
169
|
+
of its problems recur in any surveillance feed: a **frame with no timestamp**, so `observed_at`
|
|
170
|
+
is receipt time and has to say so; a **position that needs a second message** to resolve, which
|
|
171
|
+
is where the line between translation and fusion gets drawn and where a reference position
|
|
172
|
+
supplied as *configuration* is legitimate while a cache is not; and **two fields that look like
|
|
173
|
+
one** — a barometric and a GNSS altitude, which must not be collapsed into `alt_m` however
|
|
174
|
+
convenient it would be. It is also the adapter whose gate earned its keep most visibly: the
|
|
175
|
+
byte-exact round trip found two silent data losses that every other check passed.
|
|
176
|
+
|
|
177
|
+
Then:
|
|
178
|
+
|
|
179
|
+
**1. Declare the class.** The contract is checked at class-definition time, so a mistake here
|
|
180
|
+
fails at import rather than at 03:00 on the first outbound push.
|
|
181
|
+
|
|
182
|
+
```python
|
|
183
|
+
class TakAdapter(Adapter):
|
|
184
|
+
name = "tak" # unique; how the harness and every SourceRef name you
|
|
185
|
+
version = "0.1.0" # semver; goes into source.adapter_version
|
|
186
|
+
direction = "bidirectional" # then you MUST override from_cdm()
|
|
187
|
+
system = "TAK"
|
|
188
|
+
|
|
189
|
+
TRANSFORMS = {"event.@time": "re-rendered into the CDM's fixed-millisecond form"}
|
|
190
|
+
|
|
191
|
+
def to_cdm(self, raw: bytes | dict) -> list[CDMBase]:
|
|
192
|
+
...
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
**2. Map the fields.** [FORMAT_COVERAGE.md](FORMAT_COVERAGE.md) already holds the CoT and
|
|
196
|
+
STANAG 4676 mappings, row by row, with the six known gaps named — that table is your
|
|
197
|
+
specification, and a test resolves every path in it against the models so it cannot go stale.
|
|
198
|
+
|
|
199
|
+
**3. Park everything else.** List the dotted paths you consumed, hand them to
|
|
200
|
+
`lossless.residual(raw, consumed)`, and put the result in `attributes["source_extras"]` /
|
|
201
|
+
`payload["source_extras"]`. Do not enumerate leftovers by hand: the block a source adds in its
|
|
202
|
+
next firmware release is exactly the one nobody remembers.
|
|
203
|
+
|
|
204
|
+
**4. Refuse what you cannot read.** A missing required field or an unmappable severity raises.
|
|
205
|
+
Do not default it — an alert that arrives labelled `INFO` because its severity was unreadable
|
|
206
|
+
is worse than one that fails loudly. An enum that *has* an `UNKNOWN` member is different: use
|
|
207
|
+
it, and keep the source's own word in `attributes`.
|
|
208
|
+
|
|
209
|
+
**5. Ship fixtures.** At least three synthetic payloads in this package's `fixtures/<name>/`,
|
|
210
|
+
including one that exercises the awkward path (a missing position, an unknown type, a vendor
|
|
211
|
+
block you have never seen). No real data, ever. If your adapter lives outside this package, put
|
|
212
|
+
them wherever you like and pass `--fixtures` — the harness is not fussy about where they are, only
|
|
213
|
+
about there being some.
|
|
214
|
+
|
|
215
|
+
**6. Record the golden output and read it.**
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
python -m synapse_cdm.harness --adapter tak --update-golden
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Then **review the diff before committing it** — `--update-golden` is how a defect becomes the
|
|
222
|
+
expectation. Both defects found while building the reference adapter were caught by reading a
|
|
223
|
+
golden file, not by a failing test.
|
|
224
|
+
|
|
225
|
+
**7. Add the tests.** Copy the shape of `tests/test_cdm_pntmap_adapter.py`: one test per claim
|
|
226
|
+
in your adapter's docstring. If you are bidirectional, the harness already round-trips you —
|
|
227
|
+
declare `direction = "bidirectional"`, override `from_cdm()`, and the `roundtrip` column checks
|
|
228
|
+
that no source value goes missing on the way out. It compares values, not bytes: a byte-equal
|
|
229
|
+
round trip is neither achievable nor the point (key order changes, omitted optional fields come
|
|
230
|
+
back explicit, XML attribute order is arbitrary). An adapter emitting XML or USMTF gets `SKIP`
|
|
231
|
+
there and must ship its own round-trip test.
|
|
232
|
+
|
|
233
|
+
## The harness
|
|
234
|
+
|
|
235
|
+
```
|
|
236
|
+
python -m synapse_cdm.harness --adapter <name|module:Class> [--fixtures <dir>] [--json]
|
|
237
|
+
[--schemas <dir>] [--now <RFC3339>] [--update-golden]
|
|
238
|
+
[--synthetic true|false]
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
Six checks per fixture, and an unrun check reports `SKIP` — never `PASS`:
|
|
242
|
+
|
|
243
|
+
| Check | Fails when |
|
|
244
|
+
|---|---|
|
|
245
|
+
| `translate` | `to_cdm()` raised. One bad fixture never stops the run; the rest are still judged. |
|
|
246
|
+
| `schema` | an object violates the **published** JSON Schema in `/schemas` (not the model — the schema is what other languages read). |
|
|
247
|
+
| `provenance` | `source.*` incomplete, `synthetic` unstated, `source_ids` empty, an event missing a timestamp. |
|
|
248
|
+
| `lossless` | a source value appears nowhere in the output and is not a declared transform. |
|
|
249
|
+
| `roundtrip` | for an `egress`/`bidirectional` adapter: a value present in the source payload is absent from what `from_cdm()` emits. `SKIP` for ingest-only adapters. |
|
|
250
|
+
| `golden` | the output differs from the recorded expectation, reported path by path. |
|
|
251
|
+
|
|
252
|
+
Nothing in the harness knows anything about any particular adapter — it resolves
|
|
253
|
+
`module:ClassName` as readily as a registered name, which is what makes it usable as the gate
|
|
254
|
+
for adapters the AI adapter factory generates and this repository has never seen.
|
|
255
|
+
|
|
256
|
+
**Exit codes: `0` every fixture passed, `1` fixtures ran and some failed, `2` the run could not
|
|
257
|
+
happen — no fixture matched, the `--schemas` directory held no schemas, or `--fixtures` was
|
|
258
|
+
omitted for an adapter this package does not ship.** The third one exists because `2` and `1` send a reader to different places — `1` says
|
|
259
|
+
debug the adapter, `2` says fix the path you passed — and because a run that matched nothing used
|
|
260
|
+
to exit `0` with `0 passed, 0 failed`. It does not any more: an absent directory, an empty one and
|
|
261
|
+
one whose only content is a `spec/` subdirectory are the same failure, and the message names the
|
|
262
|
+
adapter, the directory searched and the rule that selected nothing. `--json` prints nothing at all
|
|
263
|
+
in that case, because the shape of a report is itself a claim that fixtures were judged.
|
|
264
|
+
|
|
265
|
+
**The fixture directory is not always the adapter's name, and you no longer have to know that.**
|
|
266
|
+
`stanag4676` reads its fixtures from `fixtures/nits` — the adapter is named for a covering
|
|
267
|
+
document and the directory for the bytes it holds — and pointing `--fixtures` at
|
|
268
|
+
`fixtures/stanag4676` is the invocation that used to pass vacuously, because that directory holds
|
|
269
|
+
only pinned standards. Each adapter now DECLARES its directory (`Adapter.fixture_dir`) and the
|
|
270
|
+
harness resolves it through `importlib.resources`, so omitting `--fixtures` is always right for a
|
|
271
|
+
shipped adapter. `tests/test_cdm_harness.py` holds the same map written out by hand and requires
|
|
272
|
+
the two to agree, so a new adapter cannot join the roster without one.
|
|
273
|
+
|
|
274
|
+
**`--fixtures` is required for `module:ClassName`**, and refused rather than guessed at. This
|
|
275
|
+
package ships fixtures for the adapters IT ships; guessing at `fixtures/<your name>` would either
|
|
276
|
+
miss — a failure naming a directory you never mentioned — or HIT, because your adapter's name
|
|
277
|
+
collided with one of ours, and then your code is judged against our payloads and every check
|
|
278
|
+
passes or fails for reasons that have nothing to do with it.
|
|
279
|
+
|
|
280
|
+
### Three things the harness cannot check for you
|
|
281
|
+
|
|
282
|
+
Adapter #11 mutation-checked its own assertions and each mutation found a hole that a green run
|
|
283
|
+
had been hiding. All three generalise, so they are here rather than in one adapter's notes.
|
|
284
|
+
|
|
285
|
+
**A fixture whose behaviour is invariant under the harness clock exercises nothing.** The harness
|
|
286
|
+
injects ONE frozen instant for a whole fixture directory. CAT048's two midnight-rollover fixtures
|
|
287
|
+
describe times of day that resolve to the receipt date at that instant — so they produced correct
|
|
288
|
+
golden files, passed every check, and tested no rollover in either direction. A fixture that
|
|
289
|
+
depends on the *relationship* between the payload's time and the clock has to inject its own clock
|
|
290
|
+
from `tests/`, and the fixture row should say so; the harness pass is about the golden file, not
|
|
291
|
+
about the behaviour. This will recur for every format that states a time of day without a date,
|
|
292
|
+
which is most of them.
|
|
293
|
+
|
|
294
|
+
**A round trip proves self-consistency, never correctness. Correctness needs an external anchor.**
|
|
295
|
+
`encode(decode(x)) == x` and `inverse(direct(x)) == x` both pass when the two halves share a wrong
|
|
296
|
+
constant, because the error cancels. Replacing WGS-84's semi-major axis with its semi-minor — a
|
|
297
|
+
21 km error — passed every one of CAT048's geodesic inversion tests for exactly that reason. The
|
|
298
|
+
hole class is **any derive/invert pair whose shared constants encode a MODEL rather than a single
|
|
299
|
+
documented scale factor**: an LSB is one number a reviewer checks against the specification by
|
|
300
|
+
eye, an ellipsoid or a projection is not, and only the second kind can hide inside a round trip.
|
|
301
|
+
So audit the model separately, against something outside the implementation —
|
|
302
|
+
|
|
303
|
+
- `cat048_codec` pins WGS-84 by its published constants and by three geodesic distances computed
|
|
304
|
+
independently of it (one degree of longitude at the equator, one of latitude, the quarter
|
|
305
|
+
meridian).
|
|
306
|
+
- `gmtif_codec` already had the right shape and it is worth naming as the pattern: its strongest
|
|
307
|
+
tests are the worked examples the standard itself prints — `BA16 0101100100011100` = 125.31006°
|
|
308
|
+
and −34.876099° = `SA16 1100111001100110` — which are anchors the implementation cannot
|
|
309
|
+
influence.
|
|
310
|
+
- `asterix_cat021`'s scale factors are the safe kind: each is a single stated LSB, checkable
|
|
311
|
+
against the document without running anything.
|
|
312
|
+
|
|
313
|
+
**The roster sweep is a manual protocol act, and prose counts are what it is for.** When an
|
|
314
|
+
adapter joins the shipped roster, seven documents restate how many adapters there are and four of
|
|
315
|
+
them do the pair arithmetic as well — and nothing in the harness reads prose. The sweep is:
|
|
316
|
+
|
|
317
|
+
1. **`grep` every spelled-out number within 120 characters of the word "adapter"**, across
|
|
318
|
+
`*.md`, `*.mdx` and `*.py`. The narrower form — grepping for the *previous* count word, "eight"
|
|
319
|
+
or "nine" — is what the adapter #11 sweep started with, and it missed
|
|
320
|
+
`synapse_cdm/__init__.py`, which still said "five adapters means ten translations" four
|
|
321
|
+
adapters later. A site that is stale by more than one release does not contain the previous
|
|
322
|
+
count word, so searching for it cannot find the sites that have drifted furthest.
|
|
323
|
+
2. **Check the pair arithmetic at every site that states a number**, not just the count. Two
|
|
324
|
+
documents disagreed on whether it is `N×(N−1)` or `N(N−1)/2`, which for the nine adapters of
|
|
325
|
+
the day was 72 against 36; neither was wrong on its own page and together they were a
|
|
326
|
+
contradiction. At ten it is 90 against 45.
|
|
327
|
+
3. **Read every sentence that states the count TWICE.** `symbology.py` and
|
|
328
|
+
`docs/docs/cdm/entity.mdx` both carry "so that ten adapters cannot grow ten slightly
|
|
329
|
+
different opinions", and commit 94c000a had to repair that sentence half-updated —
|
|
330
|
+
"seven adapters cannot grow six" — which reads as prose either way.
|
|
331
|
+
4. **Read the gap list's own tallies.** `FORMAT_COVERAGE.md` gap 1 counts how many adapters park
|
|
332
|
+
a private name key, and it had been undercounting itself by one adapter since adapter #6. A
|
|
333
|
+
count that IS the argument decays exactly like any other.
|
|
334
|
+
|
|
335
|
+
**A structured-status counter is blind to all of this.** The adapter #11 flip counter walked every
|
|
336
|
+
`Status`-bearing table row, correctly reported zero rows left saying `not yet`, and did not see
|
|
337
|
+
the two prose sentences in the same section that still described the row set as unimplemented.
|
|
338
|
+
Anything that parses tables will report clean while the paragraphs around them contradict them.
|
|
339
|
+
|
|
340
|
+
`tests/test_cdm_prose_counts.py` now pins the seven sites the sweep has already had to fix, so a
|
|
341
|
+
half-edit at a KNOWN site fails a build. It is deliberately an allowlist and not a scanner — a
|
|
342
|
+
general prose-number check would flag "two altitudes that are two different measurements" and
|
|
343
|
+
need an exemption list larger than the sweep it replaced — so **finding a NEW site is still the
|
|
344
|
+
sweep's job**, and adding it to that allowlist is how the sweep's work stops being undone.
|
|
345
|
+
|
|
346
|
+
None of the three is something the six checks can produce, and that is the point of writing them
|
|
347
|
+
down here: a green harness run is a floor.
|
|
348
|
+
|
|
349
|
+
## Layout
|
|
350
|
+
|
|
351
|
+
Repository root, then the package:
|
|
352
|
+
|
|
353
|
+
```
|
|
354
|
+
packages/cdm/
|
|
355
|
+
pyproject.toml distribution metadata; version is READ FROM version.py, never restated
|
|
356
|
+
synapse_cdm/
|
|
357
|
+
models.py the four objects, Position, Kinematics, SourceRef, Integrity, payloads
|
|
358
|
+
enums.py closed vocabularies; UNKNOWN is a member, never a null
|
|
359
|
+
geo.py GeoJSON Point/LineString/Polygon, [lon, lat], ring closure enforced
|
|
360
|
+
times.py one timestamp form, one injectable clock
|
|
361
|
+
ids.py derived stable identity (uuid5) and the id basis
|
|
362
|
+
version.py SCHEMA_VERSION and the compatibility rule
|
|
363
|
+
symbology.py MIL-STD-2525D standard identity, CoT affiliation letters
|
|
364
|
+
lossless.py the never-drop rule as a computable check
|
|
365
|
+
adapter.py the Adapter ABC, its class-definition-time gates, the registry
|
|
366
|
+
schemas.py JSON Schema export (+ --check for CI)
|
|
367
|
+
harness.py the adapter-agnostic validation harness
|
|
368
|
+
adapters/ one module per external system (pntmap, tak, ais, adsb, …)
|
|
369
|
+
fixtures/ synthetic payloads + golden outputs
|
|
370
|
+
schemas/ published JSON Schema, generated — never hand-edited
|
|
371
|
+
tests/test_cdm_*.py
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
`schemas/` sits at the repository root rather than inside the package because it is the
|
|
375
|
+
artefact for OTHER languages: a Go or TypeScript consumer clones this repository and reads
|
|
376
|
+
those files, and burying the one thing they need under a Python package layout would be a
|
|
377
|
+
Python assumption in a deliberately language-neutral contract. The generator writes both
|
|
378
|
+
copies from one source — `python -m synapse_cdm.schemas --check --out schemas` is the CI
|
|
379
|
+
form and fails on any drift.
|
|
380
|
+
|
|
381
|
+
`synapse_cdm` depends on nothing but `pydantic` and `jsonschema` — in particular nothing from
|
|
382
|
+
the SynapseCommand product repository (`agents/`, `core/`, `platform/`, `synapse-data/`,
|
|
383
|
+
`airtasking/`) — which is why it could be lifted out into this repository at all. It also
|
|
384
|
+
contains no crypto: the `integrity` field is designed and deliberately unpopulated, because a
|
|
385
|
+
signature computed inside a translator is held by nothing that audits it. Both properties are
|
|
386
|
+
enforced by AST over the package's own sources in `tests/test_cdm_boundary.py`, not by this
|
|
387
|
+
paragraph.
|