Skip to content

Conversation

@jtfedd
Copy link
Contributor

@jtfedd jtfedd commented Dec 28, 2024

Problem

Message type 5 (Volume Coverage Pattern) contains a lot of useful information for interpreting the individual elevation cuts.

Solution

Decode it!

VCP message contents from `KDMX20240521_215236_V06`

NOTE: Angles are displayed in radians

Message {
    header: Header {
        message_size: 540,
        pattern_type: Constant,
        pattern_number: 212,
        number_of_elevation_cuts: 23,
        version: 1,
        clutter_map_group_number: 1,
        doppler_velocity_resolution: Some(
            0.5 m^1 s^-1,
        ),
        pulse_width: Short,
        reserved_1: 0,
        vcp_sequencing_raw: 0,
        vcp_sequencing_number_of_elevations: 0,
        vcp_sequencing_maximum_sails_cuts: 0,
        vcp_sequencing_sequence_active: false,
        vcp_sequencing_truncated_vcp: false,
        vcp_supplemental_data_raw: 112,
        vcp_supplemental_data_sails_vcp: false,
        vcp_supplemental_data_number_sails_cuts: 0,
        vcp_supplemental_data_mrle_vcp: true,
        vcp_supplemental_data_number_mrle_cuts: 3,
        vcp_supplemental_data_mpda_vcp: false,
        vcp_supplemental_data_base_tilt_vcp: false,
        vcp_supplemental_data_base_tilts: 0,
        reserved_2: 0,
    },
    elevations: [
        ElevationDataBlock {
            elevation_angle: 0.008436894333371027,
            channel_configuration: SZ2Phase,
            waveform_type: CS,
            super_resolution_control_raw: 11,
            super_resolution_control_half_degree_azimuth: true,
            super_resolution_control_quarter_km_reflectivity: true,
            super_resolution_control_doppler_to_300km: false,
            super_resolution_control_dual_polarization_to_300km: true,
            surveillance_prf_number: 1,
            surveillance_prf_pulse_count_radial: 15,
            azimuth_rate: 0.3691141270849824 s^-1,
            reflectivity_threshold: 2.0,
            velocity_threshold: 2.0,
            spectrum_width_threshold: 2.0,
            differential_reflectivity_threshold: 2.0,
            differential_phase_threshold: 2.0,
            correlation_coefficient_threshold: 2.0,
            sector_1_edge_angle: 0.0,
            sector_1_doppler_prf_number: 0,
            sector_1_doppler_prf_pulse_count_radial: 0,
            sector_2_edge_angle: 0.0,
            sector_2_doppler_prf_number: 0,
            sector_2_doppler_prf_pulse_count_radial: 0,
            sector_3_edge_angle: 0.0,
            sector_3_doppler_prf_number: 0,
            sector_3_doppler_prf_pulse_count_radial: 0,
            ebc_angle: 0.0,
            supplemental_data: 0,
            supplemental_data_sails_cut: false,
            supplemental_data_sails_sequence_number: 0,
            supplemental_data_mrle_cut: false,
            supplemental_data_mrle_sequence_number: 0,
            supplemental_data_mpda_cut: false,
            supplemental_data_base_tilt_cut: false,
            reserved: 0,
        },
        ElevationDataBlock {
            elevation_angle: 0.008436894333371027,
            channel_configuration: SZ2Phase,
            waveform_type: CDW,
            super_resolution_control_raw: 7,
            super_resolution_control_half_degree_azimuth: true,
            super_resolution_control_quarter_km_reflectivity: true,
            super_resolution_control_doppler_to_300km: true,
            super_resolution_control_dual_polarization_to_300km: false,
            surveillance_prf_number: 0,
            surveillance_prf_pulse_count_radial: 0,
            azimuth_rate: 0.252339839607188 s^-1,
            reflectivity_threshold: 3.5,
            velocity_threshold: 3.5,
            spectrum_width_threshold: 3.5,
            differential_reflectivity_threshold: 3.5,
            differential_phase_threshold: 3.5,
            correlation_coefficient_threshold: 3.5,
            sector_1_edge_angle: 0.5238544390629465,
            sector_1_doppler_prf_number: 4,
            sector_1_doppler_prf_pulse_count_radial: 64,
            sector_2_edge_angle: 3.6654470926527396,
            sector_2_doppler_prf_number: 4,
            sector_2_doppler_prf_pulse_count_radial: 64,
            sector_3_edge_angle: 5.846767773026121,
            sector_3_doppler_prf_number: 4,
            sector_3_doppler_prf_pulse_count_radial: 64,
            ebc_angle: 0.0,
            supplemental_data: 0,
            supplemental_data_sails_cut: false,
            supplemental_data_sails_sequence_number: 0,
            supplemental_data_mrle_cut: false,
            supplemental_data_mrle_sequence_number: 0,
            supplemental_data_mpda_cut: false,
            supplemental_data_base_tilt_cut: false,
            reserved: 0,
        },
        ElevationDataBlock {
            elevation_angle: 0.015339807878856412,
            channel_configuration: SZ2Phase,
            waveform_type: CS,
            super_resolution_control_raw: 11,
            super_resolution_control_half_degree_azimuth: true,
            super_resolution_control_quarter_km_reflectivity: true,
            super_resolution_control_doppler_to_300km: false,
            super_resolution_control_dual_polarization_to_300km: true,
            surveillance_prf_number: 1,
            surveillance_prf_pulse_count_radial: 15,
            azimuth_rate: 0.3691141270849824 s^-1,
            reflectivity_threshold: 2.0,
            velocity_threshold: 2.0,
            spectrum_width_threshold: 2.0,
            differential_reflectivity_threshold: 2.0,
            differential_phase_threshold: 2.0,
            correlation_coefficient_threshold: 2.0,
            sector_1_edge_angle: 0.0,
            sector_1_doppler_prf_number: 0,
            sector_1_doppler_prf_pulse_count_radial: 0,
            sector_2_edge_angle: 0.0,
            sector_2_doppler_prf_number: 0,
            sector_2_doppler_prf_pulse_count_radial: 0,
            sector_3_edge_angle: 0.0,
            sector_3_doppler_prf_number: 0,
            sector_3_doppler_prf_pulse_count_radial: 0,
            ebc_angle: 0.0,
            supplemental_data: 0,
            supplemental_data_sails_cut: false,
            supplemental_data_sails_sequence_number: 0,
            supplemental_data_mrle_cut: false,
            supplemental_data_mrle_sequence_number: 0,
            supplemental_data_mpda_cut: false,
            supplemental_data_base_tilt_cut: false,
            reserved: 0,
        },
        ElevationDataBlock {
            elevation_angle: 0.015339807878856412,
            channel_configuration: SZ2Phase,
            waveform_type: CDW,
            super_resolution_control_raw: 7,
            super_resolution_control_half_degree_azimuth: true,
            super_resolution_control_quarter_km_reflectivity: true,
            super_resolution_control_doppler_to_300km: true,
            super_resolution_control_dual_polarization_to_300km: false,
            surveillance_prf_number: 0,
            surveillance_prf_pulse_count_radial: 0,
            azimuth_rate: 0.252339839607188 s^-1,
            reflectivity_threshold: 3.5,
            velocity_threshold: 3.5,
            spectrum_width_threshold: 3.5,
            differential_reflectivity_threshold: 3.5,
            differential_phase_threshold: 3.5,
            correlation_coefficient_threshold: 3.5,
            sector_1_edge_angle: 0.5238544390629465,
            sector_1_doppler_prf_number: 4,
            sector_1_doppler_prf_pulse_count_radial: 64,
            sector_2_edge_angle: 3.6654470926527396,
            sector_2_doppler_prf_number: 4,
            sector_2_doppler_prf_pulse_count_radial: 64,
            sector_3_edge_angle: 5.846767773026121,
            sector_3_doppler_prf_number: 4,
            sector_3_doppler_prf_pulse_count_radial: 64,
            ebc_angle: 0.0,
            supplemental_data: 0,
            supplemental_data_sails_cut: false,
            supplemental_data_sails_sequence_number: 0,
            supplemental_data_mrle_cut: false,
            supplemental_data_mrle_sequence_number: 0,
            supplemental_data_mpda_cut: false,
            supplemental_data_base_tilt_cut: false,
            reserved: 0,
        },
        ElevationDataBlock {
            elevation_angle: 0.02300971181828462,
            channel_configuration: SZ2Phase,
            waveform_type: CS,
            super_resolution_control_raw: 11,
            super_resolution_control_half_degree_azimuth: true,
            super_resolution_control_quarter_km_reflectivity: true,
            super_resolution_control_doppler_to_300km: false,
            super_resolution_control_dual_polarization_to_300km: true,
            surveillance_prf_number: 2,
            surveillance_prf_pulse_count_radial: 15,
            azimuth_rate: 0.401902966426038 s^-1,
            reflectivity_threshold: 2.0,
            velocity_threshold: 2.0,
            spectrum_width_threshold: 2.0,
            differential_reflectivity_threshold: 2.0,
            differential_phase_threshold: 2.0,
            correlation_coefficient_threshold: 2.0,
            sector_1_edge_angle: 0.0,
            sector_1_doppler_prf_number: 0,
            sector_1_doppler_prf_pulse_count_radial: 0,
            sector_2_edge_angle: 0.0,
            sector_2_doppler_prf_number: 0,
            sector_2_doppler_prf_pulse_count_radial: 0,
            sector_3_edge_angle: 0.0,
            sector_3_doppler_prf_number: 0,
            sector_3_doppler_prf_pulse_count_radial: 0,
            ebc_angle: 0.0,
            supplemental_data: 0,
            supplemental_data_sails_cut: false,
            supplemental_data_sails_sequence_number: 0,
            supplemental_data_mrle_cut: false,
            supplemental_data_mrle_sequence_number: 0,
            supplemental_data_mpda_cut: false,
            supplemental_data_base_tilt_cut: false,
            reserved: 0,
        },
        ElevationDataBlock {
            elevation_angle: 0.02300971181828462,
            channel_configuration: SZ2Phase,
            waveform_type: CDW,
            super_resolution_control_raw: 7,
            super_resolution_control_half_degree_azimuth: true,
            super_resolution_control_quarter_km_reflectivity: true,
            super_resolution_control_doppler_to_300km: true,
            super_resolution_control_dual_polarization_to_300km: false,
            surveillance_prf_number: 0,
            surveillance_prf_pulse_count_radial: 0,
            azimuth_rate: 0.252339839607188 s^-1,
            reflectivity_threshold: 3.5,
            velocity_threshold: 3.5,
            spectrum_width_threshold: 3.5,
            differential_reflectivity_threshold: 3.5,
            differential_phase_threshold: 3.5,
            correlation_coefficient_threshold: 3.5,
            sector_1_edge_angle: 0.5238544390629465,
            sector_1_doppler_prf_number: 4,
            sector_1_doppler_prf_pulse_count_radial: 64,
            sector_2_edge_angle: 3.6654470926527396,
            sector_2_doppler_prf_number: 4,
            sector_2_doppler_prf_pulse_count_radial: 64,
            sector_3_edge_angle: 5.846767773026121,
            sector_3_doppler_prf_number: 4,
            sector_3_doppler_prf_pulse_count_radial: 64,
            ebc_angle: 0.0,
            supplemental_data: 0,
            supplemental_data_sails_cut: false,
            supplemental_data_sails_sequence_number: 0,
            supplemental_data_mrle_cut: false,
            supplemental_data_mrle_sequence_number: 0,
            supplemental_data_mpda_cut: false,
            supplemental_data_base_tilt_cut: false,
            reserved: 0,
        },
        ElevationDataBlock {
            elevation_angle: 0.03144660615165564,
            channel_configuration: ConstantPhase,
            waveform_type: B,
            super_resolution_control_raw: 14,
            super_resolution_control_half_degree_azimuth: false,
            super_resolution_control_quarter_km_reflectivity: true,
            super_resolution_control_doppler_to_300km: true,
            super_resolution_control_dual_polarization_to_300km: true,
            surveillance_prf_number: 3,
            surveillance_prf_pulse_count_radial: 3,
            azimuth_rate: 0.4605777315626638 s^-1,
            reflectivity_threshold: 3.5,
            velocity_threshold: 3.5,
            spectrum_width_threshold: 3.5,
            differential_reflectivity_threshold: 3.5,
            differential_phase_threshold: 3.5,
            correlation_coefficient_threshold: 3.5,
            sector_1_edge_angle: 0.5238544390629465,
            sector_1_doppler_prf_number: 4,
            sector_1_doppler_prf_pulse_count_radial: 26,
            sector_2_edge_angle: 3.6654470926527396,
            sector_2_doppler_prf_number: 4,
            sector_2_doppler_prf_pulse_count_radial: 26,
            sector_3_edge_angle: 5.846767773026121,
            sector_3_doppler_prf_number: 4,
            sector_3_doppler_prf_pulse_count_radial: 26,
            ebc_angle: 0.0,
            supplemental_data: 0,
            supplemental_data_sails_cut: false,
            supplemental_data_sails_sequence_number: 0,
            supplemental_data_mrle_cut: false,
            supplemental_data_mrle_sequence_number: 0,
            supplemental_data_mpda_cut: false,
            supplemental_data_base_tilt_cut: false,
            reserved: 0,
        },
        ElevationDataBlock {
            elevation_angle: 0.042184471666855135,
            channel_configuration: ConstantPhase,
            waveform_type: B,
            super_resolution_control_raw: 14,
            super_resolution_control_half_degree_azimuth: false,
            super_resolution_control_quarter_km_reflectivity: true,
            super_resolution_control_doppler_to_300km: true,
            super_resolution_control_dual_polarization_to_300km: true,
            surveillance_prf_number: 4,
            surveillance_prf_pulse_count_radial: 3,
            azimuth_rate: 0.4770680250324344 s^-1,
            reflectivity_threshold: 3.5,
            velocity_threshold: 3.5,
            spectrum_width_threshold: 3.5,
            differential_reflectivity_threshold: 3.5,
            differential_phase_threshold: 3.5,
            correlation_coefficient_threshold: 3.5,
            sector_1_edge_angle: 0.5238544390629465,
            sector_1_doppler_prf_number: 4,
            sector_1_doppler_prf_pulse_count_radial: 26,
            sector_2_edge_angle: 3.6654470926527396,
            sector_2_doppler_prf_number: 4,
            sector_2_doppler_prf_pulse_count_radial: 26,
            sector_3_edge_angle: 5.846767773026121,
            sector_3_doppler_prf_number: 4,
            sector_3_doppler_prf_pulse_count_radial: 26,
            ebc_angle: 0.0,
            supplemental_data: 0,
            supplemental_data_sails_cut: false,
            supplemental_data_sails_sequence_number: 0,
            supplemental_data_mrle_cut: false,
            supplemental_data_mrle_sequence_number: 0,
            supplemental_data_mpda_cut: false,
            supplemental_data_base_tilt_cut: false,
            reserved: 0,
        },
        ElevationDataBlock {
            elevation_angle: 0.054456317969940264,
            channel_configuration: ConstantPhase,
            waveform_type: B,
            super_resolution_control_raw: 14,
            super_resolution_control_half_degree_azimuth: false,
            super_resolution_control_quarter_km_reflectivity: true,
            super_resolution_control_doppler_to_300km: true,
            super_resolution_control_dual_polarization_to_300km: true,
            surveillance_prf_number: 5,
            surveillance_prf_pulse_count_radial: 3,
            azimuth_rate: 0.49259958050977654 s^-1,
            reflectivity_threshold: 3.5,
            velocity_threshold: 3.5,
            spectrum_width_threshold: 3.5,
            differential_reflectivity_threshold: 3.5,
            differential_phase_threshold: 3.5,
            correlation_coefficient_threshold: 3.5,
            sector_1_edge_angle: 0.5238544390629465,
            sector_1_doppler_prf_number: 4,
            sector_1_doppler_prf_pulse_count_radial: 26,
            sector_2_edge_angle: 3.6654470926527396,
            sector_2_doppler_prf_number: 4,
            sector_2_doppler_prf_pulse_count_radial: 26,
            sector_3_edge_angle: 5.846767773026121,
            sector_3_doppler_prf_number: 4,
            sector_3_doppler_prf_pulse_count_radial: 26,
            ebc_angle: 0.0,
            supplemental_data: 0,
            supplemental_data_sails_cut: false,
            supplemental_data_sails_sequence_number: 0,
            supplemental_data_mrle_cut: false,
            supplemental_data_mrle_sequence_number: 0,
            supplemental_data_mpda_cut: false,
            supplemental_data_base_tilt_cut: false,
            reserved: 0,
        },
        ElevationDataBlock {
            elevation_angle: 0.06979612584879667,
            channel_configuration: ConstantPhase,
            waveform_type: B,
            super_resolution_control_raw: 14,
            super_resolution_control_half_degree_azimuth: false,
            super_resolution_control_quarter_km_reflectivity: true,
            super_resolution_control_doppler_to_300km: true,
            super_resolution_control_dual_polarization_to_300km: true,
            surveillance_prf_number: 6,
            surveillance_prf_pulse_count_radial: 3,
            azimuth_rate: 0.46076947916114946 s^-1,
            reflectivity_threshold: 3.5,
            velocity_threshold: 3.5,
            spectrum_width_threshold: 3.5,
            differential_reflectivity_threshold: 3.5,
            differential_phase_threshold: 3.5,
            correlation_coefficient_threshold: 3.5,
            sector_1_edge_angle: 0.5238544390629465,
            sector_1_doppler_prf_number: 4,
            sector_1_doppler_prf_pulse_count_radial: 27,
            sector_2_edge_angle: 3.6654470926527396,
            sector_2_doppler_prf_number: 4,
            sector_2_doppler_prf_pulse_count_radial: 27,
            sector_3_edge_angle: 5.846767773026121,
            sector_3_doppler_prf_number: 4,
            sector_3_doppler_prf_pulse_count_radial: 27,
            ebc_angle: 0.0,
            supplemental_data: 0,
            supplemental_data_sails_cut: false,
            supplemental_data_sails_sequence_number: 0,
            supplemental_data_mrle_cut: false,
            supplemental_data_mrle_sequence_number: 0,
            supplemental_data_mpda_cut: false,
            supplemental_data_base_tilt_cut: false,
            reserved: 0,
        },
        ElevationDataBlock {
            elevation_angle: 0.08897088569736719,
            channel_configuration: ConstantPhase,
            waveform_type: B,
            super_resolution_control_raw: 14,
            super_resolution_control_half_degree_azimuth: false,
            super_resolution_control_quarter_km_reflectivity: true,
            super_resolution_control_doppler_to_300km: true,
            super_resolution_control_dual_polarization_to_300km: true,
            surveillance_prf_number: 6,
            surveillance_prf_pulse_count_radial: 3,
            azimuth_rate: 0.46076947916114946 s^-1,
            reflectivity_threshold: 3.5,
            velocity_threshold: 3.5,
            spectrum_width_threshold: 3.5,
            differential_reflectivity_threshold: 3.5,
            differential_phase_threshold: 3.5,
            correlation_coefficient_threshold: 3.5,
            sector_1_edge_angle: 0.5238544390629465,
            sector_1_doppler_prf_number: 4,
            sector_1_doppler_prf_pulse_count_radial: 28,
            sector_2_edge_angle: 3.6654470926527396,
            sector_2_doppler_prf_number: 4,
            sector_2_doppler_prf_pulse_count_radial: 28,
            sector_3_edge_angle: 5.846767773026121,
            sector_3_doppler_prf_number: 4,
            sector_3_doppler_prf_pulse_count_radial: 28,
            ebc_angle: 0.0,
            supplemental_data: 0,
            supplemental_data_sails_cut: false,
            supplemental_data_sails_sequence_number: 0,
            supplemental_data_mrle_cut: false,
            supplemental_data_mrle_sequence_number: 0,
            supplemental_data_mpda_cut: false,
            supplemental_data_base_tilt_cut: false,
            reserved: 0,
        },
        ElevationDataBlock {
            elevation_angle: 0.008436894333371027,
            channel_configuration: SZ2Phase,
            waveform_type: CS,
            super_resolution_control_raw: 11,
            super_resolution_control_half_degree_azimuth: true,
            super_resolution_control_quarter_km_reflectivity: true,
            super_resolution_control_doppler_to_300km: false,
            super_resolution_control_dual_polarization_to_300km: true,
            surveillance_prf_number: 1,
            surveillance_prf_pulse_count_radial: 15,
            azimuth_rate: 0.3691141270849824 s^-1,
            reflectivity_threshold: 2.0,
            velocity_threshold: 2.0,
            spectrum_width_threshold: 2.0,
            differential_reflectivity_threshold: 2.0,
            differential_phase_threshold: 2.0,
            correlation_coefficient_threshold: 2.0,
            sector_1_edge_angle: 0.0,
            sector_1_doppler_prf_number: 0,
            sector_1_doppler_prf_pulse_count_radial: 0,
            sector_2_edge_angle: 0.0,
            sector_2_doppler_prf_number: 0,
            sector_2_doppler_prf_pulse_count_radial: 0,
            sector_3_edge_angle: 0.0,
            sector_3_doppler_prf_number: 0,
            sector_3_doppler_prf_pulse_count_radial: 0,
            ebc_angle: 0.0,
            supplemental_data: 48,
            supplemental_data_sails_cut: false,
            supplemental_data_sails_sequence_number: 0,
            supplemental_data_mrle_cut: true,
            supplemental_data_mrle_sequence_number: 1,
            supplemental_data_mpda_cut: false,
            supplemental_data_base_tilt_cut: false,
            reserved: 0,
        },
        ElevationDataBlock {
            elevation_angle: 0.008436894333371027,
            channel_configuration: SZ2Phase,
            waveform_type: CDW,
            super_resolution_control_raw: 7,
            super_resolution_control_half_degree_azimuth: true,
            super_resolution_control_quarter_km_reflectivity: true,
            super_resolution_control_doppler_to_300km: true,
            super_resolution_control_dual_polarization_to_300km: false,
            surveillance_prf_number: 0,
            surveillance_prf_pulse_count_radial: 0,
            azimuth_rate: 0.252339839607188 s^-1,
            reflectivity_threshold: 3.5,
            velocity_threshold: 3.5,
            spectrum_width_threshold: 3.5,
            differential_reflectivity_threshold: 3.5,
            differential_phase_threshold: 3.5,
            correlation_coefficient_threshold: 3.5,
            sector_1_edge_angle: 0.5238544390629465,
            sector_1_doppler_prf_number: 4,
            sector_1_doppler_prf_pulse_count_radial: 64,
            sector_2_edge_angle: 3.6654470926527396,
            sector_2_doppler_prf_number: 4,
            sector_2_doppler_prf_pulse_count_radial: 64,
            sector_3_edge_angle: 5.846767773026121,
            sector_3_doppler_prf_number: 4,
            sector_3_doppler_prf_pulse_count_radial: 64,
            ebc_angle: 0.0,
            supplemental_data: 48,
            supplemental_data_sails_cut: false,
            supplemental_data_sails_sequence_number: 0,
            supplemental_data_mrle_cut: true,
            supplemental_data_mrle_sequence_number: 1,
            supplemental_data_mpda_cut: false,
            supplemental_data_base_tilt_cut: false,
            reserved: 0,
        },
        ElevationDataBlock {
            elevation_angle: 0.015339807878856412,
            channel_configuration: SZ2Phase,
            waveform_type: CS,
            super_resolution_control_raw: 11,
            super_resolution_control_half_degree_azimuth: true,
            super_resolution_control_quarter_km_reflectivity: true,
            super_resolution_control_doppler_to_300km: false,
            super_resolution_control_dual_polarization_to_300km: true,
            surveillance_prf_number: 1,
            surveillance_prf_pulse_count_radial: 15,
            azimuth_rate: 0.3691141270849824 s^-1,
            reflectivity_threshold: 2.0,
            velocity_threshold: 2.0,
            spectrum_width_threshold: 2.0,
            differential_reflectivity_threshold: 2.0,
            differential_phase_threshold: 2.0,
            correlation_coefficient_threshold: 2.0,
            sector_1_edge_angle: 0.0,
            sector_1_doppler_prf_number: 0,
            sector_1_doppler_prf_pulse_count_radial: 0,
            sector_2_edge_angle: 0.0,
            sector_2_doppler_prf_number: 0,
            sector_2_doppler_prf_pulse_count_radial: 0,
            sector_3_edge_angle: 0.0,
            sector_3_doppler_prf_number: 0,
            sector_3_doppler_prf_pulse_count_radial: 0,
            ebc_angle: 0.0,
            supplemental_data: 80,
            supplemental_data_sails_cut: false,
            supplemental_data_sails_sequence_number: 0,
            supplemental_data_mrle_cut: true,
            supplemental_data_mrle_sequence_number: 2,
            supplemental_data_mpda_cut: false,
            supplemental_data_base_tilt_cut: false,
            reserved: 0,
        },
        ElevationDataBlock {
            elevation_angle: 0.015339807878856412,
            channel_configuration: SZ2Phase,
            waveform_type: CDW,
            super_resolution_control_raw: 7,
            super_resolution_control_half_degree_azimuth: true,
            super_resolution_control_quarter_km_reflectivity: true,
            super_resolution_control_doppler_to_300km: true,
            super_resolution_control_dual_polarization_to_300km: false,
            surveillance_prf_number: 0,
            surveillance_prf_pulse_count_radial: 0,
            azimuth_rate: 0.252339839607188 s^-1,
            reflectivity_threshold: 3.5,
            velocity_threshold: 3.5,
            spectrum_width_threshold: 3.5,
            differential_reflectivity_threshold: 3.5,
            differential_phase_threshold: 3.5,
            correlation_coefficient_threshold: 3.5,
            sector_1_edge_angle: 0.5238544390629465,
            sector_1_doppler_prf_number: 4,
            sector_1_doppler_prf_pulse_count_radial: 64,
            sector_2_edge_angle: 3.6654470926527396,
            sector_2_doppler_prf_number: 4,
            sector_2_doppler_prf_pulse_count_radial: 64,
            sector_3_edge_angle: 5.846767773026121,
            sector_3_doppler_prf_number: 4,
            sector_3_doppler_prf_pulse_count_radial: 64,
            ebc_angle: 0.0,
            supplemental_data: 80,
            supplemental_data_sails_cut: false,
            supplemental_data_sails_sequence_number: 0,
            supplemental_data_mrle_cut: true,
            supplemental_data_mrle_sequence_number: 2,
            supplemental_data_mpda_cut: false,
            supplemental_data_base_tilt_cut: false,
            reserved: 0,
        },
        ElevationDataBlock {
            elevation_angle: 0.02300971181828462,
            channel_configuration: SZ2Phase,
            waveform_type: CS,
            super_resolution_control_raw: 11,
            super_resolution_control_half_degree_azimuth: true,
            super_resolution_control_quarter_km_reflectivity: true,
            super_resolution_control_doppler_to_300km: false,
            super_resolution_control_dual_polarization_to_300km: true,
            surveillance_prf_number: 2,
            surveillance_prf_pulse_count_radial: 15,
            azimuth_rate: 0.401902966426038 s^-1,
            reflectivity_threshold: 2.0,
            velocity_threshold: 2.0,
            spectrum_width_threshold: 2.0,
            differential_reflectivity_threshold: 2.0,
            differential_phase_threshold: 2.0,
            correlation_coefficient_threshold: 2.0,
            sector_1_edge_angle: 0.0,
            sector_1_doppler_prf_number: 0,
            sector_1_doppler_prf_pulse_count_radial: 0,
            sector_2_edge_angle: 0.0,
            sector_2_doppler_prf_number: 0,
            sector_2_doppler_prf_pulse_count_radial: 0,
            sector_3_edge_angle: 0.0,
            sector_3_doppler_prf_number: 0,
            sector_3_doppler_prf_pulse_count_radial: 0,
            ebc_angle: 0.0,
            supplemental_data: 112,
            supplemental_data_sails_cut: false,
            supplemental_data_sails_sequence_number: 0,
            supplemental_data_mrle_cut: true,
            supplemental_data_mrle_sequence_number: 3,
            supplemental_data_mpda_cut: false,
            supplemental_data_base_tilt_cut: false,
            reserved: 0,
        },
        ElevationDataBlock {
            elevation_angle: 0.02300971181828462,
            channel_configuration: SZ2Phase,
            waveform_type: CDW,
            super_resolution_control_raw: 7,
            super_resolution_control_half_degree_azimuth: true,
            super_resolution_control_quarter_km_reflectivity: true,
            super_resolution_control_doppler_to_300km: true,
            super_resolution_control_dual_polarization_to_300km: false,
            surveillance_prf_number: 0,
            surveillance_prf_pulse_count_radial: 0,
            azimuth_rate: 0.252339839607188 s^-1,
            reflectivity_threshold: 3.5,
            velocity_threshold: 3.5,
            spectrum_width_threshold: 3.5,
            differential_reflectivity_threshold: 3.5,
            differential_phase_threshold: 3.5,
            correlation_coefficient_threshold: 3.5,
            sector_1_edge_angle: 0.5238544390629465,
            sector_1_doppler_prf_number: 4,
            sector_1_doppler_prf_pulse_count_radial: 64,
            sector_2_edge_angle: 3.6654470926527396,
            sector_2_doppler_prf_number: 4,
            sector_2_doppler_prf_pulse_count_radial: 64,
            sector_3_edge_angle: 5.846767773026121,
            sector_3_doppler_prf_number: 4,
            sector_3_doppler_prf_pulse_count_radial: 64,
            ebc_angle: 0.0,
            supplemental_data: 112,
            supplemental_data_sails_cut: false,
            supplemental_data_sails_sequence_number: 0,
            supplemental_data_mrle_cut: true,
            supplemental_data_mrle_sequence_number: 3,
            supplemental_data_mpda_cut: false,
            supplemental_data_base_tilt_cut: false,
            reserved: 0,
        },
        ElevationDataBlock {
            elevation_angle: 0.11198059751565181,
            channel_configuration: ConstantPhase,
            waveform_type: B,
            super_resolution_control_raw: 14,
            super_resolution_control_half_degree_azimuth: false,
            super_resolution_control_quarter_km_reflectivity: true,
            super_resolution_control_doppler_to_300km: true,
            super_resolution_control_dual_polarization_to_300km: true,
            surveillance_prf_number: 6,
            surveillance_prf_pulse_count_radial: 3,
            azimuth_rate: 0.46076947916114946 s^-1,
            reflectivity_threshold: 3.5,
            velocity_threshold: 3.5,
            spectrum_width_threshold: 3.5,
            differential_reflectivity_threshold: 3.5,
            differential_phase_threshold: 3.5,
            correlation_coefficient_threshold: 3.5,
            sector_1_edge_angle: 0.5238544390629465,
            sector_1_doppler_prf_number: 4,
            sector_1_doppler_prf_pulse_count_radial: 28,
            sector_2_edge_angle: 3.6654470926527396,
            sector_2_doppler_prf_number: 4,
            sector_2_doppler_prf_pulse_count_radial: 28,
            sector_3_edge_angle: 5.846767773026121,
            sector_3_doppler_prf_number: 4,
            sector_3_doppler_prf_pulse_count_radial: 28,
            ebc_angle: 0.0,
            supplemental_data: 0,
            supplemental_data_sails_cut: false,
            supplemental_data_sails_sequence_number: 0,
            supplemental_data_mrle_cut: false,
            supplemental_data_mrle_sequence_number: 0,
            supplemental_data_mpda_cut: false,
            supplemental_data_base_tilt_cut: false,
            reserved: 0,
        },
        ElevationDataBlock {
            elevation_angle: 0.13959225169759334,
            channel_configuration: ConstantPhase,
            waveform_type: CDWO,
            super_resolution_control_raw: 10,
            super_resolution_control_half_degree_azimuth: false,
            super_resolution_control_quarter_km_reflectivity: true,
            super_resolution_control_doppler_to_300km: false,
            super_resolution_control_dual_polarization_to_300km: true,
            surveillance_prf_number: 0,
            surveillance_prf_pulse_count_radial: 0,
            azimuth_rate: 0.4960510372825192 s^-1,
            reflectivity_threshold: 3.5,
            velocity_threshold: 3.5,
            spectrum_width_threshold: 3.5,
            differential_reflectivity_threshold: 3.5,
            differential_phase_threshold: 3.5,
            correlation_coefficient_threshold: 3.5,
            sector_1_edge_angle: 0.5238544390629465,
            sector_1_doppler_prf_number: 6,
            sector_1_doppler_prf_pulse_count_radial: 38,
            sector_2_edge_angle: 3.6654470926527396,
            sector_2_doppler_prf_number: 6,
            sector_2_doppler_prf_pulse_count_radial: 38,
            sector_3_edge_angle: 5.846767773026121,
            sector_3_doppler_prf_number: 6,
            sector_3_doppler_prf_pulse_count_radial: 38,
            ebc_angle: 0.0,
            supplemental_data: 0,
            supplemental_data_sails_cut: false,
            supplemental_data_sails_sequence_number: 0,
            supplemental_data_mrle_cut: false,
            supplemental_data_mrle_sequence_number: 0,
            supplemental_data_mpda_cut: false,
            supplemental_data_base_tilt_cut: false,
            reserved: 0,
        },
        ElevationDataBlock {
            elevation_angle: 0.1748738098189631,
            channel_configuration: ConstantPhase,
            waveform_type: CDWO,
            super_resolution_control_raw: 10,
            super_resolution_control_half_degree_azimuth: false,
            super_resolution_control_quarter_km_reflectivity: true,
            super_resolution_control_doppler_to_300km: false,
            super_resolution_control_dual_polarization_to_300km: true,
            surveillance_prf_number: 0,
            surveillance_prf_pulse_count_radial: 0,
            azimuth_rate: 0.49585928968403353 s^-1,
            reflectivity_threshold: 3.5,
            velocity_threshold: 3.5,
            spectrum_width_threshold: 3.5,
            differential_reflectivity_threshold: 3.5,
            differential_phase_threshold: 3.5,
            correlation_coefficient_threshold: 3.5,
            sector_1_edge_angle: 0.5238544390629465,
            sector_1_doppler_prf_number: 7,
            sector_1_doppler_prf_pulse_count_radial: 41,
            sector_2_edge_angle: 3.6654470926527396,
            sector_2_doppler_prf_number: 7,
            sector_2_doppler_prf_pulse_count_radial: 41,
            sector_3_edge_angle: 5.846767773026121,
            sector_3_doppler_prf_number: 7,
            sector_3_doppler_prf_pulse_count_radial: 41,
            ebc_angle: 0.0,
            supplemental_data: 0,
            supplemental_data_sails_cut: false,
            supplemental_data_sails_sequence_number: 0,
            supplemental_data_mrle_cut: false,
            supplemental_data_mrle_sequence_number: 0,
            supplemental_data_mpda_cut: false,
            supplemental_data_base_tilt_cut: false,
            reserved: 0,
        },
        ElevationDataBlock {
            elevation_angle: 0.21782527187976106,
            channel_configuration: ConstantPhase,
            waveform_type: CDWO,
            super_resolution_control_raw: 10,
            super_resolution_control_half_degree_azimuth: false,
            super_resolution_control_quarter_km_reflectivity: true,
            super_resolution_control_doppler_to_300km: false,
            super_resolution_control_dual_polarization_to_300km: true,
            surveillance_prf_number: 0,
            surveillance_prf_pulse_count_radial: 0,
            azimuth_rate: 0.5016117176386047 s^-1,
            reflectivity_threshold: 3.5,
            velocity_threshold: 3.5,
            spectrum_width_threshold: 3.5,
            differential_reflectivity_threshold: 3.5,
            differential_phase_threshold: 3.5,
            correlation_coefficient_threshold: 3.5,
            sector_1_edge_angle: 0.5238544390629465,
            sector_1_doppler_prf_number: 8,
            sector_1_doppler_prf_pulse_count_radial: 44,
            sector_2_edge_angle: 3.6654470926527396,
            sector_2_doppler_prf_number: 8,
            sector_2_doppler_prf_pulse_count_radial: 44,
            sector_3_edge_angle: 5.846767773026121,
            sector_3_doppler_prf_number: 8,
            sector_3_doppler_prf_pulse_count_radial: 44,
            ebc_angle: 0.0,
            supplemental_data: 0,
            supplemental_data_sails_cut: false,
            supplemental_data_sails_sequence_number: 0,
            supplemental_data_mrle_cut: false,
            supplemental_data_mrle_sequence_number: 0,
            supplemental_data_mpda_cut: false,
            supplemental_data_base_tilt_cut: false,
            reserved: 0,
        },
        ElevationDataBlock {
            elevation_angle: 0.2722815898497013,
            channel_configuration: ConstantPhase,
            waveform_type: CDWO,
            super_resolution_control_raw: 10,
            super_resolution_control_half_degree_azimuth: false,
            super_resolution_control_quarter_km_reflectivity: true,
            super_resolution_control_doppler_to_300km: false,
            super_resolution_control_dual_polarization_to_300km: true,
            surveillance_prf_number: 0,
            surveillance_prf_pulse_count_radial: 0,
            azimuth_rate: 0.5016117176386047 s^-1,
            reflectivity_threshold: 3.5,
            velocity_threshold: 3.5,
            spectrum_width_threshold: 3.5,
            differential_reflectivity_threshold: 3.5,
            differential_phase_threshold: 3.5,
            correlation_coefficient_threshold: 3.5,
            sector_1_edge_angle: 0.5238544390629465,
            sector_1_doppler_prf_number: 8,
            sector_1_doppler_prf_pulse_count_radial: 44,
            sector_2_edge_angle: 3.6654470926527396,
            sector_2_doppler_prf_number: 8,
            sector_2_doppler_prf_pulse_count_radial: 44,
            sector_3_edge_angle: 5.846767773026121,
            sector_3_doppler_prf_number: 8,
            sector_3_doppler_prf_pulse_count_radial: 44,
            ebc_angle: 0.0,
            supplemental_data: 0,
            supplemental_data_sails_cut: false,
            supplemental_data_sails_sequence_number: 0,
            supplemental_data_mrle_cut: false,
            supplemental_data_mrle_sequence_number: 0,
            supplemental_data_mpda_cut: false,
            supplemental_data_base_tilt_cut: false,
            reserved: 0,
        },
        ElevationDataBlock {
            elevation_angle: 0.34054373491061235,
            channel_configuration: ConstantPhase,
            waveform_type: CDWO,
            super_resolution_control_raw: 10,
            super_resolution_control_half_degree_azimuth: false,
            super_resolution_control_quarter_km_reflectivity: true,
            super_resolution_control_doppler_to_300km: false,
            super_resolution_control_dual_polarization_to_300km: true,
            surveillance_prf_number: 0,
            surveillance_prf_pulse_count_radial: 0,
            azimuth_rate: 0.5016117176386047 s^-1,
            reflectivity_threshold: 3.5,
            velocity_threshold: 3.5,
            spectrum_width_threshold: 3.5,
            differential_reflectivity_threshold: 3.5,
            differential_phase_threshold: 3.5,
            correlation_coefficient_threshold: 3.5,
            sector_1_edge_angle: 0.5238544390629465,
            sector_1_doppler_prf_number: 8,
            sector_1_doppler_prf_pulse_count_radial: 44,
            sector_2_edge_angle: 3.6654470926527396,
            sector_2_doppler_prf_number: 8,
            sector_2_doppler_prf_pulse_count_radial: 44,
            sector_3_edge_angle: 5.846767773026121,
            sector_3_doppler_prf_number: 8,
            sector_3_doppler_prf_pulse_count_radial: 44,
            ebc_angle: 0.0,
            supplemental_data: 0,
            supplemental_data_sails_cut: false,
            supplemental_data_sails_sequence_number: 0,
            supplemental_data_mrle_cut: false,
            supplemental_data_mrle_sequence_number: 0,
            supplemental_data_mpda_cut: false,
            supplemental_data_base_tilt_cut: false,
            reserved: 0,
        },
    ],
}

@jtfedd jtfedd changed the title Implement Message Type 5 Implement Message Type 5 (Volume Coverage Pattern) Dec 28, 2024
Copy link
Owner

@danielway danielway left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Really great work on this! This message has some interesting encodings and your logic matches the ICD well. The only "blocking" issue is around uom types in the API not being gated by that feature (which CI is reflecting now that I've run it; it will build and generate docs for every permutation of possible features to check that feature gating is correct), and I've included some minor suggestions too.

Please let me know if you don't have time or interest to make those edits: I would be happy to for you.

Comment on lines 28 to 32
CS, // Contiguous Surveillance
CDW, // Contiguous Doppler with Ambiguity Resolution
CDWO, // Contiguous Doppler without Ambiguity Resolution
B, // Batch
SPP, // Staggered Pulse Pair
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could document these strings:

Suggested change
CS, // Contiguous Surveillance
CDW, // Contiguous Doppler with Ambiguity Resolution
CDWO, // Contiguous Doppler without Ambiguity Resolution
B, // Batch
SPP, // Staggered Pulse Pair
/// Contiguous Surveillance
CS,
/// Contiguous Doppler with Ambiguity Resolution
CDW,
/// Contiguous Doppler without Ambiguity Resolution
CDWO,
/// Batch
B,
/// Staggered Pulse Pair
SPP,

Comment on lines 7 to 12
#[cfg(feature = "uom")]
use uom::si::angle::degree;
#[cfg(feature = "uom")]
use uom::si::angular_velocity::degree_per_second;
#[cfg(feature = "uom")]
use uom::si::f64::{Angle, AngularVelocity};
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These can be combined behind a single feature flag:

Suggested change
#[cfg(feature = "uom")]
use uom::si::angle::degree;
#[cfg(feature = "uom")]
use uom::si::angular_velocity::degree_per_second;
#[cfg(feature = "uom")]
use uom::si::f64::{Angle, AngularVelocity};
#[cfg(feature = "uom")]
use uom::si::{
angle::degree,
angular_velocity::degree_per_second,
f64::{Angle, AngularVelocity},
};


impl ElevationDataBlock {
/// The elevation angle for this cut
pub fn elevation_angle(&self) -> Angle {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think any functions returning uom types will need to be gated by a feature flag to omit them from builds without the feature.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You might notice in some other message types I included a non-uom variant of functions like these with their native representation, in case a consumer either doesn't want to include uom as a dependency or doesn't want to do the conversion work.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oops, good catch. I tried to gate the uom stuff but my ide was not very helpful pointing it out...

Comment on lines 275 to 276
#[cfg(not(feature = "uom"))]
impl Debug for ElevationDataBlock {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As these structs have gotten larger and larger, I've started moving towards a pattern where I conditionally add to the debug struct rather than having two variants. It might be less work and reduce the risk of adding a new field to one representation and not the other.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh yeah, that could clean this up a lot.

@jtfedd jtfedd requested a review from danielway December 31, 2024 21:02
Copy link
Owner

@danielway danielway left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great work, thanks for contributing it!

@danielway danielway merged commit 2b1b138 into danielway:main Dec 31, 2024
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants