modbus_adapter_brake_test.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2019 Pilz GmbH & Co. KG
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8 
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU Lesser General Public License for more details.
13 
14  * You should have received a copy of the GNU Lesser General Public License
15  * along with this program. If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #ifndef MODBUS_ADAPTER_BRAKE_TEST_H
19 #define MODBUS_ADAPTER_BRAKE_TEST_H
20 
21 #include <memory>
22 #include <map>
23 #include <string>
24 #include <functional>
25 
26 #include <ros/ros.h>
27 
28 #include <prbt_hardware_support/ModbusMsgInStamped.h>
30 #include <prbt_hardware_support/IsBrakeTestRequired.h>
31 #include <prbt_hardware_support/SendBrakeTestResult.h>
33 
34 namespace prbt_hardware_support
35 {
36 
37 using TWriteModbusRegister = std::function<bool(const uint16_t&, const RegCont&)>;
38 
44 {
45 public:
46  ModbusAdapterBrakeTest(TWriteModbusRegister&& write_modbus_register_func,
47  const ModbusApiSpec& read_api_spec,
48  const ModbusApiSpec& write_api_spec);
49 
50 public:
57  void modbusMsgCallback(const ModbusMsgInStampedConstPtr& msg_raw);
58 
64  bool isBrakeTestRequired(IsBrakeTestRequired::Request&,
65  IsBrakeTestRequired::Response& res);
66 
70  bool sendBrakeTestResult(SendBrakeTestResult::Request& req,
71  SendBrakeTestResult::Response& res);
72 
73 private:
74  using TBrakeTestRequired = IsBrakeTestRequiredResponse::_result_type;
75  void updateBrakeTestRequiredState(TBrakeTestRequired brake_test_required);
76 
77 private:
78  using TRegIdx = uint16_t;
79  using TRegIdxCont = std::map<std::string, TRegIdx>;
84  static TRegIdxCont getRegisters(const ModbusApiSpec &write_api_spec);
85 
87  static const TRegIdxCont::mapped_type& getMinRegisterIdx(const TRegIdxCont& reg_idx_cont);
89  static const TRegIdxCont::mapped_type& getMaxRegisterIdx(const TRegIdxCont& reg_idx_cont);
90 
93  static unsigned long getRegisterBlockSize(const TRegIdxCont& reg_idx_cont);
94 
95 private:
97 
99  TBrakeTestRequired brake_test_required_ {IsBrakeTestRequiredResponse::UNKNOWN};
100 
104 
105  const TRegIdx reg_start_idx_ {getMinRegisterIdx(reg_idx_cont_)};
106  const RegCont::size_type reg_block_size_ {getRegisterBlockSize(reg_idx_cont_)};
107 
109 };
110 
111 //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
112 
113 inline bool ModbusAdapterBrakeTest::isBrakeTestRequired(IsBrakeTestRequired::Request& /*req*/,
114  IsBrakeTestRequired::Response& res)
115 {
116  res.result = brake_test_required_;
117  return true;
118 }
119 
120 // The following is excluded because lambda functions are not marked properly with gcc-7
121 // see https://github.com/gcc-mirror/gcc/commit/7de708f
122 // LCOV_EXCL_START
123 inline const ModbusAdapterBrakeTest::TRegIdxCont::mapped_type& ModbusAdapterBrakeTest::getMinRegisterIdx(const TRegIdxCont& reg_idx_cont)
124 {
125  return std::min_element(
126  reg_idx_cont.cbegin(), reg_idx_cont.cend(),
127  [](const TRegIdxCont::value_type& l, const TRegIdxCont::value_type& r) -> bool { return l.second < r.second; })
128  ->second;
129 }
130 
131 inline const ModbusAdapterBrakeTest::TRegIdxCont::mapped_type& ModbusAdapterBrakeTest::getMaxRegisterIdx(const TRegIdxCont& reg_idx_cont)
132 {
133  return std::max_element(
134  reg_idx_cont.cbegin(), reg_idx_cont.cend(),
135  [](const TRegIdxCont::value_type& l, const TRegIdxCont::value_type& r) -> bool { return l.second < r.second; })
136  ->second;
137 }
138 // LCVO EXCL_STOP
139 
141 {
142  return static_cast<unsigned long>(std::abs(getMaxRegisterIdx(reg_idx_cont) - getMinRegisterIdx(reg_idx_cont)) + 1);
143 }
144 
145 } // namespace prbt_hardware_support
146 #endif // MODBUS_ADAPTER_BRAKE_TEST_H
IsBrakeTestRequiredResponse::_result_type TBrakeTestRequired
static const TRegIdxCont::mapped_type & getMaxRegisterIdx(const TRegIdxCont &reg_idx_cont)
ModbusAdapterBrakeTest(TWriteModbusRegister &&write_modbus_register_func, const ModbusApiSpec &read_api_spec, const ModbusApiSpec &write_api_spec)
TBrakeTestRequired brake_test_required_
Store the current state of whether a brake test is required.
bool sendBrakeTestResult(SendBrakeTestResult::Request &req, SendBrakeTestResult::Response &res)
Sends the brake test result data to the modbus client.
static const TRegIdxCont::mapped_type & getMinRegisterIdx(const TRegIdxCont &reg_idx_cont)
void updateBrakeTestRequiredState(TBrakeTestRequired brake_test_required)
bool isBrakeTestRequired(IsBrakeTestRequired::Request &, IsBrakeTestRequired::Response &res)
Stores the brake test required flag and initializes the brake test service, the first time the functi...
void modbusMsgCallback(const ModbusMsgInStampedConstPtr &msg_raw)
Called whenever a new modbus message arrives.
static unsigned long getRegisterBlockSize(const TRegIdxCont &reg_idx_cont)
std::function< bool(const uint16_t &, const RegCont &)> TWriteModbusRegister
Listens to the modbus_read topic and publishes a message informing about a required brake test...
static TRegIdxCont getRegisters(const ModbusApiSpec &write_api_spec)
Specifies the meaning of the holding registers.


prbt_hardware_support
Author(s):
autogenerated on Tue Feb 2 2021 03:50:17