From f969ba032be7e5f48a51558cf3509c7a6c45ec6d Mon Sep 17 00:00:00 2001 From: Hannah DeFazio Date: Thu, 22 Dec 2022 14:57:13 -0500 Subject: [PATCH] Add dwell segment, file reorg --- arrows/stanag/CMakeLists.txt | 10 +- .../segments/stanag_4607_dwell_segment.cxx | 838 ++++++++++++++++++ .../segments/stanag_4607_dwell_segment.h | 450 ++++++++++ .../stanag_4607_mission_segment.cxx} | 264 +----- .../segments/stanag_4607_mission_segment.h | 140 +++ .../segments/stanag_4607_segment_lookup.cxx | 206 +++++ .../segments/stanag_4607_segment_lookup.h | 123 +++ .../stanag/segments/stanag_4607_segments.cxx | 63 ++ arrows/stanag/segments/stanag_4607_segments.h | 136 +++ arrows/stanag/stanag_4607_packet.cxx | 61 +- arrows/stanag/stanag_4607_packet.h | 21 +- arrows/stanag/stanag_4607_segments.h | 324 ------- arrows/stanag/stanag_util.cxx | 2 + arrows/stanag/stanag_util.h | 2 + 14 files changed, 2054 insertions(+), 586 deletions(-) create mode 100644 arrows/stanag/segments/stanag_4607_dwell_segment.cxx create mode 100644 arrows/stanag/segments/stanag_4607_dwell_segment.h rename arrows/stanag/{stanag_4607_segments.cxx => segments/stanag_4607_mission_segment.cxx} (54%) create mode 100644 arrows/stanag/segments/stanag_4607_mission_segment.h create mode 100644 arrows/stanag/segments/stanag_4607_segment_lookup.cxx create mode 100644 arrows/stanag/segments/stanag_4607_segment_lookup.h create mode 100644 arrows/stanag/segments/stanag_4607_segments.cxx create mode 100644 arrows/stanag/segments/stanag_4607_segments.h delete mode 100644 arrows/stanag/stanag_4607_segments.h diff --git a/arrows/stanag/CMakeLists.txt b/arrows/stanag/CMakeLists.txt index 9c97474b3a..6edf388fcb 100644 --- a/arrows/stanag/CMakeLists.txt +++ b/arrows/stanag/CMakeLists.txt @@ -4,14 +4,20 @@ set(CMAKE_FOLDER "Arrows/STANAG") set( sources stanag_4607_packet.cxx - stanag_4607_segments.cxx stanag_util.cxx + segments/stanag_4607_segments.cxx + segments/stanag_4607_segment_lookup.cxx + segments/stanag_4607_mission_segment.cxx + segments/stanag_4607_dwell_segment.cxx ) set( public_headers stanag_4607_packet.h - stanag_4607_segments.h stanag_util.h + segments/stanag_4607_segments.h + segments/stanag_4607_segment_lookup.h + segments/stanag_4607_mission_segment.h + segments/stanag_4607_dwell_segment.h ) kwiver_install_headers( diff --git a/arrows/stanag/segments/stanag_4607_dwell_segment.cxx b/arrows/stanag/segments/stanag_4607_dwell_segment.cxx new file mode 100644 index 0000000000..a76c47dad0 --- /dev/null +++ b/arrows/stanag/segments/stanag_4607_dwell_segment.cxx @@ -0,0 +1,838 @@ +// This file is part of KWIVER, and is distributed under the +// OSI-approved BSD 3-Clause License. See top-level LICENSE file or +// https://github.com/Kitware/kwiver/blob/master/LICENSE for details. + +#include "stanag_4607_dwell_segment.h" + +namespace ka = kwiver::arrows; + +#include +#include + + +#include +#include +#include +#include +#include + +namespace kwiver { + +namespace arrows { + +namespace stanag { + + +// ---------------------------------------------------------------------------- +std::ostream& +operator<<( std::ostream& os, stanag_4607_sensor_position const& value ) +{ + return os << "{ " + << "Latitude: " << value.latitude << " degrees" << ", " + << "Longitude: " << value.longitude << " degrees" << ", " + << "Altitude: " << value.altitude << " cm" + << " }"; +} + +// ---------------------------------------------------------------------------- +DEFINE_STANAG_STRUCT_CMP ( + stanag_4607_sensor_position, + &stanag_4607_sensor_position::latitude, + &stanag_4607_sensor_position::longitude, + &stanag_4607_sensor_position::altitude +) + +// ---------------------------------------------------------------------------- +std::ostream& +operator<<( std::ostream& os, stanag_4607_scale_factor const& value ) +{ + return os << "{ " + << "Lat Scale: " << value.lat_scale << " degrees" << ", " + << "Long Scale: " << value.long_scale << " degrees" + << " }"; +} + +// ---------------------------------------------------------------------------- +DEFINE_STANAG_STRUCT_CMP ( + stanag_4607_scale_factor, + &stanag_4607_scale_factor::lat_scale, + &stanag_4607_scale_factor::long_scale +) + +// ---------------------------------------------------------------------------- +stanag_4607_scale_factor +stanag_4607_scale_factor_format +::read( ptr_t& ptr ) const +{ + stanag_4607_scale_factor result; + + result.lat_scale = klv::klv_read_int< int >( ptr, (size_t)4 ); + result.long_scale = klv::klv_read_int< int >( ptr, (size_t)4 ); + + return result; + +} + +// ---------------------------------------------------------------------------- +std::ostream& +operator<<( std::ostream& os, stanag_4607_sensor_pos_uncert const& value ) +{ + return os << "{ " + << "Along Track: " << value.along_track << " cm" << ", " + << "Cross Track: " << value.cross_track << " cm" << ", " + << "Altitude: " << value.altitude << " cm" + << " }"; +} + +// ---------------------------------------------------------------------------- +DEFINE_STANAG_STRUCT_CMP ( + stanag_4607_sensor_pos_uncert, + &stanag_4607_sensor_pos_uncert::along_track, + &stanag_4607_sensor_pos_uncert::cross_track, + &stanag_4607_sensor_pos_uncert::altitude +) + +// ---------------------------------------------------------------------------- +stanag_4607_sensor_pos_uncert +stanag_4607_sensor_pos_uncert_format +::read( ptr_t& ptr ) const +{ + stanag_4607_sensor_pos_uncert result; + + result.along_track = klv::klv_read_int< int >( ptr, (size_t)4 ); + result.cross_track = klv::klv_read_int< int >( ptr, (size_t)4 ); + result.altitude = klv::klv_read_int< int >( ptr, (size_t)2 ); + + return result; +} + +// ---------------------------------------------------------------------------- +std::ostream& +operator<<( std::ostream& os, stanag_4607_orientation const& value ) +{ + return os << "{ " + << "Heading: " << value.heading << " degrees" << ", " + << "Pitch: " << value.pitch << " degrees" << ", " + << "Roll: " << value.roll << " degrees" + << " }"; +} + +// ---------------------------------------------------------------------------- +DEFINE_STANAG_STRUCT_CMP ( + stanag_4607_orientation, + &stanag_4607_orientation::heading, + &stanag_4607_orientation::pitch, + &stanag_4607_orientation::roll +) + +// ---------------------------------------------------------------------------- +stanag_4607_orientation +stanag_4607_orientation_format +::read( ptr_t& ptr ) const +{ + stanag_4607_orientation result; + + result.heading = klv::klv_read_flint< uint16_t >({0, 369.9945}, ptr, 2); + result.pitch = klv::klv_read_flint< int16_t >({-90, 90}, ptr, 2); + result.roll = klv::klv_read_flint< int16_t >({-90, 90}, ptr, 2); + + return result; +} + +// ---------------------------------------------------------------------------- +std::ostream& +operator<<( std::ostream& os, stanag_4607_dwell_area const& value ) +{ + return os << "{ " + << "Center Latitude: " << value.center_lat << " degrees" << ", " + << "Center Longitude: " << value.center_long << " degrees" << ", " + << "Range Half Extent: " << value.range_half_ext << " km" << ", " + << "Dwell Angle Half Extent: " << value.dwell_angle_half_ext + << " degrees" + << " }"; +} + +// ---------------------------------------------------------------------------- +DEFINE_STANAG_STRUCT_CMP ( + stanag_4607_dwell_area, + &stanag_4607_dwell_area::center_lat, + &stanag_4607_dwell_area::center_long, + &stanag_4607_dwell_area::range_half_ext, + &stanag_4607_dwell_area::dwell_angle_half_ext +) + +// ---------------------------------------------------------------------------- +std::ostream& +operator<<( std::ostream& os, + stanag_4607_target_classification const& value ) +{ + std::map< stanag_4607_target_classification, std::string > strings + { + { STANAG_4607_TARGET_CLASS_NO_INFO_LIVE, "No Information, Live Target" }, + { STANAG_4607_TARGET_CLASS_TRACKED_VEHICLE_LIVE, + "Tracked Vehicle, Live Target" }, + { STANAG_4607_TARGET_CLASS_WHEELED_VEHICLE_LIVE, + "Wheeled Vehicle, Live Target" }, + { STANAG_4607_TARGET_CLASS_ROTARY_WING_AIRCRAFT_LIVE, + "Rotary Wing Aircraft, Live Target"} , + { STANAG_4607_TARGET_CLASS_FIXED_WING_AIRCRAFT_LIVE, + "Fixed Wing Aircraft, Live Target" }, + { STANAG_4607_TARGET_CLASS_STATIONARY_ROTATOR_LIVE, + "Stationary Rotator, Live Target" }, + { STANAG_4607_TARGET_CLASS_MARITIME_LIVE, "Maritime, Live Target" }, + { STANAG_4607_TARGET_CLASS_BEACON_LIVE, "Beacon, Live Target" }, + { STANAG_4607_TARGET_CLASS_AMPHIBIOUS_LIVE, "Amphibious, Live Target" }, + { STANAG_4607_TARGET_CLASS_PERSON_LIVE, "Person, Live Target" }, + { STANAG_4607_TARGET_CLASS_VEHICLE_LIVE, "Vehicle, Live Target" }, + { STANAG_4607_TARGET_CLASS_ANIMAL_LIVE, "Animal, Live Target" }, + { STANAG_4607_TARGET_CLASS_LARGE_MULTI_RETURN_LIVE_LAND, + "Large Multiple-Return, Live Land Target" }, + { STANAG_4607_TARGET_CLASS_LARGE_MULTI_RETURN_LIVE_MARITIME, + "Large Multiple-Return, Live Maritime Target" }, + { STANAG_4607_TARGET_CLASS_OTHER_LIVE, "Other, Live Target" }, + { STANAG_4607_TARGET_CLASS_UNKNOWN_LIVE, "Unknown, Live Target" }, + { STANAG_4607_TARGET_CLASS_NO_INFO_SIM, + "No Information, Simulated Target" }, + { STANAG_4607_TARGET_CLASS_TRACKED_VEHICLE_SIM, + "Tracked Vehicle, Simulated Target" }, + { STANAG_4607_TARGET_CLASS_WHEELED_VEHICLE_SIM, + "Wheeled Vehicle, Simulated Target" }, + { STANAG_4607_TARGET_CLASS_ROTARY_WING_AIRCRAFT_SIM, + "Rotary Wing Aircraft, Simulated Target" }, + { STANAG_4607_TARGET_CLASS_FIXED_WING_AIRCRAFT_SIM, + "Fixed Wing Aircraft, Simulated Target" }, + { STANAG_4607_TARGET_CLASS_STATIONARY_ROTATOR_SIM, + "Stationary Rotator, Simulated Target" }, + { STANAG_4607_TARGET_CLASS_MARITIME_SIM, "Maritime, Simulated Target" }, + { STANAG_4607_TARGET_CLASS_BEACON_SIM, "Beacon, Simulated Target" }, + { STANAG_4607_TARGET_CLASS_AMPHIBIOUS_SIM, + "Amphibious, Simulated Target" }, + { STANAG_4607_TARGET_CLASS_PERSON_SIM, "Person, Simulated Target" }, + { STANAG_4607_TARGET_CLASS_VEHICLE_SIM, "Vehicle, Simulated Target" }, + { STANAG_4607_TARGET_CLASS_ANIMAL_SIM, "Animal, Simulated Target" }, + { STANAG_4607_TARGET_CLASS_LARGE_MULTI_RETURN_SIM_LAND, + "Large Multiple-Return, Simulated Land Target" }, + { STANAG_4607_TARGET_CLASS_LARGE_MULTI_RETURN_SIM_MARITIME, + "Large Multiple-Return, Simulated Maritime Target" }, + { STANAG_4607_TARGET_CLASS_TAGGING_DEVICE, "Tagging Device" }, + { STANAG_4607_TARGET_CLASS_OTHER_SIM, "Other, Simulated Target" }, + { STANAG_4607_TARGET_CLASS_UNKNOWN_SIM, "Unknown, Simulated Target" }, + { STANAG_4607_TARGET_CLASS_ENUM_END, "Unknown Target Classification" } + }; + + os << strings[ std::min( value, STANAG_4607_TARGET_CLASS_ENUM_END ) ]; + + return os; +} + +// ---------------------------------------------------------------------------- +std::ostream& +operator<<( std::ostream& os, stanag_4607_target_measure_uncert const& value ) +{ + return os << "{ " + << "Slant Range: " << value.slant_range << " cm" << ", " + << "Cross Range: " << value.cross_range << " dm" << ", " + << "Height: " << value.height << " m" << ", " + << "Target Radial Velocity: " << value.radial_velocity << " cm/sec" + << " }"; + +} + +// ---------------------------------------------------------------------------- +DEFINE_STANAG_STRUCT_CMP ( + stanag_4607_target_measure_uncert, + &stanag_4607_target_measure_uncert::slant_range, + &stanag_4607_target_measure_uncert::cross_range, + &stanag_4607_target_measure_uncert::height, + &stanag_4607_target_measure_uncert::radial_velocity +) +// ---------------------------------------------------------------------------- +stanag_4607_target_measure_uncert +stanag_4607_target_measure_uncert_format +::read( ptr_t& ptr ) const +{ + stanag_4607_target_measure_uncert result; + + result.slant_range = klv::klv_read_int< int >( ptr, (size_t)2 ); + result.cross_range = klv::klv_read_int< int >( ptr, (size_t)2 ); + result.height = klv::klv_read_int< int >( ptr, (size_t)1 ); + result.radial_velocity = klv::klv_read_int< int >( ptr, (size_t)2 ); + + return result; +} + +// ---------------------------------------------------------------------------- +std::ostream& +operator<<( std::ostream& os, stanag_4607_truth_tag const& value ) +{ + return os << "{ " + << "Application: " << value.application << ", " + << "Entity: " << value.entity + << " }"; +} + +// ---------------------------------------------------------------------------- +DEFINE_STANAG_STRUCT_CMP ( + stanag_4607_truth_tag, + &stanag_4607_truth_tag::application, + &stanag_4607_truth_tag::entity +) + +// ---------------------------------------------------------------------------- +stanag_4607_truth_tag +stanag_4607_truth_tag_format +::read( ptr_t& ptr ) const +{ + stanag_4607_truth_tag result; + + result.application = klv::klv_read_int< int >( ptr, (size_t)1 ); + result.entity = klv::klv_read_int< int >( ptr, (size_t)4 ); + + return result; +} + +// ---------------------------------------------------------------------------- +std::ostream& +operator<<( std::ostream& os, + stanag_4607_dwell_existence_mask_bit const& value ) +{ + static std::string strings[ STANAG_4607_DWELL_EXIST_MASK_BIT_REVISIT_INDEX + + 1 ] = + { + "Target Report: Radar Cross Section Transmitted", + "Target Report: Truth Tag: Entity Transmitted", + "Target Report: Truth Tag: Application Transmitted", + "Target Report: Measurement Uncertainty: Radial Velocity Transmitted", + "Target Report: Measurement Uncertainty: Height Transmitted", + "Target Report: Measurement Uncertainty: Cross Range Transmitted", + "Target Report: Measurement Uncertainty: Slant Range Transmitted", + "Target Report: Class. Probability Transmitted", + "Target Report: Classification Transmitted", + "Target Report: SNR Transmitted", + "Target Report: Wrap Velocity Transmitted", + "Target Report: Velocity Line-of-Sight Component Transmitted", + "Target Report: Location: Geodetic Height Transmitted", + "Target Report: Location: Delta Long Transmitted", + "Target Report: Location: Delta Lat Transmitted", + "Target Report: Location: Hi-Res Longitude Transmitted", + "Target Report: Location: Hi-Res Latitude Transmitted", + "Target Report: MTI Report Index Transmitted", + "Minimum Detectable Velocity Transmitted", + "Sensor Orientation: Roll Transmitted", + "Sensor Orientation: Pitch Transmitted", + "Sensor Orientation: Heading Transmitted", + "Dwell Area: Dwell Angle Half Extent Transmitted", + "Dwell Area: Range Half Extent Transmitted", + "Dwell Area: Center Longitude Transmitted", + "Dwell Area: Center Latitude Transmitted", + "Platform Orientation: Roll Transmitted", + "Platform Orientation: Pitch Transmitted", + "Platform Orientation: Heading Transmitted", + "Sensor Vertical Velocity Uncertainty Transmitted", + "Sensor Speed Uncertainty Transmitted", + "Sensor Track Uncertainty Transmitted", + "Sensor Vertical Velocity Transmitted", + "Sensor Speed Transmitted", + "Sensor Track Transmitted", + "Sensor Position Uncertainty: Altitude Transmitted", + "Sensor Position Uncertainty: Cross Track Transmitted", + "Sensor Position Uncertainty: Along Track Transmitted", + "Scale Factor: Long Scale Transmitted", + "Scale Factor: Lat Scale Transmitted", + "Sensor Position: Altitude Transmitted", + "Sensor Position: Longitude Transmitted", + "Sensor Position: Latitude Transmitted", + "Dwell Time Transmitted", + "Target Report Count Transmitted", + "Last Dwell of Revisit Transmitted", + "Dwell Index Transmitted", + "Revisit Index Transmitted" + }; + + os << strings[ value ]; + return os; +} + +// ---------------------------------------------------------------------------- +std::ostream& +operator<<( std::ostream& os, stanag_4607_target_location const& value ) +{ + os << "{ "; + + if( value.hi_res_lat ) + { + os << "Hi-Res Latitude: " << *value.hi_res_lat << " degrees" << ", " + << "Hi-Res Longitude: " << *value.hi_res_long << " degrees" << ", "; + } + + if( value.delta_lat ) + { + os << "Delta Lat: " << *value.delta_lat << ", " + << "Delta Long: " << *value.delta_long << ", "; + } + + if( value.geodetic_height ) + { + os << "Geodetic Height: " << *value.geodetic_height << " m"; + } + + os << " }"; + + return os; +} + +// ---------------------------------------------------------------------------- +DEFINE_STANAG_STRUCT_CMP ( + stanag_4607_target_location, + &stanag_4607_target_location::hi_res_lat, + &stanag_4607_target_location::hi_res_long, + &stanag_4607_target_location::delta_lat, + &stanag_4607_target_location::delta_long, + &stanag_4607_target_location::geodetic_height +) + +// ---------------------------------------------------------------------------- +stanag_4607_target_location +stanag_4607_target_location_format +::read( ptr_t& ptr, + std::set< stanag_4607_dwell_existence_mask_bit > existence_mask ) const +{ + stanag_4607_target_location result; + + // Fields D32.2-D32.3 are conditional and always sent together + if( existence_mask.count( + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_LOCATION_HI_RES_LAT) ) + { + result.hi_res_lat = klv::klv_read_flint< int32_t >({-90, 90}, ptr, 4); + result.hi_res_long = klv::klv_read_flint< uint32_t >({0, 359.999999916}, + ptr, 4); + } + // Fields D32.4-D32.5 are conditional and always sent together + // Condition: Sent if D32.2 and D32.3 are not sent + else{ + result.delta_lat = klv::klv_read_int< int >( ptr, (size_t)2 ); + result.delta_long = klv::klv_read_int< int >( ptr, (size_t)2 ); + } + + // Field D32.6 is optional + if( existence_mask.count( + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_LOCATION_GEODETIC_HEIGHT) + ) + { + result.geodetic_height = klv::klv_read_int< int >( ptr, (size_t)2 ); + } + + return result; +} + +// ---------------------------------------------------------------------------- +std::ostream& +operator<<( std::ostream& os, stanag_4607_target_report const& value ) +{ + os << "{ "; + if ( value.mti_report_idx ) + { + os << "MTI Report Index: " << *value.mti_report_idx << ", "; + } + + if( value.location ) + { + os << "Target Location: " << *value.location << ", "; + } + + if( value.velocity_los ) + { + os << "Target Velocity Line-of-Sight Component: " << *value.velocity_los + << " cm/sec" << ", " + << "Target Wrap Velocity: " << *value.wrap_velocity << " cm/sec" + << ", "; + } + + if( value.snr ) + { + os << "Target SNR: " << *value.snr << " dB" << ", "; + } + + if( value.classification ) + { + os << "Target Classification: " << *value.classification << ", "; + } + + if( value.class_probability ) + { + os << "Target Class. Probability: " << *value.class_probability << " %" + << ", "; + } + + if( value.measurement_uncert ) + { + os << "Target Measurement Uncertainty: " << *value.measurement_uncert + << ", "; + } + + if( value.truth_tag ) + { + os << "Truth Tag: " << *value.truth_tag << ", "; + } + + if( value.radar_cross_sect ) + { + os << "Target Radar Cross Section:" << *value.radar_cross_sect + << " dB/2"; + } + + os << " }"; + return os; +} + +// ---------------------------------------------------------------------------- +std::ostream& +operator<<( std::ostream& os, + std::vector< stanag_4607_target_report > const& value ) +{ + auto num_targets = value.size(); + + os << "{ "; + + if( num_targets == 0 ) + { + return os << "(empty) }"; + } + + for( size_t i=0; i existence_mask ) const +{ + stanag_4607_target_report result; + + // Field D32.1 is conditional + // Condition: Send if an HRR report is provided for targets in this dwell + if( existence_mask.count( + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_LOCATION_MTI_REPORT_IDX) ) + { + result.mti_report_idx = klv::klv_read_int< int >( ptr, (size_t)2 ); + } + + result.location = stanag_4607_target_location_format{} + .read( ptr, existence_mask ); + + // Fields D32.7-D32.8 are optional and always sent together + if( existence_mask.count( + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_VEL_LOS) ) + { + result.velocity_los = klv::klv_read_int< int >( ptr, (size_t)2 ); + result.wrap_velocity = klv::klv_read_int< int >( ptr, (size_t)2 ); + } + + // Field D32.9 is optional + if( existence_mask.count( + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_SNR) ) + { + result.snr = klv::klv_read_int< int >( ptr, (size_t)1 ); + } + + // Field D32.10 is optional + if( existence_mask.count( + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_CLASS) ) + { + result.classification = static_cast< stanag_4607_target_classification >( + klv::klv_read_int< uint64_t >( ptr, (size_t)1 )); + } + + // Field D32.11 is optional + if( existence_mask.count( + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_CLASS_PROB) ) + { + result.class_probability = klv::klv_read_int< int >( ptr, (size_t)1 ); + } + + // Fields D32.12-D32.15 are conditional and always sent together + if( existence_mask.count( + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_MEASURE_SLANT_RANGE) ) + { + result.measurement_uncert = stanag_4607_target_measure_uncert_format{} + .read( ptr ); + } + + // Fields D32.16-D32.17 are conditional and always sent together + if( existence_mask.count( + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_TRUTH_TAG_APPL) ) + { + result.truth_tag = stanag_4607_truth_tag_format{}.read( ptr ); + } + + // Field D32.18 is optional + if( existence_mask.count( + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_RADAR_CROSS_SECT) ) + { + result.radar_cross_sect = klv::klv_read_int< int >( ptr, (size_t)1 ); + } + + return result; +} + +// ---------------------------------------------------------------------------- +std::ostream& +operator<<( std::ostream& os, stanag_4607_dwell_segment const& value ) +{ + os << "{ " + << "Existence Mask: { "; + for( stanag_4607_dwell_existence_mask_bit m : value.existence_mask ) + { + os << m << ", "; + } + os << " }, "; + + os << "Revisit Index: " << value.revisit_index << ", " + << "Dwell Index: " << value.dwell_index << ", " + << "Last Dwell of Revisit: " + << ( value.last_dwell_of_revisit + ? "No additional dwells" + : "Additional dwells" ) + << ", " + << "Target Report Count: " << value.target_report_count << ", " + << "Dwell Time: " << value.dwell_time << " ms" << ", " + << "Sensor Position: " << value.sensor_position << ", "; + if( value.scale_factor ) + { + os << "Scale Factor: " << *value.scale_factor << ", "; + } + + if( value.sensor_pos_uncert ) + { + os << "Sensor Position Uncertainty: " << *value.sensor_pos_uncert << ", "; + } + + if( value.sensor_track ) + { + os << "Sensor Track: " << *value.sensor_track << " degrees" << ", " + << "Sensor Speed: " << *value.sensor_speed << " mm/sec" << ", " + << "Sensor Vertical Velocity: " << *value.sensor_vertical_vel + << " dm/sec" << ", "; + } + + if( value.sensor_track_uncert ) + { + os << "Sensor Track Uncertainty: " << *value.sensor_track_uncert + << " degrees" << ", " + << "Sensor Speed Uncertainty: " << *value.sensor_speed_uncert + << " mm/sec" << ", " + << "Sensor Vertical Velocity Uncertainty: " + << *value.sensor_vertical_vel_uncert << " cm/sec" << ", "; + } + + if( value.platform_orient ) + { + os << "Platform Orientation: " << *value.platform_orient << ", "; + } + + os << "Dwell Area: " << value.dwell_area << ", "; + + if( value.sensor_orientation ) + { + os << "Sensor Orientation: " << *value.sensor_orientation << ", "; + } + + if( value.min_detectable_vel ) + { + os << "Minimum Detectable Velocity: " << *value.min_detectable_vel + << " dm/sec" << ", "; + } + + os << "Target Reports: " << value.target_reports + << " }"; + + return os; +} + +// ---------------------------------------------------------------------------- +DEFINE_STANAG_STRUCT_CMP( + stanag_4607_dwell_segment, + &stanag_4607_dwell_segment::existence_mask, + &stanag_4607_dwell_segment::revisit_index, + &stanag_4607_dwell_segment::dwell_index, + &stanag_4607_dwell_segment::last_dwell_of_revisit, + &stanag_4607_dwell_segment::target_report_count, + &stanag_4607_dwell_segment::dwell_time, + &stanag_4607_dwell_segment::sensor_position, + &stanag_4607_dwell_segment::scale_factor, + &stanag_4607_dwell_segment::sensor_pos_uncert, + &stanag_4607_dwell_segment::sensor_track, + &stanag_4607_dwell_segment::sensor_speed, + &stanag_4607_dwell_segment::sensor_vertical_vel, + &stanag_4607_dwell_segment::sensor_track_uncert, + &stanag_4607_dwell_segment::sensor_speed_uncert, + &stanag_4607_dwell_segment::sensor_vertical_vel_uncert, + &stanag_4607_dwell_segment::platform_orient, + &stanag_4607_dwell_segment::dwell_area, + &stanag_4607_dwell_segment::sensor_orientation, + &stanag_4607_dwell_segment::min_detectable_vel, + &stanag_4607_dwell_segment::target_reports +) + +// ---------------------------------------------------------------------------- +stanag_4607_dwell_segment_format +::stanag_4607_dwell_segment_format() +{} + +// ---------------------------------------------------------------------------- +stanag_4607_dwell_segment +stanag_4607_dwell_segment_format +::read( ptr_t& ptr ) const +{ + stanag_4607_dwell_segment result {}; + + // Fields D1-D9 are mandatory + auto mask = klv::klv_read_int< uint64_t >( ptr, (size_t)8 ); + mask >>= 16; + result.existence_mask = klv::bitfield_to_enums< + stanag_4607_dwell_existence_mask_bit, uint64_t >( mask ); + + result.revisit_index = klv::klv_read_int< int >( ptr, (size_t)2 ); + + result.dwell_index = klv::klv_read_int< int >( ptr, (size_t)2 ); + + result.last_dwell_of_revisit = klv::klv_read_int< int >( ptr, (size_t)1 ); + + result.target_report_count = klv::klv_read_int< int >( ptr, (size_t)2 ); + + result.dwell_time = klv::klv_read_int< int >( ptr, (size_t)4 ); + + result.sensor_position.latitude = klv::klv_read_flint< int32_t >({-90, 90}, + ptr, (size_t)4); + result.sensor_position.longitude =klv::klv_read_flint< uint32_t >( + {0, 359.999999916}, ptr, (size_t)4); + result.sensor_position.altitude = klv::klv_read_int< int >( ptr, (size_t)4 ); + + // Fields D10-11 are conditional and always sent together + // Condition: Sent if D32.4 and D32.5 are sent + if( result.existence_mask.count( + STANAG_4607_DWELL_EXIST_MASK_BIT_SCALE_FACT_LAT) ) + { + result.scale_factor = stanag_4607_scale_factor_format{}.read(ptr); + } + + // Fields D12-D14 are optional and always sent together + if( result.existence_mask.count( + STANAG_4607_DWELL_EXIST_MASK_BIT_SENSOR_POS_ALONG_TRACK) ) + { + result.sensor_pos_uncert = stanag_4607_sensor_pos_uncert_format{} + .read(ptr); + } + + // Fields D15-D17 are conditional and always sent together + // Condition: Sent when the sensor system provides these parameters + if( result.existence_mask.count( + STANAG_4607_DWELL_EXIST_MASK_BIT_SENSOR_TRACK) ) + { + result.sensor_track = klv::klv_read_flint< uint16_t >({0, 359.9945}, + ptr, 2); + result.sensor_speed = klv::klv_read_int< int >( ptr, (size_t)4 ); + result.sensor_vertical_vel = klv::klv_read_int< int >( ptr, (size_t)1 ); + } + + // Fields D18-D20 are optional and always sent together + if( result.existence_mask.count( + STANAG_4607_DWELL_EXIST_MASK_BIT_SENSOR_TRACK_UNCERT) ) + { + result.sensor_track_uncert = klv::klv_read_int< int >( ptr, (size_t)1 ); + result.sensor_speed_uncert = klv::klv_read_int< int >( ptr, (size_t)2 ); + result.sensor_vertical_vel_uncert = klv::klv_read_int< int >( ptr, + (size_t)2 ); + } + + // Fields D21-D23 are conditional and always sent together + // Condition: Sent when the sensor system provides these parameters + if( result.existence_mask.count( + STANAG_4607_DWELL_EXIST_MASK_BIT_PLATFORM_OREINT_HEADING) ) + { + result.platform_orient = stanag_4607_orientation_format{}.read(ptr); + } + + // Fields D24-27 are mandatory + result.dwell_area.center_lat = klv::klv_read_flint< int32_t >({-90, 90}, + ptr, 4); + result.dwell_area.center_long = klv::klv_read_flint< uint32_t >( + {0, 359.999979}, ptr, 4); + + kwiver::vital::interval interval = {0, 255.9928}; + size_t length = 2; + auto v = klv::klv_read_int< int16_t >(ptr, length); + auto const scale = interval.span() / + (( 0x80ull << ( ( length - 1 ) * 8 ) ) - 1); + + result.dwell_area.range_half_ext = v * scale + interval.lower(); + + result.dwell_area.dwell_angle_half_ext = klv::klv_read_flint< uint16_t >( + {0, 359.9945}, ptr, 2); + + // Fields D28-D30 are optional + // If at least one is sent, any omitted fields are set to 0 + if( result.existence_mask.count( + STANAG_4607_DWELL_EXIST_MASK_BIT_SENSOR_OREINT_HEADING) or + result.existence_mask.count( + STANAG_4607_DWELL_EXIST_MASK_BIT_SENSOR_OREINT_PITCH) or + result.existence_mask.count( + STANAG_4607_DWELL_EXIST_MASK_BIT_SENSOR_ORIENT_ROLL) ) + { + result.sensor_orientation = stanag_4607_orientation_format{}.read(ptr); + } + + // Field D31 is optional + if( result.existence_mask.count( + STANAG_4607_DWELL_EXIST_MASK_BIT_MIN_DETECT_VEL) ) + { + result.min_detectable_vel = klv::klv_read_int< int >( ptr, (size_t)1 ); + } + + // Target reports + std::vector < stanag_4607_target_report > target_reports; + for(int i=0; i +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace kwiver { + +namespace arrows { + +namespace stanag { + +namespace kv = kwiver::vital; + + +// ---------------------------------------------------------------------------- +/// Position of the sensor at the temporal center of the dwell +struct KWIVER_ALGO_STANAG_EXPORT stanag_4607_sensor_position +{ + double latitude; + double longitude; + int altitude; +}; + +// ---------------------------------------------------------------------------- +KWIVER_ALGO_STANAG_EXPORT +std::ostream& +operator<<( std::ostream& os, stanag_4607_sensor_position const& value ); + + +// ---------------------------------------------------------------------------- +DECLARE_STANAG_CMP( stanag_4607_sensor_position ) + +// ---------------------------------------------------------------------------- +/// A factor which modifies the value of the reported targetposition (lat, lon) +/// when it is necessary to send the reduced bandwidth version of the Target +/// Report. +struct KWIVER_ALGO_STANAG_EXPORT stanag_4607_scale_factor +{ + int lat_scale; + int long_scale; +}; + +// ---------------------------------------------------------------------------- +KWIVER_ALGO_STANAG_EXPORT +std::ostream& +operator<<( std::ostream& os, stanag_4607_scale_factor const& value ); + +// ---------------------------------------------------------------------------- +DECLARE_STANAG_CMP( stanag_4607_scale_factor ) + +// ---------------------------------------------------------------------------- +class KWIVER_ALGO_STANAG_EXPORT stanag_4607_scale_factor_format +{ +public: + stanag_4607_scale_factor_format() {} + + stanag_4607_scale_factor + read( ptr_t& ptr ) const; +}; + + +// ---------------------------------------------------------------------------- +/// Estimate of the standard deviation in the estimated sensor location at +/// the time of the dwell. Expressed in centimeters. +struct KWIVER_ALGO_STANAG_EXPORT stanag_4607_sensor_pos_uncert +{ + int along_track; + int cross_track; + int altitude; +}; + +// ---------------------------------------------------------------------------- +KWIVER_ALGO_STANAG_EXPORT +std::ostream& +operator<<( std::ostream& os, stanag_4607_sensor_pos_uncert const& value ); + +// ---------------------------------------------------------------------------- +DECLARE_STANAG_CMP( stanag_4607_sensor_pos_uncert ) + +// ---------------------------------------------------------------------------- +class KWIVER_ALGO_STANAG_EXPORT stanag_4607_sensor_pos_uncert_format +{ +public: + stanag_4607_sensor_pos_uncert_format() {} + + stanag_4607_sensor_pos_uncert + read( ptr_t& ptr ) const; +}; + + +// ---------------------------------------------------------------------------- +/// The toll angle of the platform at the time of the dwell. +struct KWIVER_ALGO_STANAG_EXPORT stanag_4607_orientation +{ + double heading; + double pitch; + double roll; +}; + +// ---------------------------------------------------------------------------- +KWIVER_ALGO_STANAG_EXPORT +std::ostream& +operator<<( std::ostream& os, stanag_4607_orientation const& value ); + +// ---------------------------------------------------------------------------- +DECLARE_STANAG_CMP( stanag_4607_orientation ) + +// ---------------------------------------------------------------------------- +class KWIVER_ALGO_STANAG_EXPORT stanag_4607_orientation_format +{ +public: + stanag_4607_orientation_format() {} + + stanag_4607_orientation + read( ptr_t& ptr ) const; +}; + + +// ---------------------------------------------------------------------------- +/// The position of the center of the dwell area +struct KWIVER_ALGO_STANAG_EXPORT stanag_4607_dwell_area +{ + double center_lat; + double center_long; + double range_half_ext; + double dwell_angle_half_ext; +}; + +// ---------------------------------------------------------------------------- +KWIVER_ALGO_STANAG_EXPORT +std::ostream& +operator<<( std::ostream& os, stanag_4607_dwell_area const& value ); + + +// ---------------------------------------------------------------------------- +DECLARE_STANAG_CMP( stanag_4607_dwell_area ) + +// ---------------------------------------------------------------------------- +/// Classification of the target. +enum KWIVER_ALGO_STANAG_EXPORT stanag_4607_target_classification +{ + STANAG_4607_TARGET_CLASS_NO_INFO_LIVE, + STANAG_4607_TARGET_CLASS_TRACKED_VEHICLE_LIVE, + STANAG_4607_TARGET_CLASS_WHEELED_VEHICLE_LIVE, + STANAG_4607_TARGET_CLASS_ROTARY_WING_AIRCRAFT_LIVE, + STANAG_4607_TARGET_CLASS_FIXED_WING_AIRCRAFT_LIVE, + STANAG_4607_TARGET_CLASS_STATIONARY_ROTATOR_LIVE, + STANAG_4607_TARGET_CLASS_MARITIME_LIVE, + STANAG_4607_TARGET_CLASS_BEACON_LIVE, + STANAG_4607_TARGET_CLASS_AMPHIBIOUS_LIVE, + STANAG_4607_TARGET_CLASS_PERSON_LIVE, + STANAG_4607_TARGET_CLASS_VEHICLE_LIVE, + STANAG_4607_TARGET_CLASS_ANIMAL_LIVE, + STANAG_4607_TARGET_CLASS_LARGE_MULTI_RETURN_LIVE_LAND, + STANAG_4607_TARGET_CLASS_LARGE_MULTI_RETURN_LIVE_MARITIME, + // Note: 14-125 are reserved + STANAG_4607_TARGET_CLASS_OTHER_LIVE = 126, + STANAG_4607_TARGET_CLASS_UNKNOWN_LIVE, + STANAG_4607_TARGET_CLASS_NO_INFO_SIM, + STANAG_4607_TARGET_CLASS_TRACKED_VEHICLE_SIM, + STANAG_4607_TARGET_CLASS_WHEELED_VEHICLE_SIM, + STANAG_4607_TARGET_CLASS_ROTARY_WING_AIRCRAFT_SIM, + STANAG_4607_TARGET_CLASS_FIXED_WING_AIRCRAFT_SIM, + STANAG_4607_TARGET_CLASS_STATIONARY_ROTATOR_SIM, + STANAG_4607_TARGET_CLASS_MARITIME_SIM, + STANAG_4607_TARGET_CLASS_BEACON_SIM, + STANAG_4607_TARGET_CLASS_AMPHIBIOUS_SIM, + STANAG_4607_TARGET_CLASS_PERSON_SIM, + STANAG_4607_TARGET_CLASS_VEHICLE_SIM, + STANAG_4607_TARGET_CLASS_ANIMAL_SIM, + STANAG_4607_TARGET_CLASS_LARGE_MULTI_RETURN_SIM_LAND, + STANAG_4607_TARGET_CLASS_LARGE_MULTI_RETURN_SIM_MARITIME, + STANAG_4607_TARGET_CLASS_TAGGING_DEVICE, + // Note: 143-253 are reserved + STANAG_4607_TARGET_CLASS_OTHER_SIM = 254, + STANAG_4607_TARGET_CLASS_UNKNOWN_SIM, + STANAG_4607_TARGET_CLASS_ENUM_END, +}; + +// ---------------------------------------------------------------------------- +KWIVER_ALGO_STANAG_EXPORT +std::ostream& +operator<<( std::ostream& os, + stanag_4607_target_classification const& value ); + +// ---------------------------------------------------------------------------- +/// Standard deviation of the target measurements. +struct KWIVER_ALGO_STANAG_EXPORT stanag_4607_target_measure_uncert +{ + int slant_range; + int cross_range; + int height; + int radial_velocity; +}; + +// ---------------------------------------------------------------------------- +KWIVER_ALGO_STANAG_EXPORT +std::ostream& +operator<<( std::ostream& os, stanag_4607_target_measure_uncert const& value ); + +// ---------------------------------------------------------------------------- +DECLARE_STANAG_CMP( stanag_4607_target_measure_uncert ) + +// ---------------------------------------------------------------------------- +class KWIVER_ALGO_STANAG_EXPORT stanag_4607_target_measure_uncert_format +{ +public: + stanag_4607_target_measure_uncert_format() {} + + stanag_4607_target_measure_uncert + read( ptr_t& ptr ) const; +}; + + +// ---------------------------------------------------------------------------- +/// Information used to generate the MTI Target. +struct KWIVER_ALGO_STANAG_EXPORT stanag_4607_truth_tag +{ + int application; + int entity; +}; + +// ---------------------------------------------------------------------------- +KWIVER_ALGO_STANAG_EXPORT +std::ostream& +operator<<( std::ostream& os, stanag_4607_truth_tag const& value ); + +// ---------------------------------------------------------------------------- +DECLARE_STANAG_CMP( stanag_4607_truth_tag ) + +// ---------------------------------------------------------------------------- +class KWIVER_ALGO_STANAG_EXPORT stanag_4607_truth_tag_format +{ +public: + stanag_4607_truth_tag_format() {} + + stanag_4607_truth_tag + read( ptr_t& ptr ) const; +}; + + +// ---------------------------------------------------------------------------- +/// Each bit of the Existence Mask indicates whether or not the corresponding +/// field of the Dwell Segment is present in the data stream. +enum KWIVER_ALGO_STANAG_EXPORT stanag_4607_dwell_existence_mask_bit +{ + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_RADAR_CROSS_SECT, + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_TRUTH_TAG_ENTITY, + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_TRUTH_TAG_APPL, + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_MEASURE_RADIAL_VEL, + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_MEASURE_HEIGHT, + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_MEASURE_CROSS_RNAGE, + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_MEASURE_SLANT_RANGE, + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_CLASS_PROB, + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_CLASS, + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_SNR, + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_WRAP_VEL, + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_VEL_LOS, + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_LOCATION_GEODETIC_HEIGHT, + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_LOCATION_DELTA_LONG, + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_LOCATION_DELTA_LAT, + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_LOCATION_HI_RES_LONG, + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_LOCATION_HI_RES_LAT, + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_LOCATION_MTI_REPORT_IDX, + STANAG_4607_DWELL_EXIST_MASK_BIT_MIN_DETECT_VEL, + STANAG_4607_DWELL_EXIST_MASK_BIT_SENSOR_ORIENT_ROLL, + STANAG_4607_DWELL_EXIST_MASK_BIT_SENSOR_OREINT_PITCH, + STANAG_4607_DWELL_EXIST_MASK_BIT_SENSOR_OREINT_HEADING, + STANAG_4607_DWELL_EXIST_MASK_BIT_DWELL_AREA_DWELL_ANGLE_HALF, + STANAG_4607_DWELL_EXIST_MASK_BIT_DWELL_AREA_RANGE_HALF, + STANAG_4607_DWELL_EXIST_MASK_BIT_DWELL_AREA_CENTER_LONG, + STANAG_4607_DWELL_EXIST_MASK_BIT_DWELL_AREA_CENTER_LAT, + STANAG_4607_DWELL_EXIST_MASK_BIT_PLATFORM_OREINT_ROLL, + STANAG_4607_DWELL_EXIST_MASK_BIT_PLATFORM_ORIENT_PITCH, + STANAG_4607_DWELL_EXIST_MASK_BIT_PLATFORM_OREINT_HEADING, + STANAG_4607_DWELL_EXIST_MASK_BIT_SENSOR_VERTICAL_VEL_UNCERT, + STANAG_4607_DWELL_EXIST_MASK_BIT_SENSOR_SPEED_UNCERT, + STANAG_4607_DWELL_EXIST_MASK_BIT_SENSOR_TRACK_UNCERT, + STANAG_4607_DWELL_EXIST_MASK_BIT_SENSOR_VERTICAL_VEL, + STANAG_4607_DWELL_EXIST_MASK_BIT_SENSOR_SPEED, + STANAG_4607_DWELL_EXIST_MASK_BIT_SENSOR_TRACK, + STANAG_4607_DWELL_EXIST_MASK_BIT_SENSOR_POS_ALT, + STANAG_4607_DWELL_EXIST_MASK_BIT_SENSOR_POS_CROSS_TRACK, + STANAG_4607_DWELL_EXIST_MASK_BIT_SENSOR_POS_ALONG_TRACK, + STANAG_4607_DWELL_EXIST_MASK_BIT_SCALE_FACT_LONG, + STANAG_4607_DWELL_EXIST_MASK_BIT_SCALE_FACT_LAT, + STANAG_4607_DWELL_EXIST_MASK_BIT_SENSOR_ALT, + STANAG_4607_DWELL_EXIST_MASK_BIT_SENSOR_LONG, + STANAG_4607_DWELL_EXIST_MASK_BIT_SENSOR_LAT, + STANAG_4607_DWELL_EXIST_MASK_BIT_DWELL_TIME, + STANAG_4607_DWELL_EXIST_MASK_BIT_TARGET_REPORT_COUNT, + STANAG_4607_DWELL_EXIST_MASK_BIT_LAST_DWELL_REVISIT, + STANAG_4607_DWELL_EXIST_MASK_BIT_DWELL_INDEX, + STANAG_4607_DWELL_EXIST_MASK_BIT_REVISIT_INDEX, +}; + +// ---------------------------------------------------------------------------- +KWIVER_ALGO_STANAG_EXPORT +std::ostream& +operator<<( std::ostream& os, + stanag_4607_dwell_existence_mask_bit const& value ); + +// ---------------------------------------------------------------------------- +/// The position of the reported detection. +struct KWIVER_ALGO_STANAG_EXPORT stanag_4607_target_location +{ + kv::optional< double > hi_res_lat; + kv::optional< double > hi_res_long; + kv::optional< int > delta_lat; + kv::optional< int > delta_long; + kv::optional< int > geodetic_height; +}; + +// ---------------------------------------------------------------------------- +KWIVER_ALGO_STANAG_EXPORT +std::ostream& +operator<<( std::ostream& os, stanag_4607_target_location const& value ); + +// ---------------------------------------------------------------------------- +DECLARE_STANAG_CMP( stanag_4607_target_location ) + +// ---------------------------------------------------------------------------- +class KWIVER_ALGO_STANAG_EXPORT stanag_4607_target_location_format +{ +public: + stanag_4607_target_location_format() {} + + stanag_4607_target_location + read( ptr_t& ptr, + std::set< stanag_4607_dwell_existence_mask_bit > existence_mask ) const; +}; + + +// ---------------------------------------------------------------------------- +/// Each target observed within the dwell. +struct KWIVER_ALGO_STANAG_EXPORT stanag_4607_target_report +{ + kv::optional< int > mti_report_idx; + kv::optional< stanag_4607_target_location > location; + kv::optional< int > velocity_los; + kv::optional< int > wrap_velocity; + kv::optional< int > snr; + kv::optional< stanag_4607_target_classification > classification; + kv::optional< int > class_probability; + kv::optional< stanag_4607_target_measure_uncert > measurement_uncert; + kv::optional< stanag_4607_truth_tag > truth_tag; + kv::optional< int > radar_cross_sect; +}; + +// ---------------------------------------------------------------------------- +KWIVER_ALGO_STANAG_EXPORT +std::ostream& +operator<<( std::ostream& os, stanag_4607_target_report const& value ); + +// ---------------------------------------------------------------------------- +KWIVER_ALGO_STANAG_EXPORT +std::ostream& +operator<<( std::ostream& os, + std::vector< stanag_4607_target_report > const& value ); + +// ---------------------------------------------------------------------------- +DECLARE_STANAG_CMP( stanag_4607_target_report ) + +// ---------------------------------------------------------------------------- +class KWIVER_ALGO_STANAG_EXPORT stanag_4607_target_report_format +{ +public: + stanag_4607_target_report_format(); + + stanag_4607_target_report + read( ptr_t& ptr, + std::set< stanag_4607_dwell_existence_mask_bit > existence_mask ) const; +}; + + +// ---------------------------------------------------------------------------- +/// A report on a grouping of zero or more target reports. +struct KWIVER_ALGO_STANAG_EXPORT stanag_4607_dwell_segment +{ + std::set< stanag_4607_dwell_existence_mask_bit > existence_mask; + int revisit_index; + int dwell_index; + int last_dwell_of_revisit; + int target_report_count; + int dwell_time; + stanag_4607_sensor_position sensor_position; + kv::optional< stanag_4607_scale_factor > scale_factor; + kv::optional< stanag_4607_sensor_pos_uncert > sensor_pos_uncert; + kv::optional< double > sensor_track; + kv::optional< int > sensor_speed; + kv::optional< int > sensor_vertical_vel; + kv::optional< int > sensor_track_uncert; + kv::optional< int > sensor_speed_uncert; + kv::optional< int > sensor_vertical_vel_uncert; + kv::optional< stanag_4607_orientation > platform_orient; + stanag_4607_dwell_area dwell_area; + kv::optional< stanag_4607_orientation > sensor_orientation; + kv::optional< int > min_detectable_vel; + std::vector< stanag_4607_target_report > target_reports; +}; + +// ---------------------------------------------------------------------------- +KWIVER_ALGO_STANAG_EXPORT +std::ostream& +operator<<( std::ostream& os, stanag_4607_dwell_segment const& value ); + +// ---------------------------------------------------------------------------- +DECLARE_STANAG_CMP( stanag_4607_dwell_segment ) + +// ---------------------------------------------------------------------------- +class KWIVER_ALGO_STANAG_EXPORT stanag_4607_dwell_segment_format + : public stanag_4607_segment_data_format_< stanag_4607_dwell_segment > +{ +public: + stanag_4607_dwell_segment_format(); + + + size_t size; + + stanag_4607_dwell_segment + read( ptr_t& ptr ) const; +}; + +} // namespace stanag + +} // namespace arrows + +} // namespace kwiver + +#endif diff --git a/arrows/stanag/stanag_4607_segments.cxx b/arrows/stanag/segments/stanag_4607_mission_segment.cxx similarity index 54% rename from arrows/stanag/stanag_4607_segments.cxx rename to arrows/stanag/segments/stanag_4607_mission_segment.cxx index 638e1c6dae..38cd18b13c 100644 --- a/arrows/stanag/stanag_4607_segments.cxx +++ b/arrows/stanag/segments/stanag_4607_mission_segment.cxx @@ -2,7 +2,7 @@ // OSI-approved BSD 3-Clause License. See top-level LICENSE file or // https://github.com/Kitware/kwiver/blob/master/LICENSE for details. -#include "stanag_4607_segments.h" +#include "stanag_4607_mission_segment.h" namespace ka = kwiver::arrows; @@ -18,238 +18,6 @@ namespace arrows { namespace stanag { -// ---------------------------------------------------------------------------- -stanag_4607_segment_type_traits_lookup const& -stanag_4607_segment_type_traits_lookup_table() -{ - static stanag_4607_segment_type_traits_lookup const lookup = { - { - STANAG_4607_SEGMENT_TYPE_MISSION, "STANAG_4607_SEGMENT_TYPE_MISSION", - std::make_shared< stanag_4607_mission_segment_format >(), - "Mission Segment" - } - }; - - // TODO finish rest of segments - /* - { - STANAG_4607_SEGMENT_TYPE_DWELL, - std::make_shared<>(), - "Dwell Segment" - }, - { - STANAG_4607_SEGMENT_TYPE_HRR, - std::make_shared<>(), - "HRR Segment" - }, - { - STANAG_4607_SEGMENT_TYPE_JOB_DEFINITION, - std::make_shared<>(), - "Job Definition Segment" - }, - { - STANAG_4607_SEGMENT_TYPE_FREE_TEXT, - std::make_shared<>(), - "Free Text Segment" - }, - { - STANAG_4607_SEGMENT_TYPE_LOW_REFLECTIVITY_INDEX, - std::make_shared<>(), - "Low Reflectivity Index Segment" - }, - { - STANAG_4607_SEGMENT_TYPE_GROUP, - std::make_shared<>(), - "Group Segment" - }, - { - STANAG_4607_SEGMENT_TYPE_ATTACHED_TARGET, - std::make_shared<>(), - "Attached Target Segment" - }, - { - STANAG_4607_SEGMENT_TYPE_TEST_AND_STATUS, - std::make_shared<>(), - "Test and Status Segment" - }, - { - STANAG_4607_SEGMENT_TYPE_SYSTEM_SPECIFIC, - std::make_shared<>(), - "System-Specific Segment" - }, - { - STANAG_4607_SEGMENT_TYPE_PROCESSING_HISTORY, - std::make_shared<>(), - "Processing History Segment" - }, - { - STANAG_4607_SEGMENT_TYPE_PLATFORM_LOCATION, - std::make_shared<>(), - "Platform Location Segment" - }, - { - STANAG_4607_SEGMENT_TYPE_JOB_REQUEST, - std::make_shared<>(), - "Job Request Segment" - }, - { - STANAG_4607_SEGMENT_TYPE_JOB_ACKNOWLEDGE, - std::make_shared<>(), - "Job Acknowledge Segment" - }, - { - STANAG_4607_SEGMENT_TYPE_ENUM_END, - std::make_shared<>(), - "Unknown STANAG4607 segment type" - } */ - //}; - - return lookup; -} - -// ---------------------------------------------------------------------------- -std::ostream& -operator<<( std::ostream& os, - stanag_4607_segment_type const& value ) -{ - os << stanag_4607_segment_type_traits_lookup_table().by_type( value ) - .name(); - - return os; -} - -// ---------------------------------------------------------------------------- -std::ostream& -operator<<( std::ostream& os, stanag_4607_segment_header const& value ) -{ - os << "{ " - << "Segment Type: " << value.segment_type << ", " - << "Segment Size: " << value.segment_size - << " }"; - - return os; -} - -// ---------------------------------------------------------------------------- -DEFINE_STANAG_STRUCT_CMP( - stanag_4607_segment_header, - &stanag_4607_segment_header::segment_type, - &stanag_4607_segment_header::segment_size -) - -// ---------------------------------------------------------------------------- -stanag_4607_segment_header_format -::stanag_4607_segment_header_format() -{} - -// ---------------------------------------------------------------------------- -stanag_4607_segment_header -stanag_4607_segment_header_format -::read( ptr_t& ptr ) const -{ - stanag_4607_segment_header result; - - result.segment_type = static_cast< stanag_4607_segment_type >( - ka::klv::klv_read_int< uint64_t >( ptr, 1 )); - result.segment_size = ka::klv::klv_read_int< size_t >( ptr, 4 ); - - return result; -} - -// ---------------------------------------------------------------------------- -stanag_4607_segment_type_traits_lookup -::stanag_4607_segment_type_traits_lookup( - std::initializer_list< stanag_4607_segment_type_traits > const& traits ) - : m_traits{ traits.begin(), traits.end() } -{ - initialize(); -} - -// ---------------------------------------------------------------------------- -stanag_4607_segment_type_traits_lookup -::stanag_4607_segment_type_traits_lookup( - std::vector< stanag_4607_segment_type_traits > const& traits ) - : m_traits{ traits.begin(), traits.end() } -{ - initialize(); -} - -// ---------------------------------------------------------------------------- -stanag_4607_segment_type_traits const& -stanag_4607_segment_type_traits_lookup -::by_type( uint16_t type ) const -{ - auto const result = m_type_to_traits.find( type ); - return ( result == m_type_to_traits.end() ) - ? m_traits.at( 0 ) - : *result->second; -} - -// ---------------------------------------------------------------------------- -stanag_4607_segment_type_traits const& -stanag_4607_segment_type_traits_lookup -::by_enum_name( std::string const& enum_name ) const -{ - auto const result = m_enum_name_to_traits.find( enum_name ); - return ( result == m_enum_name_to_traits.end() ) - ? m_traits.at( 0 ) - : *result->second; -} - -// ---------------------------------------------------------------------------- -void -stanag_4607_segment_type_traits_lookup -::initialize() -{ - if( m_traits.empty() ) - { - throw std::logic_error( "traits cannot be empty" ); - } - - for( auto const& trait : m_traits ) - { - if( trait.type() ) - { - m_type_to_traits.emplace( trait.type(), &trait ).second; - } - - if( !trait.enum_name().empty() ) - { - m_enum_name_to_traits.emplace( trait.enum_name(), &trait ).second; - } - } -} - -// ---------------------------------------------------------------------------- -stanag_4607_mission_segment_format -::stanag_4607_mission_segment_format() -{} - -// ---------------------------------------------------------------------------- -stanag_4607_mission_segment -stanag_4607_mission_segment_format -::read( ptr_t& ptr ) const -{ - stanag_4607_mission_segment result; - - result.mission_plan = trim_whitespace( klv::klv_read_string( ptr, - (size_t)12 ) ); - - result.flight_plan = trim_whitespace( klv::klv_read_string( ptr, - (size_t)12 ) ); - - result.platform_type = static_cast< stanag_4607_mission_segment_platform >( - klv::klv_read_int< uint64_t >( ptr, (size_t)1 )); - - result.platform_configuration = trim_whitespace( klv::klv_read_string( - ptr, (size_t)10 ) ); - - result.reference_time.year = klv::klv_read_int< int >( ptr, (size_t)2 ); - result.reference_time.month = klv::klv_read_int< int >( ptr, (size_t)1 ); - result.reference_time.day = klv::klv_read_int< int >( ptr, (size_t)1 ); - - return result; -} // ---------------------------------------------------------------------------- std::ostream& @@ -356,6 +124,36 @@ DEFINE_STANAG_STRUCT_CMP( &stanag_4607_mission_segment::reference_time ) +// ---------------------------------------------------------------------------- +stanag_4607_mission_segment_format +::stanag_4607_mission_segment_format() +{} + +// ---------------------------------------------------------------------------- +stanag_4607_mission_segment +stanag_4607_mission_segment_format +::read( ptr_t& ptr ) const +{ + stanag_4607_mission_segment result; + + result.mission_plan = trim_whitespace( klv::klv_read_string( ptr, + (size_t)12 ) ); + + result.flight_plan = trim_whitespace( klv::klv_read_string( ptr, + (size_t)12 ) ); + + result.platform_type = static_cast< stanag_4607_mission_segment_platform >( + klv::klv_read_int< uint64_t >( ptr, (size_t)1 )); + + result.platform_configuration = trim_whitespace( klv::klv_read_string( + ptr, (size_t)10 ) ); + + result.reference_time.year = klv::klv_read_int< int >( ptr, (size_t)2 ); + result.reference_time.month = klv::klv_read_int< int >( ptr, (size_t)1 ); + result.reference_time.day = klv::klv_read_int< int >( ptr, (size_t)1 ); + + return result; +} } // namespace stanag diff --git a/arrows/stanag/segments/stanag_4607_mission_segment.h b/arrows/stanag/segments/stanag_4607_mission_segment.h new file mode 100644 index 0000000000..bd4bf6a9d7 --- /dev/null +++ b/arrows/stanag/segments/stanag_4607_mission_segment.h @@ -0,0 +1,140 @@ +// This file is part of KWIVER, and is distributed under the +// OSI-approved BSD 3-Clause License. See top-level LICENSE file or +// https://github.com/Kitware/kwiver/blob/master/LICENSE for details. + +/// \file +/// Defines a STANAG 4607 segment header and the various segment types + +#ifndef KWIVER_ARROWS_STANAG_4607_MISSION_SEGMENT_H_ +#define KWIVER_ARROWS_STANAG_4607_MISSION_SEGMENT_H_ + +#include "stanag_4607_segments.h" +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace kwiver { + +namespace arrows { + +namespace stanag { + +namespace kv = kwiver::vital; + +// ---------------------------------------------------------------------------- +/// Identifies the type of platform that originated the data +enum KWIVER_ALGO_STANAG_EXPORT stanag_4607_mission_segment_platform +{ + STANAG_4607_MISSION_PLATFORM_UNIDENTIFIED, + STANAG_4607_MISSION_PLATFORM_ACS, + STANAG_4607_MISSION_PLATFORM_ARL_M, + STANAG_4607_MISSION_PLATFORM_SENTINEL, + STANAG_4607_MISSION_PLATFORM_ROTARY_WING_RADAR, + STANAG_4607_MISSION_PLATFORM_GLOBAL_HAWK_NAVY, + STANAG_4607_MISSION_PLATFORM_HORIZON, + STANAG_4607_MISSION_PLATFORM_E_8, + STANAG_4607_MISSION_PLATFORM_P_3C, + STANAG_4607_MISSION_PLATFORM_PREDATOR, + STANAG_4607_MISSION_PLATFORM_RADARSAT2, + STANAG_4607_MISSION_PLATFORM_U_2, + STANAG_4607_MISSION_PLATFORM_E_10, + STANAG_4607_MISSION_PLATFORM_UGS_SINGLE, + STANAG_4607_MISSION_PLATFORM_UGS_CLUSTER, + STANAG_4607_MISSION_PLATFORM_GROUND_BASED, + STANAG_4607_MISSION_PLATFORM_UAV_MARINES, + STANAG_4607_MISSION_PLATFORM_UAV_NAVY, + STANAG_4607_MISSION_PLATFORM_UAV_AIR_FORCE, + STANAG_4607_MISSION_PLATFORM_GLOBAL_HAWK_AIR_FORCE, + STANAG_4607_MISSION_PLATFORM_GLOBAL_HAWK_AUSTRALIA, + STANAG_4607_MISSION_PLATFORM_GLOBAL_HAWK_GERMANY, + STANAG_4607_MISSION_PLATFORM_PAUL_REVERE, + STANAG_4607_MISSION_PLATFORM_MARINER_UAV, + STANAG_4607_MISSION_PLATFORM_BAC_11, + STANAG_4607_MISSION_PLATFORM_COYOTE, + STANAG_4607_MISSION_PLATFORM_KING_AIR, + STANAG_4607_MISSION_PLATFORM_LIMIT, + STANAG_4607_MISSION_PLATFORM_NRL_NP_3B, + STANAG_4607_MISSION_PLATFORM_SOSTAR_X, + STANAG_4607_MISSION_PLATFORM_WATCHKEEPER, + STANAG_4607_MISSION_PLATFORM_ALLIANCE_GROUND_SURVEILLANCE, + STANAG_4607_MISSION_PLATFORM_STRYKER, + STANAG_4607_MISSION_PLATFORM_AGS, + STANAG_4607_MISSION_PLATFORM_SIDM, + STANAG_4607_MISSION_PLATFORM_REAPER, + STANAG_4607_MISSION_PLATFORM_WARRIOR_A, + STANAG_4607_MISSION_PLATFORM_WARRIOR, + STANAG_4607_MISSION_PLATFORM_TWIN_OTTER, + // Note: 40-254 are available for future use + STANAG_4607_MISSION_PLATFORM_OTHER = 255, + STANAG_4607_MISSION_PLATFORM_ENUM_END, +}; + +// ---------------------------------------------------------------------------- +KWIVER_ALGO_STANAG_EXPORT +std::ostream& +operator<<( std::ostream& os, + stanag_4607_mission_segment_platform const& value ); + +// ---------------------------------------------------------------------------- +/// UTC time in which the mission originated +struct KWIVER_ALGO_STANAG_EXPORT stanag_4607_mission_reference_time +{ + int year; + int month; + int day; +}; + +// ---------------------------------------------------------------------------- +KWIVER_ALGO_STANAG_EXPORT +std::ostream& +operator<<( std::ostream& os, + stanag_4607_mission_reference_time const& value ); + +// ---------------------------------------------------------------------------- +DECLARE_STANAG_CMP( stanag_4607_mission_reference_time ) + +// ---------------------------------------------------------------------------- +/// Information concerning the mission +struct KWIVER_ALGO_STANAG_EXPORT stanag_4607_mission_segment +{ + std::string mission_plan; + std::string flight_plan; + stanag_4607_mission_segment_platform platform_type; + std::string platform_configuration; + stanag_4607_mission_reference_time reference_time; +}; + +// ---------------------------------------------------------------------------- +KWIVER_ALGO_STANAG_EXPORT +std::ostream& +operator<<( std::ostream& os, stanag_4607_mission_segment const& value ); + +// ---------------------------------------------------------------------------- +DECLARE_STANAG_CMP( stanag_4607_mission_segment ) + +// ---------------------------------------------------------------------------- +class KWIVER_ALGO_STANAG_EXPORT stanag_4607_mission_segment_format + : public stanag_4607_segment_data_format_< stanag_4607_mission_segment > +{ +public: + stanag_4607_mission_segment_format(); + + using data_type = stanag_4607_mission_segment; + + stanag_4607_mission_segment + read( ptr_t& ptr ) const; +}; + +} // namespace stanag + +} // namespace arrows + +} // namespace kwiver + +#endif diff --git a/arrows/stanag/segments/stanag_4607_segment_lookup.cxx b/arrows/stanag/segments/stanag_4607_segment_lookup.cxx new file mode 100644 index 0000000000..60accd1da5 --- /dev/null +++ b/arrows/stanag/segments/stanag_4607_segment_lookup.cxx @@ -0,0 +1,206 @@ +// This file is part of KWIVER, and is distributed under the +// OSI-approved BSD 3-Clause License. See top-level LICENSE file or +// https://github.com/Kitware/kwiver/blob/master/LICENSE for details. + +#include "stanag_4607_segment_lookup.h" + +namespace ka = kwiver::arrows; + +#include + +#include +#include +#include + +namespace kwiver { + +namespace arrows { + +namespace stanag { + +// ---------------------------------------------------------------------------- +stanag_4607_segment_type_traits_lookup const& +stanag_4607_segment_type_traits_lookup_table() +{ + static stanag_4607_segment_type_traits_lookup const lookup = { + { + STANAG_4607_SEGMENT_TYPE_MISSION, + "STANAG_4607_SEGMENT_TYPE_MISSION", + std::make_shared< stanag_4607_mission_segment_format >(), + "Mission Segment" + }, + { + STANAG_4607_SEGMENT_TYPE_DWELL, + "STANAG_4607_SEGMENT_TYPE_DWELL", + std::make_shared< stanag_4607_dwell_segment_format >(), + "Dwell Segment" + } + + // Currently supports a subset of the standard. More segments + // will be added in the future. + /* + { + STANAG_4607_SEGMENT_TYPE_HRR, + "STANAG_4607_SEGMENT_TYPE_HRR", + std::make_shared<>(), + "HRR Segment" + }, + { + STANAG_4607_SEGMENT_TYPE_JOB_DEFINITION, + "STANAG_4607_SEGMENT_TYPE_JOB_DEFINITION", + std::make_shared<>(), + "Job Definition Segment" + }, + { + STANAG_4607_SEGMENT_TYPE_FREE_TEXT, + "STANAG_4607_SEGMENT_TYPE_FREE_TEXT", + std::make_shared<>(), + "Free Text Segment" + }, + { + STANAG_4607_SEGMENT_TYPE_LOW_REFLECTIVITY_INDEX, + "STANAG_4607_SEGMENT_TYPE_LOW_REFLECTIVITY_INDEX", + std::make_shared<>(), + "Low Reflectivity Index Segment" + }, + { + STANAG_4607_SEGMENT_TYPE_GROUP, + "STANAG_4607_SEGMENT_TYPE_GROUP", + std::make_shared<>(), + "Group Segment" + }, + { + STANAG_4607_SEGMENT_TYPE_ATTACHED_TARGET, + "STANAG_4607_SEGMENT_TYPE_ATTACHED_TARGET", + std::make_shared<>(), + "Attached Target Segment" + }, + { + STANAG_4607_SEGMENT_TYPE_TEST_AND_STATUS, + "STANAG_4607_SEGMENT_TYPE_TEST_AND_STATUS", + std::make_shared<>(), + "Test and Status Segment" + }, + { + STANAG_4607_SEGMENT_TYPE_SYSTEM_SPECIFIC, + "STANAG_4607_SEGMENT_TYPE_SYSTEM_SPECIFIC", + std::make_shared<>(), + "System-Specific Segment" + }, + { + STANAG_4607_SEGMENT_TYPE_PROCESSING_HISTORY, + "STANAG_4607_SEGMENT_TYPE_PROCESSING_HISTORY", + std::make_shared<>(), + "Processing History Segment" + }, + { + STANAG_4607_SEGMENT_TYPE_PLATFORM_LOCATION, + "STANAG_4607_SEGMENT_TYPE_PLATFORM_LOCATION", + std::make_shared<>(), + "Platform Location Segment" + }, + { + STANAG_4607_SEGMENT_TYPE_JOB_REQUEST, + "STANAG_4607_SEGMENT_TYPE_JOB_REQUEST", + std::make_shared<>(), + "Job Request Segment" + }, + { + STANAG_4607_SEGMENT_TYPE_JOB_ACKNOWLEDGE, + "STANAG_4607_SEGMENT_TYPE_JOB_ACKNOWLEDGE", + std::make_shared<>(), + "Job Acknowledge Segment" + },*/ + /*{ + STANAG_4607_SEGMENT_TYPE_ENUM_END, + "STANAG_4607_SEGMENT_TYPE_ENUM_END", + std::make_shared< void >(), + "Unknown STANAG4607 segment type" + } */ + }; + + return lookup; +} + + +// ---------------------------------------------------------------------------- +stanag_4607_segment_type_traits_lookup +::stanag_4607_segment_type_traits_lookup( + std::initializer_list< stanag_4607_segment_type_traits > const& traits ) + : m_traits{ traits.begin(), traits.end() } +{ + initialize(); +} + +// ---------------------------------------------------------------------------- +stanag_4607_segment_type_traits_lookup +::stanag_4607_segment_type_traits_lookup( + std::vector< stanag_4607_segment_type_traits > const& traits ) + : m_traits{ traits.begin(), traits.end() } +{ + initialize(); +} + +// ---------------------------------------------------------------------------- +stanag_4607_segment_type_traits const& +stanag_4607_segment_type_traits_lookup +::by_type( uint16_t type ) const +{ + auto const result = m_type_to_traits.find( type ); + return ( result == m_type_to_traits.end() ) + ? m_traits.at( 0 ) + : *result->second; +} + +// ---------------------------------------------------------------------------- +stanag_4607_segment_type_traits const& +stanag_4607_segment_type_traits_lookup +::by_enum_name( std::string const& enum_name ) const +{ + auto const result = m_enum_name_to_traits.find( enum_name ); + return ( result == m_enum_name_to_traits.end() ) + ? m_traits.at( 0 ) + : *result->second; +} + +// ---------------------------------------------------------------------------- +void +stanag_4607_segment_type_traits_lookup +::initialize() +{ + if( m_traits.empty() ) + { + throw std::logic_error( "traits cannot be empty" ); + } + + for( auto const& trait : m_traits ) + { + if( trait.type() ) + { + m_type_to_traits.emplace( trait.type(), &trait ).second; + } + + if( !trait.enum_name().empty() ) + { + m_enum_name_to_traits.emplace( trait.enum_name(), &trait ).second; + } + } +} + +// ---------------------------------------------------------------------------- +std::ostream& +operator<<( std::ostream& os, + stanag_4607_segment_type const& value ) +{ + os << stanag_4607_segment_type_traits_lookup_table().by_type( value ) + .name(); + + return os; +} + + +} // namespace stanag + +} // namespace arrows + +} // namespace kwiver diff --git a/arrows/stanag/segments/stanag_4607_segment_lookup.h b/arrows/stanag/segments/stanag_4607_segment_lookup.h new file mode 100644 index 0000000000..ac368e09e0 --- /dev/null +++ b/arrows/stanag/segments/stanag_4607_segment_lookup.h @@ -0,0 +1,123 @@ +// This file is part of KWIVER, and is distributed under the +// OSI-approved BSD 3-Clause License. See top-level LICENSE file or +// https://github.com/Kitware/kwiver/blob/master/LICENSE for details. + +/// \file +/// Defines a STANAG 4607 segment header and the various segment types + +#ifndef KWIVER_ARROWS_STANAG_4607_SEGMENT_LOOKUP_H_ +#define KWIVER_ARROWS_STANAG_4607_SEGMENT_LOOKUP_H_ + +#include + +#include "stanag_4607_dwell_segment.h" +#include "stanag_4607_mission_segment.h" + +#include +#include +#include +#include +#include +#include + +namespace kwiver { + +namespace arrows { + +namespace stanag { + +namespace kv = kwiver::vital; + +// ---------------------------------------------------------------------------- +/// The type, enumeration, and name of a segment +class KWIVER_ALGO_STANAG_EXPORT stanag_4607_segment_type_traits +{ +public: + stanag_4607_segment_type_traits( uint16_t type, + std::string const& enum_name, + stanag_4607_segment_data_format_sptr format, + std::string const& name ) + : m_type{ type }, m_enum_name{ enum_name }, m_format{ format }, + m_name{ name } + {} + + /// Returns the enumeration value of the segment + uint16_t + type() const { return m_type; } + + /// Return a string version of the segment enumeration + std::string + enum_name() const { return m_enum_name; } + + /// Return the data format used to represent this segment's value. + stanag_4607_segment_data_format& + format() const { return *m_format; } + + /// Return the segment's name. + std::string + name() const { return m_name; } + +private: + uint16_t m_type; + std::string m_enum_name; + stanag_4607_segment_data_format_sptr m_format; + std::string m_name; +}; + +// ---------------------------------------------------------------------------- +/// Lookup table used to match a segment to its traits +class KWIVER_ALGO_STANAG_EXPORT stanag_4607_segment_type_traits_lookup +{ +public: + using iterator = + typename std::vector< stanag_4607_segment_type_traits >::const_iterator; + using init_list = + typename std::initializer_list< stanag_4607_segment_type_traits >; + + stanag_4607_segment_type_traits_lookup( + std::initializer_list< stanag_4607_segment_type_traits > const& traits ); + + stanag_4607_segment_type_traits_lookup( + std::vector< stanag_4607_segment_type_traits > const& traits ); + + iterator + begin() const { return m_traits.begin(); } + + iterator + end() const { return m_traits.end(); } + + stanag_4607_segment_type_traits const& + by_type( uint16_t type ) const; + + /// Return the traits object with \p enum_name as its enum name. + stanag_4607_segment_type_traits const& + by_enum_name( std::string const& enum_name ) const; + +private: + void initialize(); + + std::vector< stanag_4607_segment_type_traits > m_traits; + std::map< std::string, + stanag_4607_segment_type_traits const* > m_enum_name_to_traits; + std::map< uint16_t, + stanag_4607_segment_type_traits const* > m_type_to_traits; +}; + +// ---------------------------------------------------------------------------- +/// Return a traits lookup object for segment types. +stanag_4607_segment_type_traits_lookup const& +stanag_4607_segment_type_traits_lookup_table(); + +// ---------------------------------------------------------------------------- +KWIVER_ALGO_STANAG_EXPORT +std::ostream& +operator<<( std::ostream& os, + stanag_4607_segment_type const& value ); + +} // namespace stanag + +} // namespace arrows + +} // namespace kwiver + +#endif diff --git a/arrows/stanag/segments/stanag_4607_segments.cxx b/arrows/stanag/segments/stanag_4607_segments.cxx new file mode 100644 index 0000000000..d39e016754 --- /dev/null +++ b/arrows/stanag/segments/stanag_4607_segments.cxx @@ -0,0 +1,63 @@ +// This file is part of KWIVER, and is distributed under the +// OSI-approved BSD 3-Clause License. See top-level LICENSE file or +// https://github.com/Kitware/kwiver/blob/master/LICENSE for details. + +#include "stanag_4607_segments.h" + +namespace ka = kwiver::arrows; + +#include + +#include +#include +#include + +namespace kwiver { + +namespace arrows { + +namespace stanag { + +// ---------------------------------------------------------------------------- +std::ostream& +operator<<( std::ostream& os, stanag_4607_segment_header const& value ) +{ + os << "{ " + << "Segment Type: " << value.segment_type << ", " + << "Segment Size: " << value.segment_size + << " }"; + + return os; +} + +// ---------------------------------------------------------------------------- +DEFINE_STANAG_STRUCT_CMP( + stanag_4607_segment_header, + &stanag_4607_segment_header::segment_type, + &stanag_4607_segment_header::segment_size +) + +// ---------------------------------------------------------------------------- +stanag_4607_segment_header_format +::stanag_4607_segment_header_format() +{} + +// ---------------------------------------------------------------------------- +stanag_4607_segment_header +stanag_4607_segment_header_format +::read( ptr_t& ptr ) const +{ + stanag_4607_segment_header result; + + result.segment_type = static_cast< stanag_4607_segment_type >( + ka::klv::klv_read_int< uint64_t >( ptr, 1 )); + result.segment_size = ka::klv::klv_read_int< size_t >( ptr, 4 ); + + return result; +} + +} // namespace stanag + +} // namespace arrows + +} // namespace kwiver diff --git a/arrows/stanag/segments/stanag_4607_segments.h b/arrows/stanag/segments/stanag_4607_segments.h new file mode 100644 index 0000000000..d9dae20617 --- /dev/null +++ b/arrows/stanag/segments/stanag_4607_segments.h @@ -0,0 +1,136 @@ +// This file is part of KWIVER, and is distributed under the +// OSI-approved BSD 3-Clause License. See top-level LICENSE file or +// https://github.com/Kitware/kwiver/blob/master/LICENSE for details. + +/// \file +/// Defines a STANAG 4607 segment header and the various segment types + +#ifndef KWIVER_ARROWS_STANAG_4607_SEGMENTS_H_ +#define KWIVER_ARROWS_STANAG_4607_SEGMENTS_H_ + +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace kwiver { + +namespace arrows { + +namespace stanag { + +namespace kv = kwiver::vital; + +// ---------------------------------------------------------------------------- +/// The type of message contained in the segment +enum KWIVER_ALGO_STANAG_EXPORT stanag_4607_segment_type : uint16_t +{ + STANAG_4607_SEGMENT_TYPE_MISSION = 1, + STANAG_4607_SEGMENT_TYPE_DWELL = 2, + STANAG_4607_SEGMENT_TYPE_HRR = 3, + // Note: 4 is reserved + STANAG_4607_SEGMENT_TYPE_JOB_DEFINITION = 5, + STANAG_4607_SEGMENT_TYPE_FREE_TEXT = 6, + STANAG_4607_SEGMENT_TYPE_LOW_REFLECTIVITY_INDEX = 7, + STANAG_4607_SEGMENT_TYPE_GROUP = 8, + STANAG_4607_SEGMENT_TYPE_ATTACHED_TARGET = 9, + STANAG_4607_SEGMENT_TYPE_TEST_AND_STATUS = 10, + STANAG_4607_SEGMENT_TYPE_SYSTEM_SPECIFIC = 11, + STANAG_4607_SEGMENT_TYPE_PROCESSING_HISTORY = 12, + STANAG_4607_SEGMENT_TYPE_PLATFORM_LOCATION = 13, + // Note: 14-100 are reserved for new segments + STANAG_4607_SEGMENT_TYPE_JOB_REQUEST = 101, + STANAG_4607_SEGMENT_TYPE_JOB_ACKNOWLEDGE = 102, + // Note: 103-127 are reserved for future use + // Note: 128-255 are reserved for extensions + STANAG_4607_SEGMENT_TYPE_ENUM_END = 256, +}; + +// ---------------------------------------------------------------------------- +/// Identifies the type and size of the segment that follows +struct KWIVER_ALGO_STANAG_EXPORT stanag_4607_segment_header +{ + stanag_4607_segment_type segment_type; + size_t segment_size; +}; + +// ---------------------------------------------------------------------------- +KWIVER_ALGO_STANAG_EXPORT +std::ostream& +operator<<( std::ostream& os, stanag_4607_segment_header const& value ); + +// ---------------------------------------------------------------------------- +DECLARE_STANAG_CMP( stanag_4607_segment_header ) + +// ---------------------------------------------------------------------------- +class KWIVER_ALGO_STANAG_EXPORT stanag_4607_segment_header_format + : public stanag_4607_segment_header +{ +public: + stanag_4607_segment_header_format(); + + const size_t size = 5; // Number of bytes in the segment header + + stanag_4607_segment_header + read( ptr_t& ptr ) const; +}; + +// ---------------------------------------------------------------------------- +/// Untyped base for STANAG formats +class KWIVER_ALGO_STANAG_EXPORT stanag_4607_segment_data_format +{ +public: + explicit + stanag_4607_segment_data_format() {} + + virtual + ~stanag_4607_segment_data_format() = default; + + template < class T > T + read( ptr_t& ptr ) const; +}; + +using stanag_4607_segment_data_format_sptr = + std::shared_ptr< stanag_4607_segment_data_format >; + +// ---------------------------------------------------------------------------- +/// Typed base for STANAG formats +template < class T > +class KWIVER_ALGO_STANAG_EXPORT stanag_4607_segment_data_format_ + : public stanag_4607_segment_data_format +{ +public: + using data_type = T; + + explicit + stanag_4607_segment_data_format_() + {} + + virtual + ~stanag_4607_segment_data_format_() {} + + T + read( ptr_t& ptr ) const; +}; + +template < class T > +T +stanag_4607_segment_data_format +::read( ptr_t& ptr ) const +{ + return dynamic_cast< const stanag_4607_segment_data_format_< T >& >( *this ) + .read( ptr ); +} + +} // namespace stanag + +} // namespace arrows + +} // namespace kwiver + +#endif diff --git a/arrows/stanag/stanag_4607_packet.cxx b/arrows/stanag/stanag_4607_packet.cxx index a7ffedf9b6..2bdfd799c3 100644 --- a/arrows/stanag/stanag_4607_packet.cxx +++ b/arrows/stanag/stanag_4607_packet.cxx @@ -5,6 +5,7 @@ #include "stanag_4607_packet.h" #include +#include namespace kwiver { @@ -189,10 +190,20 @@ operator<<( std::ostream& os, stanag_4607_packet const& value ) } for ( size_t i=0; i const& value ) } for( auto v : value ) { - os << v; + os << v << std::endl; os << std::endl; } return os; @@ -245,8 +256,8 @@ ::read( ptr_t& ptr ) const auto packet_size = packet_header_data.packet_size; std::vector< stanag_4607_segment_header > segment_headers; - // TODO: make this any segment type - std::vector< stanag_4607_mission_segment > segments; + std::vector< stanag_4607_segments > segments; + auto it = segments.begin(); while( bytes_read_in_packet < packet_size ) { @@ -262,8 +273,21 @@ ::read( ptr_t& ptr ) const size_t segment_size = segment_header_data.segment_size; // Read message segment - auto message = format.read( ptr ); - segments.push_back( message ); + stanag_4607_segments message; + if( typeid(format) == typeid(stanag_4607_mission_segment_format) ) + { + message = stanag_4607_mission_segment_format{}.read( ptr ); + } + else if( typeid(format) == typeid(stanag_4607_dwell_segment_format) ) + { + message = stanag_4607_dwell_segment_format{}.read( ptr ); + } + + //std::visit([](const auto &x) + //{ std::cout << x << std::endl; }, message); + + segments.insert(it, message); + it = segments.end(); bytes_read_in_packet += segment_size; } @@ -278,21 +302,20 @@ ::read( ptr_t& ptr ) const // ---------------------------------------------------------------------------- std::vector< stanag_4607_packet > -read_stanag_4607_data( ptr_t& ptr ) +read_stanag_4607_data( std::vector< uint8_t > input_bytes ) { + auto ptr = &*input_bytes.cbegin(); std::vector< stanag_4607_packet > result; + auto it = result.begin(); - // TODO loop over all packets - //while(ptr != &*input_bytes.cend() ) - //{ - stanag_4607_packet_format packet; - stanag_4607_packet packet_data = packet.read( ptr ); - result.push_back( packet_data ); - - //} - - //std::vector< stanag_4607_packet > result{ packet_data }; + while( ptr != &*input_bytes.cend() ) + { + stanag_4607_packet_format packet; + stanag_4607_packet packet_data = packet.read( ptr ); + result.insert( it, packet_data ); + it = result.end(); + } return result; } diff --git a/arrows/stanag/stanag_4607_packet.h b/arrows/stanag/stanag_4607_packet.h index b88e632aa6..d2ac9ca60c 100644 --- a/arrows/stanag/stanag_4607_packet.h +++ b/arrows/stanag/stanag_4607_packet.h @@ -5,14 +5,21 @@ /// \file /// Defines a STANAG 4607 packet and packet header +/// STANAG 4607 documentation can be found at: +/// https://nso.nato.int/nso/nsdd/main/standards/stanag-details/8003/EN + #ifndef KWIVER_ARROWS_STANAG_4607_PACKET_H_ #define KWIVER_ARROWS_STANAG_4607_PACKET_H_ #include -#include "stanag_4607_segments.h" #include "stanag_util.h" +#include +#include +#include + +#include namespace ka = kwiver::arrows; #include @@ -27,6 +34,9 @@ namespace arrows { namespace stanag { +using stanag_4607_segments = typename std::variant< stanag_4607_mission_segment, + stanag_4607_dwell_segment >; + // ---------------------------------------------------------------------------- /// Indicates the classification level of a packet enum KWIVER_ALGO_STANAG_EXPORT stanag_4607_security_classification @@ -89,7 +99,6 @@ KWIVER_ALGO_STANAG_EXPORT std::ostream& operator<<( std::ostream& os, stanag_4607_packet_security const& value ); - // ---------------------------------------------------------------------------- DECLARE_STANAG_CMP( stanag_4607_packet_security ) @@ -150,22 +159,19 @@ class KWIVER_ALGO_STANAG_EXPORT stanag_4607_packet_header_format public: stanag_4607_packet_header_format(); - const size_t size = 32; // Number of bytes in packet header stanag_4607_packet_header read( ptr_t& ptr ) const; }; - // ---------------------------------------------------------------------------- /// Top level STANAG 4607 packet struct KWIVER_ALGO_STANAG_EXPORT stanag_4607_packet { stanag_4607_packet_header header; std::vector< stanag_4607_segment_header > segment_headers; - std::vector< stanag_4607_mission_segment > segments; // TODO: make this any - // segment type + std::vector< stanag_4607_segments > segments; }; // ---------------------------------------------------------------------------- @@ -192,12 +198,11 @@ class KWIVER_ALGO_STANAG_EXPORT stanag_4607_packet_format read( ptr_t& ptr ) const; }; - // ---------------------------------------------------------------------------- /// Read the input data as a list of packets KWIVER_ALGO_STANAG_EXPORT std::vector< stanag_4607_packet > -read_stanag_4607_data( ptr_t& ptr ); +read_stanag_4607_data( std::vector< uint8_t > input_bytes ); } // Namespace stanag diff --git a/arrows/stanag/stanag_4607_segments.h b/arrows/stanag/stanag_4607_segments.h deleted file mode 100644 index 3b1ebbb2f1..0000000000 --- a/arrows/stanag/stanag_4607_segments.h +++ /dev/null @@ -1,324 +0,0 @@ -// This file is part of KWIVER, and is distributed under the -// OSI-approved BSD 3-Clause License. See top-level LICENSE file or -// https://github.com/Kitware/kwiver/blob/master/LICENSE for details. - -/// \file -/// Defines a STANAG 4607 segment header and the various segment types - -#ifndef KWIVER_ARROWS_STANAG_4607_SEGMENTS_H_ -#define KWIVER_ARROWS_STANAG_4607_SEGMENTS_H_ - -#include "stanag_util.h" -#include - -#include -#include -#include -#include -#include -#include - -namespace kwiver { - -namespace arrows { - -namespace stanag { - -// ---------------------------------------------------------------------------- -/// The type of message contained in the segment -enum KWIVER_ALGO_STANAG_EXPORT stanag_4607_segment_type : uint16_t -{ - STANAG_4607_SEGMENT_TYPE_MISSION = 1, - STANAG_4607_SEGMENT_TYPE_DWELL = 2, - STANAG_4607_SEGMENT_TYPE_HRR = 3, - // Note: 4 is reserved - STANAG_4607_SEGMENT_TYPE_JOB_DEFINITION = 5, - STANAG_4607_SEGMENT_TYPE_FREE_TEXT = 6, - STANAG_4607_SEGMENT_TYPE_LOW_REFLECTIVITY_INDEX = 7, - STANAG_4607_SEGMENT_TYPE_GROUP = 8, - STANAG_4607_SEGMENT_TYPE_ATTACHED_TARGET = 9, - STANAG_4607_SEGMENT_TYPE_TEST_AND_STATUS = 10, - STANAG_4607_SEGMENT_TYPE_SYSTEM_SPECIFIC = 11, - STANAG_4607_SEGMENT_TYPE_PROCESSING_HISTORY = 12, - STANAG_4607_SEGMENT_TYPE_PLATFORM_LOCATION = 13, - // Note 14-100 are reserved for new segments - STANAG_4607_SEGMENT_TYPE_JOB_REQUEST = 101, - STANAG_4607_SEGMENT_TYPE_JOB_ACKNOWLEDGE = 102, - // Note: 103-127 are reserved for future use - // Note 128-255 are reserved for extensions - STANAG_4607_SEGMENT_TYPE_ENUM_END = 256, -}; - -// ---------------------------------------------------------------------------- -KWIVER_ALGO_STANAG_EXPORT -std::ostream& -operator<<( std::ostream& os, - stanag_4607_segment_type const& value ); - -// ---------------------------------------------------------------------------- -/// Identifies the type and size of the segment that follows -struct KWIVER_ALGO_STANAG_EXPORT stanag_4607_segment_header -{ - stanag_4607_segment_type segment_type; - size_t segment_size; -}; - -// ---------------------------------------------------------------------------- -KWIVER_ALGO_STANAG_EXPORT -std::ostream& -operator<<( std::ostream& os, stanag_4607_segment_header const& value ); - -// ---------------------------------------------------------------------------- -DECLARE_STANAG_CMP( stanag_4607_segment_header ) - -// ---------------------------------------------------------------------------- -class KWIVER_ALGO_STANAG_EXPORT stanag_4607_segment_header_format - : public stanag_4607_segment_header -{ -public: - stanag_4607_segment_header_format(); - - - const size_t size = 5; // Number of bytes in the segment header - - stanag_4607_segment_header - read( ptr_t& ptr ) const; -}; - - -// ---------------------------------------------------------------------------- -/// Identifies the type of platform that originated the data -enum KWIVER_ALGO_STANAG_EXPORT stanag_4607_mission_segment_platform -{ - STANAG_4607_MISSION_PLATFORM_UNIDENTIFIED, - STANAG_4607_MISSION_PLATFORM_ACS, - STANAG_4607_MISSION_PLATFORM_ARL_M, - STANAG_4607_MISSION_PLATFORM_SENTINEL, - STANAG_4607_MISSION_PLATFORM_ROTARY_WING_RADAR, - STANAG_4607_MISSION_PLATFORM_GLOBAL_HAWK_NAVY, - STANAG_4607_MISSION_PLATFORM_HORIZON, - STANAG_4607_MISSION_PLATFORM_E_8, - STANAG_4607_MISSION_PLATFORM_P_3C, - STANAG_4607_MISSION_PLATFORM_PREDATOR, - STANAG_4607_MISSION_PLATFORM_RADARSAT2, - STANAG_4607_MISSION_PLATFORM_U_2, - STANAG_4607_MISSION_PLATFORM_E_10, - STANAG_4607_MISSION_PLATFORM_UGS_SINGLE, - STANAG_4607_MISSION_PLATFORM_UGS_CLUSTER, - STANAG_4607_MISSION_PLATFORM_GROUND_BASED, - STANAG_4607_MISSION_PLATFORM_UAV_MARINES, - STANAG_4607_MISSION_PLATFORM_UAV_NAVY, - STANAG_4607_MISSION_PLATFORM_UAV_AIR_FORCE, - STANAG_4607_MISSION_PLATFORM_GLOBAL_HAWK_AIR_FORCE, - STANAG_4607_MISSION_PLATFORM_GLOBAL_HAWK_AUSTRALIA, - STANAG_4607_MISSION_PLATFORM_GLOBAL_HAWK_GERMANY, - STANAG_4607_MISSION_PLATFORM_PAUL_REVERE, - STANAG_4607_MISSION_PLATFORM_MARINER_UAV, - STANAG_4607_MISSION_PLATFORM_BAC_11, - STANAG_4607_MISSION_PLATFORM_COYOTE, - STANAG_4607_MISSION_PLATFORM_KING_AIR, - STANAG_4607_MISSION_PLATFORM_LIMIT, - STANAG_4607_MISSION_PLATFORM_NRL_NP_3B, - STANAG_4607_MISSION_PLATFORM_SOSTAR_X, - STANAG_4607_MISSION_PLATFORM_WATCHKEEPER, - STANAG_4607_MISSION_PLATFORM_ALLIANCE_GROUND_SURVEILLANCE, - STANAG_4607_MISSION_PLATFORM_STRYKER, - STANAG_4607_MISSION_PLATFORM_AGS, - STANAG_4607_MISSION_PLATFORM_SIDM, - STANAG_4607_MISSION_PLATFORM_REAPER, - STANAG_4607_MISSION_PLATFORM_WARRIOR_A, - STANAG_4607_MISSION_PLATFORM_WARRIOR, - STANAG_4607_MISSION_PLATFORM_TWIN_OTTER, - // Note: 40-254 are available for future use - STANAG_4607_MISSION_PLATFORM_OTHER = 255, - STANAG_4607_MISSION_PLATFORM_ENUM_END, -}; - -// ---------------------------------------------------------------------------- -KWIVER_ALGO_STANAG_EXPORT -std::ostream& -operator<<( std::ostream& os, - stanag_4607_mission_segment_platform const& value ); - -// ---------------------------------------------------------------------------- -/// UTC time in which the mission originated -struct KWIVER_ALGO_STANAG_EXPORT stanag_4607_mission_reference_time -{ - int year; - int month; - int day; -}; - -// ---------------------------------------------------------------------------- -KWIVER_ALGO_STANAG_EXPORT -std::ostream& -operator<<( std::ostream& os, - stanag_4607_mission_reference_time const& value ); - - -// ---------------------------------------------------------------------------- -DECLARE_STANAG_CMP( stanag_4607_mission_reference_time ) - -// ---------------------------------------------------------------------------- -/// Information concerning the mission -struct KWIVER_ALGO_STANAG_EXPORT stanag_4607_mission_segment -{ - std::string mission_plan; - std::string flight_plan; - stanag_4607_mission_segment_platform platform_type; - std::string platform_configuration; - stanag_4607_mission_reference_time reference_time; -}; - -// ---------------------------------------------------------------------------- -KWIVER_ALGO_STANAG_EXPORT -std::ostream& -operator<<( std::ostream& os, stanag_4607_mission_segment const& value ); - -// ---------------------------------------------------------------------------- -DECLARE_STANAG_CMP( stanag_4607_mission_segment ) - -// ---------------------------------------------------------------------------- -/// Untyped base for STANAG formats -class KWIVER_ALGO_STANAG_EXPORT stanag_4607_segment_data_format -{ -public: - explicit - stanag_4607_segment_data_format() {} - - virtual - ~stanag_4607_segment_data_format() = default; - - virtual stanag_4607_mission_segment // TODO: make this any segment type - read( ptr_t& ptr ) const = 0; -}; - -using stanag_4607_segment_data_format_sptr = - std::shared_ptr< stanag_4607_segment_data_format >; - -// ---------------------------------------------------------------------------- -/// Typed base for STANAG formats -template < class T > -class KWIVER_ALGO_STANAG_EXPORT stanag_4607_segment_data_format_ - : public stanag_4607_segment_data_format -{ -public: - using data_type = T; - - explicit - stanag_4607_segment_data_format_() - {} - - virtual - ~stanag_4607_segment_data_format_() {} - - virtual T - read( ptr_t& ptr ) const = 0; -}; - -// ---------------------------------------------------------------------------- -/// The type, enumeration, and name of a segment -class KWIVER_ALGO_STANAG_EXPORT stanag_4607_segment_type_traits -{ -public: - stanag_4607_segment_type_traits( uint16_t type, - std::string const& enum_name, - stanag_4607_segment_data_format_sptr format, - std::string const& name ) - : m_type{ type }, m_enum_name{ enum_name }, m_format{ format }, - m_name{ name } - {} - - /// Returns the enumeration value of the segment - uint16_t - type() const { return m_type; } - - /// Return a string version of the segment enumeration - std::string - enum_name() const { return m_enum_name; } - - /// Return the data format used to represent this segment's value. - stanag_4607_segment_data_format& - format() const { return *m_format; } - - /// Return the segment's name. - std::string - name() const { return m_name; } - -private: - uint16_t m_type; - std::string m_enum_name; - stanag_4607_segment_data_format_sptr m_format; - std::string m_name; -}; - -// ---------------------------------------------------------------------------- -/// Lookup table used to match a segment to its traits -class KWIVER_ALGO_STANAG_EXPORT stanag_4607_segment_type_traits_lookup -{ -public: - using iterator = - typename std::vector< stanag_4607_segment_type_traits >::const_iterator; - using init_list = - typename std::initializer_list< stanag_4607_segment_type_traits >; - - stanag_4607_segment_type_traits_lookup( - std::initializer_list< stanag_4607_segment_type_traits > const& traits ); - - stanag_4607_segment_type_traits_lookup( - std::vector< stanag_4607_segment_type_traits > const& traits ); - - iterator - begin() const { return m_traits.begin(); } - - iterator - end() const { return m_traits.end(); } - - stanag_4607_segment_type_traits const& - by_type( uint16_t type ) const; - - /// Return the traits object with \p enum_name as its enum name. - stanag_4607_segment_type_traits const& - by_enum_name( std::string const& enum_name ) const; - -private: - void initialize(); - - - std::vector< stanag_4607_segment_type_traits > m_traits; - std::map< std::string, - stanag_4607_segment_type_traits const* > m_enum_name_to_traits; - std::map< uint16_t, - stanag_4607_segment_type_traits const* > m_type_to_traits; -}; - -// ---------------------------------------------------------------------------- -class KWIVER_ALGO_STANAG_EXPORT stanag_4607_mission_segment_format - : public stanag_4607_segment_data_format_< stanag_4607_mission_segment > -{ -public: - stanag_4607_mission_segment_format(); - - - const size_t size = 39; // Number of bytes in mission segment - - stanag_4607_mission_segment - read( ptr_t& ptr ) const override; -}; - -// ---------------------------------------------------------------------------- -/// -// TODO DWELL - -// ---------------------------------------------------------------------------- -/// Return a traits lookup object for segment types. -stanag_4607_segment_type_traits_lookup const& -stanag_4607_segment_type_traits_lookup_table(); - -} // namespace stanag - -} // namespace arrows - -} // namespace kwiver - -#endif diff --git a/arrows/stanag/stanag_util.cxx b/arrows/stanag/stanag_util.cxx index b7e6a7b507..f49cd2d46d 100644 --- a/arrows/stanag/stanag_util.cxx +++ b/arrows/stanag/stanag_util.cxx @@ -3,6 +3,7 @@ // https://github.com/Kitware/kwiver/blob/master/LICENSE for details. #include "stanag_util.h" +#include namespace klv = kwiver::arrows::klv; @@ -24,6 +25,7 @@ trim_whitespace( std::string input ) return input.substr( str_begin, ( str_end - str_begin ) + 1 ); } + } // namespace stanag } // namespace arrows diff --git a/arrows/stanag/stanag_util.h b/arrows/stanag/stanag_util.h index 4fc8808915..984e5069df 100644 --- a/arrows/stanag/stanag_util.h +++ b/arrows/stanag/stanag_util.h @@ -10,6 +10,7 @@ #include +#include #include #include @@ -17,6 +18,7 @@ #include #include #include +#include #include