From 2e9101da99b18700e23587e04751050cf07de632 Mon Sep 17 00:00:00 2001 From: Florian Pose Date: Fri, 29 Nov 2024 14:06:02 +0100 Subject: [PATCH 1/3] Remove domain information from RtIPC path. --- fake_lib/fakeethercat.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fake_lib/fakeethercat.cpp b/fake_lib/fakeethercat.cpp index ee8a21cb..88a3b618 100644 --- a/fake_lib/fakeethercat.cpp +++ b/fake_lib/fakeethercat.cpp @@ -118,7 +118,7 @@ int ec_domain::activate(int domain_id) slaves.insert(pdo.slave_address.getCombined()); void *rt_pdo = nullptr; char buf[512]; - const auto fmt = snprintf(buf, sizeof(buf), "%s/%d/%d/%08X/%04X", prefix, master->getId(), domain_id, pdo.slave_address.getCombined(), pdo.pdo_index); + 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)) { return -ENOBUFS; From 5ae76628930094caed35c58dc2099b241e7d82a6 Mon Sep 17 00:00:00 2001 From: Florian Pose Date: Mon, 16 Dec 2024 15:45:55 +0100 Subject: [PATCH 2/3] Removed domain permutation from documentation; fixed some typos. --- fake_lib/README.md | 61 ++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 34 deletions(-) diff --git a/fake_lib/README.md b/fake_lib/README.md index c9b7647a..0b8c76d9 100644 --- a/fake_lib/README.md +++ b/fake_lib/README.md @@ -1,16 +1,16 @@ FakeEtherCAT Library {#libfakeethercat} ==================== -Libfakeethercat is a userspace library which has the same API as -the EtherCAT master interface library libethercat. -Libfakeethercat can be used to spin up your RT application in a dry-run mode, -without any master configured or slaves attached. -Furthermore, it is possible to emulate EtherCAT slaves on process data level -by running two applications back to back. +Libfakeethercat is a userspace library which has the same API as the EtherCAT +master interface library libethercat. Libfakeethercat can be used to spin up +your RT application in a dry-run mode, without any master configured or slaves +attached. Furthermore, it is possible to emulate EtherCAT slaves on process +data level by running two applications back to back. ## Supported features -Currently, only a very limited subset of libethercat functionality is supported: +Currently, only a very limited subset of libethercat functionality is +supported: - Creating master and domain instances - Activating master, `send`/`receive`. @@ -18,26 +18,24 @@ Currently, only a very limited subset of libethercat functionality is supported: - Configuring PDOs - Configuring SDOs using `ecrt_slave_config_sdo*` -The SDO config does not do anything, -but when activating the master the SDO config will -be dumped into a JSON file. +The SDO config does not do anything, but when activating the master the SDO +config will be dumped into a JSON file. -ecrt_master_state() and ecrt_domain_state() both return states as if -the bus works without errors. -So currenty, a bus error cannot be simulated. +`ecrt_master_state()` and `ecrt_domain_state()` both return states as if the +bus works without errors. So currently, a bus error cannot be simulated. ## How to build -[RtIPC](https://gitlab.com/etherlab.org/rtipc) is needed. -Simply pass `--enable-fakeuserlib` to your `./configure` call -and the library will be built for you. +[RtIPC](https://gitlab.com/etherlab.org/rtipc) is needed. Simply pass +`--enable-fakeuserlib` to your `./configure` call and the library will be +built for you. ## How to set up dry run mode ### Redirect library loading -To avoid recompiling your application, -we will use `LD_LIBRARY_PATH` to load `libfakeethercat` instead of `libethercat`. +To avoid recompiling your application, we will use `LD_LIBRARY_PATH` to load +`libfakeethercat` instead of `libethercat`. ```sh # pick a location for an empty directory @@ -52,16 +50,15 @@ ln -s /usr/lib64/libfakeethercat.so.1 $MY_LIB_LOCATION/libethercat.so.1 export LD_LIBRARY_PATH=$MY_LIB_LOCATION # check whether everything is done right ldd my_application | grep ethercat - libethercat.so.1 => /home/vh/fake_lib64/libethercat.so.1 (0x00007fa5a5c59000) + libethercat.so.1 => /home/vh/fake_lib64/libethercat.so.1 (0x7fa5c590) ``` ### Set up FakeEtherCAT Home -RtIPC needs a place to store its configuration. -Set `FAKE_EC_HOMEDIR` environment variabe to a path to an empty directory, -for instance `/tmp/FakeEtherCAT`. -`FAKE_EC_NAME` can be set to a useful name of your application, -default is `FakeEtherCAT`. +RtIPC needs a place to store its configuration. Set `FAKE_EC_HOMEDIR` +environment variable to a path to an empty directory, for instance +`/tmp/FakeEtherCAT`. `FAKE_EC_NAME` can be set to a useful name of your +application, default is `FakeEtherCAT`. ```sh export FAKE_EC_HOMEDIR=/tmp/FakeEtherCAT @@ -113,13 +110,9 @@ Then, in another shell, do the same thing with your simulator, but do not remove the `FAKE_EC_HOMEDIR` directory and pick another `FAKE_EC_NAME`. -Carefully watch the PDO configuration on stderr and compare them. -All paths configured as Output on the control application have to -be configured as Input on your simulator and vice versa. -If you use multiple domains and there is a mismatch of the domain IDs, -set `FAKE_EC_DOMAIN_PERMUTATION` to a space-separated list of integers to -permutate the domain IDs of one application. -`FAKE_EC_DOMAIN_PERMUTATION="0 1"` swaps domains 0 and 1, for instance. +Carefully watch the PDO configuration on stderr and compare them. All paths +configured as output on the control application have to be configured as input +on your simulator and vice versa. Finally, your control application needs to be restarted so it can find the RtIPC variables which contains the process data of the @@ -127,7 +120,7 @@ simulator. ## Environment variables - - FAKE_EC_DOMAIN_PERMUTATION: Permutate the domain IDs, useful to match control and simulation applications. - - FAKE_EC_HOMEDIR: Directory for RtIPC builletin board and SDO json files + - FAKE_EC_HOMEDIR: Directory for RtIPC bulletin board and SDO json files - FAKE_EC_NAME: Will be used for naming RtIPC config and SDO json file - - FAKE_EC_PREFIX: Prefix for RtIPC variables, useful to run multiple simulators side by side. + - FAKE_EC_PREFIX: Prefix for RtIPC variables, useful to run multiple + simulators side by side. From c117849d02cf53b7fe338c39798b6e3b81b3a812 Mon Sep 17 00:00:00 2001 From: Florian Pose Date: Mon, 16 Dec 2024 15:49:33 +0100 Subject: [PATCH 3/3] Removed FAKE_EC_DOMAIN_PERMUTATION. --- fake_lib/fakeethercat.cpp | 34 ---------------------------------- 1 file changed, 34 deletions(-) diff --git a/fake_lib/fakeethercat.cpp b/fake_lib/fakeethercat.cpp index 88a3b618..b60b1994 100644 --- a/fake_lib/fakeethercat.cpp +++ b/fake_lib/fakeethercat.cpp @@ -31,8 +31,6 @@ #include #include -static std::vector getPermutationVector(size_t count); - static std::ostream &operator<<(std::ostream &os, const sdo_address &a) { os << std::setfill('0') << std::hex << std::setw(6) << a.getCombined(); @@ -213,14 +211,6 @@ int ecrt_domain_state( int ec_master::activate() { - const auto permutate = getPermutationVector(domains.size()); - int i = 0; - for (auto &domain : domains) - { - if (domain.activate(permutate[i])) - return -1; - ++i; - } { std::ofstream out(rt_ipc_dir + "/" + rt_ipc_name + "_slaves.json"); if (!out.is_open()) @@ -433,30 +423,6 @@ static const char *getRtIpcDir() return "/tmp/FakeEtherCAT"; } -static std::vector getPermutationVector(size_t count) -{ - std::vector ans; - for (size_t i = 0; i < count; ++i) - { - ans.push_back(i); - } - const auto spec = getenv("FAKE_EC_DOMAIN_PERMUTATION"); - if (!spec) - return ans; - std::istringstream is(spec); - std::istream_iterator begin(is), end; - std::vector values(begin, end); - if (values.size() % 2) - { - throw std::invalid_argument("Specify an even number of indices to permutate.\n"); - } - for (size_t i = 0; i < values.size() / 2; ++i) - { - std::swap(ans.at(values[2 * i]), ans.at(values[2 * i + 1])); - } - return ans; -} - ec_master::ec_master(int id) : rt_ipc_dir(getRtIpcDir()), rt_ipc_name(getName()), rt_ipc(rtipc_create(rt_ipc_name.c_str(), rt_ipc_dir.c_str())), id_(id) { }