Lely core libraries 1.9.2
sdo_error.cpp
Go to the documentation of this file.
1
24#include "coapp.hpp"
25#include <lely/co/sdo.h>
27
28#include <iomanip>
29#include <sstream>
30
31namespace lely {
32
33namespace canopen {
34
35namespace {
36
37class SdoErrcCategory : public ::std::error_category {
38 public:
39 const char*
40 name() const noexcept override {
41 return "SDO";
42 }
43
44 ::std::error_condition default_error_condition(int ev) const
45 noexcept override;
46 // bool equivalent(int code, const ::std::error_condition& condition) const
47 // noexcept override; bool equivalent(const std::error_code& code, int
48 // condition) const noexcept override;
49
50 ::std::string
51 message(int ev) const override {
52 return co_sdo_ac2str(ev);
53 }
54};
55
56::std::error_condition
57SdoErrcCategory::default_error_condition(int ev) const noexcept {
58 switch (static_cast<SdoErrc>(ev)) {
59 case SdoErrc::TOGGLE:
60 return ::std::errc::protocol_error;
62 return ::std::errc::timed_out;
63 case SdoErrc::NO_CS:
66 return ::std::errc::protocol_error;
68 return ::std::errc::illegal_byte_sequence;
69 case SdoErrc::NO_MEM:
70 return ::std::errc::not_enough_memory;
74 return ::std::errc::permission_denied;
75 case SdoErrc::NO_OBJ:
76 return ::std::errc::no_such_file_or_directory;
77 // case SdoErrc::NO_PDO:
78 // case SdoErrc::PDO_LEN:
79 case SdoErrc::PARAM:
80 return ::std::errc::invalid_argument;
81 case SdoErrc::COMPAT:
82 return ::std::errc::no_such_device_or_address;
84 return ::std::errc::io_error;
88 return ::std::errc::invalid_argument;
89 case SdoErrc::NO_SUB:
90 return ::std::errc::no_such_file_or_directory;
92 return ::std::errc::invalid_argument;
96 return ::std::errc::result_out_of_range;
97 case SdoErrc::NO_SDO:
98 return ::std::errc::protocol_not_supported;
99 // case SdoErrc::ERROR:
100 case SdoErrc::DATA:
101 return ::std::errc::io_error;
104 return ::std::errc::device_or_resource_busy;
105 // case SdoErrc::NO_OD:
106 case SdoErrc::NO_VAL:
107 return ::std::errc::no_message_available;
108 default:
109 return ::std::error_condition(ev, *this);
110 }
111}
112
113::std::string
114SdoWhat(uint8_t netid, uint8_t id, uint16_t idx, uint8_t subidx,
115 ::std::error_code ec, const ::std::string& what_arg = "") {
116 ::std::stringstream ss;
117 ss << ::std::uppercase << ::std::setfill('0') << ::std::hex;
118 if (!what_arg.empty()) ss << what_arg << ':';
119 ss << ::std::setw(2) << int(netid) << ':' << int(id) << ':';
120 ss << ::std::setw(4) << idx << ':' << ::std::setw(2) << int(subidx) << ": ";
121 ss << ec.message();
122 ss << " (" << ::std::setw(8) << uint32_t(ec.value()) << ')';
123 return ss.str();
124}
125
126} // namespace
127
128SdoError::SdoError(uint8_t netid, uint8_t id, uint16_t idx, uint8_t subidx,
129 ::std::error_code ec)
130 : ::std::runtime_error(SdoWhat(netid, id, idx, subidx, ec)),
131 netid_(netid),
132 id_(id),
133 idx_(idx),
134 subidx_(subidx),
135 ec_(ec) {}
136
137SdoError::SdoError(uint8_t netid, uint8_t id, uint16_t idx, uint8_t subidx,
138 ::std::error_code ec, const ::std::string& what_arg)
139 : ::std::runtime_error(SdoWhat(netid, id, idx, subidx, ec, what_arg)),
140 netid_(netid),
141 id_(id),
142 idx_(idx),
143 subidx_(subidx),
144 ec_(ec) {}
145
146SdoError::SdoError(uint8_t netid, uint8_t id, uint16_t idx, uint8_t subidx,
147 ::std::error_code ec, const char* what_arg)
148 : ::std::runtime_error(SdoWhat(netid, id, idx, subidx, ec, what_arg)),
149 netid_(netid),
150 id_(id),
151 idx_(idx),
152 subidx_(subidx),
153 ec_(ec) {}
154
155SdoError::SdoError(uint8_t netid, uint8_t id, uint16_t idx, uint8_t subidx,
156 int ev, const char* what_arg)
157 : SdoError(netid, id, idx, subidx, ::std::error_code(ev, SdoCategory()),
158 what_arg) {}
159
160SdoError::SdoError(uint8_t netid, uint8_t id, uint16_t idx, uint8_t subidx,
161 int ev)
162 : SdoError(netid, id, idx, subidx, ::std::error_code(ev, SdoCategory())) {}
163
164const ::std::error_category&
165SdoCategory() noexcept {
166 static const SdoErrcCategory category;
167 return category;
168}
169
170::std::error_code
172 return {static_cast<int>(e), SdoCategory()};
173}
174
175::std::error_condition
177 return {static_cast<int>(e), SdoCategory()};
178}
179
180} // namespace canopen
181
182} // namespace lely
This header file is part of the CANopen library; it contains the Service Data Object (SDO) declaratio...
const char * co_sdo_ac2str(co_unsigned32_t ac)
Returns a string describing an SDO abort code.
Definition: sdo.c:57
const ::std::error_category & SdoCategory() noexcept
Returns a reference to the error category object for SDO abort codes.
Definition: sdo_error.cpp:165
SdoErrc
The SDO abort codes.
Definition: sdo_error.hpp:37
@ TIMEOUT
SDO protocol timed out.
@ BLK_SIZE
Invalid block size (block mode only).
@ NO_CS
Client/server command specifier not valid or unknown.
@ TYPE_LEN_LO
Data type does not match, length of service parameter too low.
@ TOGGLE
Toggle bit not altered.
@ PARAM_VAL
Invalid value for parameter (download only).
@ PARAM
General parameter incompatibility reason.
@ NO_VAL
No data available. (NO_DATA is a macro defined in <netdb.h>)
@ NO_SUB
Sub-index does not exist.
@ PARAM_LO
Value of parameter written too low (download only).
@ BLK_SEQ
Invalid sequence number (block mode only).
@ DATA_DEV
Data cannot be transferred or stored to the application because of the present device state.
@ HARDWARE
Access failed due to a hardware error.
@ BLK_CRC
CRC error (block mode only).
@ PARAM_HI
Value of parameter written too high (download only).
@ TYPE_LEN
Data type does not match, length of service parameter does not match.
@ PARAM_RANGE
Maximum value is less than minimum value (download only).
@ COMPAT
General internal incompatibility in the device.
@ NO_MEM
Out of memory.
@ NO_OBJ
Object does not exist in the object dictionary.
@ NO_WRITE
Attempt to write a read only object.
@ NO_SDO
Resource not available: SDO connection.
@ DATA_CTL
Data cannot be transferred or stored to the application because of local control.
@ TYPE_LEN_HI
Data type does not match, length of service parameter too high.
@ NO_ACCESS
Unsupported access to an object.
@ DATA
Data cannot be transferred or stored to the application.
@ NO_READ
Attempt to read a write only object.
::std::error_condition make_error_condition(SdoErrc e) noexcept
Creates an error condition corresponding to an SDO abort code.
Definition: sdo_error.cpp:176
::std::error_code make_error_code(SdoErrc e) noexcept
Creates an error code corresponding to an SDO abort code.
Definition: sdo_error.cpp:171
Global namespace for the Lely Industries N.V. libraries.
Definition: buf.hpp:32
STL namespace.
This header file is part of the C++ CANopen application library; it contains the SDO error declaratio...
This is the internal header file of the C++ CANopen application library.