Clang-formatted fake library.

This commit is contained in:
Florian Pose 2025-07-24 11:49:14 +02:00
parent 04c4db80c3
commit 49e82079dc
3 changed files with 723 additions and 625 deletions

93
.clang-format Normal file
View File

@ -0,0 +1,93 @@
---
Language: Cpp
AccessModifierOffset: -2
AlignAfterOpenBracket: AlwaysBreak
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignConsecutiveMacros: false
AlignEscapedNewlines: DontAlign
AlignOperands: false
AlignTrailingComments: true
AllowAllConstructorInitializersOnNextLine: true
AllowAllArgumentsOnNextLine: false
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: InlineOnly
AllowShortIfStatementsOnASingleLine: Never
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: No
BinPackArguments: false
BinPackParameters: false
BraceWrapping:
AfterCaseLabel: false
AfterClass: true
AfterControlStatement: Never
AfterEnum: false
AfterFunction: true
AfterNamespace: false
AfterStruct: true
AfterUnion: true
AfterExternBlock: false
BeforeCatch: true
BeforeElse: true
IndentBraces: false
SplitEmptyFunction: false
SplitEmptyRecord: false
SplitEmptyNamespace: false
BreakBeforeBinaryOperators: NonAssignment
BreakBeforeBraces: Custom # Same as 'BraceWrapping'
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: AfterColon
BreakInheritanceList: AfterColon
BreakStringLiterals: true
ColumnLimit: 78
CompactNamespaces: true
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 8
Cpp11BracedListStyle: true
DeriveLineEnding: true
DerivePointerAlignment: false
FixNamespaceComments: true
IncludeBlocks: Preserve
IndentAccessModifiers: true
IndentCaseLabels: true
IndentGotoLabels: true
IndentPPDirectives: None
IndentWidth: 4
InsertBraces: true
KeepEmptyLinesAtTheStartOfBlocks: false
MaxEmptyLinesToKeep: 2
NamespaceIndentation: None
PackConstructorInitializers: Never
PointerAlignment: Right
ReflowComments: true
SortIncludes: false
SortUsingDeclarations: true
SpaceAfterCStyleCast: true
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeCpp11BracedList: true
SpaceBeforeCtorInitializerColon: false
SpaceBeforeInheritanceColon: false
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceBeforeSquareBrackets: false
SpaceInEmptyBlock: false
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 2
SpacesInAngles: false
SpacesInCStyleCastParentheses: false
SpacesInConditionalStatement: false
SpacesInContainerLiterals: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Auto
TabWidth: 2
UseTab: Never
...

View File

@ -25,12 +25,13 @@
#include <cstring>
#include <fstream>
#include <ios>
#include <iterator>
#include <sstream>
#include <string>
#include <utility>
#include <unordered_set>
#include <iterator>
#include <ios>
#include <utility>
#include <sys/stat.h>
/****************************************************************************/
@ -49,28 +50,23 @@ static std::ostream &operator<<(std::ostream &os, const ec_address &a)
static void add_spaces(std::ostream &out, int const num)
{
for (int i = 0; i < num; ++i)
{
for (int i = 0; i < num; ++i) {
out << ' ';
}
}
template <typename Map, typename Func>
static void map2Json(std::ostream &out, const Map &map, Func &&print_func,
int indent = 0)
template <typename Map, typename Func> static void
map2Json(std::ostream &out, const Map &map, Func &&print_func, int indent = 0)
{
indent += 4;
out << "{";
bool is_first = true;
for (const auto &kv : map)
{
if (is_first)
{
for (const auto &kv : map) {
if (is_first) {
out << '\n';
is_first = false;
}
else
{
else {
out << ",\n";
}
add_spaces(out, indent);
@ -84,11 +80,14 @@ static void map2Json(std::ostream &out, const Map &map, Func &&print_func,
out << "}";
}
/*****************************************************************************
* Pdo
****************************************************************************/
size_t pdo::sizeInBytes() const
{
size_t ans = 0;
for (const auto &entry : entries)
{
for (const auto &entry : entries) {
ans += entry.bit_length;
}
return (ans + 7) / 8;
@ -97,10 +96,8 @@ size_t pdo::sizeInBytes() const
Offset pdo::findEntry(uint16_t idx, uint8_t subindex) const
{
size_t offset_bits = 0;
for (const auto &entry : entries)
{
if (entry.index == idx && entry.subindex == subindex)
{
for (const auto &entry : entries) {
if (entry.index == idx && entry.subindex == subindex) {
return Offset(offset_bits / 8, offset_bits % 8);
}
offset_bits += entry.bit_length;
@ -112,10 +109,8 @@ Offset pdo::findEntryByPos(unsigned int entry_pos) const
{
size_t offset_bits = 0;
unsigned int pos {0};
for (const auto &entry : entries)
{
if (pos == entry_pos)
{
for (const auto &entry : entries) {
if (pos == entry_pos) {
return Offset(offset_bits / 8, offset_bits % 8);
}
offset_bits += entry.bit_length;
@ -156,8 +151,7 @@ void ecrt_release_master(ec_master_t *master)
* Master
****************************************************************************/
int ecrt_master_reserve(
ec_master_t *master /**< EtherCAT master */
int ecrt_master_reserve(ec_master_t *master /**< EtherCAT master */
)
{
return 0;
@ -165,8 +159,9 @@ int ecrt_master_reserve(
static const char *getPrefix()
{
if (const auto ans = getenv("FAKE_EC_PREFIX"))
if (const auto ans = getenv("FAKE_EC_PREFIX")) {
return ans;
}
return "/FakeEtherCAT";
}
@ -176,8 +171,8 @@ ec_domain *ec_master::createDomain()
return &domains.back();
}
ec_domain_t *ecrt_master_create_domain(
ec_master_t *master /**< EtherCAT master. */
ec_domain_t *
ecrt_master_create_domain(ec_master_t *master /**< EtherCAT master. */
)
{
return master->createDomain();
@ -192,24 +187,25 @@ ec_slave_config_t *ec_master::slave_config(
{
const ec_address address {alias, position};
const auto it = slaves.find(address);
if (it != slaves.end())
{
if (it != slaves.end()) {
if (it->second.vendor_id == vendor_id
&& it->second.product_code == product_code)
&& it->second.product_code == product_code) {
return &it->second;
else
{
std::cerr << "Attempted to reconfigure slave (" << alias
<< "," << position << ")!\n";
}
else {
std::cerr << "Attempted to reconfigure slave (" << alias << ","
<< position << ")!\n";
return nullptr;
}
}
else
{
return &slaves.insert(std::make_pair<ec_address,
ec_slave_config>(ec_address{address},
ec_slave_config{address, vendor_id,
product_code})).first->second;
else {
return &slaves.insert(std::make_pair<ec_address, ec_slave_config>(
ec_address {address},
ec_slave_config {
address,
vendor_id,
product_code}))
.first->second;
}
}
@ -235,8 +231,8 @@ int ecrt_master_select_reference_clock(
int ecrt_master(
ec_master_t *master, /**< EtherCAT master */
ec_master_info_t *master_info /**< Structure that will output the
information */
ec_master_info_t *master_info /**< Structure that will output
the information */
)
{
master_info->slave_count = 0;
@ -400,38 +396,38 @@ int ecrt_master_read_idn(
int ec_master::activate()
{
for (auto &domain : domains)
{
if (domain.activate())
for (auto &domain : domains) {
if (domain.activate()) {
return -1;
}
}
{
std::ofstream out(rt_ipc_dir + "/" + rt_ipc_name + "_slaves.json");
if (!out.is_open())
{
if (!out.is_open()) {
std::cerr << "could not dump json.\n";
return -1;
}
out << "{\n \"slaves\": ";
map2Json(out, slaves, [](std::ostream &out,
const ec_slave_config &slave)
{ slave.dumpJson(out, 8); }, 4);
map2Json(
out,
slaves,
[](std::ostream &out, const ec_slave_config &slave) {
slave.dumpJson(out, 8);
},
4);
out << "\n}\n";
}
return rtipc_prepare(rt_ipc.get());
}
int ecrt_master_activate(
ec_master_t *master /**< EtherCAT master. */
int ecrt_master_activate(ec_master_t *master /**< EtherCAT master. */
)
{
try
{
try {
return master->activate();
}
catch (const std::exception &e)
{
catch (const std::exception &e) {
std::cerr << "Could not activate: " << e.what() << '\n';
return -1;
}
@ -447,8 +443,7 @@ int ec_master::deactivate()
return 0;
}
int ecrt_master_deactivate(
ec_master_t *master /**< EtherCAT master. */
int ecrt_master_deactivate(ec_master_t *master /**< EtherCAT master. */
)
{
return master->deactivate();
@ -462,15 +457,13 @@ int ecrt_master_set_send_interval(
return 0;
}
int ecrt_master_send(
ec_master_t *master /**< EtherCAT master. */
int ecrt_master_send(ec_master_t *master /**< EtherCAT master. */
)
{
return 0;
}
int ecrt_master_receive(
ec_master_t *master /**< EtherCAT master. */
int ecrt_master_receive(ec_master_t *master /**< EtherCAT master. */
)
{
return 0;
@ -524,8 +517,7 @@ int ecrt_master_sync_reference_clock_to(
return 0;
}
int ecrt_master_sync_slave_clocks(
ec_master_t *master /**< EtherCAT master. */
int ecrt_master_sync_slave_clocks(ec_master_t *master /**< EtherCAT master. */
)
{
return 0;
@ -554,8 +546,7 @@ uint32_t ecrt_master_sync_monitor_process(
return 32;
}
int ecrt_master_reset(
ec_master_t *master /**< EtherCAT master. */
int ecrt_master_reset(ec_master_t *master /**< EtherCAT master. */
)
{
return 0;
@ -563,18 +554,16 @@ int ecrt_master_reset(
static int mkpath(const std::string &file_path)
{
if (file_path.empty())
if (file_path.empty()) {
return 0;
}
std::size_t offset = 0;
do
{
do {
offset = file_path.find('/', offset + 1);
const auto subpath = file_path.substr(0, offset);
if (mkdir(subpath.c_str(), 0755) == -1)
{
if (errno != EEXIST)
{
if (mkdir(subpath.c_str(), 0755) == -1) {
if (errno != EEXIST) {
return -1;
}
}
@ -585,8 +574,7 @@ static int mkpath(const std::string &file_path)
static std::string getRtIpcDir(int idx)
{
std::string ans;
if (const auto e = getenv("FAKE_EC_HOMEDIR"))
{
if (const auto e = getenv("FAKE_EC_HOMEDIR")) {
ans = e + std::string("/") + std::to_string(idx);
}
ans = "/tmp/FakeEtherCAT/" + std::to_string(idx);
@ -598,13 +586,11 @@ static const char *getName()
{
static const char *default_name = "FakeEtherCAT";
if (const auto ans = getenv("FAKE_EC_NAME"))
{
if (const auto ans = getenv("FAKE_EC_NAME")) {
return ans;
}
std::cerr
<< "\nThe environment variable \"FAKE_EC_NAME\" is not set.\n"
std::cerr << "\nThe environment variable \"FAKE_EC_NAME\" is not set.\n"
<< "Using the default value \"" << default_name << "\".\n"
<< "Please consider to set unique names when using multiple"
<< " instances.\n\n";
@ -617,8 +603,7 @@ ec_master::ec_master(int id):
rt_ipc_name(getName()),
rt_ipc(rtipc_create(rt_ipc_name.c_str(), rt_ipc_dir.c_str())),
id_(id)
{
}
{}
/*****************************************************************************
* Slave Configuration
@ -687,7 +672,6 @@ int ecrt_slave_config_pdo_mapping_add(
for (auto smIt = sc->sync_managers.begin();
smIt != sc->sync_managers.end();
++smIt) {
auto pdo_it = smIt->second.pdos.find(pdo_index);
if (pdo_it == smIt->second.pdos.end()) {
continue;
@ -736,28 +720,25 @@ int ecrt_slave_config_pdos(
configurations. */
)
{
if (!syncs)
if (!syncs) {
return 0;
for (unsigned int sync_idx = 0; sync_idx < n_syncs; ++sync_idx)
{
if (syncs[sync_idx].index == 0xff)
{
}
for (unsigned int sync_idx = 0; sync_idx < n_syncs; ++sync_idx) {
if (syncs[sync_idx].index == 0xff) {
return 0;
}
auto &syncManager = sc->sync_managers[syncs[sync_idx].index];
syncManager.dir = syncs[sync_idx].dir;
for (unsigned int i = 0; i < syncs[sync_idx].n_pdos; ++i)
{
for (unsigned int i = 0; i < syncs[sync_idx].n_pdos; ++i) {
const auto &in_pdo = syncs[sync_idx].pdos[i];
if (in_pdo.n_entries == 0 || !in_pdo.entries)
{
if (in_pdo.n_entries == 0 || !in_pdo.entries) {
std::cerr << "Default mapping not supported.";
return -1;
}
auto &out_pdo = syncManager.pdos[in_pdo.index];
for (unsigned int pdo_entry_idx = 0;
pdo_entry_idx < in_pdo.n_entries; ++pdo_entry_idx)
{
pdo_entry_idx < in_pdo.n_entries;
++pdo_entry_idx) {
out_pdo.entries.push_back(in_pdo.entries[pdo_entry_idx]);
}
}
@ -775,30 +756,25 @@ int ecrt_slave_config_reg_pdo_entry(
is desired */
)
{
for (auto sync_it : sc->sync_managers)
{
for (auto pdo_it : sync_it.second.pdos)
{
const auto offset = pdo_it.second.findEntry(entry_index,
entry_subindex);
if (offset != NotFound)
{
for (auto sync_it : sc->sync_managers) {
for (auto pdo_it : sync_it.second.pdos) {
const auto offset =
pdo_it.second.findEntry(entry_index, entry_subindex);
if (offset != NotFound) {
const auto domain_offset =
domain->map(*sc, sync_it.first, pdo_it.first);
if (domain_offset != -1)
{
if (bit_position)
if (domain_offset != -1) {
if (bit_position) {
*bit_position = offset.bits;
else if (offset.bits)
{
}
else if (offset.bits) {
std::cerr << "Pdo Entry is not byte aligned"
<< " but bit offset is ignored!\n";
return -1;
}
return domain_offset + offset.bytes;
}
else
{
else {
return -1;
}
}
@ -828,8 +804,7 @@ int ecrt_slave_config_reg_pdo_entry_pos(
}
const auto offset = pdo_it->second.findEntryByPos(entry_pos);
if (offset != NotFound)
{
if (offset != NotFound) {
return -1;
}
@ -841,8 +816,7 @@ int ecrt_slave_config_reg_pdo_entry_pos(
if (bit_position) {
*bit_position = offset.bits;
}
else if (offset.bits)
{
else if (offset.bits) {
std::cerr << "Pdo Entry is not byte aligned"
<< " but bit offset is ignored!\n";
return -1;
@ -894,8 +868,12 @@ int ecrt_slave_config_sdo16(
{
uint8_t buf[sizeof(value)];
memcpy(&buf, &value, sizeof(value));
return ecrt_slave_config_sdo(sc, sdo_index, sdo_subindex,
buf, sizeof(buf));
return ecrt_slave_config_sdo(
sc,
sdo_index,
sdo_subindex,
buf,
sizeof(buf));
}
int ecrt_slave_config_sdo32(
@ -907,8 +885,12 @@ int ecrt_slave_config_sdo32(
{
uint8_t buf[sizeof(value)];
memcpy(&buf, &value, sizeof(value));
return ecrt_slave_config_sdo(sc, sdo_index, sdo_subindex,
buf, sizeof(buf));
return ecrt_slave_config_sdo(
sc,
sdo_index,
sdo_subindex,
buf,
sizeof(buf));
}
int ecrt_slave_config_complete_sdo(
@ -1003,8 +985,8 @@ int ecrt_slave_config_idn(
ec_slave_config_t *sc, /**< Slave configuration. */
uint8_t drive_no, /**< Drive number. */
uint16_t idn, /**< SoE IDN. */
ec_al_state_t state, /**< AL state in which to write the IDN (PREOP or
SAFEOP). */
ec_al_state_t state, /**< AL state in which to write
the IDN (PREOP or SAFEOP). */
const uint8_t *data, /**< Pointer to the data. */
size_t size /**< Size of the \a data. */
)
@ -1093,17 +1075,25 @@ int ecrt_domain_reg_pdo_entry_list(
ec_slave_config_t *sc;
int ret;
for (reg = pdo_entry_regs; reg->index; reg++)
{
for (reg = pdo_entry_regs; reg->index; reg++) {
if (!(sc = ecrt_master_slave_config(
domain->getMaster(), reg->alias,
reg->position, reg->vendor_id, reg->product_code)))
domain->getMaster(),
reg->alias,
reg->position,
reg->vendor_id,
reg->product_code))) {
return -ENOENT;
}
if ((ret = ecrt_slave_config_reg_pdo_entry(
sc, reg->index, reg->subindex, domain,
reg->bit_position)) < 0)
sc,
reg->index,
reg->subindex,
domain,
reg->bit_position))
< 0) {
return ret;
}
*reg->offset = ret;
}
@ -1111,35 +1101,31 @@ int ecrt_domain_reg_pdo_entry_list(
return 0;
}
size_t ecrt_domain_size(
const ec_domain_t *domain /**< Domain. */
size_t ecrt_domain_size(const ec_domain_t *domain /**< Domain. */
)
{
return domain->getSize();
}
uint8_t *ecrt_domain_data(
const ec_domain_t *domain)
uint8_t *ecrt_domain_data(const ec_domain_t *domain)
{
return domain->getData();
}
int ecrt_domain_process(
ec_domain_t *domain)
int ecrt_domain_process(ec_domain_t *domain)
{
return domain->process();
}
int ecrt_domain_queue(
ec_domain_t *domain)
int ecrt_domain_queue(ec_domain_t *domain)
{
return domain->queue();
}
int ecrt_domain_state(
const ec_domain_t *domain, /**< Domain. */
ec_domain_state_t *state /**< Pointer to a state object to store the
information. */
ec_domain_state_t *state /**< Pointer to a state object to
store the information. */
)
{
state->working_counter = domain->getNumSlaves();
@ -1149,9 +1135,10 @@ int ecrt_domain_state(
}
ec_domain::ec_domain(rtipc *rtipc, const char *prefix, ec_master_t *master):
rt_group(rtipc_create_group(rtipc, 1.0)), prefix(prefix), master(master)
{
}
rt_group(rtipc_create_group(rtipc, 1.0)),
prefix(prefix),
master(master)
{}
int ec_domain::activate()
{
@ -1159,29 +1146,39 @@ int ec_domain::activate()
connected.resize(mapped_pdos.size());
size_t idx = 0;
for (const auto &pdo : mapped_pdos)
{
for (const auto &pdo : mapped_pdos) {
slaves.insert(pdo.slave_address.getCombined());
void *rt_pdo = nullptr;
char buf[512];
const auto fmt = snprintf(buf, sizeof(buf), "%s/%d/%08X/%04X",
prefix, master->getId(), pdo.slave_address.getCombined(),
const auto fmt = snprintf(
buf,
sizeof(buf),
"%s/%d/%08X/%04X",
prefix,
master->getId(),
pdo.slave_address.getCombined(),
pdo.pdo_index);
if (fmt < 0 || fmt >= (int)sizeof(buf))
{
if (fmt < 0 || fmt >= (int) sizeof(buf)) {
return -ENOBUFS;
}
switch (pdo.dir)
{
switch (pdo.dir) {
case EC_DIR_OUTPUT:
rt_pdo = rtipc_txpdo(rt_group, buf, rtipc_uint8_T,
data.data() + pdo.offset, pdo.size_bytes);
rt_pdo = rtipc_txpdo(
rt_group,
buf,
rtipc_uint8_T,
data.data() + pdo.offset,
pdo.size_bytes);
std::cerr << "Registering " << buf << " as Output\n";
break;
case EC_DIR_INPUT:
rt_pdo = rtipc_rxpdo(rt_group, buf, rtipc_uint8_T,
data.data() + pdo.offset, pdo.size_bytes,
rt_pdo = rtipc_rxpdo(
rt_group,
buf,
rtipc_uint8_T,
data.data() + pdo.offset,
pdo.size_bytes,
connected.data() + idx);
std::cerr << "Registering " << buf << " as Input\n";
break;
@ -1189,8 +1186,7 @@ int ec_domain::activate()
std::cerr << "Unknown direction " << pdo.dir << '\n';
return -1;
}
if (!rt_pdo)
{
if (!rt_pdo) {
std::cerr << "Failed to register RtIPC PDO\n";
return -1;
}
@ -1213,26 +1209,32 @@ int ec_domain::queue()
return 0;
}
ssize_t ec_domain::map(ec_slave_config const &config,
unsigned int syncManager, uint16_t pdo_index)
ssize_t ec_domain::map(
ec_slave_config const &config,
unsigned int syncManager,
uint16_t pdo_index)
{
if (activated_)
if (activated_) {
return -1;
for (const auto &pdo : mapped_pdos)
{
}
for (const auto &pdo : mapped_pdos) {
if (pdo.slave_address == config.address
&& syncManager == pdo.syncManager
&& pdo_index == pdo.pdo_index)
{
&& syncManager == pdo.syncManager && pdo_index == pdo.pdo_index) {
// already mapped;
return pdo.offset;
}
}
const auto ans = data.size();
const auto size =
config.sync_managers.at(syncManager).pdos.at(pdo_index).sizeInBytes();
mapped_pdos.emplace_back(ans, size, config.address, syncManager,
pdo_index, config.sync_managers.at(syncManager).dir);
const auto size = config.sync_managers.at(syncManager)
.pdos.at(pdo_index)
.sizeInBytes();
mapped_pdos.emplace_back(
ans,
size,
config.address,
syncManager,
pdo_index,
config.sync_managers.at(syncManager).dir);
data.resize(ans + size);
return ans;
}
@ -1252,43 +1254,41 @@ int ecrt_sdo_request_index(
int ecrt_sdo_request_timeout(
ec_sdo_request_t *req, /**< SDO request. */
uint32_t timeout /**< Timeout in milliseconds. Zero means no
timeout. */
uint32_t timeout /**< Timeout in milliseconds. Zero
means no timeout. */
)
{
return 0;
}
uint8_t *ecrt_sdo_request_data(
const ec_sdo_request_t *req /**< SDO request. */
uint8_t *
ecrt_sdo_request_data(const ec_sdo_request_t *req /**< SDO request. */
)
{
return nullptr;
}
size_t ecrt_sdo_request_data_size(
const ec_sdo_request_t *req /**< SDO request. */
size_t
ecrt_sdo_request_data_size(const ec_sdo_request_t *req /**< SDO request. */
)
{
return 0;
}
ec_request_state_t ecrt_sdo_request_state(
ec_sdo_request_t *req /**< SDO request. */
ec_request_state_t
ecrt_sdo_request_state(ec_sdo_request_t *req /**< SDO request. */
)
{
return EC_REQUEST_ERROR;
}
int ecrt_sdo_request_write(
ec_sdo_request_t *req /**< SDO request. */
int ecrt_sdo_request_write(ec_sdo_request_t *req /**< SDO request. */
)
{
return 0;
}
int ecrt_sdo_request_read(
ec_sdo_request_t *req /**< SDO request. */
int ecrt_sdo_request_read(ec_sdo_request_t *req /**< SDO request. */
)
{
return 0;
@ -1309,43 +1309,41 @@ int ecrt_soe_request_idn(
int ecrt_soe_request_timeout(
ec_soe_request_t *req, /**< SoE request. */
uint32_t timeout /**< Timeout in milliseconds. Zero means no
timeout. */
uint32_t timeout /**< Timeout in milliseconds. Zero
means no timeout. */
)
{
return 0;
}
uint8_t *ecrt_soe_request_data(
const ec_soe_request_t *req /**< SoE request. */
uint8_t *
ecrt_soe_request_data(const ec_soe_request_t *req /**< SoE request. */
)
{
return nullptr;
}
size_t ecrt_soe_request_data_size(
const ec_soe_request_t *req /**< SoE request. */
size_t
ecrt_soe_request_data_size(const ec_soe_request_t *req /**< SoE request. */
)
{
return 0;
}
ec_request_state_t ecrt_soe_request_state(
ec_soe_request_t *req /**< SoE request. */
ec_request_state_t
ecrt_soe_request_state(ec_soe_request_t *req /**< SoE request. */
)
{
return EC_REQUEST_ERROR;
}
int ecrt_soe_request_write(
ec_soe_request_t *req /**< SoE request. */
int ecrt_soe_request_write(ec_soe_request_t *req /**< SoE request. */
)
{
return 0;
}
int ecrt_soe_request_read(
ec_soe_request_t *req /**< SoE request. */
int ecrt_soe_request_read(ec_soe_request_t *req /**< SoE request. */
)
{
return 0;
@ -1375,15 +1373,15 @@ int ecrt_voe_handler_received_header(
return 0;
}
uint8_t *ecrt_voe_handler_data(
const ec_voe_handler_t *voe /**< VoE handler. */
uint8_t *
ecrt_voe_handler_data(const ec_voe_handler_t *voe /**< VoE handler. */
)
{
return nullptr;
}
size_t ecrt_voe_handler_data_size(
const ec_voe_handler_t *voe /**< VoE handler. */
size_t
ecrt_voe_handler_data_size(const ec_voe_handler_t *voe /**< VoE handler. */
)
{
return 0;
@ -1397,22 +1395,20 @@ int ecrt_voe_handler_write(
return 0;
}
int ecrt_voe_handler_read(
ec_voe_handler_t *voe /**< VoE handler. */
int ecrt_voe_handler_read(ec_voe_handler_t *voe /**< VoE handler. */
)
{
return 0;
}
int ecrt_voe_handler_read_nosync(
ec_voe_handler_t *voe /**< VoE handler. */
int ecrt_voe_handler_read_nosync(ec_voe_handler_t *voe /**< VoE handler. */
)
{
return 0;
}
ec_request_state_t ecrt_voe_handler_execute(
ec_voe_handler_t *voe /**< VoE handler. */
ec_request_state_t
ecrt_voe_handler_execute(ec_voe_handler_t *voe /**< VoE handler. */
)
{
return EC_REQUEST_ERROR;
@ -1422,15 +1418,15 @@ ec_request_state_t ecrt_voe_handler_execute(
* Register request
****************************************************************************/
uint8_t *ecrt_reg_request_data(
const ec_reg_request_t *req /**< Register request. */
uint8_t *
ecrt_reg_request_data(const ec_reg_request_t *req /**< Register request. */
)
{
return nullptr;
}
ec_request_state_t ecrt_reg_request_state(
const ec_reg_request_t *req /**< Register request. */
ec_request_state_t
ecrt_reg_request_state(const ec_reg_request_t *req /**< Register request. */
)
{
return EC_REQUEST_ERROR;
@ -1494,16 +1490,18 @@ void ec_slave_config::dumpJson(std::ostream &out, int indent) const
out << "\"product_id\": " << product_code << ",\n";
add_spaces(out, indent);
out << "\"sdos\": ";
map2Json(out, sdos,
[](std::ostream &out, const std::basic_string<uint8_t> &value)
{
map2Json(
out,
sdos,
[](std::ostream &out, const std::basic_string<uint8_t> &value) {
out << "\"0x";
for (const auto s : value) {
out << std::hex << std::setfill('0')
<< std::setw(2) << (unsigned)s;
out << std::hex << std::setfill('0') << std::setw(2)
<< (unsigned) s;
}
out << '"';
}, indent);
},
indent);
out << '\n';
add_spaces(out, indent - 4);
out << "}";

View File

@ -38,8 +38,10 @@ struct Offset
int bytes;
int bits;
constexpr Offset(int bytes,
int bits) : bytes(bytes), bits(bits) {}
constexpr Offset(int bytes, int bits):
bytes(bytes),
bits(bits)
{}
constexpr bool operator!=(const Offset &other) const noexcept
{
@ -67,14 +69,15 @@ struct syncManager
class ec_address
{
private:
uint32_t value;
public:
ec_address(uint16_t alias, /**< Slave alias. */
uint16_t position /**< Slave position. */)
: value(static_cast<uint32_t>(alias) << 16 | position)
{
}
ec_address(
uint16_t alias, /**< Slave alias. */
uint16_t position /**< Slave position. */):
value(static_cast<uint32_t>(alias) << 16 | position)
{}
uint16_t getAlias() const { return value >> 16; }
uint16_t getPosition() const { return value & 0xFFFF; }
@ -94,14 +97,15 @@ public:
class sdo_address
{
private:
uint32_t value;
public:
sdo_address(uint16_t index, /**< Slave alias. */
uint8_t subindex /**< Slave position. */)
: value(static_cast<uint32_t>(index) << 8 | subindex)
{
}
sdo_address(
uint16_t index, /**< Slave alias. */
uint8_t subindex /**< Slave position. */):
value(static_cast<uint32_t>(index) << 8 | subindex)
{}
uint16_t getIndex() const { return value >> 8; }
uint8_t getSubIndex() const { return value & 0xFF; }
@ -129,17 +133,17 @@ struct ec_slave_config
ec_slave_config(
ec_address address,
uint32_t vendor_id, /**< Expected vendor ID. */
uint32_t product_code /**< Expected product code. */)
: address(address), vendor_id(vendor_id), product_code(product_code)
{
}
uint32_t product_code /**< Expected product code. */):
address(address),
vendor_id(vendor_id),
product_code(product_code)
{}
void dumpJson(std::ostream &out, int indent) const;
};
struct ec_domain
{
private:
struct PdoMap
{
@ -150,16 +154,19 @@ private:
uint16_t pdo_index;
ec_direction_t dir;
PdoMap(
size_t offset,
PdoMap(size_t offset,
size_t size_bytes,
ec_address slave_address,
unsigned int syncManager,
uint16_t pdo_index,
ec_direction_t dir)
: offset(offset), size_bytes(size_bytes), slave_address(slave_address), syncManager(syncManager), pdo_index(pdo_index), dir(dir)
{
}
ec_direction_t dir):
offset(offset),
size_bytes(size_bytes),
slave_address(slave_address),
syncManager(syncManager),
pdo_index(pdo_index),
dir(dir)
{}
};
std::vector<uint8_t> data;
@ -172,19 +179,20 @@ private:
size_t numSlaves = 0;
public:
explicit ec_domain(struct rtipc *rtipc, const char *prefix, ec_master_t *master);
explicit ec_domain(
struct rtipc *rtipc,
const char *prefix,
ec_master_t *master);
uint8_t *getData() const
{
if (!activated_)
if (!activated_) {
return nullptr;
}
return const_cast<uint8_t *>(data.data());
}
size_t getSize() const
{
return data.size();
}
size_t getSize() const { return data.size(); }
int activate();
int process();
@ -192,7 +200,9 @@ public:
size_t getNumSlaves() const { return numSlaves; }
ssize_t map(ec_slave_config const &config, unsigned int syncManager,
ssize_t
map(ec_slave_config const &config,
unsigned int syncManager,
uint16_t pdo_index);
ec_master_t *getMaster() const { return master; }
@ -203,10 +213,7 @@ struct ec_master
private:
struct RtIpcDeleter
{
void operator()(struct rtipc *r) const
{
rtipc_exit(r);
}
void operator()(struct rtipc *r) const { rtipc_exit(r); }
};
std::string rt_ipc_dir;