supla-device
Loading...
Searching...
No Matches
supla_srpc.h
1// SPDX-FileCopyrightText: AC SOFTWARE SP. Z O.O.
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#ifndef SRC_SUPLA_PROTOCOL_SUPLA_SRPC_H_
5#define SRC_SUPLA_PROTOCOL_SUPLA_SRPC_H_
6
7#include <stddef.h>
8#include <supla-common/proto.h>
9
10#include "protocol_layer.h"
11
12#define SUPLA_SRPC_CALCFG_RESULT_DONT_REPLY (-1)
13#define SUPLA_SRPC_CALCFG_RESULT_PENDING (-2)
14
15namespace Supla {
16
17class Client;
18
19namespace Device {
20class ChannelConflictResolver;
21class RemoteDeviceConfig;
22} // namespace Device
23
24namespace Protocol {
25
26struct CalCfgResultPendingItem;
27
29 public:
30 friend class SuplaSrpc;
31 void set(int16_t channelNo,
32 int32_t receiverId,
33 int32_t command,
34 uint32_t timeoutMs = 0);
35 void clear(int16_t channelNo, int32_t command = -1);
36 void clearTimeout(int16_t channelNo, int32_t command = -1);
37 void clearAll();
38 CalCfgResultPendingItem *get(int16_t channelNo, int32_t command = -1);
39
40 protected:
43 CalCfgResultPendingItem *first = nullptr;
44};
45
46class SuplaSrpc : public ProtocolLayer {
47 public:
48 static bool isSuplaSSLEnabled;
49
50 explicit SuplaSrpc(SuplaDeviceClass *sdc, int version = 23);
51 ~SuplaSrpc();
52
53 void setNetworkClient(Supla::Client *newClient);
54
55 void onInit() override;
56 bool onLoadConfig() override;
57 bool verifyConfig() override;
58 bool isEnabled() override;
59 void disconnect() override;
60 bool iterate(uint32_t _millis) override;
61 bool isNetworkRestartRequested() override;
62 uint32_t getConnectionFailTime() override;
63 ConnectionError getConnectionError() const override;
64 bool isRegisteredAndReady() override;
65 void initClient();
66
67 void sendActionTrigger(uint8_t channelNumber, uint32_t actionId) override;
68 void sendRegisterNotification(
69 TDS_RegisterPushNotification *notification) override;
70 bool sendNotification(int context,
71 const char *title,
72 const char *message,
73 int soundId) override;
74 void sendSubdeviceDetails(TDS_SubdeviceDetails *subdeviceDetails) override;
75 void getUserLocaltime() override;
76 void sendChannelValueChanged(uint8_t channelNumber,
77 int8_t *value,
78 uint8_t offline,
79 uint32_t validityTimeSec) override;
80 void sendExtendedChannelValueChanged(
81 uint8_t channelNumber, TSuplaChannelExtendedValue *value) override;
82
83 void getChannelConfig(uint8_t channelNumber, uint8_t configType) override;
84 bool setChannelConfig(uint8_t channelNumber,
85 _supla_int_t channelFunction,
86 void *channelConfig,
87 int size,
88 uint8_t configType) override;
89
90 bool setDeviceConfig(TSDS_SetDeviceConfig *deviceConfig) override;
91 bool setInitialCaption(uint8_t channelNumber, const char *caption) override;
92 void sendRemainingTimeValue(uint8_t channelNumber,
93 uint32_t timeMs,
94 uint8_t state,
95 int32_t senderId) override;
96 void sendRemainingTimeValue(uint8_t channelNumber,
97 uint32_t remainingTime,
98 unsigned char state[SUPLA_CHANNELVALUE_SIZE],
99 int32_t senderId,
100 bool useSecondsInsteadOfMs) override;
101
102 void onVersionError(TSDC_SuplaVersionError *versionError);
103 void onRegisterResult(TSD_SuplaRegisterDeviceResult *register_device_result);
104 void onRegisterResultB(
105 TSD_SuplaRegisterDeviceResult_B *registerDeviceResultB);
106 void onSetActivityTimeoutResult(TSDC_SuplaSetActivityTimeoutResult *result);
107 void setActivityTimeout(uint32_t activityTimeoutSec);
108 uint32_t getActivityTimeout();
109 void updateLastResponseTime();
110 void updateLastSentTime();
111 void onGetUserLocaltimeResult(TSDC_UserLocalTimeResult *result);
112 void sendChannelStateResult(int32_t receiverId, uint8_t channelNo) override;
113
114 void setServerPort(int value);
115 void setVersion(int value);
116 bool hasWriteFailure() const;
117 void markWriteFailure();
118 void setSuplaCACert(const char *);
119 void setSupla3rdPartyCACert(const char *);
120 const char *getSuplaCACert() const;
121 const char *getSupla3rdPartyCACert() const;
122 void setLowLevelDebugLogs(bool value);
123 bool isUpdatePending() override;
124 void handleDeviceConfig(TSDS_SetDeviceConfig *deviceConfig);
125 void handleSetDeviceConfigResult(TSDS_SetDeviceConfigResult *result);
126
127 Supla::Client *client = nullptr;
128 CalCfgResultPending calCfgResultPending;
129 void sendPendingCalCfgResult(int16_t channelNo,
130 int32_t result,
131 int32_t command,
132 int dataSize = 0,
133 void *data = nullptr);
134 void sendPendingCalCfgResultForCommand(int16_t channelNo,
135 int32_t result,
136 int32_t pendingCommand,
137 int32_t responseCommand,
138 int dataSize = 0,
139 void *data = nullptr);
140 void sendCalCfgResult(int32_t receiverId,
141 int16_t channelNo,
142 int32_t result,
143 int32_t command,
144 int dataSize = 0,
145 void *data = nullptr);
146
147 void clearPendingCalCfgResult(int16_t channelNo, int32_t command = -1);
148 void clearPendingCalCfgTimeout(int16_t channelNo, int32_t command = -1);
149
150 static const char *configResultToCStr(int result);
151
152 void setChannelConflictResolver(
154
155 static void onPacketSent(void *srpcHandle,
156 unsigned _supla_int_t callId,
157 void *data,
158 unsigned _supla_int_t dataSize,
159 void *userParam);
160 static void onPacketReceived(void *srpcHandle,
161 unsigned _supla_int_t callId,
162 void *data,
163 unsigned _supla_int_t dataSize,
164 void *userParam);
165 void logSrpcPacket(bool send, int callId, const uint8_t *buf, size_t size);
166 static const char *callIdToName(int callId);
167 static bool isSensitiveCallId(int callId);
168
169 protected:
170 bool ping();
171 void scheduleReconnect(uint32_t now);
172 void initializeSrpc();
173 void deinitializeSrpc();
174 void addLastStateAdError(char *buf);
175
176 uint8_t version = 0;
177 uint8_t activityTimeoutS = 30;
178 uint8_t securityLevel = 0;
179 int8_t registered = 0;
180 bool requestNetworkRestart = false;
181 bool enabled = true;
182 bool setDeviceConfigReceivedAfterRegistration = false;
183 bool firstConnectionAttempt = true;
184 bool adErrorLogged = false;
185 bool writeFailure = false;
186 uint8_t autodiscoverRetryCounter = 0;
187 uint16_t connectionFailCounter = 0;
188 uint8_t reconnectAttemptCounter = 0;
189
190 uint32_t lastPingTimeMs = 0;
191 uint32_t waitForIterate = 0;
192 uint32_t lastIterateTime = 0;
193 uint32_t lastResponseMs = 0;
194 uint32_t lastSentMs = 0;
195
196 int port = -1;
197
198 const char *suplaCACert = nullptr;
199 const char *supla3rdPartyCACert = nullptr;
200 const char *selectedCertificate = nullptr;
201 void *srpc = nullptr;
202 Supla::Device::ChannelConflictResolver *channelConflictResolver = nullptr;
203
204 private:
205 void handlePendingCalCfgTimeouts(uint32_t _millis);
206 Supla::Device::RemoteDeviceConfig *remoteDeviceConfig = nullptr;
207 bool versionErrorDisconnectPending = false;
208};
209} // namespace Protocol
210
211// Method passed to SRPC as a callback to read raw data from network interface
212_supla_int_t dataRead(void *buf, _supla_int_t count, void *sdc);
213// Method passed to SRPC as a callback to write raw data to network interface
214_supla_int_t dataWrite(void *buf, _supla_int_t count, void *sdc);
215// Method passed to SRPC as a callback to handle response from Supla server
216void messageReceived(void *srpc,
217 unsigned _supla_int_t rrId,
218 unsigned _supla_int_t callType,
219 void *userParam,
220 unsigned char protoVersion);
221
222} // namespace Supla
223
224#endif // SRC_SUPLA_PROTOCOL_SUPLA_SRPC_H_
Definition SuplaDevice.h:167
Definition client.h:24
Definition channel_conflict_resolver.h:18
Definition remote_device_config.h:28
Definition supla_srpc.h:28
Definition protocol_layer.h:18
Definition supla_srpc.h:46
Definition supla_srpc.cpp:30
Definition proto.h:4174
Definition proto.h:4200
Definition proto.h:707
Definition proto.h:2913
Definition proto.h:3174
Definition proto.h:3162
Definition proto.h:1176
Definition proto.h:1163
Definition proto.h:780