8#include <nlohmann/json_fwd.hpp>
12#include <unordered_map>
56 const std::string&
name()
const;
99 std::expected<std::vector<uint8_t>, std::string>
readSdo(uint16_t index, uint8_t subindex)
const;
111 std::expected<void, std::string>
writeSdo(uint16_t index, uint8_t subindex,
112 std::span<const uint8_t> data)
const;
118 std::expected<std::vector<uint8_t>, std::string>
readFile(
const std::string& filename)
const;
125 std::expected<void, std::string>
writeFile(
const std::string& filename,
126 std::span<const uint8_t> data)
const;
135 std::expected<void, std::string>
readRegister(uint16_t address, std::span<uint8_t> data)
const;
144 std::expected<void, std::string>
writeRegister(uint16_t address,
145 std::span<const uint8_t> data)
const;
154 std::expected<std::vector<uint8_t>, std::string>
readSii()
const;
165 std::expected<void, std::string>
writeSii(std::span<const uint8_t> data)
const;
188 bool useCompleteAccess =
true);
263 std::expected<void, std::string>
setValue(uint16_t index, uint8_t subindex,
279 uint16_t index, uint8_t subindex, std::span<const uint8_t> bytes);
290 std::expected<std::vector<uint8_t>, std::string>
valueAsBytes(uint16_t index,
291 uint8_t subindex)
const;
295 const std::unordered_map<uint32_t, DeviceParameter>&
parameters()
const;
321 std::optional<DeviceParameterValue>
value(uint16_t index, uint8_t subindex)
const;
332 std::optional<DeviceParameter>
parameterCopy(uint16_t index, uint8_t subindex)
const;
343 std::optional<uint16_t>
dataType(uint16_t index, uint8_t subindex)
const;
360 std::expected<DeviceParameterValue, std::string>
readParameter(uint16_t index, uint8_t subindex);
381 std::expected<void, std::string>
readAllParameters(
bool useCompleteAccess =
true);
402 std::expected<void, std::string>
writeParameter(uint16_t index, uint8_t subindex,
418 template <
typename T>
419 std::expected<void, std::string>
writeValue(uint16_t index, uint8_t subindex, T newValue) {
434 template <
typename T>
435 std::expected<T, std::string>
readValue(uint16_t index, uint8_t subindex) {
438 return std::unexpected(v.error());
440 if (
const auto* p = std::get_if<T>(&*v)) {
443 return std::unexpected(
444 std::format(
"parameter 0x{:04X}:{:02X} holds a different type", index, subindex));
459 void readParameterValues(std::vector<DeviceParameter>& defs,
bool useCompleteAccess);
469 std::expected<std::vector<PdoMappingObject>, std::string> readPdoAssignment(
470 uint16_t assignmentIndex);
472 uint16_t slavePosition_;
484 uint32_t productCode_;
485 uint32_t revisionNumber_;
486 uint32_t serialNumber_;
496 std::unique_ptr<std::mutex> parametersMutex_;
497 std::unordered_map<uint32_t, DeviceParameter> parameters_;
510void to_json(nlohmann::json& j,
const Device& d);
Abstract interface for an EtherCAT fieldbus driver.
Definition fieldbus_driver.h:343
Represents a single node on the fieldbus.
Definition device.h:36
std::expected< void, std::string > writeSdo(uint16_t index, uint8_t subindex, std::span< const uint8_t > data) const
Writes an object dictionary entry to the device (CoE SDO download).
Definition device.cc:72
std::expected< DeviceParameterValue, std::string > readParameter(uint16_t index, uint8_t subindex)
Reads a parameter value, keeping the cached store in sync.
Definition device.cc:756
std::expected< void, std::string > readRegister(uint16_t address, std::span< uint8_t > data) const
Reads bytes from an ESC register on this device.
Definition device.cc:87
std::expected< void, std::string > initializeParameters(bool readValues=false, bool useCompleteAccess=true)
Enumerates the device's CoE object dictionary and populates parameters().
Definition device.cc:105
const DeviceParameter * parameter(uint16_t index, uint8_t subindex) const
Looks up a parameter by (index, subindex). O(1).
Definition device.cc:719
uint32_t serialNumber() const
Serial number from EEPROM.
Definition device.cc:45
std::expected< std::vector< uint8_t >, std::string > readSdo(uint16_t index, uint8_t subindex) const
Reads an object dictionary entry from the device (CoE SDO upload).
Definition device.cc:67
std::expected< void, std::string > readAllParameters(bool useCompleteAccess=true)
Refreshes the cached value of every readable parameter, keeping the list intact.
Definition device.cc:798
const std::unordered_map< uint32_t, DeviceParameter > & parameters() const
Returns the parameter map, keyed by makeParameterKey(index, subindex). Empty until initializeParamete...
Definition device.cc:351
std::expected< void, std::string > writePdoMapping(const PdoMapping &mapping)
Writes a new PDO mapping to the device via SDO, then reads it back to verify.
Definition device.cc:593
std::expected< void, std::string > writeRegister(uint16_t address, std::span< const uint8_t > data) const
Writes bytes to an ESC register on this device.
Definition device.cc:92
const std::string & name() const
Human-readable node name from SII EEPROM.
Definition device.cc:41
std::expected< void, std::string > writeValue(uint16_t index, uint8_t subindex, T newValue)
Typed convenience wrapper for writeParameter.
Definition device.h:419
std::optional< DeviceParameter > parameterCopy(uint16_t index, uint8_t subindex) const
Returns a copy of a full parameter struct (value + metadata), no bus access.
Definition device.cc:733
std::optional< DeviceParameterValue > value(uint16_t index, uint8_t subindex) const
Returns a copy of a parameter's cached value (the typed cache getter), no bus access.
Definition device.cc:724
uint32_t revisionNumber() const
Revision number from EEPROM.
Definition device.cc:44
const FlatPdoMapping & flatPdoMapping() const
Returns the device's PDO mapping. Empty until readFlatPdoMapping() succeeds.
Definition device.cc:493
bool exchangesProcessData() const
Whether the device is in a process-data-exchanging state (SAFE-OP or OP, error bit clear).
Definition device.cc:59
std::expected< PdoMapping, std::string > readPdoMapping()
Reads the device's PDO mapping grouped by mapping object (0x16xx / 0x1Axx).
Definition device.cc:451
std::vector< DeviceParameter > parametersOrdered() const
Returns all parameters sorted ascending by (index, subindex).
Definition device.cc:707
std::expected< void, std::string > readFlatPdoMapping()
Reads the device's PDO mapping from its assignment and mapping objects.
Definition device.cc:466
std::expected< DeviceParameterValue, std::string > setValueFromBytes(uint16_t index, uint8_t subindex, std::span< const uint8_t > bytes)
Sets the parameter's value from its raw on-the-wire bytes (the bytes-domain setter).
Definition device.cc:677
std::expected< void, std::string > writeFile(const std::string &filename, std::span< const uint8_t > data) const
Writes a file to this device via File over EtherCAT (FoE).
Definition device.cc:82
std::expected< void, std::string > writeParameter(uint16_t index, uint8_t subindex, DeviceParameterValue newValue)
Writes a parameter value, always updating the cache first.
Definition device.cc:870
bool mailboxActive() const
Whether the device's CoE/SDO mailbox is currently active (AL state PRE-OP, SAFE-OP,...
Definition device.cc:47
uint32_t productCode() const
Product code from EEPROM.
Definition device.cc:43
std::expected< void, std::string > writeSii(std::span< const uint8_t > data) const
Writes a raw SII (EEPROM) image to this device.
Definition device.cc:101
std::expected< std::vector< uint8_t >, std::string > valueAsBytes(uint16_t index, uint8_t subindex) const
Returns the parameter's value as its raw on-the-wire bytes (the bytes-domain getter).
Definition device.cc:696
std::expected< T, std::string > readValue(uint16_t index, uint8_t subindex)
Typed convenience wrapper for readParameter.
Definition device.h:435
std::expected< std::vector< uint8_t >, std::string > readFile(const std::string &filename) const
Reads a file from this device via File over EtherCAT (FoE).
Definition device.cc:77
uint16_t slavePosition() const
Returns the 1-based position of this node on the fieldbus.
Definition device.cc:40
std::optional< uint16_t > dataType(uint16_t index, uint8_t subindex) const
Returns a parameter's declared ETG.1020 data-type code, thread-safely (cache lock).
Definition device.cc:742
std::expected< void, std::string > setValue(uint16_t index, uint8_t subindex, DeviceParameterValue newValue)
Stores a parameter's value locally, without any bus access (the typed setter).
Definition device.cc:662
uint32_t vendorId() const
Vendor ID from EEPROM.
Definition device.cc:42
std::expected< std::vector< uint8_t >, std::string > readSii() const
Reads this device's raw Slave Information Interface (SII / EEPROM) image.
Definition device.cc:97
On-disk cache of CoE parameter definitions, keyed by device identity.
Definition parameter_cache.h:55
Definition http_server.h:16
std::variant< int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, float, double, std::string, std::vector< uint8_t > > DeviceParameterValue
Decoded value of a single device parameter (CoE object dictionary entry).
Definition device_parameter.h:24
void to_json(nlohmann::json &j, const Device &d)
Serialises a Device to JSON.
Definition device.cc:915
std::expected< int, std::string > reconcileDetectedModules(const Device &device)
Reconciles a device's Configured Module Ident List with its Detected list.
Definition device.cc:946
A single object dictionary entry held by a Device.
Definition device_parameter.h:66
A device's complete PDO mapping across both directions.
Definition pdo_mapping.h:62
A device's desired PDO configuration to write and assign — the write-side input to Device::writePdoMa...
Definition pdo_mapping.h:89
The live process-data runtime: the published image, the cross-thread exchange buffers,...
Definition process_data.h:36