monitoring_frame_deserialization.h
Go to the documentation of this file.
1 // Copyright (c) 2020-2022 Pilz GmbH & Co. KG
2 //
3 // This program is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU Lesser General Public License as published by
5 // the Free Software Foundation, either version 3 of the License, or
6 // (at your option) any later version.
7 //
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 // GNU Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public License
14 // along with this program. If not, see <https://www.gnu.org/licenses/>.
15 #ifndef PSEN_SCAN_V2_STANDALONE_MONITORING_FRAME_DESERIALIZATION_H
16 #define PSEN_SCAN_V2_STANDALONE_MONITORING_FRAME_DESERIALIZATION_H
17 
18 #include <istream>
19 #include <stdexcept>
20 #include <string>
21 #include <vector>
22 #include <bitset>
23 
31 
33 {
49 namespace data_conversion_layer
50 {
51 namespace monitoring_frame
52 {
53 static constexpr uint32_t DEFAULT_DEVICE_STATUS{ 0 };
54 static constexpr uint32_t OP_CODE_MONITORING_FRAME{ 0xCA };
55 static constexpr uint32_t ONLINE_WORKING_MODE{ 0x00 };
56 static constexpr uint32_t GUI_MONITORING_TRANSACTION{ 0x05 };
57 static constexpr uint16_t NUMBER_OF_BYTES_SCAN_COUNTER{ 4 };
58 static constexpr uint16_t NUMBER_OF_BYTES_ZONE_SET{ 1 };
59 static constexpr uint16_t NUMBER_OF_BYTES_SINGLE_MEASUREMENT{ 2 };
60 static constexpr uint16_t NO_SIGNAL_ARRIVED{ 59956 };
61 static constexpr uint16_t SIGNAL_TOO_LATE{ 59958 };
62 static constexpr uint16_t NUMBER_OF_BYTES_SINGLE_INTENSITY{ 2 };
63 
68 {
69 public:
70  using DeviceStatus = uint32_t;
71  using OpCode = uint32_t;
72  using WorkingMode = uint32_t;
73  using TransactionType = uint32_t;
76 
77 public:
78  FixedFields(DeviceStatus device_status,
79  OpCode op_code,
80  WorkingMode working_mode,
81  TransactionType transaction_type,
82  configuration::ScannerId scanner_id,
83  FromTheta from_theta,
85 
86 public:
87  DeviceStatus deviceStatus() const;
88  OpCode opCode() const;
89  WorkingMode workingMode() const;
92  FromTheta fromTheta() const;
93  Resolution resolution() const;
94 
95 private:
103 };
116 {
117 public:
118  using Id = uint8_t;
119  using Length = uint16_t;
120 
121 public:
123 
124 public:
125  Id id() const;
126  Length length() const;
127 
128  static std::string idToString(Id id);
129 
130 private:
133 };
134 
136 {
137  io_pin_data = 0x01,
138  scan_counter = 0x02,
139  zone_set = 0x03,
140  diagnostics = 0x04,
141  measurements = 0x05,
142  intensities = 0x06,
143  end_of_frame = 0x09
144 };
145 
146 AdditionalFieldHeader readAdditionalField(std::istream& is, const std::size_t& max_num_bytes);
147 
148 monitoring_frame::Message deserialize(const data_conversion_layer::RawData& data, const std::size_t& num_bytes);
149 FixedFields readFixedFields(std::istream& is);
150 namespace diagnostic
151 {
152 std::vector<diagnostic::Message> deserializeMessages(std::istream& is);
153 }
154 
155 namespace io
156 {
157 template <size_t ChunkSize>
158 void deserializePinField(std::istream& is, std::array<std::bitset<8>, ChunkSize>& pin_states)
159 {
160  for (auto& byte_states : pin_states)
161  {
162  const auto raw_byte = raw_processing::read<uint8_t>(is);
163  byte_states |= std::bitset<8>(raw_byte);
164  }
165 }
166 PinData deserializePins(std::istream& is);
167 } // namespace io
168 
172 class DecodingFailure : public std::runtime_error
173 {
174 public:
175  DecodingFailure(const std::string& msg = "Error while decoding laser scanner measurement data");
176 };
177 
191 {
192 public:
193  AdditionalFieldUnexpectedSize(const std::string& msg);
194 };
195 
196 inline DecodingFailure::DecodingFailure(const std::string& msg) : std::runtime_error(msg)
197 {
198 }
199 
201 {
202 }
203 
205 {
206  return id_;
207 }
208 
210 {
211  return length_;
212 }
213 
215 {
216  return device_status_;
217 }
218 
220 {
221  return op_code_;
222 }
223 
225 {
226  return working_mode_;
227 }
228 
230 {
231  return transaction_type_;
232 }
233 
235 {
236  return scanner_id_;
237 }
238 
240 {
241  return from_theta_;
242 }
243 
245 {
246  return resolution_;
247 }
248 
249 } // namespace monitoring_frame
250 } // namespace data_conversion_layer
251 } // namespace psen_scan_v2_standalone
252 
253 #endif // PSEN_SCAN_V2_STANDALONE_MONITORING_FRAME_DESERIALIZATION_H
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::AdditionalFieldUnexpectedSize::AdditionalFieldUnexpectedSize
AdditionalFieldUnexpectedSize(const std::string &msg)
Definition: monitoring_frame_deserialization.h:200
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::DecodingFailure::DecodingFailure
DecodingFailure(const std::string &msg="Error while decoding laser scanner measurement data")
Definition: monitoring_frame_deserialization.h:196
TenthOfDegree
psen_scan_v2_standalone::util::TenthOfDegree TenthOfDegree
Definition: zoneset_configuration_ros_conversion.h:33
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::FixedFields::DeviceStatus
uint32_t DeviceStatus
Definition: monitoring_frame_deserialization.h:70
psen_scan_v2_standalone::configuration::ScannerId
ScannerId
Definition: scanner_ids.h:27
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::readAdditionalField
AdditionalFieldHeader readAdditionalField(std::istream &is, const std::size_t &max_num_bytes)
Definition: monitoring_frame_deserialization.cpp:166
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::AdditionalFieldHeaderID::scan_counter
@ scan_counter
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::OP_CODE_MONITORING_FRAME
static constexpr uint32_t OP_CODE_MONITORING_FRAME
Definition: monitoring_frame_deserialization.h:54
monitoring_frame_msg.h
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::DecodingFailure
Exception thrown on problems during the extraction of the measurement data.
Definition: monitoring_frame_deserialization.h:172
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::io::deserializePins
PinData deserializePins(std::istream &is)
Definition: monitoring_frame_deserialization.cpp:185
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::FixedFields::working_mode_
WorkingMode working_mode_
Definition: monitoring_frame_deserialization.h:98
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::NO_SIGNAL_ARRIVED
static constexpr uint16_t NO_SIGNAL_ARRIVED
Definition: monitoring_frame_deserialization.h:60
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::FixedFields::workingMode
WorkingMode workingMode() const
Definition: monitoring_frame_deserialization.h:224
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::ONLINE_WORKING_MODE
static constexpr uint32_t ONLINE_WORKING_MODE
Definition: monitoring_frame_deserialization.h:55
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::NUMBER_OF_BYTES_SCAN_COUNTER
static constexpr uint16_t NUMBER_OF_BYTES_SCAN_COUNTER
Definition: monitoring_frame_deserialization.h:57
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::FixedFields::resolution
Resolution resolution() const
Definition: monitoring_frame_deserialization.h:244
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::DEFAULT_DEVICE_STATUS
static constexpr uint32_t DEFAULT_DEVICE_STATUS
Definition: monitoring_frame_deserialization.h:53
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::io::deserializePinField
void deserializePinField(std::istream &is, std::array< std::bitset< 8 >, ChunkSize > &pin_states)
Definition: monitoring_frame_deserialization.h:158
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::AdditionalFieldUnexpectedSize
Exception thrown on problems with the additional fields with fixed size.
Definition: monitoring_frame_deserialization.h:190
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::FixedFields::transactionType
TransactionType transactionType() const
Definition: monitoring_frame_deserialization.h:229
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::AdditionalFieldHeader::Length
uint16_t Length
Definition: monitoring_frame_deserialization.h:119
tenth_of_degree.h
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::FixedFields::opCode
OpCode opCode() const
Definition: monitoring_frame_deserialization.h:219
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::NUMBER_OF_BYTES_SINGLE_INTENSITY
static constexpr uint16_t NUMBER_OF_BYTES_SINGLE_INTENSITY
Definition: monitoring_frame_deserialization.h:62
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::AdditionalFieldHeaderID::end_of_frame
@ end_of_frame
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::readFixedFields
FixedFields readFixedFields(std::istream &is)
Definition: monitoring_frame_deserialization.cpp:232
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::NUMBER_OF_BYTES_ZONE_SET
static constexpr uint16_t NUMBER_OF_BYTES_ZONE_SET
Definition: monitoring_frame_deserialization.h:58
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::FixedFields::scannerId
configuration::ScannerId scannerId() const
Definition: monitoring_frame_deserialization.h:234
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::AdditionalFieldHeader
Definition for the type and length of an additional field in a monitoring frame.
Definition: monitoring_frame_deserialization.h:115
raw_scanner_data.h
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::FixedFields::from_theta_
FromTheta from_theta_
Definition: monitoring_frame_deserialization.h:101
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::FixedFields::transaction_type_
TransactionType transaction_type_
Definition: monitoring_frame_deserialization.h:99
diagnostics.h
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::AdditionalFieldHeaderID
AdditionalFieldHeaderID
Definition: monitoring_frame_deserialization.h:135
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::FixedFields::deviceStatus
DeviceStatus deviceStatus() const
Definition: monitoring_frame_deserialization.h:214
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::AdditionalFieldHeader::length
Length length() const
Definition: monitoring_frame_deserialization.h:209
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::AdditionalFieldHeader::Id
uint8_t Id
Definition: monitoring_frame_deserialization.h:118
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::FixedFields::WorkingMode
uint32_t WorkingMode
Definition: monitoring_frame_deserialization.h:72
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::FixedFields::FixedFields
FixedFields(DeviceStatus device_status, OpCode op_code, WorkingMode working_mode, TransactionType transaction_type, configuration::ScannerId scanner_id, FromTheta from_theta, Resolution resolution)
Definition: monitoring_frame_deserialization.cpp:46
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::GUI_MONITORING_TRANSACTION
static constexpr uint32_t GUI_MONITORING_TRANSACTION
Definition: monitoring_frame_deserialization.h:56
raw_processing.h
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::FixedFields::fromTheta
FromTheta fromTheta() const
Definition: monitoring_frame_deserialization.h:239
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::AdditionalFieldHeader::length_
Length length_
Definition: monitoring_frame_deserialization.h:132
scanner_ids.h
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::AdditionalFieldHeaderID::diagnostics
@ diagnostics
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::AdditionalFieldHeader::AdditionalFieldHeader
AdditionalFieldHeader(Id id, Length length)
Definition: monitoring_frame_deserialization.cpp:42
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::deserialize
monitoring_frame::Message deserialize(const data_conversion_layer::RawData &data, const std::size_t &num_bytes)
Definition: monitoring_frame_deserialization.cpp:79
std
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::AdditionalFieldHeader::idToString
static std::string idToString(Id id)
psen_scan_v2_standalone
Root namespace in which the software components to communicate with the scanner (firmware-version: 2)...
Definition: udp_client.h:41
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::AdditionalFieldHeaderID::io_pin_data
@ io_pin_data
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::FixedFields::resolution_
Resolution resolution_
Definition: monitoring_frame_deserialization.h:102
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::FixedFields::TransactionType
uint32_t TransactionType
Definition: monitoring_frame_deserialization.h:73
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::Message
Higher level data type representing a single monitoring frame.
Definition: monitoring_frame_msg.h:62
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::FixedFields::OpCode
uint32_t OpCode
Definition: monitoring_frame_deserialization.h:71
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::NUMBER_OF_BYTES_SINGLE_MEASUREMENT
static constexpr uint16_t NUMBER_OF_BYTES_SINGLE_MEASUREMENT
Definition: monitoring_frame_deserialization.h:59
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::AdditionalFieldHeader::id_
Id id_
Definition: monitoring_frame_deserialization.h:131
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::FixedFields::op_code_
OpCode op_code_
Definition: monitoring_frame_deserialization.h:97
psen_scan_v2_standalone::data_conversion_layer::RawData
std::vector< char > RawData
Definition: raw_scanner_data.h:25
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::SIGNAL_TOO_LATE
static constexpr uint16_t SIGNAL_TOO_LATE
Definition: monitoring_frame_deserialization.h:61
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::AdditionalFieldHeaderID::measurements
@ measurements
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::AdditionalFieldHeaderID::intensities
@ intensities
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::FixedFields::scanner_id_
configuration::ScannerId scanner_id_
Definition: monitoring_frame_deserialization.h:100
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::FixedFields::device_status_
DeviceStatus device_status_
Definition: monitoring_frame_deserialization.h:96
psen_scan_v2_standalone::util::TenthOfDegree
Helper class representing angles in tenth of degree.
Definition: tenth_of_degree.h:34
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::diagnostic::deserializeMessages
std::vector< diagnostic::Message > deserializeMessages(std::istream &is)
Definition: monitoring_frame_deserialization.cpp:204
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::FixedFields
The information included in every single monitoring frame.
Definition: monitoring_frame_deserialization.h:67
io_pin_data.h
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::AdditionalFieldHeader::id
Id id() const
Definition: monitoring_frame_deserialization.h:204
psen_scan_v2_standalone::data_conversion_layer::monitoring_frame::AdditionalFieldHeaderID::zone_set
@ zone_set


psen_scan_v2
Author(s): Pilz GmbH + Co. KG
autogenerated on Sat Nov 25 2023 03:46:26