- 'enable' method is used to execute zigbee daemon on demand.
- Its synchronous operation may cause unexpected gvariant crash,
change this function to act asynchronously.
Change-Id: I3bd9ce51eb4c0642e7b201d58dca46416529846e
Signed-off-by: Jiwan Kim <ji-wan.kim@samsung.com>
--- /dev/null
+[D-BUS Service]
+Name=org.tizen.zigbee
+
+Exec=/bin/false
+User=system
+SystemdService=zigbee-daemon.service
Summary: ZigBee Daemon
Group: System/Network
Source0: %{name}-%{version}.tar.gz
+Source1: org.tizen.zigbee.service
BuildRequires: cmake
BuildRequires: pkgconfig(dlog)
BuildRequires: pkgconfig(gio-2.0)
%prep
%setup -q
+chmod 644 %{SOURCE1}
+cp -a %{SOURCE1} .
+
%build
cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DVERSION=%{version} \
%make_install
-# For debug, do not execute zigbee daemon automatically.
-#mkdir -p %{buildroot}%{_libdir}/systemd/system/multi-user.target.wants
-#ln -s %{_libdir}/systemd/system/zigbee-daemon.service %{buildroot}%{_libdir}/systemd/system/multi-user.target.wants/zigbee-daemon.service
+mkdir -p %{buildroot}%{_libdir}/systemd/system/multi-user.target.wants
+ln -s %{_libdir}/systemd/system/zigbee-daemon.service %{buildroot}%{_libdir}/systemd/system/multi-user.target.wants/zigbee-daemon.service
+
+mkdir -p %{buildroot}%{_datadir}/dbus-1/system-services/
+cp org.tizen.zigbee.service %{buildroot}%{_datadir}/dbus-1/system-services/org.tizen.zigbee.service
%post -p /sbin/ldconfig
%manifest zigbee-daemon.manifest
%defattr(644,system,system,-)
%attr(755,system,system) %{_bindir}/zigbee-daemon
-# For debug, do not execute zigbee daemon automatically.
-#%{_libdir}/systemd/system/zigbee-daemon.service
-#%{_libdir}/systemd/system/multi-user.target.wants/zigbee-daemon.service
+%{_libdir}/systemd/system/zigbee-daemon.service
+%{_libdir}/systemd/system/multi-user.target.wants/zigbee-daemon.service
%{_datadir}/license/zigbee-daemon
+%attr(644,root,root) %{_datadir}/dbus-1/system-services/*
%files -n zigbee-lib
-#%manifest lib-zigbee/lib-zigbee.manifest
%defattr(644,system,system,-)
%{_libdir}/libzigbee-lib.so*
%{_datadir}/license/zigbee-lib
INSTALL(TARGETS zigbee-lib DESTINATION lib COMPONENT Runtime)
INSTALL(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin)
INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE DESTINATION /usr/share/license RENAME zigbee-daemon)
-# For debug, do not execute zigbee daemon automatically.
-#INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/resources/zigbee-daemon.service DESTINATION /usr/lib/systemd/system)
+INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/resources/zigbee-daemon.service DESTINATION /usr/lib/systemd/system)
[Unit]
Description=ZigBee daemon
+Requires=dbus.socket
+After=dbus.socket
[Service]
+Type=dbus
+BusName=org.tizen.zigbee
User=system
Group=system
SmackProcessLabel=System
ExecStart=/usr/bin/zigbee-daemon
-Restart=always
+Restart=on-failure
RestartSec=0
KillMode=none
<arg type='i' name='result' direction='out'/>
<arg type='b' name='zigbee_state' direction='out'/>
</method>
+ <method name='enable'>
+ </method>
+ <method name='disable'>
+ <arg type='i' name='result' direction='out'/>
+ </method>
<signal name='zigbee_state'>
<arg type='b' name='state'/>
<node>
<interface name='org.tizen.zigbee.service'>
- <method name='enable'>
- <arg type='i' name='result' direction='out'/>
- <arg type='b' name='enabled' direction='out'/>
- </method>
- <method name='disable'>
- <arg type='i' name='result' direction='out'/>
- </method>
<method name='zb_hw_reset'>
<arg type='i' name='result' direction='out'/>
</method>
/**< ZigBee D-BUS service interface name */
#define ZIGBEE_DBUS_SERVICE_INTERFACE_NAME "zigbee-dbus"
-static gboolean zigbee_on_manager_get_zigbee_state(ZigbeeManager *zigbee_mgr,
+static gboolean on_manager_enable(ZigbeeManager *zigbee_mgr,
+ GDBusMethodInvocation *invocation,
+ gpointer user_data)
+{
+ ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
+ ZigbeeCustomData_t *custom_data = zblib_service_interface_ref_user_data(service_interface);
+
+ if (NULL == custom_data) {
+ ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
+
+ return TRUE;
+ }
+
+ zigbee_manager_complete_enable(zigbee_mgr, invocation);
+
+ if (TRUE == custom_data->sevice_interface_init_complete) {
+ /* Emit zigbee_state - enabled */
+ zigbee_manager_emit_zigbee_state(zigbee_mgr, TRUE);
+ }
+
+ return TRUE;
+}
+
+static gboolean on_manager_disable(ZigbeeManager *zigbee_mgr,
+ GDBusMethodInvocation *invocation,
+ gpointer user_data)
+{
+ NOT_USED(user_data);
+
+ zigbee_manager_complete_disable(zigbee_mgr, invocation, TRUE);
+
+ return TRUE;
+}
+
+static gboolean on_manager_get_zigbee_state(ZigbeeManager *zigbee_mgr,
GDBusMethodInvocation *invocation, gpointer user_data)
{
+ ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
+ ZigbeeCustomData_t *custom_data = zblib_service_interface_ref_user_data(service_interface);
+
Z_LOGI("Entered");
- NOT_USED(zigbee_mgr);
- NOT_USED(invocation);
- NOT_USED(user_data);
+ if (NULL == custom_data) {
+ ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
- /*
- * TODO -
- * Create and send request for processing
- */
+ return TRUE;
+ }
+
+ zigbee_manager_complete_get_zigbee_state(zigbee_mgr, invocation,
+ 0, custom_data->sevice_interface_init_complete);
return TRUE;
}
custom_data->name_acquired = TRUE;
if (TRUE == custom_data->sevice_interface_init_complete) {
- /* TODO - Emit zigbee_state signal */
+ /* Emit zigbee_state - enabled */
+ zigbee_manager_emit_zigbee_state(custom_data->zigbee_mgr, TRUE);
}
}
*/
g_signal_connect(custom_data->zigbee_mgr,
"handle-get-zigbee-state",
- G_CALLBACK(zigbee_on_manager_get_zigbee_state),
- custom_data);
+ G_CALLBACK(on_manager_get_zigbee_state),
+ service_interface);
+
+ g_signal_connect(custom_data->zigbee_mgr,
+ "handle-enable",
+ G_CALLBACK(on_manager_enable),
+ service_interface);
+
+ g_signal_connect(custom_data->zigbee_mgr,
+ "handle-disable",
+ G_CALLBACK(on_manager_disable),
+ service_interface);
/*
* Export 'manager' interface on ZigBee D-BUS
g_dbus_object_manager_server_export(custom_data->manager,
G_DBUS_OBJECT_SKELETON(zigbee_object));
- /* Servcie interface initialization completed */
+ /* Service interface initialization completed */
custom_data->sevice_interface_init_complete = TRUE;
if (TRUE == custom_data->name_acquired) {
return service;
}
-static void on_service_enable_resp(ZigBeeServiceInterface *service_interface,
- guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
-{
- ZigbeeServiceInterfaceRespCbData_t *cb_data =
- (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
-
- ZigbeeService *service_object;
- GDBusMethodInvocation *invocation;
- ZigbeeServiceServiceStateResp_t *payload =
- (ZigbeeServiceServiceStateResp_t*)resp_data;
-
- NOT_USED(service_interface);
- NOT_USED(request_id);
-
- if (NULL == resp_data || 0 == resp_data_len) {
- Z_LOGE("resp_data is null");
- g_free(cb_data);
- return;
- }
-
- service_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
- zblib_check_null_free_and_ret("service_object", service_object, cb_data);
-
- invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
- zblib_check_null_free_and_ret("invocation", invocation, cb_data);
-
- zigbee_service_complete_enable(service_object, invocation,
- payload->result, payload->enabled);
-
- g_free(cb_data);
-}
-
-static gboolean on_service_enable(ZigbeeService *service_object,
- GDBusMethodInvocation *invocation,
- gpointer user_data)
-{
- ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
- ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
-
- gboolean ret;
-
- /* Allocate response callback data */
- resp_cb_data =
- zigbee_service_dbus_interface_create_resp_cb_data(service_object,
- invocation, NULL, 0);
- if (NULL == resp_cb_data) {
- Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
-
- /* Send failure response */
- ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
-
- return TRUE;
- }
-
- /* Dispatch request */
- ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
- ZBLIB_DRIVER_TYPE_SERVICE,
- ZBLIB_SERVICE_OPS_ENABLE,
- NULL, 0,
- on_service_enable_resp, resp_cb_data);
- if (FALSE == ret) {
- Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
-
- /* Free response callback data */
- zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
-
- /* Send failure response */
- ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
-
- return TRUE;
- }
-
- return TRUE;
-}
-
-static void on_service_disable_resp(ZigBeeServiceInterface *service_interface,
- guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
-{
- ZigbeeServiceInterfaceRespCbData_t *cb_data =
- (ZigbeeServiceInterfaceRespCbData_t *)resp_cb_data;
-
- ZigbeeService *service_object;
- GDBusMethodInvocation *invocation;
- ZigbeeGeneralResp_t *payload = (ZigbeeGeneralResp_t*)resp_data;
-
- NOT_USED(service_interface);
- NOT_USED(request_id);
-
- if (NULL == resp_data || 0 == resp_data_len) {
- Z_LOGE("resp_data is null");
- g_free(cb_data);
- return;
- }
-
- service_object = zigbee_service_dbus_interface_ref_interface_object(cb_data);
- zblib_check_null_free_and_ret("service_object", service_object, cb_data);
-
- invocation = zigbee_service_dbus_interface_ref_invocation(cb_data);
- zblib_check_null_free_and_ret("invocation", invocation, cb_data);
-
- zigbee_service_complete_disable(service_object, invocation, payload->result);
-
- g_free(cb_data);
-}
-
-static gboolean on_service_disable(ZigbeeService *service_object,
- GDBusMethodInvocation *invocation,
- gpointer user_data)
-{
- ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
- ZigbeeServiceInterfaceRespCbData_t *resp_cb_data = NULL;
-
- gboolean ret;
-
- /* Allocate response callback data */
- resp_cb_data =
- zigbee_service_dbus_interface_create_resp_cb_data(service_object,
- invocation, NULL, 0);
- if (NULL == resp_cb_data) {
- Z_LOGE("zigbee_service_dbus_interface_create_resp_cb_data failed!");
-
- /* Send failure response */
- ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
-
- return TRUE;
- }
-
- /* Dispatch request */
- ret = zigbee_service_dbus_interface_dispatch_request(service_interface,
- ZBLIB_DRIVER_TYPE_SERVICE,
- ZBLIB_SERVICE_OPS_DISABLE,
- NULL, 0,
- on_service_disable_resp, resp_cb_data);
- if (FALSE == ret) {
- Z_LOGE("zigbee_service_dbus_interface_dispatch_request failed!");
-
- /* Free response callback data */
- zigbee_service_dbus_interface_destroy_resp_cb_data(resp_cb_data);
-
- /* Send failure response */
- ZIGBEE_DBUS_FAIL_RESPONSE(invocation, ZIGBEE_DBUS_DEFAULT_REQ_FAILED_MSG);
-
- return TRUE;
- }
-
- return TRUE;
-}
-
static void on_service_zb_hw_reset_resp(ZigBeeServiceInterface *service_interface,
guint request_id, gpointer resp_data, guint resp_data_len, gpointer resp_cb_data)
{
* Register signal handlers for 'service' interface
*/
g_signal_connect(service_object,
- "handle-enable",
- G_CALLBACK(on_service_enable), service_interface);
-
- g_signal_connect(service_object,
- "handle-disable",
- G_CALLBACK(on_service_disable), service_interface);
-
- g_signal_connect(service_object,
"handle-zb-hw-reset",
G_CALLBACK(on_service_zb_hw_reset), service_interface);
/**< ZigBee 'service' driver operations */
typedef struct {
- gboolean (*enable)(ZigBeeDriver *driver, guint request_id);
- gboolean (*disable)(ZigBeeDriver *driver, guint request_id);
gboolean (*zb_hw_reset)(ZigBeeDriver *driver, guint request_id);
gboolean (*form_network)(ZigBeeDriver *driver, guint request_id);
gboolean (*coex_start)(ZigBeeDriver *driver, guint request_id);
/**< ZigBee 'service' ops IDs */
typedef enum {
- ZBLIB_SERVICE_OPS_ENABLE = 1, /**< Enable */
- ZBLIB_SERVICE_OPS_DISABLE, /**< Disable */
- ZBLIB_SERVICE_OPS_ZB_HW_RESET, /**< Zb hw reset */
+ ZBLIB_SERVICE_OPS_ZB_HW_RESET = 1, /**< Zb hw reset */
ZBLIB_SERVICE_OPS_FORM_NETWORK, /**< Form network */
ZBLIB_SERVICE_OPS_COEX_START, /**< Coex start */
ZBLIB_SERVICE_OPS_COEX_STOP, /**< Coex stop */
/* Fetch ops ID */
ops_id = zblib_request_get_ops_id(request_type);
switch (ops_id) {
- case ZBLIB_SERVICE_OPS_ENABLE: {
- zblib_check_null_ret_error("ops->enable",
- ops->enable, FALSE);
-
- ret = ops->enable(driver, request_id);
- }
- break;
-
- case ZBLIB_SERVICE_OPS_DISABLE: {
- zblib_check_null_ret_error("ops->disable",
- ops->disable, FALSE);
-
- ret = ops->disable(driver, request_id);
- }
- break;
-
case ZBLIB_SERVICE_OPS_ZB_HW_RESET: {
zblib_check_null_ret_error("ops->zb_hw_reset",
ops->zb_hw_reset, FALSE);
/* Fetch ops ID */
ops_id = __zblib_request_get_ops_id(request_type);
switch (ops_id) {
- case ZBLIB_SERVICE_OPS_ENABLE: {
- service_request_data = NULL;
- }
- break;
-
- case ZBLIB_SERVICE_OPS_DISABLE: {
- service_request_data = NULL;
- }
- break;
-
case ZBLIB_SERVICE_OPS_ZB_HW_RESET: {
service_request_data = NULL;
}
/* Fetch ops ID */
ops_id = __zblib_request_get_ops_id(request_type);
switch (ops_id) {
- case ZBLIB_SERVICE_OPS_ENABLE: {
- }
- break;
-
- case ZBLIB_SERVICE_OPS_DISABLE: {
- }
- break;
-
case ZBLIB_SERVICE_OPS_ZB_HW_RESET: {
}
break;