summaryrefslogtreecommitdiffstats
path: root/src/serialbus/qcansignaldescription.h
blob: cbd2d9c8c8f80b45ace6e87cfe3e6ef6286a07a2 (plain)
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
// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only

#ifndef QCANSIGNALDESCRIPTION_H
#define QCANSIGNALDESCRIPTION_H

#include <QtCore/QDebug>
#include <QtCore/QExplicitlySharedDataPointer>
#include <QtCore/QVariant>

#include <QtSerialBus/qcancommondefinitions.h>
#include <QtSerialBus/qtserialbusglobal.h>

QT_BEGIN_NAMESPACE

class QCanSignalDescriptionPrivate;
QT_DECLARE_QESDP_SPECIALIZATION_DTOR_WITH_EXPORT(QCanSignalDescriptionPrivate, Q_SERIALBUS_EXPORT)

class Q_SERIALBUS_EXPORT QCanSignalDescription
{
public:
    struct MultiplexValueRange {
        QVariant minimum;
        QVariant maximum;
    private:
        friend bool operator==(const MultiplexValueRange &lhs,
                               const MultiplexValueRange &rhs) noexcept
        {
            return lhs.minimum == rhs.minimum && lhs.maximum == rhs.maximum;
        }
        friend bool operator!=(const MultiplexValueRange &lhs,
                               const MultiplexValueRange &rhs) noexcept
        {
            return !(lhs == rhs);
        }
        friend size_t qHash(const MultiplexValueRange &, size_t) noexcept = delete;
#ifndef QT_NO_DEBUG_STREAM
        friend QDebug operator<<(QDebug dbg, const MultiplexValueRange &range)
        {
            return debugStreaming(dbg, range);
        }
        static QDebug debugStreaming(QDebug dbg, const MultiplexValueRange &range);
#endif // QT_NO_DEBUG_STREAM
    };
    using MultiplexValues = QList<MultiplexValueRange>;
    using MultiplexSignalValues = QHash<QString, MultiplexValues>;


    QCanSignalDescription();
    QCanSignalDescription(const QCanSignalDescription &other);
    QCanSignalDescription(QCanSignalDescription &&other) noexcept = default;
    ~QCanSignalDescription() = default;

    QCanSignalDescription &operator=(const QCanSignalDescription &other);
    QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QCanSignalDescription)

    friend bool operator==(const QCanSignalDescription &lhs, const QCanSignalDescription &rhs)
    {
        return equals(lhs, rhs);
    }
    friend bool operator!=(const QCanSignalDescription &lhs, const QCanSignalDescription &rhs)
    {
        return !equals(lhs, rhs);
    }

    void swap(QCanSignalDescription &other) noexcept { d.swap(other.d); }

    bool isValid() const;

    QString name() const;
    void setName(const QString &name);

    QString physicalUnit() const;
    void setPhysicalUnit(const QString &unit);

    QString receiver() const;
    void setReceiver(const QString &receiver);

    QString comment() const;
    void setComment(const QString &text);

    QtCanBus::DataSource dataSource() const;
    void setDataSource(QtCanBus::DataSource source);

    QSysInfo::Endian dataEndian() const;
    void setDataEndian(QSysInfo::Endian endian);

    QtCanBus::DataFormat dataFormat() const;
    void setDataFormat(QtCanBus::DataFormat format);

    quint16 startBit() const;
    void setStartBit(quint16 bit);

    quint16 bitLength() const;
    void setBitLength(quint16 length);

    double factor() const;
    void setFactor(double factor);

    double offset() const;
    void setOffset(double offset);

    double scaling() const;
    void setScaling(double scaling);

    double minimum() const;
    double maximum() const;
    void setRange(double minimum, double maximum);

    QtCanBus::MultiplexState multiplexState() const;
    void setMultiplexState(QtCanBus::MultiplexState state);

    MultiplexSignalValues multiplexSignals() const;
    void clearMultiplexSignals();
    void setMultiplexSignals(const MultiplexSignalValues &multiplexorSignals);
    void addMultiplexSignal(const QString &name, const MultiplexValues &ranges);
    void addMultiplexSignal(const QString &name, const QVariant &value);

private:
    QExplicitlySharedDataPointer<QCanSignalDescriptionPrivate> d;
    friend class QCanSignalDescriptionPrivate;

    static bool equals(const QCanSignalDescription &lhs, const QCanSignalDescription &rhs);

#ifndef QT_NO_DEBUG_STREAM
    friend QDebug operator<<(QDebug dbg, const QCanSignalDescription &sig)
    {
        return debugStreaming(dbg, sig);
    }
    static QDebug debugStreaming(QDebug dbg, const QCanSignalDescription &sig);
#endif // QT_NO_DEBUG_STREAM
};

Q_DECLARE_SHARED(QCanSignalDescription)

QT_END_NAMESPACE

#endif // QCANSIGNALDESCRIPTION_H