ConnectionConfig.h
6.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/****************************************************************************
* Copyright (c) 2022 Priva b.v.
****************************************************************************/
#pragma once
#include <string>
#include <unordered_map>
/*!
* \brief The ConnectionPort enum.
* CP_EXTERNAL - the first serial port
* CP_IOBUS - The second serial port through RJ45 connector
* CP_TCP - TCP Connections
*/
enum class ConnectionPort : unsigned int
{
CP_EXTERNAL = 0,
CP_IOBUS,
CP_TCP
};
/*!
* \brief The Parity enum.
* Used in a serial port context
*/
enum class Parity : unsigned int
{
PAR_ODD,
PAR_EVEN,
PAR_NONE
};
/*!
* \brief The ConnectionType enum.
* Added for convenience, to distinguish between types.
*/
enum class ConnectionType : unsigned int
{
CT_SERIAL,
CT_TCP,
CT_UNKNOWN
};
/*!
* \brief The ConnectionConfig class holds all the information we need to establish a proper connection.
* It can be created by a configuration object and passed on to the ModBus stack.
* By using this class, all the connectioninfo is within its context for convenience.
*
* Data can be accessed by their resp. getter-methods to avoid internal data-exposure
* according to the basic principles of object oriented programming. ( Abstraction, Encapsulation, Inheritance, and Polymorphism )
*/
class ConnectionConfig
{
public:
/*!
* \brief ConnectionConfig Constructor. Used to create a new serial connection.
* \param port - The portname given by its enum.
* \param baud - The port speed in a serial port context ( default = 115200 )
* \param parity - The parity. ( Default : None, no parity )
* \param dataBits - The number of databits. RTU uses 8 (0 - 255), ASCII uses 7 (0 - 127). Default is RTU
* \param stopBits - The number of stopbits used to detect the end of the frame. ( Default = 1 )
* \param timeOut - Timeout in .1 secs. See the termios documentation for deviations on this.
*/
ConnectionConfig( ConnectionPort port, int baud = 115200, Parity parity = Parity::PAR_NONE, int dataBits = 8, int stopBits = 1, int timeOut = -1 )
: m_port( port )
, m_baudRate( baud )
, m_parity( parity )
, m_dataBits( dataBits )
, m_stopBits( stopBits )
, m_ipaddress()
, m_portnumber( -1 )
, m_timeOut( timeOut )
, m_conType( ConnectionType::CT_SERIAL )
{}
/*!
* \brief ConnectionConfig Constructor. Used to create a new TCP connection.
* \param port - The portname given by its enaum. ( Should be CP_TCP )
* \param ip - The ip address of the ModBus device we want to connect to.
* \param portnum - The portnumber the ModBus device is using
* \param timeOut - Timeout in which a modbus device should respond.
*/
ConnectionConfig( ConnectionPort port, const std::string &ip, int portnum, int timeOut = -1 )
: m_port( port )
, m_baudRate( -1 )
, m_parity( Parity::PAR_NONE )
, m_dataBits( -1 )
, m_stopBits( -1 )
, m_ipaddress( ip )
, m_portnumber( portnum )
, m_timeOut( timeOut )
, m_conType( ConnectionType::CT_TCP )
{}
// Getters and Setters. Implemented to avoid outside meddling on the member variables.
std::string getPort() const { return m_portMap.at(m_port); } ///< Get the translated portName.
ConnectionPort getPortEnum() const { return m_port; } ///< Get the portname Enum
int getBaudRate() const { return m_baudRate; } ///< Get the given baudrate as int.
char getParity() const { return m_parityMap.at(m_parity); } ///< Get the translated parity.
Parity getParityEnum() const { return m_parity; } ///< Get the parity Enum
int getDataBits() const { return m_dataBits; } ///< Get the number of databits ( 7 for ASCII, 8 for RTU )
int getStopBits() const { return m_stopBits; } ///< Get the number of stopBits. ( de-facto = 1 )
std::string getIpAddress() const { return m_ipaddress; } ///< Get the ip-address as string
int getTcpPort() const { return m_portnumber; } ///< Get the tcp portnumber as int
int getTimeOut() const { return m_timeOut; } ///< Get the timeout as a multitude of 0.1 sec.
ConnectionType getType() const { return m_conType; } ///< Get the connection type ( Serial, TCP or Unknown )
private:
/// Serial connections
ConnectionPort m_port; ///< Member variable holding the portName Enum
int m_baudRate; ///< Member variable holding the Serial port Baudrate
Parity m_parity; ///< Member variable holding the Serial port Parity
int m_dataBits; ///< Member variable holding the number of databits
int m_stopBits; ///< Member variable holding the number of stopbits
/// TCP connections
std::string m_ipaddress; ///< Member variable holding the ip-address of the TCP-connection
int m_portnumber; ///< Member variable holding the portnumber of the TCP-connection
/// Generic
int m_timeOut; ///< Member variable holding the timeOut value
ConnectionType m_conType; ///< Member variable holding the connection type.
/// Translation tables for portnames and parity.
// ============================================================
// == Change accordingly to the devicenames on your platform ==
// ============================================================
std::unordered_map<ConnectionPort, std::string> m_portMap =
{
{ ConnectionPort::CP_EXTERNAL, "/dev/ttyUSB0" },
{ ConnectionPort::CP_IOBUS, "/dev/ttyUSB1" }
};
std::unordered_map<Parity, char> m_parityMap =
{
{ Parity::PAR_EVEN, 'E' },
{ Parity::PAR_ODD, 'O' },
{ Parity::PAR_NONE, 'N' }
};
};