#[cfg(feature = "python")]
use pyo3::prelude::*;
use serde::Serialize;
#[derive(Debug, PartialEq, Eq, Hash, Serialize, Clone)]
#[cfg_attr(
feature = "python",
pyclass(frozen, eq, hash, module = "otdrs", get_all)
)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub struct BlockInfo {
pub identifier: String,
pub revision_number: u16,
pub size: i32,
}
#[derive(Debug, PartialEq, Eq, Hash, Serialize, Clone)]
#[cfg_attr(
feature = "python",
pyclass(frozen, eq, hash, module = "otdrs", get_all)
)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub struct MapBlock {
pub revision_number: u16,
pub block_size: i32,
pub block_count: i16,
pub block_info: Vec<BlockInfo>,
}
#[derive(Debug, PartialEq, Eq, Hash, Serialize, Clone)]
#[cfg_attr(
feature = "python",
pyclass(frozen, eq, hash, module = "otdrs", get_all)
)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub struct GeneralParametersBlock {
pub language_code: String,
pub cable_id: String,
pub fiber_id: String,
pub fiber_type: i16,
pub nominal_wavelength: i16,
pub originating_location: String,
pub terminating_location: String,
pub cable_code: String,
pub current_data_flag: String,
pub user_offset: i32,
pub user_offset_distance: i32,
pub operator: String,
pub comment: String,
}
#[derive(Debug, PartialEq, Serialize, Clone)]
#[cfg_attr(feature = "python", pyclass(frozen, eq, module = "otdrs", get_all))]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub struct SupplierParametersBlock {
pub supplier_name: String,
pub otdr_mainframe_id: String,
pub otdr_mainframe_sn: String,
pub optical_module_id: String,
pub optical_module_sn: String,
pub software_revision: String,
pub other: String,
}
#[derive(Debug, PartialEq, Serialize, Clone)]
#[cfg_attr(feature = "python", pyclass(frozen, eq, module = "otdrs", get_all))]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub struct FixedParametersBlock {
pub date_time_stamp: u32,
pub units_of_distance: String,
pub actual_wavelength: i16,
pub acquisition_offset: i32,
pub acquisition_offset_distance: i32,
pub total_n_pulse_widths_used: i16,
pub pulse_widths_used: Vec<i16>,
pub data_spacing: Vec<i32>,
pub n_data_points_for_pulse_widths_used: Vec<i32>,
pub group_index: i32,
pub backscatter_coefficient: i16,
pub number_of_averages: i32,
pub averaging_time: u16,
pub acquisition_range: i32,
pub acquisition_range_distance: i32,
pub front_panel_offset: i32,
pub noise_floor_level: u16,
pub noise_floor_scale_factor: i16,
pub power_offset_first_point: u16,
pub loss_threshold: u16,
pub reflectance_threshold: u16,
pub end_of_fibre_threshold: u16,
pub trace_type: String,
pub window_coordinate_1: i32,
pub window_coordinate_2: i32,
pub window_coordinate_3: i32,
pub window_coordinate_4: i32,
}
#[derive(Debug, PartialEq, Serialize, Clone)]
#[cfg_attr(feature = "python", pyclass(frozen, eq, module = "otdrs", get_all))]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub struct KeyEvent {
pub event_number: i16,
pub event_propogation_time: i32,
pub attenuation_coefficient_lead_in_fiber: i16,
pub event_loss: i16,
pub event_reflectance: i32,
pub event_code: String,
pub loss_measurement_technique: String,
pub marker_location_1: i32,
pub marker_location_2: i32,
pub marker_location_3: i32,
pub marker_location_4: i32,
pub marker_location_5: i32,
pub comment: String,
}
#[derive(Debug, PartialEq, Serialize, Clone)]
#[cfg_attr(feature = "python", pyclass(frozen, eq, module = "otdrs", get_all))]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub struct LastKeyEvent {
pub event_number: i16,
pub event_propogation_time: i32,
pub attenuation_coefficient_lead_in_fiber: i16,
pub event_loss: i16,
pub event_reflectance: i32,
pub event_code: String,
pub loss_measurement_technique: String,
pub marker_location_1: i32,
pub marker_location_2: i32,
pub marker_location_3: i32,
pub marker_location_4: i32,
pub marker_location_5: i32,
pub comment: String,
pub end_to_end_loss: i32,
pub end_to_end_marker_position_1: i32,
pub end_to_end_marker_position_2: i32,
pub optical_return_loss: u16,
pub optical_return_loss_marker_position_1: i32,
pub optical_return_loss_marker_position_2: i32,
}
#[derive(Debug, PartialEq, Serialize, Clone)]
#[cfg_attr(feature = "python", pyclass(frozen, eq, module = "otdrs", get_all))]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub struct KeyEvents {
pub number_of_key_events: i16,
pub key_events: Vec<KeyEvent>,
pub last_key_event: LastKeyEvent,
}
#[derive(Debug, PartialEq, Serialize, Clone)]
#[cfg_attr(feature = "python", pyclass(frozen, eq, module = "otdrs", get_all))]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub struct Landmark {
pub landmark_number: i16,
pub landmark_code: String,
pub landmark_location: i32,
pub related_event_number: i16,
pub gps_longitude: i32,
pub gps_latitude: i32,
pub fiber_correction_factor_lead_in_fiber: i16,
pub sheath_marker_entering_landmark: i32,
pub sheath_marker_leaving_landmark: i32,
pub units_of_sheath_marks_leaving_landmark: String,
pub mode_field_diameter_leaving_landmark: i16,
pub comment: String,
}
#[derive(Debug, PartialEq, Serialize, Clone)]
#[cfg_attr(feature = "python", pyclass(frozen, eq, module = "otdrs", get_all))]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub struct DataPointsAtScaleFactor {
pub n_points: i32,
pub scale_factor: i16,
pub data: Vec<u16>,
}
#[derive(Debug, PartialEq, Serialize, Clone)]
#[cfg_attr(feature = "python", pyclass(frozen, eq, module = "otdrs", get_all))]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub struct DataPoints {
pub number_of_data_points: i32,
pub total_number_scale_factors_used: i16,
pub scale_factors: Vec<DataPointsAtScaleFactor>,
}
#[derive(Debug, PartialEq, Serialize, Clone)]
#[cfg_attr(feature = "python", pyclass(frozen, eq, module = "otdrs", get_all))]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub struct LinkParameters {
pub number_of_landmarks: i16,
pub landmarks: Vec<Landmark>,
}
#[derive(Debug, PartialEq, Serialize, Clone)]
#[cfg_attr(feature = "python", pyclass(frozen, eq, module = "otdrs", get_all))]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub struct ProprietaryBlock {
pub header: String,
pub data: Vec<u8>,
}
#[derive(Debug, PartialEq, Serialize, Clone)]
#[cfg_attr(feature = "python", pyclass(frozen, eq, module = "otdrs", get_all))]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub struct ChecksumBlock {
pub checksum: i16,
}
#[derive(Debug, PartialEq, Serialize, Clone)]
#[cfg_attr(feature = "python", pyclass(frozen, eq, module = "otdrs", get_all))]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub struct SORFile {
pub map: MapBlock,
pub general_parameters: Option<GeneralParametersBlock>,
pub supplier_parameters: Option<SupplierParametersBlock>,
pub fixed_parameters: Option<FixedParametersBlock>,
pub key_events: Option<KeyEvents>,
pub link_parameters: Option<LinkParameters>,
pub data_points: Option<DataPoints>,
pub proprietary_blocks: Vec<ProprietaryBlock>,
pub checksum: Option<ChecksumBlock>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "python", pyclass(frozen, eq, module = "otdrs", get_all))]
pub enum ChecksumStatus {
Missing,
Valid,
Mismatch,
Error,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "python", pyclass(frozen, eq, module = "otdrs", get_all))]
pub enum ChecksumStrategy {
PrecedingBytes,
WholeFileChecksumZeroed,
WholeFileExcludingBlock,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "python", pyclass(frozen, eq, module = "otdrs", get_all))]
pub struct ChecksumValidationResult {
pub status: ChecksumStatus,
pub stored: Option<u16>,
pub matched: Option<u16>,
pub matched_by: Option<ChecksumStrategy>,
}