supla-device
Loading...
Searching...
No Matches
modbus_client_handler.h
1// SPDX-FileCopyrightText: AC SOFTWARE SP. Z O.O.
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#ifndef SRC_SUPLA_MODBUS_MODBUS_CLIENT_HANDLER_H_
5#define SRC_SUPLA_MODBUS_MODBUS_CLIENT_HANDLER_H_
6
7#include <stddef.h>
8#include <stdint.h>
9
10namespace Supla {
11
12namespace Modbus {
13enum class Result {
14 OK,
15 INVALID_STATE,
16 INVALID_REGISTER_ADDRESS,
17};
18
19enum class Access {
20 READ,
21 WRITE,
22};
23} // namespace Modbus
24
26 public:
28
29 virtual ~ModbusClientHandler();
30 // RW holding register
31 static Supla::Modbus::Result HoldingProcessRequest(
32 uint16_t address,
33 uint16_t nRegs,
34 uint8_t *regBuffer,
35 Supla::Modbus::Access access);
36 // RO input register
37 static Supla::Modbus::Result InputProcessRequest(uint16_t address,
38 uint16_t nRegs,
39 uint8_t *regBuffer);
40 // RW coils
41 static Supla::Modbus::Result CoilsProcessRequest(
42 uint16_t address,
43 uint16_t nRegs,
44 uint8_t *regBuffer,
45 Supla::Modbus::Access access);
46 // RO discrete register
47 static Supla::Modbus::Result DiscreteProcessRequest(uint16_t address,
48 uint16_t nRegs,
49 uint8_t *regBuffer);
50
51 static bool IsInputSupported();
52 static bool IsDiscreteSupported();
53 static bool IsCoilsSupported();
54 static bool IsHoldingSupported();
55
56 virtual bool isInputSupported();
57 virtual bool isDiscreteSupported();
58 virtual bool isCoilsSupported();
59 virtual bool isHoldingSupported();
60
61 virtual bool holdingRespondsToAddress(uint16_t address, uint16_t nRegs);
62 virtual Supla::Modbus::Result holdingProcessRequest(
63 uint16_t address,
64 uint16_t nRegs,
65 uint8_t *regBuffer,
66 Supla::Modbus::Access access);
67
68 virtual bool inputRespondsToAddress(uint16_t address, uint16_t nRegs);
69 virtual Supla::Modbus::Result inputProcessRequest(uint16_t address,
70 uint16_t nRegs,
71 uint8_t *regBuffer);
72
73 virtual bool coilsRespondsToAddress(uint16_t address, uint16_t nRegs);
74 virtual Supla::Modbus::Result coilsProcessRequest(
75 uint16_t address,
76 uint16_t nRegs,
77 uint8_t *regBuffer,
78 Supla::Modbus::Access access);
79
80 virtual bool discreteRespondsToAddress(uint16_t address, uint16_t nRegs);
81 virtual Supla::Modbus::Result discreteProcessRequest(uint16_t address,
82 uint16_t nRegs,
83 uint8_t *regBuffer);
84
85 protected:
86 void storeBigEndian(uint64_t value,
87 uint8_t *regBuffer,
88 uint8_t registerOffset,
89 uint8_t registerCount);
90 uint16_t modbusAddressOffset = 0;
91 uint16_t usedRegistersCount = 0;
92
93 private:
94 static ModbusClientHandler *GetHoldingHandler(uint16_t address,
95 uint16_t nRegs);
96 static ModbusClientHandler *GetInputHandler(uint16_t address, uint16_t nRegs);
97 static ModbusClientHandler *GetDiscreteHandler(uint16_t address,
98 uint16_t nRegs);
99 static ModbusClientHandler *GetCoilsHandler(uint16_t address, uint16_t nRegs);
100 static ModbusClientHandler *first;
101 ModbusClientHandler *next = nullptr;
102};
103
104} // namespace Supla
105#endif // SRC_SUPLA_MODBUS_MODBUS_CLIENT_HANDLER_H_
Definition modbus_client_handler.h:25