Motion Master
Loading...
Searching...
No Matches
base.h
Go to the documentation of this file.
1#pragma once
2
3#include <condition_variable>
4#include <map>
5#include <optional>
6#include <set>
7#include <sstream>
8#include <string>
9#include <typeindex>
10#include <unordered_map>
11#include <utility>
12#include <variant>
13#include <vector>
14
15#include <nlohmann/json.hpp>
16
17#include "core/util.h"
18
19namespace mm::comm::base {
30 std::map<std::uint16_t, std::vector<std::uint32_t>> rx;
31 std::map<std::uint16_t, std::vector<std::uint32_t>> tx;
32};
33
42
54void from_json(const nlohmann::json& j, UiPdoMapping& p);
55
65void from_json(const nlohmann::json& j, UiConfigJson& r);
66
74enum class EtherCATVendorID : uint32_t {
80 SYNAPTICON = 0x000022d2,
81};
82
83inline constexpr std::size_t kDeviceFilePartSize =
84 9000;
86
98inline bool operator==(uint32_t lhs, EtherCATVendorID rhs) {
99 return lhs == static_cast<uint32_t>(rhs);
100}
101
113inline bool operator==(EtherCATVendorID lhs, uint32_t rhs) {
114 return static_cast<uint32_t>(lhs) == rhs;
115}
116
127 uint16_t pdoIndex;
128 uint16_t index;
129 uint8_t subindex;
130 uint8_t
132};
133
149 std::vector<PdoMappingEntry> rxPdos;
151 std::vector<PdoMappingEntry> txPdos;
153};
154
162enum class ObjectFlags : uint16_t {
163 None = 0x0000,
164
165 // Read access
166 PO_RD = 0x0001,
167 SO_RD = 0x0002,
168 OP_RD = 0x0004,
170
171 // Write access
172 PO_WR = 0x0008,
173 SO_WR = 0x0010,
174 OP_WR = 0x0020,
176
177 // Read/Write combinations
182
183 // Mapping
184 RXPDO_MAP = 0x0040,
185 TXPDO_MAP = 0x0080,
186 RXTXPDO_MAP = 0x00C0,
187
188 // Other flags
189 BACKUP = 0x0100,
190 STARTUP = 0x0200,
191
193};
194
206 return static_cast<ObjectFlags>(static_cast<uint16_t>(lhs) |
207 static_cast<uint16_t>(rhs));
208}
209
221 return static_cast<ObjectFlags>(static_cast<uint16_t>(lhs) &
222 static_cast<uint16_t>(rhs));
223}
224
236 lhs = lhs | rhs;
237 return lhs;
238}
239
254 ObjectFlags a) {
255 return b | s | p | a;
256}
257
270enum class ObjectDataType : uint16_t {
271 UNSPECIFIED = 0x0000,
272
273 BOOLEAN = 0x0001,
274 BYTE = 0x001E,
275 WORD = 0x001F,
276 DWORD = 0x0020,
277
278 BIT1 = 0x0030,
279 BIT2 = 0x0031,
280 BIT3 = 0x0032,
281 BIT4 = 0x0033,
282 BIT5 = 0x0034,
283 BIT6 = 0x0035,
284 BIT7 = 0x0036,
285 BIT8 = 0x0037,
286 BIT9 = 0x0038,
287 BIT10 = 0x0039,
288 BIT11 = 0x003A,
289 BIT12 = 0x003B,
290 BIT13 = 0x003C,
291 BIT14 = 0x003D,
292 BIT15 = 0x003E,
293 BIT16 = 0x003F,
294
295 BITARR8 = 0x002D,
296 BITARR16 = 0x002E,
297 BITARR32 = 0x002F,
298
299 INTEGER8 = 0x0002,
300 INTEGER16 = 0x0003,
301 INTEGER24 = 0x0010,
302 INTEGER32 = 0x0004,
303 INTEGER40 = 0x0012,
304 INTEGER48 = 0x0013,
305 INTEGER56 = 0x0014,
306 INTEGER64 = 0x0015,
307
308 UNSIGNED8 = 0x0005,
309 UNSIGNED16 = 0x0006,
310 UNSIGNED24 = 0x0016,
311 UNSIGNED32 = 0x0007,
312 UNSIGNED40 = 0x0018,
313 UNSIGNED48 = 0x0019,
314 UNSIGNED56 = 0x001A,
315 UNSIGNED64 = 0x001B,
316
317 REAL32 = 0x0008,
318 REAL64 = 0x0011,
319
320 GUID = 0x001D,
321
322 VISIBLE_STRING = 0x0009,
323 OCTET_STRING = 0x000A,
324 UNICODE_STRING = 0x000B,
326 ARRAY_OF_INT = 0x0260,
327 ARRAY_OF_SINT = 0x0261,
328 ARRAY_OF_DINT = 0x0262,
329 ARRAY_OF_UDINT = 0x0263,
330
331 PDO_MAPPING = 0x0021,
332 IDENTITY = 0x0023,
333 COMMAND_PAR = 0x0025,
334 PDO_PARAMETER = 0x0027,
335 ENUM = 0x0028,
337 0x0029,
338 RECORD = 0x002A,
343 ERROR_SETTING = 0x0281,
345 0x0282,
353 0x0286,
355
356 TIME_OF_DAY = 0x000C,
358 0x000D,
359 UTYPE_START = 0x0800,
360 UTYPE_END = 0x0FFF
361};
362
372enum class ObjectCode : uint16_t {
373 DEFTYPE = 0x0005,
374 DEFSTRUCT = 0x0006,
375 VAR = 0x0007,
376 ARRAY = 0x0008,
377 RECORD = 0x0009,
378};
379
404 std::variant<bool, std::int8_t, std::int16_t, std::int32_t, std::int64_t,
405 std::uint8_t, std::uint16_t, std::uint32_t, std::uint64_t,
406 float, double, std::string,
407 std::vector<std::uint8_t>>;
409
421
429 std::vector<MappedParameterValue> rx;
430 std::vector<MappedParameterValue> tx;
431};
432
444
467 public:
476 using Address = std::pair<uint16_t, uint8_t>;
477
482 std::string group;
483
487 std::string name;
488
492 std::uint16_t index;
493
497 std::uint8_t subindex;
498
502 std::uint16_t bitLength;
503
508
513
518
523
528
536
540 std::vector<std::uint8_t> data;
541
572 ParameterValue getValue() const;
573
591 template <typename T>
592 T getValue() const {
593 // Get the value as a ParameterValue
594 const ParameterValue& val = getValue();
595
596 // Try to get the value of type T from the variant
597 if (auto ptr = std::get_if<T>(&val)) {
598 return *ptr; // Return the value of type T
599 } else {
600 throw std::bad_variant_access(); // If type T is not found in the variant
601 }
602 }
603
619 template <typename T>
620 std::optional<T> tryGetValue() const {
621 const ParameterValue& val = getValue();
622 if (auto ptr = std::get_if<T>(&val)) {
623 return *ptr;
624 } else {
625 return std::nullopt;
626 }
627 }
628
640 template <typename T>
645
666 void setValue(const ParameterValue& value);
667
684 template <typename T>
685 void setValue(const T& value) {
686 // Convert the input value to ParameterValue (variant)
687 ParameterValue parameterValue(value);
688
689 // Reuse the existing setValue function to handle the assignment
690 setValue(parameterValue);
691 }
692
707 template <typename T>
708 bool trySetValue(const T& value) {
709 auto expectedType = [this]() -> std::type_index {
710 switch (dataType) {
712 return typeid(bool);
713 }
715 return typeid(std::int8_t);
716 }
718 return typeid(std::int16_t);
719 }
722 return typeid(std::int32_t);
723 }
725 return typeid(std::int64_t);
726 }
732 return typeid(std::uint8_t);
733 }
735 return typeid(std::uint16_t);
736 }
739 return typeid(std::uint32_t);
740 }
742 return typeid(std::uint64_t);
743 }
745 return typeid(float);
746 }
748 return typeid(double);
749 }
753 return typeid(std::string);
754 }
755 default: {
756 return typeid(void);
757 }
758 }
759 };
760
761 const std::type_index expected = expectedType();
762 if (expected != typeid(T) &&
763 typeid(T) != typeid(std::vector<std::uint8_t>)) {
764 return false;
765 }
766
768 return true;
769 }
770
779 bool hasAllRead() const;
780
789 bool hasAllWrite() const;
790
801 bool operator<(const Parameter& other) const {
802 if (index != other.index) {
803 return index < other.index; // Compare by index first
804 }
805 return subindex <
806 other.subindex; // Compare by subindex if indices are equal
807 }
808
819 bool operator>(const Parameter& other) const {
820 if (index != other.index) {
821 return index > other.index; // Compare by index first
822 }
823 return subindex >
824 other.subindex; // Compare by subindex if indices are equal
825 }
826
837 bool operator==(const Parameter& other) const {
838 return index == other.index && subindex == other.subindex;
839 }
840
851 static void to_json(nlohmann::json& j, const Parameter& p);
852
863 static void from_json(const nlohmann::json& j, Parameter& p);
864};
865
879
894void assignGroupsToParameters(std::vector<Parameter>& parameters);
895
916 const std::unordered_map<Parameter::Address, Parameter>& parametersMap,
917 bool sortParameters = true);
918
931inline bool isAppBinFile(const std::string& filename) {
932 return filename.rfind("app_", 0) == 0 && filename.size() >= 4 &&
933 filename.compare(filename.size() - 4, 4, ".bin") == 0;
934}
935
948inline bool isComBinFile(const std::string& filename) {
949 return filename.rfind("com_", 0) == 0 && filename.size() >= 4 &&
950 filename.compare(filename.size() - 4, 4, ".bin") == 0;
951}
952
962inline bool isFirmwareBinFile(const std::string& filename) {
963 return isAppBinFile(filename) || isComBinFile(filename);
964}
965
998
1005inline std::string deviceFileErrorToString(DeviceFileError error) {
1006 switch (error) {
1008 return "No error";
1010 return "File not found";
1012 return "File is empty";
1014 return "File starts with a null terminator";
1016 return "Failed to unzip file";
1018 return "Failed to flash device";
1020 return "Failed to write to device";
1022 return "An unknown error occurred";
1023 default:
1024 return "Unrecognized error";
1025 }
1026}
1027
1035class Device {
1036 public:
1045 virtual ~Device() = default;
1046
1055 virtual uint16_t getPosition() const = 0;
1056
1074 virtual uint8_t getState(
1075 bool refresh = false,
1076 const std::chrono::steady_clock::duration expiryTime =
1077 std::chrono::milliseconds(5000)) = 0;
1078
1091 virtual bool setState(uint8_t state,
1092 const std::chrono::steady_clock::duration expiryTime =
1093 std::chrono::milliseconds(5000)) = 0;
1094
1109 virtual std::vector<uint8_t> readFile(
1110 const std::string& filename,
1111 const std::chrono::steady_clock::duration expiryTime =
1112 std::chrono::milliseconds(5000)) = 0;
1113
1136 virtual std::vector<std::string> readFileList(
1137 const bool stripSizeSuffix,
1138 const std::chrono::steady_clock::duration expiryTime =
1139 std::chrono::milliseconds(5000)) = 0;
1140
1153 virtual void writeFile(const std::string& filename,
1154 const std::vector<uint8_t>& data,
1155 const std::chrono::steady_clock::duration expiryTime =
1156 std::chrono::milliseconds(5000)) = 0;
1157
1165 virtual void removeFile(const std::string& filename,
1166 const std::chrono::steady_clock::duration expiryTime =
1167 std::chrono::milliseconds(5000)) = 0;
1168
1180 virtual void updateFirmware(
1181 const std::vector<std::uint8_t>& data,
1182 const std::vector<std::string>& skipFiles = {},
1183 std::function<void(uint8_t, std::string)> progressCallback = nullptr,
1184 const std::chrono::steady_clock::duration expiryTime =
1185 std::chrono::milliseconds(60000)) = 0;
1186
1196 virtual size_t loadParameters(
1197 bool readValues, const std::chrono::steady_clock::duration expiryTime =
1198 std::chrono::milliseconds(9000)) = 0;
1199
1206 virtual void clearParameters() = 0;
1207
1214 virtual std::vector<std::reference_wrapper<Parameter>> parameters() = 0;
1215
1231 virtual Parameter& findParameter(uint16_t index, uint8_t subindex) = 0;
1232
1251 uint16_t index, uint8_t subindex,
1252 const std::chrono::steady_clock::duration expiryTime =
1253 std::chrono::milliseconds(5000)) = 0;
1254
1270 virtual void download(uint16_t index, uint8_t subindex,
1271 const std::chrono::steady_clock::duration expiryTime =
1272 std::chrono::milliseconds(5000)) = 0;
1273
1291 virtual void download(uint16_t index, uint8_t subindex,
1292 const ParameterValue& value,
1293 const std::chrono::steady_clock::duration expiryTime =
1294 std::chrono::milliseconds(5000)) = 0;
1295
1308 uint64_t missedCycles = 0) = 0;
1309
1326 uint8_t subindex) const = 0;
1327
1333 virtual bool isOnline() = 0;
1334};
1335
1345 public:
1360 virtual bool setState(
1361 uint8_t state, const std::chrono::steady_clock::duration expiryTime) = 0;
1362
1375 virtual std::vector<uint8_t> exchangeProcessData(
1376 const std::vector<uint8_t>& data,
1377 const std::chrono::steady_clock::duration expiryTime) = 0;
1378
1391 uint64_t missedCycles,
1392 const std::chrono::steady_clock::duration expiryTime) = 0;
1393 virtual std::vector<Device>& devices() = 0;
1394
1395 private:
1396 // Container holding all managed devices.
1397 std::vector<Device> devices_;
1398};
1399
1408class DeviceResponseException : public std::runtime_error {
1409 public:
1416 DeviceResponseException(const std::string& what_arg, uint16_t position,
1417 int code);
1418
1422 uint16_t position() const noexcept;
1423
1427 int code() const noexcept;
1428
1429 private:
1430 uint16_t position_;
1431 int code_;
1432};
1433
1446extern std::set<std::string> kNonPartedFileNames;
1447
1478std::vector<std::uint8_t> readCompleteDeviceFile(
1479 Device& device, const std::string& filename,
1480 const std::chrono::steady_clock::duration expiryTime =
1481 std::chrono::milliseconds(20000));
1482
1509 Device& device, const std::string& filename,
1510 const std::vector<std::uint8_t>& data,
1511 std::function<void(uint8_t, std::string)> progressCallback = nullptr,
1512 const std::chrono::steady_clock::duration expiryTime =
1513 std::chrono::milliseconds(30000));
1514
1533void removeDeviceFileOrParts(Device& device, const std::string& filename,
1534 const std::chrono::steady_clock::duration
1535 expiryTime = std::chrono::milliseconds(20000));
1536
1557 Device& device, const std::vector<std::uint8_t>& data,
1558 const std::vector<std::string>& skipFiles = {},
1559 std::function<void(uint8_t, std::string)> progressCallback = nullptr,
1560 const std::chrono::steady_clock::duration expiryTime =
1561 std::chrono::milliseconds(60000));
1562
1577inline std::string makeParameterId(int index, int subindex) {
1578 std::stringstream oss;
1579 // Format index and subindex into "0xINDEX:SUBINDEX"
1580 oss << "0x" << std::setw(4) << std::setfill('0') << std::hex << std::uppercase
1581 << index << ":" << std::setw(2) << std::setfill('0') << std::hex
1582 << std::uppercase << subindex;
1583
1584 return oss.str();
1585}
1586
1609 public:
1617 std::chrono::milliseconds intervalBetweenUploads);
1618
1623
1631 void add(uint16_t index, uint8_t subindex);
1632
1641 void remove(uint16_t index, uint8_t subindex);
1642
1648 void clear();
1649
1660 void start();
1661
1674 void stop();
1675
1685 void triggerManualRefresh(bool async = false);
1686
1687 protected:
1703 virtual void refresh(const std::vector<Parameter::Address>& addresses) = 0;
1704
1705 std::chrono::milliseconds
1707 std::condition_variable
1709 std::mutex mutex_;
1710 std::vector<Parameter::Address>
1714 std::thread worker_;
1715
1716 private:
1737 void run();
1738};
1739
1740} // namespace mm::comm::base
1741
1742namespace nlohmann {
1747template <>
1748struct adl_serializer<mm::comm::base::ParameterValue> {
1750 std::visit([&j](const auto& val) { j = val; }, value);
1751 }
1752
1754 if (j.is_boolean()) {
1755 value = j.get<bool>();
1756 } else if (j.is_number_integer()) {
1757 int64_t num = j.get<int64_t>();
1758 if (num >= -128 && num <= 127) {
1759 value = static_cast<int8_t>(num);
1760 } else if (num >= -32768 && num <= 32767) {
1761 value = static_cast<int16_t>(num);
1762 } else if (num >= -2147483648LL && num <= 2147483647LL) {
1763 value = static_cast<int32_t>(num);
1764 } else {
1765 value = num; // int64_t
1766 }
1767 } else if (j.is_number_unsigned()) {
1768 uint64_t num = j.get<uint64_t>();
1769 if (num <= 255) {
1770 value = static_cast<uint8_t>(num);
1771 } else if (num <= 65535) {
1772 value = static_cast<uint16_t>(num);
1773 } else if (num <= 4294967295ULL) {
1774 value = static_cast<uint32_t>(num);
1775 } else {
1776 value = num; // uint64_t
1777 }
1778 } else if (j.is_number_float()) {
1779 double f = j.get<double>();
1780 // float range: approx ±3.4e38
1781 if (f >= -3.4e38 && f <= 3.4e38) {
1782 value = static_cast<float>(f);
1783 } else {
1784 value = f; // double
1785 }
1786 } else if (j.is_string()) {
1787 value = j.get<std::string>();
1788 } else if (j.is_array()) {
1789 value = j.get<std::vector<uint8_t>>();
1790 } else {
1791 throw std::runtime_error("Unsupported JSON type for ParameterValue");
1792 }
1793 }
1794};
1795
1801inline void to_json(nlohmann::json& j,
1803 j = nlohmann::json{
1804 {"index", p.index}, {"subindex", p.subindex}, {"value", p.value}};
1805}
1806
1812inline void from_json(const nlohmann::json& j,
1814 j.at("index").get_to(p.index);
1815 j.at("subindex").get_to(p.subindex);
1816 j.at("value").get_to(p.value);
1817}
1818
1825 j = json{{"rx", p.rx}, {"tx", p.tx}};
1826}
1827
1834 j.at("rx").get_to(p.rx);
1835 j.at("tx").get_to(p.tx);
1836}
1837} // namespace nlohmann
nlohmann::json json
Definition circulo_encoder_configuration.cc:13
Manages devices and performs cyclic process data exchange.
Definition base.h:1344
virtual void exchangeProcessDataAndUpdateParameters(uint64_t missedCycles, const std::chrono::steady_clock::duration expiryTime)=0
Exchanges process data and updates internal parameters for each device.
virtual std::vector< Device > & devices()=0
virtual bool setState(uint8_t state, const std::chrono::steady_clock::duration expiryTime)=0
Sets the operational state of all managed devices.
virtual std::vector< uint8_t > exchangeProcessData(const std::vector< uint8_t > &data, const std::chrono::steady_clock::duration expiryTime)=0
Exchanges process data with devices.
virtual void refresh(const std::vector< Parameter::Address > &addresses)=0
Rereads the specified device parameters.
void triggerManualRefresh(bool async=false)
Triggers a manual refresh of device parameters.
Definition base.cc:697
void remove(uint16_t index, uint8_t subindex)
Remove a parameter identified by (index, subindex) from the refresh list.
Definition base.cc:628
void start()
Starts the refresher background thread if it is not already running.
Definition base.cc:640
std::vector< Parameter::Address > addresses_
List of parameter addresses to refresh.
Definition base.h:1711
~DeviceParameterRefresher()
Destructor ensures the refresher thread is stopped cleanly.
Definition base.cc:607
bool running_
Flag indicating whether the refresher thread is running.
Definition base.h:1713
void clear()
Remove all parameters from the refresh list.
Definition base.cc:635
Device & device_
Reference to the device instance used for uploading.
Definition base.h:1712
DeviceParameterRefresher(Device &device, std::chrono::milliseconds intervalBetweenUploads)
Constructor initializes the refresher with a device reference and upload interval.
Definition base.cc:603
std::chrono::milliseconds interval_
Time to wait between consecutive parameter uploads.
Definition base.h:1706
std::mutex mutex_
Mutex protecting access to shared data members.
Definition base.h:1709
std::condition_variable cv_
Condition variable used to notify the worker thread.
Definition base.h:1708
std::thread worker_
The background thread performing periodic uploads.
Definition base.h:1714
void add(uint16_t index, uint8_t subindex)
Add a parameter identified by (index, subindex) to the refresh list.
Definition base.cc:609
void stop()
Stops the refresher background thread if it is running.
Definition base.cc:651
uint16_t position() const noexcept
Returns the device position or ID.
Definition base.cc:324
int code() const noexcept
Returns the device-specific error code.
Definition base.cc:328
DeviceResponseException(const std::string &what_arg, uint16_t position, int code)
Constructs a DeviceResponseException.
Definition base.cc:320
Abstract interface representing a generic device.
Definition base.h:1035
virtual ~Device()=default
Virtual destructor for Device interface.
virtual uint16_t getPosition() const =0
Gets the device's position in the network chain.
virtual size_t loadParameters(bool readValues, const std::chrono::steady_clock::duration expiryTime=std::chrono::milliseconds(9000))=0
Loads parameters from the device and stores them locally.
virtual Parameter & upload(uint16_t index, uint8_t subindex, const std::chrono::steady_clock::duration expiryTime=std::chrono::milliseconds(5000))=0
Uploads a parameter from the device via SDO and updates the local parameter store.
virtual void removeFile(const std::string &filename, const std::chrono::steady_clock::duration expiryTime=std::chrono::milliseconds(5000))=0
Removes a file from the device.
virtual void exchangeProcessDataAndUpdateParameters(uint64_t missedCycles=0)=0
Exchanges process data with the remote device and updates local parameters accordingly.
virtual void writeFile(const std::string &filename, const std::vector< uint8_t > &data, const std::chrono::steady_clock::duration expiryTime=std::chrono::milliseconds(5000))=0
Sends a file to the device.
virtual void download(uint16_t index, uint8_t subindex, const ParameterValue &value, const std::chrono::steady_clock::duration expiryTime=std::chrono::milliseconds(5000))=0
Sets a parameter value in the local store and downloads it to the device.
virtual PdoMappingStatus getPdoMappingStatus(uint16_t index, uint8_t subindex) const =0
Determines the PDO mapping status of a parameter by its index and subindex.
virtual void updateFirmware(const std::vector< std::uint8_t > &data, const std::vector< std::string > &skipFiles={}, std::function< void(uint8_t, std::string)> progressCallback=nullptr, const std::chrono::steady_clock::duration expiryTime=std::chrono::milliseconds(60000))=0
Updates the device firmwares.
virtual std::vector< uint8_t > readFile(const std::string &filename, const std::chrono::steady_clock::duration expiryTime=std::chrono::milliseconds(5000))=0
Reads the contents of a file from the device.
virtual std::vector< std::string > readFileList(const bool stripSizeSuffix, const std::chrono::steady_clock::duration expiryTime=std::chrono::milliseconds(5000))=0
Reads a list of file names from the device.
virtual void clearParameters()=0
Clears all loaded object dictionary parameters.
virtual bool isOnline()=0
Checks if the device is online.
virtual void download(uint16_t index, uint8_t subindex, const std::chrono::steady_clock::duration expiryTime=std::chrono::milliseconds(5000))=0
Downloads a parameter to the device using SDO communication.
virtual bool setState(uint8_t state, const std::chrono::steady_clock::duration expiryTime=std::chrono::milliseconds(5000))=0
Sets the device to a specified state.
virtual Parameter & findParameter(uint16_t index, uint8_t subindex)=0
Finds and returns a reference to a parameter by its index and subindex.
virtual std::vector< std::reference_wrapper< Parameter > > parameters()=0
Get a vector of references to parameters.
virtual uint8_t getState(bool refresh=false, const std::chrono::steady_clock::duration expiryTime=std::chrono::milliseconds(5000))=0
Reads and returns the current state of the device.
Represents a device parameter identified by index and subindex.
Definition base.h:466
bool hasAllRead() const
Checks if all read access flags are set in the access field.
Definition base.cc:208
ParameterValue getValue() const
Retrieves the value of the parameter based on its data type.
Definition base.cc:41
ObjectDataType dataType
The data type of the parameter.
Definition base.h:512
T getIntValue()
Converts the internal byte vector to an integer of type T.
Definition base.h:641
ObjectCode code
The object code for the parameter.
Definition base.h:517
ObjectFlags access
The access flags for the parameter.
Definition base.h:527
std::optional< T > tryGetValue() const
Attempts to retrieve the parameter value from the ParameterValue variant as the specified type.
Definition base.h:620
std::string name
Name of the parameter.
Definition base.h:487
static void to_json(nlohmann::json &j, const Parameter &p)
Serializes a Parameter object to JSON.
Definition base.cc:216
static void from_json(const nlohmann::json &j, Parameter &p)
Deserializes a Parameter object from JSON.
Definition base.cc:228
std::pair< uint16_t, uint8_t > Address
Alias for a pair of uint16_t and uint8_t representing a parameter address.
Definition base.h:476
void setValue(const T &value)
Sets the parameter value using a strongly-typed input.
Definition base.h:685
std::vector< std::uint8_t > data
Holds raw data as a vector of uint8_t elements.
Definition base.h:540
bool operator==(const Parameter &other) const
Checks if two Parameter objects are equal.
Definition base.h:837
std::uint16_t index
Index of the parameter.
Definition base.h:492
T getValue() const
Retrieves the parameter value from the ParameterValue variant as the specified type.
Definition base.h:592
bool operator<(const Parameter &other) const
Compares two Parameter objects for ordering.
Definition base.h:801
bool trySetValue(const T &value)
Attempts to set the parameter value with a strongly-typed input.
Definition base.h:708
std::uint16_t bitLength
Bit length of the parameter.
Definition base.h:502
bool hasAllWrite() const
Checks if all write access flags are set in the access field.
Definition base.cc:212
std::string group
Name of the group this parameter belongs to. Applicable only to ARRAY and RECORD objects.
Definition base.h:482
ObjectFlags flags
The object flags for the parameter.
Definition base.h:522
bool operator>(const Parameter &other) const
Compares two Parameter objects for reverse ordering.
Definition base.h:819
std::uint8_t subindex
Subindex of the parameter.
Definition base.h:497
void setValue(const ParameterValue &value)
Sets the internal raw data representation from a given value.
Definition base.cc:129
int byteLength
Byte length of the parameter.
Definition base.h:507
PdoMappingStatus pdoMappingStatus
PDO mapping status of this parameter.
Definition base.h:535
uint8_t * value
Definition co_dictionary.h:9
uint16_t index
Definition co_dictionary.h:0
Definition base.cc:13
void from_json(const nlohmann::json &j, UiPdoMapping &p)
Deserialize a JSON object into a UiPdoMapping structure.
Definition base.cc:15
std::string makeParameterId(int index, int subindex)
Formats the given index and subindex into a parameter identifier string.
Definition base.h:1577
std::string deviceFileErrorToString(DeviceFileError error)
Convert a DeviceFileError enum value to a human-readable string.
Definition base.h:1005
std::set< std::string > kNonPartedFileNames
Set of filenames that are always stored as complete files and can be read directly.
Definition base.cc:330
bool operator==(uint32_t lhs, EtherCATVendorID rhs)
Compares a uint32_t value with an EtherCATVendorID enum value.
Definition base.h:98
constexpr std::size_t kDeviceFilePartSize
Definition base.h:83
ObjectDataType
Enumerates the supported data types for parameters.
Definition base.h:270
@ BIT14
14-bit field.
Definition base.h:291
@ UNSIGNED40
40-bit unsigned integer.
Definition base.h:312
@ INTEGER16
16-bit signed integer.
Definition base.h:300
@ UNICODE_STRING
Definition base.h:324
@ BACKUP_PARAMETER
For BACKUP_PARAMETER definition see ETG.1020.
Definition base.h:340
@ UNSPECIFIED
Undefined or unknown data type.
Definition base.h:271
@ INTEGER64
64-bit signed integer.
Definition base.h:306
@ SM_SYNCHRONIZATION
For SM_SYNCHRONIZATION definition see ETG.1000.
Definition base.h:336
@ EXTERNAL_SYNC_STATUS
Definition base.h:346
@ BIT8
8-bit field.
Definition base.h:285
@ ERROR_SETTING
For ERROR_SETTING definition see ETG.1020.
Definition base.h:343
@ INTEGER32
32-bit signed integer.
Definition base.h:302
@ BIT10
10-bit field.
Definition base.h:287
@ ARRAY_OF_INT
Sequence of INT.
Definition base.h:326
@ TIME_OF_DAY
Time of day format (implementation-defined).
Definition base.h:356
@ REAL32
32-bit floating-point number.
Definition base.h:317
@ UNSIGNED56
56-bit unsigned integer.
Definition base.h:314
@ UNSIGNED8
8-bit unsigned integer.
Definition base.h:308
@ MODULAR_DEVICE_PARAMETER
Definition base.h:341
@ BITARR8
Array of 8 bits.
Definition base.h:295
@ BITARR32
Array of 32 bits.
Definition base.h:297
@ UNSIGNED64
64-bit unsigned integer.
Definition base.h:315
@ BIT3
3-bit field.
Definition base.h:280
@ REAL64
64-bit floating-point number (double).
Definition base.h:318
@ DEFTYPE_FSOECOMMPAR
Definition base.h:352
@ BIT13
13-bit field.
Definition base.h:290
@ GUID
128-bit globally unique identifier.
Definition base.h:320
@ BIT1
1-bit field.
Definition base.h:278
@ INTEGER40
40-bit signed integer.
Definition base.h:303
@ PDO_PARAMETER
For PDO_PARAMETER definition see ETG.1020.
Definition base.h:334
@ ENUM
For ENUM definition see ETG.1020.
Definition base.h:335
@ EXTERNAL_SYNC_SETTINGS
Definition base.h:348
@ UNSIGNED48
48-bit unsigned integer.
Definition base.h:313
@ DWORD
Four octets (32 bits) unsigned integer.
Definition base.h:276
@ BIT9
9-bit field.
Definition base.h:286
@ BIT16
16-bit field.
Definition base.h:293
@ UTYPE_END
End of user-defined type range.
Definition base.h:360
@ ARRAY_OF_SINT
Sequence of SINT.
Definition base.h:327
@ RECORD
Definition base.h:338
@ UNSIGNED16
16-bit unsigned integer.
Definition base.h:309
@ INTEGER48
48-bit signed integer.
Definition base.h:304
@ ARRAY_OF_UDINT
Sequence of UDINT.
Definition base.h:329
@ BIT6
6-bit field.
Definition base.h:283
@ BIT2
2-bit field.
Definition base.h:279
@ INTEGER56
56-bit signed integer.
Definition base.h:305
@ DEFTYPE_FSOEFRAME
Definition base.h:350
@ BITARR16
Array of 16 bits.
Definition base.h:296
@ VISIBLE_STRING
Null-terminated ASCII string.
Definition base.h:322
@ BIT11
11-bit field.
Definition base.h:288
@ BIT4
4-bit field.
Definition base.h:281
@ BIT12
12-bit field.
Definition base.h:289
@ WORD
Two octets (16 bits) unsigned integer.
Definition base.h:275
@ BIT5
5-bit field.
Definition base.h:282
@ BIT15
15-bit field.
Definition base.h:292
@ BOOLEAN
Boolean value (true or false).
Definition base.h:273
@ BIT7
7-bit field.
Definition base.h:284
@ UNSIGNED32
32-bit unsigned integer.
Definition base.h:311
@ DIAGNOSIS_HISTORY
For DIAGNOSIS_HISTORY definition see ETG.1020.
Definition base.h:344
@ INTEGER24
24-bit signed integer.
Definition base.h:301
@ ARRAY_OF_DINT
Sequence of DINT.
Definition base.h:328
@ COMMAND_PAR
For COMMAND_PAR definition see ETG.1000.
Definition base.h:333
@ IDENTITY
For IDENTITY definition see ETG.1000.
Definition base.h:332
@ TIME_DIFFERENCE
Time difference format (implementation-defined).
Definition base.h:357
@ BYTE
8-bit unsigned integer.
Definition base.h:274
@ PDO_MAPPING
For PDO_MAPPING definition see ETG.1000.
Definition base.h:331
@ UNSIGNED24
24-bit unsigned integer.
Definition base.h:310
@ OCTET_STRING
Array of raw bytes.
Definition base.h:323
@ INTEGER8
8-bit signed integer.
Definition base.h:299
@ UTYPE_START
Start of user-defined type range.
Definition base.h:359
void writeDeviceFileInOptionalParts(Device &device, const std::string &filename, const std::vector< std::uint8_t > &data, std::function< void(uint8_t, std::string)> progressCallback, const std::chrono::steady_clock::duration expiryTime)
Write a file to a device, splitting it into parts if necessary.
Definition base.cc:430
EtherCATVendorID
Enum class representing EtherCAT vendor IDs.
Definition base.h:74
@ SYNAPTICON
Vendor ID for Synapticon GmbH.
Definition base.h:80
ObjectCode
Enum class representing different object types used in the EtherCAT protocol.
Definition base.h:372
@ DEFSTRUCT
Definition structure object.
Definition base.h:374
@ DEFTYPE
Definition type object.
Definition base.h:373
@ ARRAY
Array object type.
Definition base.h:376
@ VAR
Variable object type.
Definition base.h:375
void logParametersMap(const std::unordered_map< Parameter::Address, Parameter > &parametersMap, bool sortParameters)
Logs the contents of a map of parameters with an option to sort them.
Definition base.cc:293
ObjectFlags SetObjectFlags(ObjectFlags b, ObjectFlags s, ObjectFlags p, ObjectFlags a)
Combine multiple ObjectFlags values into one.
Definition base.h:253
bool isComBinFile(const std::string &filename)
Checks whether a given filename starts with "com_" and ends with ".bin".
Definition base.h:948
void removeDeviceFileOrParts(Device &device, const std::string &filename, const std::chrono::steady_clock::duration expiryTime)
Removes a file from the device, including handling multipart files if applicable.
Definition base.cc:503
ObjectFlags operator|(ObjectFlags lhs, ObjectFlags rhs)
Bitwise OR operator for ObjectFlags enum class.
Definition base.h:205
DeviceFileError
Enumeration of possible device file-related error codes.
Definition base.h:970
@ CommunicationBridgeError
Definition base.h:988
@ StorageFull
Definition base.h:974
@ PacketNumber
Definition base.h:976
@ EmptyContent
Definition base.h:989
@ FilenameLength
Definition base.h:984
@ ZipFailure
Definition base.h:991
@ FlashBusy
Definition base.h:986
@ NotFound
Definition base.h:972
@ None
Definition base.h:971
@ IllegalRequest
Definition base.h:975
@ BootstrapOnly
Definition base.h:979
@ Unknown
Definition base.h:996
@ SuccessAcknowledgement
Definition base.h:987
@ AlreadyExists
Definition base.h:977
@ UnzipFailure
Definition base.h:992
@ RemoveFailure
Definition base.h:995
@ NoUser
Definition base.h:978
@ NoRights
Definition base.h:981
@ FlashFailure
Definition base.h:993
@ Timeout
Definition base.h:985
@ AccessDenied
Definition base.h:973
@ NotBootstrap
Definition base.h:980
@ Busy
Definition base.h:983
@ ProgramError
Definition base.h:982
@ UnexpectedNullTerminator
Definition base.h:990
@ WriteFailure
Definition base.h:994
PdoMappingStatus
Represents the PDO mapping status of a parameter.
Definition base.h:439
@ MAPPED_RX_PDO
The parameter is mapped as a Receive PDO.
Definition base.h:441
@ NOT_MAPPED
The parameter is not mapped in any PDO.
Definition base.h:440
@ MAPPED_TX_PDO
The parameter is mapped as a Transmit PDO.
Definition base.h:442
void writeFirmwarePackage(Device &device, const std::vector< std::uint8_t > &data, const std::vector< std::string > &skipFiles, std::function< void(uint8_t, std::string)> progressCallback, const std::chrono::steady_clock::duration expiryTime)
Writes a firmware package to the given device.
Definition base.cc:550
std::variant< bool, std::int8_t, std::int16_t, std::int32_t, std::int64_t, std::uint8_t, std::uint16_t, std::uint32_t, std::uint64_t, float, double, std::string, std::vector< std::uint8_t > > ParameterValue
Alias for a variant that can hold multiple types of values.
Definition base.h:403
void assignGroupsToParameters(std::vector< Parameter > &parameters)
Assigns group names to parameters based on their index and subindex.
Definition base.cc:259
std::vector< std::uint8_t > readCompleteDeviceFile(Device &device, const std::string &filename, const std::chrono::steady_clock::duration expiryTime)
Reads a file from the device, supporting both complete and multipart zipped files.
Definition base.cc:336
ObjectFlags operator&(ObjectFlags lhs, ObjectFlags rhs)
Bitwise AND operator for ObjectFlags enum class.
Definition base.h:220
ObjectFlags & operator|=(ObjectFlags &lhs, ObjectFlags rhs)
Bitwise OR assignment operator for ObjectFlags enum class.
Definition base.h:235
ObjectFlags
Enum class representing various object flags.
Definition base.h:162
@ ALL_WR
Definition base.h:175
@ ALL_LIST_FLAGS
Definition base.h:192
@ RXPDO_MAP
Definition base.h:184
@ STARTUP
Definition base.h:190
@ OP_RDWR
Definition base.h:180
@ ALL_RDWR
Definition base.h:181
@ PO_RD
Definition base.h:166
@ ALL_RD
Definition base.h:169
@ PO_RDWR
Definition base.h:178
@ None
Definition base.h:163
@ RXTXPDO_MAP
Definition base.h:186
@ SO_WR
Definition base.h:173
@ OP_RD
Definition base.h:168
@ OP_WR
Definition base.h:174
@ SO_RDWR
Definition base.h:179
@ BACKUP
Definition base.h:189
@ SO_RD
Definition base.h:167
@ TXPDO_MAP
Definition base.h:185
@ PO_WR
Definition base.h:172
bool isAppBinFile(const std::string &filename)
Checks whether a given filename starts with "app_" and ends with ".bin".
Definition base.h:931
bool isFirmwareBinFile(const std::string &filename)
Checks whether the given file is a firmware binary file.
Definition base.h:962
std::string convertParameterValueToString(const ParameterValue &value)
Converts a ParameterValue to a string representation.
Definition base.cc:240
@ LITTLE
Definition util.h:77
T toInteger(const std::vector< std::uint8_t > &data, std::size_t offset=0, Endianness endian=Endianness::LITTLE)
Converts a byte sequence to an integer of type T with optional offset and endianness.
Definition util.h:103
Definition base.cc:13
Definition base.h:1742
void to_json(nlohmann::json &j, const mm::comm::base::MappedParameterValue &p)
Serialize MappedParameterValue to JSON.
Definition base.h:1801
void from_json(const nlohmann::json &j, mm::comm::base::MappedParameterValue &p)
Deserialize JSON into MappedParameterValue.
Definition base.h:1812
Represents a single mapped parameter value.
Definition base.h:416
uint8_t subindex
Definition base.h:418
uint16_t index
Definition base.h:417
ParameterValue value
Definition base.h:419
Holds collections of mapped parameter values for RX and TX directions.
Definition base.h:428
std::vector< MappedParameterValue > rx
Definition base.h:429
std::vector< MappedParameterValue > tx
Definition base.h:430
Represents a single PDO (Process Data Object) mapping entry.
Definition base.h:126
uint16_t index
The object dictionary index (e.g., 0x607A)
Definition base.h:128
uint8_t subindex
The subindex of the object (e.g., 0x00)
Definition base.h:129
uint8_t bitlength
The size of the mapped entry in bits (e.g., 16, 32, etc.)
Definition base.h:131
uint16_t pdoIndex
The PDO index (e.g., 0x1600 or 0x1A00)
Definition base.h:127
Represents the mapped PDO entries for a slave device.
Definition base.h:148
std::vector< PdoMappingEntry > txPdos
Definition base.h:151
std::vector< PdoMappingEntry > rxPdos
Definition base.h:149
Top-level UI configuration JSON structure.
Definition base.h:39
UiPdoMapping pdoMapping
Definition base.h:40
Represents the PDO mapping for RX and TX channels.
Definition base.h:29
std::map< std::uint16_t, std::vector< std::uint32_t > > rx
Definition base.h:30
std::map< std::uint16_t, std::vector< std::uint32_t > > tx
Definition base.h:31
static void to_json(json &j, const mm::comm::base::ParameterValue &value)
Definition base.h:1749
static void from_json(const json &j, mm::comm::base::ParameterValue &value)
Definition base.h:1753