2 * Copyright (c) 2016 Samsung Electronics Co., Ltd. All rights reserved.
4 * Contact: Suresh Kumar N (suresh.n@samsung.com)
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
19 #include "zigbee_service_interface_common.h"
21 #include <zblib_driver_zcl_thermostat.h>
23 static void on_thermostat_get_local_temp_resp(ZigBeeServiceInterface *service_interface,
24 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
26 ZigbeeServiceInterfaceRespCbData_t *cb_data =
27 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
30 NOT_USED(service_interface);
33 NOT_USED(resp_data_len);
36 static gboolean on_thermostat_get_local_temp(ZigbeeZcl_thermostat *thermostat_object,
37 GDBusMethodInvocation *invocation,
42 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
43 ZigbeeZclThermostatGetLocalTemp_t req;
44 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
46 GVariantIter *iter = NULL;
51 memset(&req, 0x0, sizeof(ZigbeeZclThermostatGetLocalTemp_t));
53 /* Update request structure */
54 g_variant_get(eui64, "ay", &iter);
55 while (g_variant_iter_loop(iter, "y", req.eui64[i])) {
57 if (i >= ZIGBEE_EUI64_SIZE)
60 req.endpoint = endpoint;
62 /* Allocate response callback data */
64 zigbee_service_dbus_interface_create_resp_cb_data(thermostat_object,
66 if (NULL == resp_cb_data) {
67 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
69 /* Send failure response */
70 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
75 /* Dispatch request */
76 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
77 ZBLIB_DRIVER_TYPE_ZCL_THERMOSTAT,
78 ZBLIB_ZCL_THERMOSTAT_OPS_GET_LOCAL_TEMP,
80 on_thermostat_get_local_temp_resp, resp_cb_data);
82 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
84 /* Free response callback data */
85 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
87 /* Send failure response */
88 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
96 static void on_thermostat_get_weekly_schedule_resp(ZigBeeServiceInterface *service_interface,
97 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
99 ZigbeeServiceInterfaceRespCbData_t *cb_data =
100 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
103 NOT_USED(service_interface);
104 NOT_USED(request_id);
106 NOT_USED(resp_data_len);
109 static gboolean on_thermostat_get_weekly_schedule(ZigbeeZcl_thermostat *thermostat_object,
110 GDBusMethodInvocation *invocation,
117 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
118 ZigbeeZclThermostatGetWeeklySchedule_t req;
119 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
121 GVariantIter *iter = NULL;
126 memset(&req, 0x0, sizeof(ZigbeeZclThermostatGetWeeklySchedule_t));
128 /* Update request structure */
129 g_variant_get(eui64, "ay", &iter);
130 while (g_variant_iter_loop(iter, "y", req.eui64[i])) {
132 if (i >= ZIGBEE_EUI64_SIZE)
135 req.endpoint = endpoint;
136 req.num_of_days = no_of_days;
139 /* Allocate response callback data */
141 zigbee_service_dbus_interface_create_resp_cb_data(thermostat_object,
142 invocation, NULL, 0);
143 if (NULL == resp_cb_data) {
144 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
146 /* Send failure response */
147 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
152 /* Dispatch request */
153 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
154 ZBLIB_DRIVER_TYPE_ZCL_THERMOSTAT,
155 ZBLIB_ZCL_THERMOSTAT_OPS_GET_WEEKLY_SCHEDULE,
157 on_thermostat_get_weekly_schedule_resp, resp_cb_data);
159 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
161 /* Free response callback data */
162 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
164 /* Send failure response */
165 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
173 static void on_thermostat_set_weekly_schedule_resp(ZigBeeServiceInterface *service_interface,
174 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
176 ZigbeeServiceInterfaceRespCbData_t *cb_data =
177 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
180 NOT_USED(service_interface);
181 NOT_USED(request_id);
183 NOT_USED(resp_data_len);
186 static gboolean on_thermostat_set_weekly_schedule(ZigbeeZcl_thermostat *thermostat_object,
187 GDBusMethodInvocation *invocation,
190 gchar no_of_transitions,
197 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
198 ZigbeeZclThermostatSetWeeklySchedule_t req;
199 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
201 GVariantIter *iter = NULL;
206 memset(&req, 0x0, sizeof(ZigbeeZclThermostatSetWeeklySchedule_t));
208 /* Update request structure */
209 g_variant_get(eui64, "ay", &iter);
210 while (g_variant_iter_loop(iter, "y", req.eui64[i])) {
212 if (i >= ZIGBEE_EUI64_SIZE)
215 req.endpoint = endpoint;
216 req.no_of_transitions = no_of_transitions;
217 req.num_of_days = no_of_days;
221 g_variant_get(payload, "ay", &iter);
222 while (g_variant_iter_loop(iter, "y", req.payload[i])) {
224 if (i >= (guint)payload_len)
227 req.payload_len = payload_len;
229 /* Allocate response callback data */
231 zigbee_service_dbus_interface_create_resp_cb_data(thermostat_object,
232 invocation, NULL, 0);
233 if (NULL == resp_cb_data) {
234 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
236 /* Send failure response */
237 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
242 /* Dispatch request */
243 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
244 ZBLIB_DRIVER_TYPE_ZCL_THERMOSTAT,
245 ZBLIB_ZCL_THERMOSTAT_OPS_SET_WEEKLY_SCHEDULE,
247 on_thermostat_set_weekly_schedule_resp, resp_cb_data);
249 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
251 /* Free response callback data */
252 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
254 /* Send failure response */
255 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
263 static void on_thermostat_clear_weekly_schedule_resp(ZigBeeServiceInterface *service_interface,
264 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
266 ZigbeeServiceInterfaceRespCbData_t *cb_data =
267 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
270 NOT_USED(service_interface);
271 NOT_USED(request_id);
273 NOT_USED(resp_data_len);
276 static gboolean on_thermostat_clear_weekly_schedule(ZigbeeZcl_thermostat *thermostat_object,
277 GDBusMethodInvocation *invocation,
282 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
283 ZigbeeZclThermostatClearWeeklySchedule_t req;
284 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
286 GVariantIter *iter = NULL;
291 memset(&req, 0x0, sizeof(ZigbeeZclThermostatClearWeeklySchedule_t));
293 /* Update request structure */
294 g_variant_get(eui64, "ay", &iter);
295 while (g_variant_iter_loop(iter, "y", req.eui64[i])) {
297 if (i >= ZIGBEE_EUI64_SIZE)
300 req.endpoint = endpoint;
302 /* Allocate response callback data */
304 zigbee_service_dbus_interface_create_resp_cb_data(thermostat_object,
305 invocation, NULL, 0);
306 if (NULL == resp_cb_data) {
307 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
309 /* Send failure response */
310 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
315 /* Dispatch request */
316 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
317 ZBLIB_DRIVER_TYPE_ZCL_THERMOSTAT,
318 ZBLIB_ZCL_THERMOSTAT_OPS_CLEAR_WEEKLY_SCHEDULE,
320 on_thermostat_clear_weekly_schedule_resp, resp_cb_data);
322 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
324 /* Free response callback data */
325 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
327 /* Send failure response */
328 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
336 static void on_thermostat_setpoint_raise_lower_resp(ZigBeeServiceInterface *service_interface,
337 guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
339 ZigbeeServiceInterfaceRespCbData_t *cb_data =
340 (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
343 NOT_USED(service_interface);
344 NOT_USED(request_id);
346 NOT_USED(resp_data_len);
349 static gboolean on_thermostat_setpoint_raise_lower(ZigbeeZcl_thermostat *thermostat_object,
350 GDBusMethodInvocation *invocation,
357 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
358 ZigbeeZclThermostatSetpointRaiseLower_t req;
359 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
363 memset(&req, 0x0, sizeof(ZigbeeZclThermostatSetpointRaiseLower_t));
365 /* Update request structure */
366 req.node_id = node_id;
367 req.endpoint = endpoint;
371 /* Allocate response callback data */
373 zigbee_service_dbus_interface_create_resp_cb_data(thermostat_object,
374 invocation, NULL, 0);
375 if (NULL == resp_cb_data) {
376 Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
378 /* Send failure response */
379 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
384 /* Dispatch request */
385 ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
386 ZBLIB_DRIVER_TYPE_ZCL_THERMOSTAT,
387 ZBLIB_ZCL_THERMOSTAT_OPS_SETPOINT_RAISE_LOWER,
389 on_thermostat_setpoint_raise_lower_resp, resp_cb_data);
391 Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
393 /* Free response callback data */
394 zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
396 /* Send failure response */
397 ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
405 void zigbee_service_dbus_interface_zcl_thermostat_notification(ZigBeeServiceInterface *service_interface,
406 guint noti_id, gpointer noti_data, guint noti_data_len, gpointer noti_cb_data)
408 if (NULL == service_interface) {
409 Z_LOGE("service_interface is NULL");
415 NOT_USED(noti_data_len);
416 NOT_USED(noti_cb_data);
419 gboolean zigbee_service_dbus_interface_zcl_thermostat_init(ZigBeeServiceInterface *service_interface,
420 ZigbeeObjectSkeleton *zigbee_object)
422 ZigbeeZcl_thermostat *thermostat_object;
424 if (NULL == service_interface) {
425 Z_LOGE("service_interface is NULL");
429 thermostat_object = zigbee_zcl_thermostat_skeleton_new();
430 zigbee_object_skeleton_set_zcl_thermostat(zigbee_object, thermostat_object);
431 g_object_unref(thermostat_object);
433 Z_LOGI("thermostat_object: [%p]", thermostat_object);
436 * Register signal handlers for 'thermostat' interface
438 g_signal_connect(thermostat_object,
439 "handle-get-local-temp",
440 G_CALLBACK(on_thermostat_get_local_temp), service_interface);
442 g_signal_connect(thermostat_object,
443 "handle-get-weekly-schedule",
444 G_CALLBACK(on_thermostat_get_weekly_schedule), service_interface);
446 g_signal_connect(thermostat_object,
447 "handle-set-weekly-schedule",
448 G_CALLBACK(on_thermostat_set_weekly_schedule), service_interface);
450 g_signal_connect(thermostat_object,
451 "handle-clear-weekly-schedule",
452 G_CALLBACK(on_thermostat_clear_weekly_schedule), service_interface);
454 g_signal_connect(thermostat_object,
455 "handle-setpoint-raise-lower",
456 G_CALLBACK(on_thermostat_setpoint_raise_lower), service_interface);