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_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(ZigbeeThermostat *thermostat_object,
37 GDBusMethodInvocation *invocation,
42 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
43 ZigbeeThermostatGetLocalTemp_t req;
44 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
46 GVariantIter *iter = NULL;
51 memset(&req, 0x0, sizeof(ZigbeeThermostatGetLocalTemp_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_THERMOSTAT,
78 ZBLIB_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(ZigbeeThermostat *thermostat_object,
110 GDBusMethodInvocation *invocation,
117 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
118 ZigbeeThermostatGetWeeklySchedule_t req;
119 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
121 GVariantIter *iter = NULL;
126 memset(&req, 0x0, sizeof(ZigbeeThermostatGetWeeklySchedule_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_THERMOSTAT,
155 ZBLIB_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(ZigbeeThermostat *thermostat_object,
187 GDBusMethodInvocation *invocation,
190 gchar no_of_transitions,
197 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
198 ZigbeeThermostatSetWeeklySchedule_t req;
199 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
201 GVariantIter *iter = NULL;
206 memset(&req, 0x0, sizeof(ZigbeeThermostatSetWeeklySchedule_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_THERMOSTAT,
245 ZBLIB_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(ZigbeeThermostat *thermostat_object,
277 GDBusMethodInvocation *invocation,
282 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
283 ZigbeeThermostatClearWeeklySchedule_t req;
284 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
286 GVariantIter *iter = NULL;
291 memset(&req, 0x0, sizeof(ZigbeeThermostatClearWeeklySchedule_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_THERMOSTAT,
318 ZBLIB_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(ZigbeeThermostat *thermostat_object,
350 GDBusMethodInvocation *invocation,
357 ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
358 ZigbeeThermostatSetpointRaiseLower_t req;
359 ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
363 memset(&req, 0x0, sizeof(ZigbeeThermostatSetpointRaiseLower_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_THERMOSTAT,
387 ZBLIB_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 gboolean zigbee_service_dbus_interface_thermostat_init(ZigBeeServiceInterface *service_interface,
406 ZigbeeObjectSkeleton *zigbee_object)
408 ZigbeeThermostat *thermostat_object;
410 if (NULL == service_interface) {
411 Z_LOGE("service_interface is NULL");
415 thermostat_object = zigbee_thermostat_skeleton_new();
416 zigbee_object_skeleton_set_thermostat(zigbee_object, thermostat_object);
417 g_object_unref(thermostat_object);
419 Z_LOGI("thermostat_object: [%p]", thermostat_object);
422 * Register signal handlers for 'thermostat' interface
424 g_signal_connect(thermostat_object,
425 "handle-get-local-temp",
426 G_CALLBACK(on_thermostat_get_local_temp), service_interface);
428 g_signal_connect(thermostat_object,
429 "handle-get-weekly-schedule",
430 G_CALLBACK(on_thermostat_get_weekly_schedule), service_interface);
432 g_signal_connect(thermostat_object,
433 "handle-set-weekly-schedule",
434 G_CALLBACK(on_thermostat_set_weekly_schedule), service_interface);
436 g_signal_connect(thermostat_object,
437 "handle-clear-weekly-schedule",
438 G_CALLBACK(on_thermostat_clear_weekly_schedule), service_interface);
440 g_signal_connect(thermostat_object,
441 "handle-setpoint-raise-lower",
442 G_CALLBACK(on_thermostat_setpoint_raise_lower), service_interface);