-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathwsrelaydiginmbrtu.h
93 lines (79 loc) · 3.04 KB
/
wsrelaydiginmbrtu.h
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
/*********************************************************************
* Copyright EoF Software Labs. All Rights Reserved.
* Copyright EoF Software Labs Authors.
* Written by B. Eschrich ([email protected])
* SPDX-License-Identifier: GPL v3
**********************************************************************/
#pragma once
#include <QMap>
#include <QObject>
#include <QSerialPort>
#include <QTimer>
#include <QWidget>
#include <mbrtuclient.h>
#include <wsmodbusrtu.h>
/**
* @brief The relay / digital input driver class for Waveshare Modbus RTU (D)
*/
class WSRelayDigInMbRtu: public WSModbusRtu
{
Q_OBJECT
public:
enum TRelayFunction {
UpdateRelay = RtuCustomStart + 0x0101,
ReadRelayStatus = RtuCustomStart + 0x0102,
ReadDigitalInput = RtuCustomStart + 0x0103,
WriteRelayStatus = RtuCustomStart + 0x0104,
WriteRelayMask = RtuCustomStart + 0x0105,
ReadControlMode = RtuCustomStart + 0x0106,
WriteControlMode = RtuCustomStart + 0x0107,
WriteControlModes = RtuCustomStart + 0x0108,
SetFlashOnInterval = RtuCustomStart + 0x0109,
SetFlashOffInterval = RtuCustomStart + 0x0110,
};
Q_ENUM(TRelayFunction)
enum TControlMode {
NormalMode,
LinkageMode,
ToggleMode,
};
Q_ENUM(TControlMode)
explicit WSRelayDigInMbRtu(MBRtuClient* modbus, QObject* parent = nullptr);
~WSRelayDigInMbRtu();
const char* id() const override;
quint8 maxInputs() const override;
quint8 maxOutputs() const override;
QWidget* settingsWidget(QWidget* parent) override;
void setRelayStatus(const quint8 relay, const bool state);
void setAllRelays(const quint8 mask);
void setControlModes(const QMap<quint8, TControlMode>& modes, bool updateDevice = false);
void setControlMode(quint8 channel, const TControlMode mode, bool updateDevice = false);
bool relayStatus(const quint8 relay) const;
TControlMode controlMode(const quint8 relay) const;
bool digitalInput(const quint8 channel) const;
signals:
void relayChanged(quint8 relay, bool state);
void inputChanged(quint8 channel, bool state);
void modeChanged(quint8 channel, WSRelayDigInMbRtu::TControlMode mode);
protected:
void startStatusWorker() override;
void doFunction(uint function) override;
void doModbusOpened() override;
bool doMduCoils(const QModbusDataUnit& unit) override;
bool doMduDiscreteInputs(const QModbusDataUnit& unit) override;
bool doMduInputRegisters(const QModbusDataUnit& unit) override;
bool doMduHoldingRegisters(const QModbusDataUnit& unit) override;
private:
/* holds current relay control mode */
QMap<quint8, TControlMode> m_control;
/* holds current relay state */
QMap<quint8, bool> m_relays;
/* holds current digital input state */
QMap<quint8, bool> m_dinputs;
private:
inline void readRelayStatus();
inline void readInputStatus();
inline void readControlModes();
};
Q_DECLARE_METATYPE(WSRelayDigInMbRtu::TRelayFunction)
Q_DECLARE_METATYPE(WSRelayDigInMbRtu::TControlMode);