supla-device
Loading...
Searching...
No Matches
multi_ds_handler_base.h
1// SPDX-FileCopyrightText: AC SOFTWARE SP. Z O.O.
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#ifndef SRC_SUPLA_SENSOR_MULTI_DS_HANDLER_BASE_H_
5#define SRC_SUPLA_SENSOR_MULTI_DS_HANDLER_BASE_H_
6
7#include <SuplaDevice.h>
8#include <supla/element.h>
9#include <supla/log_wrapper.h>
10#include <supla/local_action.h>
11#include <supla/device/subdevice_pairing_handler.h>
12#include <supla/device/channel_conflict_resolver.h>
13
14#include "multi_ds_sensor.h"
15
16#define MUTLI_DS_DEFAULT_PAIRING_DURATION_SEC 5
17#define MULTI_DS_MAX_DEVICES_COUNT 10
18#define MULTI_DS_MAX_ACTIONS 10
19
20namespace Supla {
21
22namespace Sensor {
23
24enum class MultiDsState {
25 READY,
26 PARING
27};
28
32 public:
33 explicit MultiDsHandlerBase(SuplaDeviceClass *sdc, uint8_t pin);
34 virtual ~MultiDsHandlerBase();
35
36 void onRegistered(Supla::Protocol::SuplaSrpc *suplaSrpc) override;
37 void iterateAlways() override;
38 bool iterateConnected() override;
39 void onLoadConfig(SuplaDeviceClass *sdc) override;
40 void onInit() override;
41
42 bool startPairing(Supla::Protocol::SuplaSrpc *srpc,
43 TCalCfg_SubdevicePairingResult *result) override;
44
45 bool onChannelConflictReport(
46 uint8_t *channelReport,
47 uint8_t channelReportSize,
48 bool hasConflictInvalidType,
49 bool hasConflictChannelMissingOnServer,
50 bool hasConflictChannelMissingOnDevice) override;
51
52 virtual double getTemperature(const uint8_t *address) = 0;
53
62 void setMaxDeviceCount(uint8_t count);
63
68 void setRefreshIntervalMs(uint32_t intervalMs);
69
82 void setChannelNumberOffset(uint8_t offset);
83
97 void setUseSubDevices(bool useSubDevices);
98
107 void setPairingTimeout(uint8_t timeout);
108
113
132
133 protected:
134 SuplaDeviceClass *sdc = nullptr;
135 MultiDsSensor *sensors[MULTI_DS_MAX_DEVICES_COUNT] = {};
136 Supla::Sensor::MultiDsSensor *addDevice(uint8_t *deviceAddress,
137 int channelNumber = -1,
138 int subDeviceId = -1);
139 virtual int refreshSensorsCount() = 0;
140 virtual void requestTemperatures() = 0;
141 virtual bool getSensorAddress(uint8_t *address, int index) = 0;
142
143 int findFreeSensorSlot() const;
144 int findNextFreeSubDeviceId() const;
145 int findChannelNumber(int sensorSlot) const;
146
147 private:
148 void notifySrpcAboutParingEnd(int pairingResult, const char *name = nullptr);
149 void addressToString(char *buffor, uint8_t bufforLength, uint8_t *address);
150 void initialSensorSearch();
151
152 uint8_t pin;
153 Supla::Protocol::SuplaSrpc *srpc = nullptr;
154 MultiDsState state = MultiDsState::READY;
155
156 uint32_t pairingStartTimeMs = 0;
157 uint32_t helperTimeMs = 0;
158 uint32_t lastBusReadTime = 0;
159 uint32_t refreshIntervalMs = 10000;
160
161 uint8_t maxDeviceCount = MULTI_DS_MAX_DEVICES_COUNT;
162 uint8_t pairingTimeout = MUTLI_DS_DEFAULT_PAIRING_DURATION_SEC;
163 int channelNumberOffset = -1;
164 bool useSubDevices = true;
165 bool channelStateDisabled = false;
166 bool anySensorLoaded = false;
167 bool searchFirstDevice = false;
168};
169
170}; // namespace Sensor
171}; // namespace Supla
172
173#endif // SRC_SUPLA_SENSOR_MULTI_DS_HANDLER_BASE_H_
Definition SuplaDevice.h:167
Definition channel_conflict_resolver.h:18
Definition subdevice_pairing_handler.h:26
Base class for all elements of SuplaDevice.
Definition element.h:30
Definition supla_srpc.h:47
Definition multi_ds_handler_base.h:31
void setChannelNumberOffset(uint8_t offset)
Sets the offset for channel number.
Definition multi_ds_handler_base.cpp:428
void setUseSubDevices(bool useSubDevices)
Sets the channel number offset for paired thermometers.
Definition multi_ds_handler_base.cpp:432
void onLoadConfig(SuplaDeviceClass *sdc) override
First method called on element in SuplaDevice.begin().
Definition multi_ds_handler_base.cpp:45
void onRegistered(Supla::Protocol::SuplaSrpc *suplaSrpc) override
Method called each time when device successfully registers to Supla server.
Definition multi_ds_handler_base.cpp:98
bool iterateConnected() override
Method called on each SuplaDevice iteration when device is connected and registered to Supla server o...
Definition multi_ds_handler_base.cpp:193
void setRefreshIntervalMs(uint32_t intervalMs)
Sets the interval between temperature conversion requests.
Definition multi_ds_handler_base.cpp:185
void setPairingTimeout(uint8_t timeout)
Sets the timeout for the pairing process.
Definition multi_ds_handler_base.cpp:436
void onInit() override
Third method called on element in SuplaDevice.begin()
Definition multi_ds_handler_base.cpp:83
void setMaxDeviceCount(uint8_t count)
Sets the maximum number of DS18B20 devices handled by this instance.
Definition multi_ds_handler_base.cpp:419
void iterateAlways() override
Method called on each SuplaDevice iteration.
Definition multi_ds_handler_base.cpp:111
void disableSensorsChannelState()
Disables channel state in all thermometers managed by this handler.
Definition multi_ds_handler_base.cpp:440
void searchForFirstSensorDuringInitialization()
Sets automatic single-sensor initialization mode.
Definition multi_ds_handler_base.cpp:444
Definition multi_ds_sensor.h:27
Definition proto.h:2293