From e4c9123ec029e48e531ccaea67be649de87c00cc Mon Sep 17 00:00:00 2001 From: Martin Teichmann <martin.teichmann@xfel.eu> Date: Tue, 19 Mar 2024 12:56:44 +0100 Subject: [PATCH] make documentation more readable --- ebpfcat/ethercat.rst | 51 +++++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/ebpfcat/ethercat.rst b/ebpfcat/ethercat.rst index 9957bef..9439836 100644 --- a/ebpfcat/ethercat.rst +++ b/ebpfcat/ethercat.rst @@ -1,3 +1,5 @@ +.. currentmodule:: ebpfcat + The EtherCAT master =================== @@ -32,18 +34,19 @@ second argument is the absolute address this terminal should be assigned to:: The terminals are usually controlled by devices, where one terminal may be controlled by several devices, or one device controls several terminals. The -devices are represented by `Device` objects. Upon instantiation, they are -connected to the terminals:: +devices are represented by :class:`~ebpfcat.Device` objects. Upon +instantiation, they are connected to the terminals:: from ebpfcat.devices import AnalogOutput ao = AnalogOutput(out.ch1_value) -Devices are grouped into `SyncGroup`, which means that their terminals are -always read and written at the same time. A device can only belong to one -`SyncGroup`, but a terminal may be part of several devices or sync groups. -The sync group is also responsible to constantly transfer data to and from -the terminals such that they do not time out and go into a safe state:: +Devices are grouped into :class:`~ebpfcat.SyncGroup`, which means that their +terminals are always read and written at the same time. A device can only +belong to one :class:`~ebpfcat.SyncGroup`, but a terminal may be part of +several devices or sync groups. The sync group is also responsible to +constantly transfer data to and from the terminals such that they do not time +out and go into a safe state:: from ebpfcat.ebpfcat import SyncGroup @@ -51,7 +54,7 @@ the terminals such that they do not time out and go into a safe state:: sg.start() # start operating the terminals -The `AnalogOutput` in the examples is a pretty boring device, it can only +The ``AnalogOutput`` in the examples is a pretty boring device, it can only output a value like so:: ao.value = 5 # set the value on the terminal @@ -61,24 +64,26 @@ Writing a device ---------------- Equipment controlled via the EtherCAT terminals often requires that a dedicated -device is written for it. Devices inherit from `ebpfcat.Device`. They declare -which kind of data they want to communicate to the terminals as a `TerminalVar` -like so:: +device is written for it. Devices inherit from :class:`ebpfcat.Device`. They +declare which kind of data they want to communicate to the terminals as a +:class:`ebpfcat.TerminalVar` like so:: - from ebpfcat.ebpfcat import Device + from ebpfcat.ebpfcat import Device, TerminalVar class Motor(Device): speed = TerminalVar() position = TerminalVar() -Before they can be used, their `TerminalVar`\ s need to be initialized:: +Before they can be used, their :class:`~ebpfcat.TerminalVar`\ s need to be +initialized:: motor = Motor() motor.speed = outputTerminal.speed motor.position = encoderTerminal.value -whenever new data is read from the loop, the `update` method of the device is -called, in which one can evaluate the `TerminalVar`\ s, or set them:: +whenever new data is read from the loop, the :meth:`~ebpfcat.Device.update` +method of the device is called, in which one can evaluate the +:class:`~ebpfcat.TerminalVar`\ s, or set them:: def update(self): """a idiotic speed controller""" @@ -107,11 +112,13 @@ simply terminals, we call them such. Everything in a terminal is controlled by reading or writing parameters in the CoE address space. These addresses are a pair of a 16 bit and an 8 bit number, -usually seperated by a colon, as in 6010:13. Most terminals allow these +usually seperated by a colon, as in ``6010:13``. Most terminals allow these parameters to be set asynchronously. Some of the parameters may be read or written synchronously, so with every communication cycle. -The meaning of all these parameters can usually be found in the documentation of the terminal. Additionally, terminals often have a self-description, which can be read with the command line tool `ec-info`:: +The meaning of all these parameters can usually be found in the documentation +of the terminal. Additionally, terminals often have a self-description, which +can be read with the command line tool ``ec-info``:: $ ec-info eth0 --terminal -1 --sdo @@ -120,21 +127,21 @@ this reads the first (-1th) terminal's self description (``--sdo``). Add a all known self descriptions of CoE parameters. Once we know the meaning of parameters, they may be read or written -asynchronously using :meth:`~ebpfcat.ethercat.Terminal.sdo_read` and -:meth:`~ebpfcat.ethercat.Terminal.sdo_write`. +asynchronously using :meth:`~ethercat.Terminal.sdo_read` and +:meth:`~ethercat.Terminal.sdo_write`. For synchronous data access, a class needs to be defined that defines the parameters one want to use synchronously. The parameters available for synchronous operations can be found with the ``--pdo`` parameter of the ``ec-info`` command. The class should inherit from -:class:`~ebpfcat.ebpfcat.EBPFTerminal` and define a set of tuples called +:class:`~ebpfcat.EBPFTerminal` and define a set of tuples called ``comptibility``. The tuples should be the pairs of Ethercat product and vendor id for all terminals supported by this class. Those can be found out with the ``--ids`` parameter of the ``ec-info`` command. Within the class, the synchronous parameters are defined via -:class:`~ebpfcat.ebpfcat.ProcessDesc`. This descriptor takes the two parts of -the CoE address as parameters, plus an optional size parameter. This is usually +:class:`~ebpfcat.ProcessDesc`. This descriptor takes the two parts of the CoE +address as parameters, plus an optional size parameter. This is usually determined automatically, but this sometimes fails, in which case it may either be defined via a format string like in the :mod:`python:struct` module, or it is an integer which is then a reference to the position of the bit in the -- GitLab