Parse Performance/Maintenance Data (Message Type 3)

This commit is contained in:
Dan Paulat 2021-06-19 15:58:36 -05:00
parent e440d8c657
commit 2fc12d44db
10 changed files with 2854 additions and 86 deletions

View file

@ -2,6 +2,18 @@
#include <scwx/wsr88d/rda/message_header.hpp> #include <scwx/wsr88d/rda/message_header.hpp>
#include <array>
#include <execution>
#include <istream>
#include <map>
#include <string>
#ifdef WIN32
# include <WinSock2.h>
#else
# include <arpa/inet.h>
#endif
namespace scwx namespace scwx
{ {
namespace wsr88d namespace wsr88d
@ -22,7 +34,54 @@ protected:
Message(Message&&) noexcept; Message(Message&&) noexcept;
Message& operator=(Message&&) noexcept; Message& operator=(Message&&) noexcept;
bool ValidateSize(std::istream& is, size_t bytesRead) const; bool ValidateMessage(std::istream& is, size_t bytesRead) const;
static void ReadBoolean(std::istream& is, bool& value)
{
std::string data(4, ' ');
is.read(reinterpret_cast<char*>(&data[0]), 4);
value = (data.at(0) == 'T');
}
static void ReadChar(std::istream& is, char& value)
{
std::string data(4, ' ');
is.read(reinterpret_cast<char*>(&data[0]), 4);
value = data.at(0);
}
static float SwapFloat(float f)
{
return ntohf(*reinterpret_cast<uint32_t*>(&f));
}
template<size_t _Size>
static void SwapFloatArray(std::array<float, _Size>& arr)
{
std::transform(std::execution::par_unseq,
arr.begin(),
arr.end(),
arr.begin(),
[](float f) { return SwapFloat(f); });
}
template<size_t _Size>
static void SwapUInt16Array(std::array<uint16_t, _Size>& arr)
{
std::transform(std::execution::par_unseq,
arr.begin(),
arr.end(),
arr.begin(),
[](uint16_t u) { return ntohs(u); });
}
template<typename T>
static void SwapFloatMap(std::map<T, float>& m)
{
std::for_each(std::execution::par_unseq, m.begin(), m.end(), [](auto& p) {
p.second = SwapFloat(p.second);
});
}
public: public:
virtual ~Message(); virtual ~Message();

View file

@ -0,0 +1,290 @@
#pragma once
#include <scwx/wsr88d/rda/message.hpp>
namespace scwx
{
namespace wsr88d
{
namespace rda
{
class PerformanceMaintenanceDataImpl;
class PerformanceMaintenanceData : public Message
{
public:
explicit PerformanceMaintenanceData();
~PerformanceMaintenanceData();
PerformanceMaintenanceData(const Message&) = delete;
PerformanceMaintenanceData&
operator=(const PerformanceMaintenanceData&) = delete;
PerformanceMaintenanceData(PerformanceMaintenanceData&&) noexcept;
PerformanceMaintenanceData& operator=(PerformanceMaintenanceData&&) noexcept;
uint16_t loop_back_set_status() const;
uint32_t t1_output_frames() const;
uint32_t t1_input_frames() const;
uint32_t router_memory_used() const;
uint32_t router_memory_free() const;
uint16_t router_memory_utilization() const;
uint16_t route_to_rpg() const;
uint32_t csu_loss_of_signal() const;
uint32_t csu_loss_of_frames() const;
uint32_t csu_yellow_alarms() const;
uint32_t csu_blue_alarms() const;
uint32_t csu_24hr_errored_seconds() const;
uint32_t csu_24hr_severely_errored_seconds() const;
uint32_t csu_24hr_severely_errored_framing_seconds() const;
uint32_t csu_24hr_unavailable_seconds() const;
uint32_t csu_24hr_controlled_slip_seconds() const;
uint32_t csu_24hr_path_coding_violations() const;
uint32_t csu_24hr_line_errored_seconds() const;
uint32_t csu_24hr_bursty_errored_seconds() const;
uint32_t csu_24hr_degraded_minutes() const;
uint32_t lan_switch_cpu_utilization() const;
uint16_t lan_switch_memory_utilization() const;
uint16_t ifdr_chasis_temperature() const;
uint16_t ifdr_fpga_temperature() const;
int32_t gps_satellites() const;
uint16_t ipc_status() const;
uint16_t commanded_channel_control() const;
uint16_t polarization() const;
float ame_internal_temperature() const;
float ame_receiver_module_temperature() const;
float ame_bite_cal_module_temperature() const;
uint16_t ame_peltier_pulse_width_modulation() const;
uint16_t ame_peltier_status() const;
uint16_t ame_a_d_converter_status() const;
uint16_t ame_state() const;
float ame_3_3v_ps_voltage() const;
float ame_5v_ps_voltage() const;
float ame_6_5v_ps_voltage() const;
float ame_15v_ps_voltage() const;
float ame_48v_ps_voltage() const;
float ame_stalo_power() const;
float peltier_current() const;
float adc_calibration_reference_voltage() const;
uint16_t ame_mode() const;
uint16_t ame_peltier_mode() const;
float ame_peltier_inside_fan_current() const;
float ame_peltier_outside_fan_current() const;
float horizontal_tr_limiter_voltage() const;
float vertical_tr_limiter_voltage() const;
float adc_calibration_offset_voltage() const;
float adc_calibration_gain_correction() const;
uint16_t rcp_status() const;
const std::string& rcp_string() const;
uint16_t spip_power_buttons() const;
float master_power_administrator_load() const;
float expansion_power_administrator_load() const;
uint16_t _5vdc_ps() const;
uint16_t _15vdc_ps() const;
uint16_t _28vdc_ps() const;
uint16_t neg_15vdc_ps() const;
uint16_t _45vdc_ps() const;
uint16_t filament_ps_voltage() const;
uint16_t vacuum_pump_ps_voltage() const;
uint16_t focus_coil_ps_voltage() const;
uint16_t filament_ps() const;
uint16_t klystron_warmup() const;
uint16_t transmitter_available() const;
uint16_t wg_switch_position() const;
uint16_t wg_pfn_transfer_interlock() const;
uint16_t maintenance_mode() const;
uint16_t maintenance_required() const;
uint16_t pfn_switch_position() const;
uint16_t modulator_overload() const;
uint16_t modulator_inv_current() const;
uint16_t modulator_switch_fail() const;
uint16_t main_power_voltage() const;
uint16_t charging_system_fail() const;
uint16_t inverse_diode_current() const;
uint16_t trigger_amplifier() const;
uint16_t circulator_temperature() const;
uint16_t spectrum_filter_pressure() const;
uint16_t wg_arc_vswr() const;
uint16_t cabinet_interlock() const;
uint16_t cabinet_air_temperature() const;
uint16_t cabinet_airflow() const;
uint16_t klystron_current() const;
uint16_t klystron_filament_current() const;
uint16_t klystron_vacion_current() const;
uint16_t klystron_air_temperature() const;
uint16_t klystron_airflow() const;
uint16_t modulator_switch_maintenance() const;
uint16_t post_charge_regulator_maintenance() const;
uint16_t wg_pressure_humidity() const;
uint16_t transmitter_overvoltage() const;
uint16_t transmitter_overcurrent() const;
uint16_t focus_coil_current() const;
uint16_t focus_coil_airflow() const;
uint16_t oil_temperature() const;
uint16_t prf_limit() const;
uint16_t transmitter_oil_level() const;
uint16_t transmitter_battery_charging() const;
uint16_t high_voltage_status() const;
uint16_t transmitter_recycling_summary() const;
uint16_t transmitter_inoperable() const;
uint16_t transmitter_air_filter() const;
uint16_t zero_test_bit(unsigned i) const;
uint16_t one_test_bit(unsigned i) const;
uint16_t xmtr_spip_interface() const;
uint16_t transmitter_summary_status() const;
float transmitter_rf_power() const;
float horizontal_xmtr_peak_power() const;
float xmtr_peak_power() const;
float vertical_xmtr_peak_power() const;
float xmtr_rf_avg_power() const;
uint32_t xmtr_recycle_count() const;
float receiver_bias() const;
float transmit_imbalance() const;
float xmtr_power_meter_zero() const;
uint16_t ac_unit1_compressor_shut_off() const;
uint16_t ac_unit2_compressor_shut_off() const;
uint16_t generator_maintenance_required() const;
uint16_t generator_battery_voltage() const;
uint16_t generator_engine() const;
uint16_t generator_volt_frequency() const;
uint16_t power_source() const;
uint16_t transitional_power_source() const;
uint16_t generator_auto_run_off_switch() const;
uint16_t aircraft_hazard_lighting() const;
uint16_t equipment_shelter_fire_detection_system() const;
uint16_t equipment_shelter_fire_smoke() const;
uint16_t generator_shelter_fire_smoke() const;
uint16_t utility_voltage_frequency() const;
uint16_t site_security_alarm() const;
uint16_t security_equipment() const;
uint16_t security_system() const;
uint16_t receiver_connected_to_antenna() const;
uint16_t radome_hatch() const;
uint16_t ac_unit1_filter_dirty() const;
uint16_t ac_unit2_filter_dirty() const;
float equipment_shelter_temperature() const;
float outside_ambient_temperature() const;
float transmitter_leaving_air_temp() const;
float ac_unit1_discharge_air_temp() const;
float generator_shelter_temperature() const;
float radome_air_temperature() const;
float ac_unit2_discharge_air_temp() const;
float spip_15v_ps() const;
float spip_neg_15v_ps() const;
uint16_t spip_28v_ps_status() const;
float spip_5v_ps() const;
uint16_t converted_generator_fuel_level() const;
uint16_t elevation_pos_dead_limit() const;
uint16_t _150v_overvoltage() const;
uint16_t _150v_undervoltage() const;
uint16_t elevation_servo_amp_inhibit() const;
uint16_t elevation_servo_amp_short_circuit() const;
uint16_t elevation_servo_amp_overtemp() const;
uint16_t elevation_motor_overtemp() const;
uint16_t elevation_stow_pin() const;
uint16_t elevation_housing_5v_ps() const;
uint16_t elevation_neg_dead_limit() const;
uint16_t elevation_pos_normal_limit() const;
uint16_t elevation_neg_normal_limit() const;
uint16_t elevation_encoder_light() const;
uint16_t elevation_gearbox_oil() const;
uint16_t elevation_handwheel() const;
uint16_t elevation_amp_ps() const;
uint16_t azimuth_servo_amp_inhibit() const;
uint16_t azimuth_servo_amp_short_circuit() const;
uint16_t azimuth_servo_amp_overtemp() const;
uint16_t azimuth_motor_overtemp() const;
uint16_t azimuth_stow_pin() const;
uint16_t azimuth_housing_5v_ps() const;
uint16_t azimuth_encoder_light() const;
uint16_t azimuth_gearbox_oil() const;
uint16_t azimuth_bull_gear_oil() const;
uint16_t azimuth_handwheel() const;
uint16_t azimuth_servo_amp_ps() const;
uint16_t servo() const;
uint16_t pedestal_interlock_switch() const;
uint16_t coho_clock() const;
uint16_t rf_generator_frequency_select_oscillator() const;
uint16_t rf_generator_rf_stalo() const;
uint16_t rf_generator_phase_shifted_coho() const;
uint16_t _9v_receiver_ps() const;
uint16_t _5v_receiver_ps() const;
uint16_t _18v_receiver_ps() const;
uint16_t neg_9v_receiver_ps() const;
uint16_t _5v_single_channel_rdaiu_ps() const;
float horizontal_short_pulse_noise() const;
float horizontal_long_pulse_noise() const;
float horizontal_noise_temperature() const;
float vertical_short_pulse_noise() const;
float vertical_long_pulse_noise() const;
float vertical_noise_temperature() const;
float horizontal_linearity() const;
float horizontal_dynamic_range() const;
float horizontal_delta_dbz0() const;
float vertical_delta_dbz0() const;
float kd_peak_measured() const;
float short_pulse_horizontal_dbz0() const;
float long_pulse_horizontal_dbz0() const;
uint16_t velocity_processed() const;
uint16_t width_processed() const;
uint16_t velocity_rf_gen() const;
uint16_t width_rf_gen() const;
float horizontal_i0() const;
float vertical_i0() const;
float vertical_dynamic_range() const;
float short_pulse_vertical_dbz0() const;
float long_pulse_vertical_dbz0() const;
float horizontal_power_sense() const;
float vertical_power_sense() const;
float zdr_bias() const;
float clutter_suppression_delta() const;
float clutter_suppression_unfiltered_power() const;
float clutter_suppression_filtered_power() const;
float vertical_linearity() const;
uint16_t state_file_read_status() const;
uint16_t state_file_write_status() const;
uint16_t bypass_map_file_read_status() const;
uint16_t bypass_map_file_write_status() const;
uint16_t current_adaptation_file_read_status() const;
uint16_t current_adaptation_file_write_status() const;
uint16_t censor_zone_file_read_status() const;
uint16_t censor_zone_file_write_status() const;
uint16_t remote_vcp_file_read_status() const;
uint16_t remote_vcp_file_write_status() const;
uint16_t baseline_adaptation_file_read_status() const;
uint16_t read_status_of_prf_sets() const;
uint16_t clutter_filter_map_file_read_status() const;
uint16_t clutter_filter_map_file_write_status() const;
uint16_t generatl_disk_io_error() const;
uint8_t rsp_status() const;
uint8_t motherboard_temperature() const;
uint8_t cpu1_temperature() const;
uint8_t cpu2_temperature() const;
uint16_t cpu1_fan_speed() const;
uint16_t cpu2_fan_speed() const;
uint16_t rsp_fan1_speed() const;
uint16_t rsp_fan2_speed() const;
uint16_t rsp_fan3_speed() const;
uint16_t spip_comm_status() const;
uint16_t hci_comm_status() const;
uint16_t signal_processor_command_status() const;
uint16_t ame_communication_status() const;
uint16_t rms_link_status() const;
uint16_t rpg_link_status() const;
uint16_t interpanel_link_status() const;
uint32_t performance_check_time() const;
uint16_t version() const;
bool Parse(std::istream& is);
static std::unique_ptr<PerformanceMaintenanceData>
Create(MessageHeader&& header, std::istream& is);
private:
std::unique_ptr<PerformanceMaintenanceDataImpl> p;
};
} // namespace rda
} // namespace wsr88d
} // namespace scwx

View file

@ -2,8 +2,6 @@
#include <scwx/wsr88d/rda/message.hpp> #include <scwx/wsr88d/rda/message.hpp>
#include <string>
namespace scwx namespace scwx
{ {
namespace wsr88d namespace wsr88d

View file

@ -10,12 +10,6 @@
#include <boost/iostreams/filter/bzip2.hpp> #include <boost/iostreams/filter/bzip2.hpp>
#include <boost/log/trivial.hpp> #include <boost/log/trivial.hpp>
#ifdef WIN32
# include <WinSock2.h>
#else
# include <arpa/inet.h>
#endif
namespace scwx namespace scwx
{ {
namespace wsr88d namespace wsr88d

View file

@ -1,16 +1,9 @@
#include <scwx/wsr88d/rda/clutter_filter_map.hpp> #include <scwx/wsr88d/rda/clutter_filter_map.hpp>
#include <istream>
#include <vector> #include <vector>
#include <boost/log/trivial.hpp> #include <boost/log/trivial.hpp>
#ifdef WIN32
# include <WinSock2.h>
#else
# include <arpa/inet.h>
#endif
namespace scwx namespace scwx
{ {
namespace wsr88d namespace wsr88d
@ -205,7 +198,7 @@ bool ClutterFilterMap::Parse(std::istream& is)
} }
} }
if (!ValidateSize(is, bytesRead)) if (!ValidateMessage(is, bytesRead))
{ {
messageValid = false; messageValid = false;
} }

View file

@ -1,7 +1,5 @@
#include <scwx/wsr88d/rda/message.hpp> #include <scwx/wsr88d/rda/message.hpp>
#include <istream>
#include <boost/log/trivial.hpp> #include <boost/log/trivial.hpp>
namespace scwx namespace scwx
@ -28,12 +26,23 @@ Message::~Message() = default;
Message::Message(Message&&) noexcept = default; Message::Message(Message&&) noexcept = default;
Message& Message::operator=(Message&&) noexcept = default; Message& Message::operator=(Message&&) noexcept = default;
bool Message::ValidateSize(std::istream& is, size_t bytesRead) const bool Message::ValidateMessage(std::istream& is, size_t bytesRead) const
{ {
bool messageValid = true; bool messageValid = true;
size_t dataSize = header().message_size() * 2 - header().SIZE; size_t dataSize = header().message_size() * 2 - header().SIZE;
if (bytesRead != dataSize) if (is.eof())
{
BOOST_LOG_TRIVIAL(warning) << logPrefix_ << "Reached end of file";
messageValid = false;
}
else if (is.fail())
{
BOOST_LOG_TRIVIAL(warning)
<< logPrefix_ << "Could not read from input stream";
messageValid = false;
}
else if (bytesRead != dataSize)
{ {
is.seekg(static_cast<std::streamoff>(dataSize) - is.seekg(static_cast<std::streamoff>(dataSize) -
static_cast<std::streamoff>(bytesRead), static_cast<std::streamoff>(bytesRead),

View file

@ -2,9 +2,9 @@
#include <scwx/util/vectorbuf.hpp> #include <scwx/util/vectorbuf.hpp>
#include <scwx/wsr88d/rda/clutter_filter_map.hpp> #include <scwx/wsr88d/rda/clutter_filter_map.hpp>
#include <scwx/wsr88d/rda/performance_maintenance_data.hpp>
#include <scwx/wsr88d/rda/rda_adaptation_data.hpp> #include <scwx/wsr88d/rda/rda_adaptation_data.hpp>
#include <istream>
#include <unordered_map> #include <unordered_map>
#include <vector> #include <vector>
@ -23,7 +23,9 @@ typedef std::function<std::unique_ptr<Message>(MessageHeader&&, std::istream&)>
CreateMessageFunction; CreateMessageFunction;
static const std::unordered_map<uint8_t, CreateMessageFunction> create_ { static const std::unordered_map<uint8_t, CreateMessageFunction> create_ {
{15, ClutterFilterMap::Create}, {18, RdaAdaptationData::Create}}; {3, PerformanceMaintenanceData::Create},
{15, ClutterFilterMap::Create},
{18, RdaAdaptationData::Create}};
static std::vector<char> messageData_; static std::vector<char> messageData_;
static size_t bufferedSize_; static size_t bufferedSize_;

File diff suppressed because it is too large Load diff

View file

@ -1,18 +1,7 @@
#include <scwx/wsr88d/rda/rda_adaptation_data.hpp> #include <scwx/wsr88d/rda/rda_adaptation_data.hpp>
#include <array>
#include <execution>
#include <istream>
#include <map>
#include <boost/log/trivial.hpp> #include <boost/log/trivial.hpp>
#ifdef WIN32
# include <WinSock2.h>
#else
# include <arpa/inet.h>
#endif
namespace scwx namespace scwx
{ {
namespace wsr88d namespace wsr88d
@ -23,14 +12,6 @@ namespace rda
static const std::string logPrefix_ = static const std::string logPrefix_ =
"[scwx::wsr88d::rda::rda_adaptation_data] "; "[scwx::wsr88d::rda::rda_adaptation_data] ";
static void ReadBoolean(std::istream& is, bool& value);
static void ReadChar(std::istream& is, char& value);
static float SwapFloat(float f);
template<size_t _Size>
static void SwapFloatArray(std::array<float, _Size>& arr);
template<typename T>
static void SwapFloatMap(std::map<T, float>& m);
struct AntManualSetup struct AntManualSetup
{ {
int32_t ielmin_; int32_t ielmin_;
@ -1757,13 +1738,7 @@ bool RdaAdaptationData::Parse(std::istream& is)
p->txbBaseline_ = SwapFloat(p->txbBaseline_); p->txbBaseline_ = SwapFloat(p->txbBaseline_);
p->txbAlarmThresh_ = SwapFloat(p->txbAlarmThresh_); p->txbAlarmThresh_ = SwapFloat(p->txbAlarmThresh_);
if (is.eof()) if (!ValidateMessage(is, bytesRead))
{
BOOST_LOG_TRIVIAL(warning) << logPrefix_ << "Reached end of file (1)";
messageValid = false;
}
if (!ValidateSize(is, bytesRead))
{ {
messageValid = false; messageValid = false;
} }
@ -1781,43 +1756,6 @@ RdaAdaptationData::Create(MessageHeader&& header, std::istream& is)
return message; return message;
} }
static void ReadBoolean(std::istream& is, bool& value)
{
std::string data(4, ' ');
is.read(reinterpret_cast<char*>(&data[0]), 4);
value = (data.at(0) == 'T');
}
static void ReadChar(std::istream& is, char& value)
{
std::string data(4, ' ');
is.read(reinterpret_cast<char*>(&data[0]), 4);
value = data.at(0);
}
static float SwapFloat(float f)
{
return ntohf(*reinterpret_cast<uint32_t*>(&f));
}
template<size_t _Size>
static void SwapFloatArray(std::array<float, _Size>& arr)
{
std::transform(std::execution::par_unseq,
arr.begin(),
arr.end(),
arr.begin(),
[](float f) { return SwapFloat(f); });
}
template<typename T>
static void SwapFloatMap(std::map<T, float>& m)
{
std::for_each(std::execution::par_unseq, m.begin(), m.end(), [](auto& p) {
p.second = SwapFloat(p.second);
});
}
} // namespace rda } // namespace rda
} // namespace wsr88d } // namespace wsr88d
} // namespace scwx } // namespace scwx

View file

@ -12,11 +12,13 @@ set(HDR_WSR88D_RDA include/scwx/wsr88d/rda/clutter_filter_map.hpp
include/scwx/wsr88d/rda/message.hpp include/scwx/wsr88d/rda/message.hpp
include/scwx/wsr88d/rda/message_factory.hpp include/scwx/wsr88d/rda/message_factory.hpp
include/scwx/wsr88d/rda/message_header.hpp include/scwx/wsr88d/rda/message_header.hpp
include/scwx/wsr88d/rda/performance_maintenance_data.hpp
include/scwx/wsr88d/rda/rda_adaptation_data.hpp) include/scwx/wsr88d/rda/rda_adaptation_data.hpp)
set(SRC_WSR88D_RDA source/scwx/wsr88d/rda/clutter_filter_map.cpp set(SRC_WSR88D_RDA source/scwx/wsr88d/rda/clutter_filter_map.cpp
source/scwx/wsr88d/rda/message.cpp source/scwx/wsr88d/rda/message.cpp
source/scwx/wsr88d/rda/message_factory.cpp source/scwx/wsr88d/rda/message_factory.cpp
source/scwx/wsr88d/rda/message_header.cpp source/scwx/wsr88d/rda/message_header.cpp
source/scwx/wsr88d/rda/performance_maintenance_data.cpp
source/scwx/wsr88d/rda/rda_adaptation_data.cpp) source/scwx/wsr88d/rda/rda_adaptation_data.cpp)
add_library(wxdata OBJECT ${HDR_UTIL} add_library(wxdata OBJECT ${HDR_UTIL}