diagnostics.cpp
Go to the documentation of this file.
1 
32 
33 #include <utility>
34 #include <string>
35 
37 {
38 DiagnosticsManager::DiagnosticsManager(const std::string name, const std::string serial,
39  std::shared_ptr<ros::Publisher> const& pub)
40  : camera_name_(name), serial_number_(serial), diagnostics_pub_(pub)
41 {
42 }
43 
45 {
46 }
47 
48 template <typename T>
49 void DiagnosticsManager::addDiagnostic(const Spinnaker::GenICam::gcstring name)
50 {
51  T first = 0;
52  T second = 0;
53  // Call the overloaded function (use the pair to determine which one)
54  addDiagnostic(name, false, std::make_pair(first, second));
55 }
56 
57 template void DiagnosticsManager::addDiagnostic<int>(const Spinnaker::GenICam::gcstring name);
58 
59 template void DiagnosticsManager::addDiagnostic<float>(const Spinnaker::GenICam::gcstring name);
60 
61 void DiagnosticsManager::addDiagnostic(const Spinnaker::GenICam::gcstring name, bool check_ranges,
62  std::pair<int, int> operational, int lower_bound, int upper_bound)
63 {
64  diagnostic_params<int> param{ name, check_ranges, operational, lower_bound, upper_bound };
65  integer_params_.push_back(param);
66 }
67 
68 void DiagnosticsManager::addDiagnostic(const Spinnaker::GenICam::gcstring name, bool check_ranges,
69  std::pair<float, float> operational, float lower_bound, float upper_bound)
70 {
71  diagnostic_params<float> param{ name, check_ranges, operational, lower_bound, upper_bound };
72  float_params_.push_back(param);
73 }
74 
75 template <typename T>
76 diagnostic_msgs::DiagnosticStatus DiagnosticsManager::getDiagStatus(const diagnostic_params<T>& param, const T value)
77 {
78  diagnostic_msgs::KeyValue kv;
79  kv.key = param.parameter_name;
80  kv.value = std::to_string(value);
81 
82  diagnostic_msgs::DiagnosticStatus diag_status;
83  diag_status.values.push_back(kv);
84  diag_status.name = "Spinnaker " + Spinnaker::GenICam::gcstring(camera_name_.c_str()) + " " + param.parameter_name;
85  diag_status.hardware_id = serial_number_;
86 
87  // Determine status level
88  if (!param.check_ranges || (value > param.operational_range.first && value <= param.operational_range.second))
89  {
90  diag_status.level = 0;
91  diag_status.message = "OK";
92  }
93  else if (value >= param.warn_range_lower && value <= param.warn_range_upper)
94  {
95  diag_status.level = 1;
96  diag_status.message = "WARNING";
97  }
98  else
99  {
100  diag_status.level = 2;
101  diag_status.message = "ERROR";
102  }
103 
104  return diag_status;
105 }
106 
108 {
109  diagnostic_msgs::DiagnosticArray diag_array;
110 
111  // Manufacturer Info
112  diagnostic_msgs::DiagnosticStatus diag_manufacture_info;
113  diag_manufacture_info.name = "Spinnaker " + camera_name_ + " Manufacture Info";
114  diag_manufacture_info.hardware_id = serial_number_;
115 
116  for (const std::string param : manufacturer_params_)
117  {
118  Spinnaker::GenApi::CStringPtr string_ptr = static_cast<Spinnaker::GenApi::CStringPtr>(
119  spinnaker->readProperty(Spinnaker::GenICam::gcstring(param.c_str())));
120 
121  diagnostic_msgs::KeyValue kv;
122  kv.key = param;
123  kv.value = string_ptr->GetValue(true);
124  diag_manufacture_info.values.push_back(kv);
125  }
126 
127  diag_array.status.push_back(diag_manufacture_info);
128 
129  // Float based parameters
131  {
132  Spinnaker::GenApi::CFloatPtr float_ptr =
133  static_cast<Spinnaker::GenApi::CFloatPtr>(spinnaker->readProperty(param.parameter_name));
134 
135  float float_value = float_ptr->GetValue(true);
136 
137  diagnostic_msgs::DiagnosticStatus diag_status = getDiagStatus(param, float_value);
138  diag_array.status.push_back(diag_status);
139  }
140 
141  // Int based parameters
143  {
144  Spinnaker::GenApi::CIntegerPtr integer_ptr =
145  static_cast<Spinnaker::GenApi::CIntegerPtr>(spinnaker->readProperty(param.parameter_name));
146 
147  int int_value = integer_ptr->GetValue(true);
148  diagnostic_msgs::DiagnosticStatus diag_status = getDiagStatus(param, int_value);
149  diag_array.status.push_back(diag_status);
150  }
151 
152  diagnostics_pub_->publish(diag_array);
153 }
154 } // namespace spinnaker_camera_driver
bool param(const std::string &param_name, T &param_val, const T &default_val)
diagnostic_msgs::DiagnosticStatus getDiagStatus(const diagnostic_params< T > &param, const T value)
Function to push the diagnostic to the publisher.
Definition: diagnostics.cpp:76
std::vector< diagnostic_params< int > > integer_params_
Definition: diagnostics.h:132
void addDiagnostic(const Spinnaker::GenICam::gcstring name)
Add a diagnostic with name only (no warning checks)
Definition: diagnostics.cpp:49
std::shared_ptr< ros::Publisher > diagnostics_pub_
Definition: diagnostics.h:129
DiagnosticsManager(const std::string name, const std::string serial, std::shared_ptr< ros::Publisher > const &pub)
Definition: diagnostics.cpp:38
Class to support ROS Diagnostics Aggregator for Spinnaker Camera.
std::vector< diagnostic_params< float > > float_params_
Definition: diagnostics.h:133
void processDiagnostics(SpinnakerCamera *spinnaker)
Read the property of given parameters and push to aggregator.
Spinnaker::GenApi::CNodePtr readProperty(const Spinnaker::GenICam::gcstring property_name)
const std::vector< std::string > manufacturer_params_
Definition: diagnostics.h:138


spinnaker_camera_driver
Author(s): Chad Rockey
autogenerated on Sun Feb 14 2021 03:47:26