Clang-formatted fake library.
This commit is contained in:
parent
04c4db80c3
commit
49e82079dc
|
|
@ -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
|
||||
...
|
||||
|
|
@ -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 << "}";
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue