Commit 0df27b07164d4e4c69b39b3617151596b2009563
1 parent
91724967
Added doxygen comments
Showing
5 changed files
with
150 additions
and
107 deletions
CMakeLists.txt
src/ConnectionConfig.h
1 | +/**************************************************************************** | |
2 | + * Copyright (c) 2022 Priva b.v. | |
3 | + ****************************************************************************/ | |
1 | 4 | #pragma once |
2 | 5 | |
3 | 6 | #include <string> |
4 | 7 | #include <unordered_map> |
5 | 8 | |
6 | 9 | /*! |
7 | - * \brief The ConnectionPort enum | |
10 | + * \brief The ConnectionPort enum. | |
11 | + * CP_EXTERNAL - the first serial port | |
12 | + * CP_IOBUS - The second serial port through RJ45 connector | |
13 | + * CP_TCP - TCP Connections | |
8 | 14 | */ |
9 | 15 | enum class ConnectionPort : unsigned int |
10 | 16 | { |
... | ... | @@ -14,7 +20,8 @@ enum class ConnectionPort : unsigned int |
14 | 20 | }; |
15 | 21 | |
16 | 22 | /*! |
17 | - * \brief The Parity enum | |
23 | + * \brief The Parity enum. | |
24 | + * Used in a serial port context | |
18 | 25 | */ |
19 | 26 | enum class Parity : unsigned int |
20 | 27 | { |
... | ... | @@ -24,7 +31,8 @@ enum class Parity : unsigned int |
24 | 31 | }; |
25 | 32 | |
26 | 33 | /*! |
27 | - * \brief The ConnectionType enum | |
34 | + * \brief The ConnectionType enum. | |
35 | + * Added for convenience, to distinguish between types. | |
28 | 36 | */ |
29 | 37 | enum class ConnectionType : unsigned int |
30 | 38 | { |
... | ... | @@ -33,17 +41,25 @@ enum class ConnectionType : unsigned int |
33 | 41 | CT_UNKNOWN |
34 | 42 | }; |
35 | 43 | |
44 | +/*! | |
45 | + * \brief The ConnectionConfig class holds all the information we need to establish a proper connection. | |
46 | + * It can be created by a configuration object and passed on to the ModBus stack. | |
47 | + * By using this class, all the connectioninfo is within its context for convenience. | |
48 | + * | |
49 | + * Data can be accessed by their resp. getter-methods to avoid internal data-exposure | |
50 | + * according to the basic principles of object oriented programming. ( Abstraction, Encapsulation, Inheritance, and Polymorphism ) | |
51 | + */ | |
36 | 52 | class ConnectionConfig |
37 | 53 | { |
38 | 54 | public: |
39 | 55 | /*! |
40 | - * \brief ConnectionConfig | |
41 | - * \param port | |
42 | - * \param baud | |
43 | - * \param parity | |
44 | - * \param dataBits | |
45 | - * \param stopBits | |
46 | - * \param timeOut | |
56 | + * \brief ConnectionConfig Constructor. Used to create a new serial connection. | |
57 | + * \param port - The portname given by its enum. | |
58 | + * \param baud - The port speed in a serial port context ( default = 115200 ) | |
59 | + * \param parity - The parity. ( Default : None, no parity ) | |
60 | + * \param dataBits - The number of databits. RTU uses 8 (0 - 255), ASCII uses 7 (0 - 127). Default is RTU | |
61 | + * \param stopBits - The number of stopbits used to detect the end of the frame. ( Default = 1 ) | |
62 | + * \param timeOut - Timeout in .1 secs. See the termios documentation for deviations on this. | |
47 | 63 | */ |
48 | 64 | ConnectionConfig( ConnectionPort port, int baud = 115200, Parity parity = Parity::PAR_NONE, int dataBits = 8, int stopBits = 1, int timeOut = -1 ) |
49 | 65 | : m_port( port ) |
... | ... | @@ -58,11 +74,11 @@ public: |
58 | 74 | {} |
59 | 75 | |
60 | 76 | /*! |
61 | - * \brief ConnectionConfig | |
62 | - * \param port | |
63 | - * \param ip | |
64 | - * \param portnum | |
65 | - * \param timeOut | |
77 | + * \brief ConnectionConfig Constructor. Used to create a new TCP connection. | |
78 | + * \param port - The portname given by its enaum. ( Should be CP_TCP ) | |
79 | + * \param ip - The ip address of the ModBus device we want to connect to. | |
80 | + * \param portnum - The portnumber the ModBus device is using | |
81 | + * \param timeOut - Timeout in which a modbus device should respond. | |
66 | 82 | */ |
67 | 83 | ConnectionConfig( ConnectionPort port, const std::string &ip, int portnum, int timeOut = -1 ) |
68 | 84 | : m_port( port ) |
... | ... | @@ -81,6 +97,7 @@ public: |
81 | 97 | ConnectionPort getPortEnum() const { return m_port; } ///< Get the portname Enum |
82 | 98 | int getBaudRate() const { return m_baudRate; } ///< Get the given baudrate as int. |
83 | 99 | char getParity() const { return m_parityMap.at(m_parity); } ///< Get the translated parity. |
100 | + Parity getParityEnum() const { return m_parity; } ///< Get the parity Enum | |
84 | 101 | int getDataBits() const { return m_dataBits; } ///< Get the number of databits ( 7 for ASCII, 8 for RTU ) |
85 | 102 | int getStopBits() const { return m_stopBits; } ///< Get the number of stopBits. ( de-facto = 1 ) |
86 | 103 | |
... | ... | @@ -93,20 +110,21 @@ public: |
93 | 110 | private: |
94 | 111 | |
95 | 112 | /// Serial connections |
96 | - ConnectionPort m_port; | |
97 | - int m_baudRate; | |
98 | - Parity m_parity; | |
99 | - int m_dataBits; | |
100 | - int m_stopBits; | |
113 | + ConnectionPort m_port; ///< Member variable holding the portName Enum | |
114 | + int m_baudRate; ///< Member variable holding the Serial port Baudrate | |
115 | + Parity m_parity; ///< Member variable holding the Serial port Parity | |
116 | + int m_dataBits; ///< Member variable holding the number of databits | |
117 | + int m_stopBits; ///< Member variable holding the number of stopbits | |
101 | 118 | |
102 | 119 | /// TCP connections |
103 | - std::string m_ipaddress; | |
104 | - int m_portnumber; | |
120 | + std::string m_ipaddress; ///< Member variable holding the ip-address of the TCP-connection | |
121 | + int m_portnumber; ///< Member variable holding the portnumber of the TCP-connection | |
105 | 122 | |
106 | 123 | /// Generic |
107 | - int m_timeOut; | |
108 | - ConnectionType m_conType; | |
124 | + int m_timeOut; ///< Member variable holding the timeOut value | |
125 | + ConnectionType m_conType; ///< Member variable holding the connection type. | |
109 | 126 | |
127 | + /// Translation tables for portnames and parity. | |
110 | 128 | // ============================================================ |
111 | 129 | // == Change accordingly to the devicenames on your platform == |
112 | 130 | // ============================================================ | ... | ... |
src/IModbusAdapter.h
... | ... | @@ -15,58 +15,70 @@ using modbusData = std::vector<std::variant<uint8_t, uint16_t>>; |
15 | 15 | class ConnectionConfig; |
16 | 16 | |
17 | 17 | /*! |
18 | - * \brief The IModbusAdapter class | |
18 | + * \brief The IModbusAdapter class provides an abstract way of using | |
19 | + * the modbus stack. Implemented as a pure virtual, it cannot be instantiated. | |
20 | + * This represents a unique connection to either a serial bus or a TCP connection. | |
19 | 21 | */ |
20 | 22 | class IModbusAdapter |
21 | 23 | { |
22 | 24 | |
23 | 25 | public: |
24 | - virtual ~IModbusAdapter() {} | |
26 | + /// Default DTor. | |
27 | + virtual ~IModbusAdapter() = default; | |
25 | 28 | |
29 | + /// Create a modbus connection, accepting a configuration object. | |
26 | 30 | virtual bool ModbusConnect( const ConnectionConfig &conncfg ) = 0; |
27 | 31 | |
28 | 32 | /*! |
29 | - * \brief ModbusDisconnect | |
33 | + * \brief ModbusDisconnect | |
34 | + * Disconnect from the serial bus or the TCP connection, freeing its resources | |
30 | 35 | */ |
31 | 36 | virtual bool ModbusDisconnect() = 0; |
32 | 37 | |
33 | 38 | /*! |
34 | - * \brief ModbusReadData | |
35 | - * \param slaveId | |
36 | - * \param startAddress | |
37 | - * \param noOfItems | |
39 | + * \brief Read data from a modbus device given by its parameters. | |
40 | + * \param slaveId - The Id of the ModbusDevice. | |
41 | + * \param functionCode - The code describing the action we want to perform on the device. | |
42 | + * Given by an enum, provided by the modbus-stack. | |
43 | + * \param startAddress - Startaddres of the register we want to read. | |
44 | + * \param noOfItems - The number of items we expect back. | |
45 | + * \returns modbusData - A vector holding each register in an entry in the same order as they are received. | |
46 | + * Empty if no data was received. | |
38 | 47 | */ |
39 | 48 | virtual modbusData ModbusReadData( int slaveId, int functionCode, int startAddress, int noOfItems ) = 0; |
40 | 49 | |
41 | 50 | /*! |
42 | - * \brief ModbusReadHoldReg | |
43 | - * \param slaveId | |
44 | - * \param startAddress | |
45 | - * \param noOfItems | |
46 | - * \return | |
51 | + * \brief Read data from the holdregisters ( or keep-registers ) of a modbus device. | |
52 | + * \param slaveId - The Id of the ModbusDevice. | |
53 | + * \param startAddress - Startaddres of the register we want to read. | |
54 | + * \param noOfItems - The number of items we expect back. | |
55 | + * \returns modbusData - A vector holding each register in an entry in the same order as they are received. | |
56 | + * Empty if no data was received. | |
47 | 57 | */ |
48 | 58 | virtual modbusData ModbusReadHoldReg( int slaveId, int startAddress, int noOfItems ) = 0; |
49 | 59 | |
50 | 60 | /*! |
51 | - * \brief ModBusWriteData | |
52 | - * \param slaveId | |
53 | - * \param funtionCode | |
54 | - * \param startAddress | |
55 | - * \param noOfItems | |
56 | - * \param values | |
61 | + * \brief Write data to the device. | |
62 | + * \param slaveId - The Id of the Modbus device | |
63 | + * \param funtionCode - The code describing the action we want to perform on the device | |
64 | + * given by an enum, provided by the modbus-stack. | |
65 | + * \param startAddress - Startaddres of the register we want to read. | |
66 | + * \param noOfItems - The number of items we expect to be written | |
67 | + * \param values - The values we want to write to the given device. Each vector-entry represents a single byte | |
68 | + * and they will be sent in sequence. | |
57 | 69 | */ |
58 | 70 | virtual void ModBusWriteData( int slaveId, int functionCode, int startAddress, int noOfItems, std::vector<int>values ) = 0; |
59 | 71 | |
60 | 72 | /*! |
61 | - * \brief isConnected | |
62 | - * \return | |
73 | + * \brief Indicates if this connection is alive. | |
74 | + * \return True if alive, false if not. | |
63 | 75 | */ |
64 | 76 | virtual bool isConnected() const = 0; |
65 | 77 | |
66 | 78 | /*! |
67 | - * \brief ErrorString | |
68 | - * \param errnum | |
69 | - * \return | |
79 | + * \brief returns the translated error code coming from the modbus stack. | |
80 | + * \param errnum - error Number coming from the stack. | |
81 | + * \return The translated error as a string. Empty if not resolvable. | |
70 | 82 | */ |
71 | 83 | virtual std::string ErrorString( int errnum ) const = 0; |
72 | 84 | }; | ... | ... |
src/ModbusAdapter.h
... | ... | @@ -21,63 +21,70 @@ class ModbusAdapter : public IModbusAdapter |
21 | 21 | { |
22 | 22 | public: |
23 | 23 | /*! |
24 | - * \brief ModbusAdapter | |
24 | + * \brief Default constructor | |
25 | 25 | */ |
26 | 26 | explicit ModbusAdapter(); |
27 | 27 | |
28 | 28 | /*! |
29 | - * \brief ~ModbusAdapter | |
29 | + * \brief Default destructor | |
30 | 30 | */ |
31 | 31 | virtual ~ModbusAdapter(); |
32 | 32 | |
33 | 33 | /*! |
34 | - * \brief ModbusConnect | |
35 | - * \param conncfg | |
34 | + * \brief /// Create a modbus connection, accepting a configuration object. | |
36 | 35 | */ |
37 | 36 | bool ModbusConnect( const ConnectionConfig &conncfg ) override; |
38 | 37 | |
39 | 38 | /*! |
40 | - * \brief ModbusDisconnect | |
39 | + * \brief ModbusDisconnect | |
40 | + * Disconnect from the serial bus or the TCP connection, freeing its resources | |
41 | 41 | */ |
42 | 42 | bool ModbusDisconnect() override; |
43 | 43 | |
44 | 44 | /*! |
45 | - * \brief ModbusReadData | |
46 | - * \param slaveId | |
47 | - * \param startAddress | |
48 | - * \param noOfItems | |
45 | + * \brief Read data from a modbus device given by its parameters. | |
46 | + * \param slaveId - The Id of the ModbusDevice. | |
47 | + * \param functionCode - The code describing the action we want to perform on the device. | |
48 | + * Given by an enum, provided by the modbus-stack. | |
49 | + * \param startAddress - Startaddres of the register we want to read. | |
50 | + * \param noOfItems - The number of items we expect back. | |
51 | + * \returns modbusData - A vector holding each register in an entry in the same order as they are received. | |
52 | + * Empty if no data was received. | |
49 | 53 | */ |
50 | 54 | modbusData ModbusReadData( int slaveId, int functionCode, int startAddress, int noOfItems ) override; |
51 | 55 | |
52 | 56 | /*! |
53 | - * \brief ModbusReadHoldReg | |
54 | - * \param slaveId | |
55 | - * \param startAddress | |
56 | - * \param noOfItems | |
57 | - * \return | |
57 | + * \brief Read data from the holdregisters ( or keep-registers ) of a modbus device. | |
58 | + * \param slaveId - The Id of the ModbusDevice. | |
59 | + * \param startAddress - Startaddres of the register we want to read. | |
60 | + * \param noOfItems - The number of items we expect back. | |
61 | + * \returns modbusData - A vector holding each register in an entry in the same order as they are received. | |
62 | + * Empty if no data was received. | |
58 | 63 | */ |
59 | 64 | modbusData ModbusReadHoldReg( int slaveId, int startAddress, int noOfItems ) override; |
60 | 65 | |
61 | 66 | /*! |
62 | - * \brief ModBusWriteData | |
63 | - * \param slaveId | |
64 | - * \param funtionCode | |
65 | - * \param startAddress | |
66 | - * \param noOfItems | |
67 | - * \param values | |
67 | + * \brief Write data to the device. | |
68 | + * \param slaveId - The Id of the Modbus device | |
69 | + * \param funtionCode - The code describing the action we want to perform on the device | |
70 | + * given by an enum, provided by the modbus-stack. | |
71 | + * \param startAddress - Startaddres of the register we want to read. | |
72 | + * \param noOfItems - The number of items we expect to be written | |
73 | + * \param values - The values we want to write to the given device. Each vector-entry represents a single byte | |
74 | + * and they will be sent in sequence. | |
68 | 75 | */ |
69 | 76 | void ModBusWriteData( int slaveId, int functionCode, int startAddress, int noOfItems, std::vector<int>values ) override; |
70 | 77 | |
71 | 78 | /*! |
72 | - * \brief isConnected | |
73 | - * \return | |
79 | + * \brief Indicates if this connection is alive. | |
80 | + * \return True if alive, false if not. | |
74 | 81 | */ |
75 | 82 | bool isConnected() const override; |
76 | 83 | |
77 | 84 | /*! |
78 | - * \brief ErrorString | |
79 | - * \param errnum | |
80 | - * \return | |
85 | + * \brief returns the translated error code coming from the modbus stack. | |
86 | + * \param errnum - error Number coming from the stack. | |
87 | + * \return The translated error as a string. Empty if not resolvable. | |
81 | 88 | */ |
82 | 89 | std::string ErrorString( int errnum ) const override; |
83 | 90 | ... | ... |
src/ModbusConnections.h
... | ... | @@ -13,91 +13,97 @@ |
13 | 13 | #include <string> |
14 | 14 | #include <unordered_map> |
15 | 15 | |
16 | -/// | |
16 | +/// Easy replacement of template construction | |
17 | 17 | using AdapterList = std::vector<std::shared_ptr<IModbusAdapter>>; |
18 | 18 | |
19 | 19 | /*! |
20 | - * \brief The ModbusConnections class | |
20 | + * \brief The ModbusConnections class conatins a list of all modbus connections, Serial and TCP. | |
21 | + * To access a specific connection, use its portname and / or endpoint to return it's interface. | |
21 | 22 | */ |
22 | 23 | class ModbusConnections |
23 | 24 | { |
24 | 25 | public: |
25 | 26 | /*! |
26 | - * \brief ModbusConnections | |
27 | + * \brief Default CTor | |
27 | 28 | */ |
28 | 29 | explicit ModbusConnections(); |
29 | 30 | |
30 | 31 | /*! |
31 | - * \brief ~ModbusConnections | |
32 | + * \brief Default DTor | |
32 | 33 | */ |
33 | 34 | virtual ~ModbusConnections(); |
34 | 35 | |
35 | 36 | /*! |
36 | - * \brief CreateConnection | |
37 | - * \param config | |
38 | - * \return | |
37 | + * \brief Create a modbus connection as described by the connection object. | |
38 | + * \param config - The connection object describing the connection in detail. | |
39 | + * \return The result of the creation. | |
40 | + * True = succesful. | |
41 | + * False = Failed. | |
39 | 42 | */ |
40 | 43 | bool CreateConnection( const ConnectionConfig &config ); |
41 | 44 | |
42 | 45 | /*! |
43 | - * \brief DeleteConnection | |
44 | - * \param portName | |
45 | - * \param endpoint | |
46 | + * \brief Remove the connection described by its portname and/or endpoint. | |
47 | + * \param portName - The portname as its enum | |
48 | + * \param endpoint - combination of ip-address and portname in endpoint-format | |
49 | + * ( tcp://<ip_address>:<portNumber> ) | |
50 | + * ( i.e. tcp://127.0.0.1:501 ) | |
46 | 51 | * \return |
47 | 52 | */ |
48 | 53 | bool DeleteConnection( const ConnectionPort portName, const std::string &endpoint = std::string() ); |
49 | 54 | |
50 | 55 | /*! |
51 | - * \brief ConnectionCount | |
52 | - * \return | |
56 | + * \brief Give the number of registered serial and tcp-connections combined. | |
53 | 57 | */ |
54 | 58 | int ConnectionCount(); |
55 | 59 | |
56 | 60 | /*! |
57 | - * \brief getConnection | |
58 | - * \param portName | |
59 | - * \param endpoint | |
60 | - * \return | |
61 | + * \brief Get the connection give by its parameters. | |
62 | + * \param portName - The portname by its enum | |
63 | + * \param endpoint - combination of ip-address and portname in endpoint-format | |
64 | + * ( tcp://<ip_address>:<portNumber> ) | |
65 | + * ( i.e. tcp://127.0.0.1:501 ) | |
66 | + * \return Valid Pointer to the Modbus Connection Interface. nullptr if the connection wasn't found. | |
61 | 67 | */ |
62 | 68 | std::shared_ptr<IModbusAdapter> getConnection( const ConnectionPort portName, const std::string &endpoint = std::string() ); |
63 | 69 | |
64 | 70 | // Convenient functions |
65 | 71 | /*! |
66 | - * \brief getConnection | |
67 | - * \param portName | |
68 | - * \param ipAddress | |
69 | - * \param tcpPortNumber | |
70 | - * \return | |
72 | + * \brief Get the connection given by its parameters. If applicable, ipaddress and portnumber will be used to create the endpoint. | |
73 | + * \param portName - The portname by its enum | |
74 | + * \param ipAddress - The ipaddress of the TCP-connection | |
75 | + * \param tcpPortNumber - The portnumber of the TCP-connection | |
76 | + * \return Valid Pointer to the Modbus Connection Interface. nullptr if the connection wasn't found. | |
71 | 77 | */ |
72 | 78 | std::shared_ptr<IModbusAdapter> getConnection( const ConnectionPort portName, const std::string &ipAddress, int tcpPortNumber ); |
73 | 79 | |
74 | 80 | /*! |
75 | - * \brief getConnections | |
76 | - * \return | |
81 | + * \brief Returns a list of all registered connections by their interfaces. This is a mix of Serial and TCP-connections. | |
77 | 82 | */ |
78 | 83 | AdapterList getConnections(); |
79 | 84 | |
80 | 85 | private: |
81 | 86 | /*! |
82 | - * \brief connectionExist | |
83 | - * \param portName | |
84 | - * \param endpoint | |
85 | - * \return | |
87 | + * \brief Check if a connection already exist. | |
88 | + * \param portName - The portName by its enum | |
89 | + * \param endpoint - The endpoint this connection was registered with. | |
90 | + * \return A valid pointer to the Interface if the connection exist. If the connection is unknown, it will return a nullptr. | |
91 | + * shared_ptr can manifest themselves as booleans, so "!ptr" is sufficient to check. | |
86 | 92 | */ |
87 | 93 | std::shared_ptr<IModbusAdapter> connectionExist( const ConnectionPort portName, const std::string &endpoint = std::string() ); |
88 | 94 | |
89 | 95 | /*! |
90 | - * \brief createEndPoint | |
91 | - * \param ipAddress | |
92 | - * \param portNumber | |
93 | - * \return | |
96 | + * \brief Create the TCP endpoint based on the connections IP-address and portnumber | |
97 | + * \param ipAddress - The ipAddress as string. | |
98 | + * \param portNumber - The portnumber as integer. | |
99 | + * \return The endpoint in format : tcp://<ip_address>:<portNumber> i.e. tcp://127.0.0.1:501 | |
94 | 100 | */ |
95 | 101 | std::string createEndPoint( const std::string &ipAddress, int portNumber ); |
96 | 102 | |
97 | 103 | /*! |
98 | - * \brief createEndPoint | |
99 | - * \param config | |
100 | - * \return | |
104 | + * \brief Create the TCP endpoint based on the connections IP-address and portnumber extracted from the connection configuration. | |
105 | + * \param config - The configuration object used to create the connection. | |
106 | + * \return The endpoint in format : tcp://<ip_address>:<portNumber> i.e. tcp://127.0.0.1:501 | |
101 | 107 | */ |
102 | 108 | std::string createEndPoint( const ConnectionConfig &config ); |
103 | 109 | ... | ... |