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
76 void setChannelNumberOffset(uint8_t offset);
77
91 void setUseSubDevices(bool useSubDevices);
92
101 void setPairingTimeout(uint8_t timeout);
102
107
126
127 protected:
128 SuplaDeviceClass *sdc = nullptr;
129 MultiDsSensor *sensors[MULTI_DS_MAX_DEVICES_COUNT] = {};
130 Supla::Sensor::MultiDsSensor *addDevice(uint8_t *deviceAddress,
131 int channelNumber = -1,
132 int subDeviceId = -1);
133 virtual int refreshSensorsCount() = 0;
134 virtual void requestTemperatures() = 0;
135 virtual bool getSensorAddress(uint8_t *address, int index) = 0;
136
137 int findFreeSensorSlot() const;
138 int findNextFreeSubDeviceId() const;
139 int findChannelNumber(int sensorSlot) const;
140
141 private:
142 void notifySrpcAboutParingEnd(int pairingResult, const char *name = nullptr);
143 void addressToString(char *buffor, uint8_t bufforLength, uint8_t *address);
144 void initialSensorSearch();
145
146 uint8_t pin;
147 Supla::Protocol::SuplaSrpc *srpc = nullptr;
148 MultiDsState state = MultiDsState::READY;
149
150 uint32_t pairingStartTimeMs = 0;
151 uint32_t helperTimeMs = 0;
152 uint32_t lastBusReadTime = 0;
153
154 uint8_t maxDeviceCount = MULTI_DS_MAX_DEVICES_COUNT;
155 uint8_t pairingTimeout = MUTLI_DS_DEFAULT_PAIRING_DURATION_SEC;
156 int channelNumberOffset = -1;
157 bool useSubDevices = true;
158 bool channelStateDisabled = false;
159 bool anySensorLoaded = false;
160 bool searchFirstDevice = false;
161};
162
163}; // namespace Sensor
164}; // namespace Supla
165
166#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:27
Definition supla_srpc.h:46
Definition multi_ds_handler_base.h:31
void setChannelNumberOffset(uint8_t offset)
Sets the offset for channel number.
Definition multi_ds_handler_base.cpp:415
void setUseSubDevices(bool useSubDevices)
Sets the channel number offset for paired thermometers.
Definition multi_ds_handler_base.cpp:419
void onLoadConfig(SuplaDeviceClass *sdc) override
First method called on element in SuplaDevice.begin().
Definition multi_ds_handler_base.cpp:39
void onRegistered(Supla::Protocol::SuplaSrpc *suplaSrpc) override
Method called each time when device successfully registers to Supla server.
Definition multi_ds_handler_base.cpp:92
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:180
void setPairingTimeout(uint8_t timeout)
Sets the timeout for the pairing process.
Definition multi_ds_handler_base.cpp:423
void onInit() override
Third method called on element in SuplaDevice.begin()
Definition multi_ds_handler_base.cpp:77
void setMaxDeviceCount(uint8_t count)
Sets the maximum number of DS18B20 devices handled by this instance.
Definition multi_ds_handler_base.cpp:406
void iterateAlways() override
Method called on each SuplaDevice iteration.
Definition multi_ds_handler_base.cpp:105
void disableSensorsChannelState()
Disables channel state in all thermometers managed by this handler.
Definition multi_ds_handler_base.cpp:427
void searchForFirstSensorDuringInitialization()
Sets automatic single-sensor initialization mode.
Definition multi_ds_handler_base.cpp:431
Definition multi_ds_sensor.h:27
Definition proto.h:2294