1 /****************************************************************************
2 **
3 ** Copyright (C) 2017 The Qt Company Ltd.
4 ** Contact: http://www.qt.io/licensing/
5 **
6 ** This file is part of the QtSerialBus module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL3$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see http://www.qt.io/terms-conditions. For further
15 ** information use the contact form at http://www.qt.io/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPLv3 included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 3 requirements
23 ** will be met: https://www.gnu.org/licenses/lgpl.html.
24 **
25 ** GNU General Public License Usage
26 ** Alternatively, this file may be used under the terms of the GNU
27 ** General Public License version 2.0 or later as published by the Free
28 ** Software Foundation and appearing in the file LICENSE.GPL included in
29 ** the packaging of this file. Please review the following information to
30 ** ensure the GNU General Public License version 2.0 requirements will be
31 ** met: http://www.gnu.org/licenses/gpl-2.0.html.
32 **
33 ** $QT_END_LICENSE$
34 **
35 ****************************************************************************/
36 
37 #ifndef QMODBUSDEVICEIDENTIFICATION_P_H
38 #define QMODBUSDEVICEIDENTIFICATION_P_H
39 
40 #include <QtCore/qmap.h>
41 #include <QtCore/qmetatype.h>
42 #include <QtSerialBus/qtserialbusglobal.h>
43 
44 QT_BEGIN_NAMESPACE
45 
46 class QModbusDeviceIdentification
47 {
48 public:
49     enum ObjectId {
50         /* Basic mandatory */
51         VendorNameObjectId = 0x00,
52         ProductCodeObjectId = 0x01,
53         MajorMinorRevisionObjectId = 0x02,
54 
55         /* Regular optional */
56         VendorUrlObjectId = 0x03,
57         ProductNameObjectId = 0x04,
58         ModelNameObjectId = 0x05,
59         UserApplicationNameObjectId = 0x06,
60         ReservedObjectId = 0x07,
61 
62         /* Extended optional */
63         ProductDependentObjectId = 0x80,
64 
65         UndefinedObjectId = 0x100
66     };
67 
68     enum ReadDeviceIdCode {
69         BasicReadDeviceIdCode = 0x01,
70         RegularReadDeviceIdCode = 0x02,
71         ExtendedReadDeviceIdCode = 0x03,
72         IndividualReadDeviceIdCode = 0x04
73     };
74 
75     enum ConformityLevel {
76         BasicConformityLevel = 0x01,
77         RegularConformityLevel = 0x02,
78         ExtendedConformityLevel = 0x03,
79         BasicIndividualConformityLevel = 0x81,
80         RegularIndividualConformityLevel = 0x82,
81         ExtendedIndividualConformityLevel = 0x83
82     };
83 
84     QModbusDeviceIdentification() = default;
85 
isValid()86     bool isValid() const {
87         return !m_objects.value(VendorNameObjectId).isEmpty()
88             && !m_objects.value(ProductCodeObjectId).isEmpty()
89             && !m_objects.value(MajorMinorRevisionObjectId).isEmpty();
90     }
91 
objectIds()92     QList<int> objectIds() const { return m_objects.keys(); }
remove(uint objectId)93     void remove(uint objectId) { m_objects.remove(objectId); }
contains(uint objectId)94     bool contains(uint objectId) const { return m_objects.contains(objectId); }
95 
insert(uint objectId,const QByteArray & data)96     bool insert(uint objectId, const QByteArray &data) {
97         if ((data.size() > 245) || (objectId >= ObjectId::UndefinedObjectId))
98             return false;
99         m_objects[objectId] = data;
100         return true;
101     }
value(uint objectId)102     QByteArray value(uint objectId) const { return m_objects.value(objectId); }
103 
conformityLevel()104     ConformityLevel conformityLevel() const { return m_conformityLevel; }
setConformityLevel(ConformityLevel level)105     void setConformityLevel(ConformityLevel level) { m_conformityLevel = level; }
106 
107     static Q_SERIALBUS_EXPORT QModbusDeviceIdentification fromByteArray(const QByteArray &ba);
108 
109 private:
110     QMap<int, QByteArray> m_objects;
111     ConformityLevel m_conformityLevel = BasicConformityLevel;
112 };
113 Q_DECLARE_TYPEINFO(QModbusDeviceIdentification, Q_MOVABLE_TYPE);
114 Q_DECLARE_TYPEINFO(QModbusDeviceIdentification::ObjectId, Q_PRIMITIVE_TYPE);
115 Q_DECLARE_TYPEINFO(QModbusDeviceIdentification::ReadDeviceIdCode, Q_PRIMITIVE_TYPE);
116 Q_DECLARE_TYPEINFO(QModbusDeviceIdentification::ConformityLevel, Q_PRIMITIVE_TYPE);
117 
118 QT_END_NAMESPACE
119 
120 Q_DECLARE_METATYPE(QModbusDeviceIdentification)
121 
122 #endif // QMODBUSDEVICEIDENTIFICATION_P_H
123