From 021b4d3b91fa43d31eb103455a4e97ca89994e17 Mon Sep 17 00:00:00 2001 From: "jino.cho" Date: Wed, 17 May 2017 10:15:07 +0900 Subject: [PATCH] Add structure to store pwm client context This patch adds structure to store pwm client context and changes argument name and type of pwm gdbus method. Change-Id: Ibfc245dd86c5da0003ae2f827e7dfb32b2ebeb18 Signed-off-by: jino.cho --- src/daemon/peripheral_bus.c | 90 ++++++++++++------------------- src/daemon/peripheral_bus.h | 9 ++++ src/daemon/peripheral_bus_pwm.c | 114 ++++++++++++++++++++++++++++++++++++---- src/daemon/peripheral_bus_pwm.h | 14 ++--- src/daemon/peripheral_io.xml | 19 +++---- 5 files changed, 161 insertions(+), 85 deletions(-) diff --git a/src/daemon/peripheral_bus.c b/src/daemon/peripheral_bus.c index 007af6c..b2a67df 100644 --- a/src/daemon/peripheral_bus.c +++ b/src/daemon/peripheral_bus.c @@ -251,13 +251,10 @@ gboolean handle_pwm_open( gpointer user_data) { peripheral_error_e ret = PERIPHERAL_ERROR_NONE; - struct _peripheral_pwm_s st_pwm; + pb_pwm_data_h pwm_handle; - st_pwm.device = device; - st_pwm.channel = channel; - - ret = peripheral_bus_pwm_open(&st_pwm); - peripheral_io_gdbus_pwm_complete_open(pwm, invocation, ret); + ret = peripheral_bus_pwm_open(device, channel, &pwm_handle, user_data); + peripheral_io_gdbus_pwm_complete_open(pwm, invocation, GPOINTER_TO_UINT(pwm_handle), ret); return true; } @@ -265,17 +262,14 @@ gboolean handle_pwm_open( gboolean handle_pwm_close( PeripheralIoGdbusPwm *pwm, GDBusMethodInvocation *invocation, - gint device, - gint channel, + gint handle, gpointer user_data) { peripheral_error_e ret = PERIPHERAL_ERROR_NONE; - struct _peripheral_pwm_s st_pwm; + pb_pwm_data_h pwm_handle = GUINT_TO_POINTER(handle); - st_pwm.device = device; - st_pwm.channel = channel; - ret = peripheral_bus_pwm_close(&st_pwm); + ret = peripheral_bus_pwm_close(pwm_handle, user_data); peripheral_io_gdbus_pwm_complete_close(pwm, invocation, ret); return true; @@ -284,18 +278,14 @@ gboolean handle_pwm_close( gboolean handle_pwm_set_duty_cycle( PeripheralIoGdbusPwm *pwm, GDBusMethodInvocation *invocation, - gint device, - gint channel, + gint handle, gint duty_cycle, gpointer user_data) { peripheral_error_e ret = PERIPHERAL_ERROR_NONE; - struct _peripheral_pwm_s st_pwm; - - st_pwm.device = device; - st_pwm.channel = channel; + pb_pwm_data_h pwm_handle = GUINT_TO_POINTER(handle); - ret = peripheral_bus_pwm_set_duty_cycle(&st_pwm, duty_cycle); + ret = peripheral_bus_pwm_set_duty_cycle(pwm_handle, duty_cycle); peripheral_io_gdbus_pwm_complete_set_duty_cycle(pwm, invocation, ret); return true; @@ -304,18 +294,14 @@ gboolean handle_pwm_set_duty_cycle( gboolean handle_pwm_set_period( PeripheralIoGdbusPwm *pwm, GDBusMethodInvocation *invocation, - gint device, - gint channel, + gint handle, gint period, gpointer user_data) { peripheral_error_e ret = PERIPHERAL_ERROR_NONE; - struct _peripheral_pwm_s st_pwm; - - st_pwm.device = device; - st_pwm.channel = channel; + pb_pwm_data_h pwm_handle = GUINT_TO_POINTER(handle); - ret = peripheral_bus_pwm_set_period(&st_pwm, period); + ret = peripheral_bus_pwm_set_period(pwm_handle, period); peripheral_io_gdbus_pwm_complete_set_period(pwm, invocation, ret); return true; @@ -324,18 +310,14 @@ gboolean handle_pwm_set_period( gboolean handle_pwm_set_enable( PeripheralIoGdbusPwm *pwm, GDBusMethodInvocation *invocation, - gint device, - gint channel, + gint handle, gint enable, gpointer user_data) { peripheral_error_e ret = PERIPHERAL_ERROR_NONE; - struct _peripheral_pwm_s st_pwm; - - st_pwm.device = device; - st_pwm.channel = channel; + pb_pwm_data_h pwm_handle = GUINT_TO_POINTER(handle); - ret = peripheral_bus_pwm_set_enable(&st_pwm, enable); + ret = peripheral_bus_pwm_set_enable(pwm_handle, enable); peripheral_io_gdbus_pwm_complete_set_enable(pwm, invocation, ret); return true; @@ -344,18 +326,15 @@ gboolean handle_pwm_set_enable( gboolean handle_pwm_get_duty_cycle( PeripheralIoGdbusPwm *pwm, GDBusMethodInvocation *invocation, - gint device, - gint channel, + gint handle, gpointer user_data) { peripheral_error_e ret = PERIPHERAL_ERROR_NONE; - struct _peripheral_pwm_s st_pwm; - - st_pwm.device = device; - st_pwm.channel = channel; + pb_pwm_data_h pwm_handle = GUINT_TO_POINTER(handle); + int duty_cycle; - ret = peripheral_bus_pwm_get_duty_cycle(&st_pwm, &st_pwm.duty_cycle); - peripheral_io_gdbus_pwm_complete_get_duty_cycle(pwm, invocation, st_pwm.duty_cycle, ret); + ret = peripheral_bus_pwm_get_duty_cycle(pwm_handle, &duty_cycle); + peripheral_io_gdbus_pwm_complete_get_duty_cycle(pwm, invocation, duty_cycle, ret); return true; } @@ -363,18 +342,15 @@ gboolean handle_pwm_get_duty_cycle( gboolean handle_pwm_get_period( PeripheralIoGdbusPwm *pwm, GDBusMethodInvocation *invocation, - gint device, - gint channel, + gint handle, gpointer user_data) { peripheral_error_e ret = PERIPHERAL_ERROR_NONE; - struct _peripheral_pwm_s st_pwm; - - st_pwm.device = device; - st_pwm.channel = channel; + pb_pwm_data_h pwm_handle = GUINT_TO_POINTER(handle); + int period; - ret = peripheral_bus_pwm_get_period(&st_pwm, &st_pwm.period); - peripheral_io_gdbus_pwm_complete_get_period(pwm, invocation, st_pwm.period, ret); + ret = peripheral_bus_pwm_get_period(pwm_handle, &period); + peripheral_io_gdbus_pwm_complete_get_period(pwm, invocation, period, ret); return true; } @@ -766,31 +742,31 @@ static gboolean __pwm_init(peripheral_bus_s *pb_data) g_signal_connect(pb_data->pwm_skeleton, "handle-open", G_CALLBACK(handle_pwm_open), - NULL); + pb_data); g_signal_connect(pb_data->pwm_skeleton, "handle-close", G_CALLBACK(handle_pwm_close), - NULL); + pb_data); g_signal_connect(pb_data->pwm_skeleton, "handle-set-duty-cycle", G_CALLBACK(handle_pwm_set_duty_cycle), - NULL); + pb_data); g_signal_connect(pb_data->pwm_skeleton, "handle-set-period", G_CALLBACK(handle_pwm_set_period), - NULL); + pb_data); g_signal_connect(pb_data->pwm_skeleton, "handle-set-enable", G_CALLBACK(handle_pwm_set_enable), - NULL); + pb_data); g_signal_connect(pb_data->pwm_skeleton, - "handle-get-duty", + "handle-get-duty-cycle", G_CALLBACK(handle_pwm_get_duty_cycle), - NULL); + pb_data); g_signal_connect(pb_data->pwm_skeleton, "handle-get-period", G_CALLBACK(handle_pwm_get_period), - NULL); + pb_data); manager = g_dbus_object_manager_server_new(PERIPHERAL_GDBUS_PWM_PATH); diff --git a/src/daemon/peripheral_bus.h b/src/daemon/peripheral_bus.h index 86ae86b..8b74484 100644 --- a/src/daemon/peripheral_bus.h +++ b/src/daemon/peripheral_bus.h @@ -26,6 +26,7 @@ typedef struct { /* devices */ GList *gpio_list; GList *i2c_list; + GList *pwm_list; GList *uart_list; /* gdbus variable */ guint reg_id; @@ -69,6 +70,13 @@ typedef struct { } peripheral_bus_i2c_data_s; typedef struct { + int device; + int channel; + /* client info */ + pb_client_info_s client_info; +} peripheral_bus_pwm_data_s; + +typedef struct { int port; int fd; uint8_t *buffer; @@ -79,6 +87,7 @@ typedef struct { typedef peripheral_bus_gpio_data_s *pb_gpio_data_h; typedef peripheral_bus_i2c_data_s *pb_i2c_data_h; +typedef peripheral_bus_pwm_data_s *pb_pwm_data_h; typedef peripheral_bus_uart_data_s *pb_uart_data_h; void peripheral_bus_emit_gpio_changed(PeripheralIoGdbusGpio *gpio, diff --git a/src/daemon/peripheral_bus_pwm.c b/src/daemon/peripheral_bus_pwm.c index 3d5e61c..6fcb205 100644 --- a/src/daemon/peripheral_bus_pwm.c +++ b/src/daemon/peripheral_bus_pwm.c @@ -21,39 +21,135 @@ #include #include "pwm.h" +#include "peripheral_io_gdbus.h" +#include "peripheral_bus.h" #include "peripheral_common.h" -int peripheral_bus_pwm_open(peripheral_pwm_context_h pwm) +static pb_pwm_data_h peripheral_bus_pwm_data_get(int device, int channel, GList **list) { - return pwm_open(pwm->device, pwm->channel); + GList *pwm_list = *list; + GList *link; + pb_pwm_data_h pwm_data; + + link = pwm_list; + while (link) { + pwm_data = (pb_pwm_data_h)link->data; + if (pwm_data->device == device && pwm_data->channel == channel) + return pwm_data; + link = g_list_next(link); + } + + return NULL; +} + +static pb_pwm_data_h peripheral_bus_pwm_data_new(GList **list) +{ + GList *pwm_list = *list; + pb_pwm_data_h pwm_data; + + pwm_data = (pb_pwm_data_h)calloc(1, sizeof(peripheral_bus_pwm_data_s)); + if (pwm_data == NULL) { + _E("failed to allocate peripheral_bus_pwm_data_s"); + return NULL; + } + + *list = g_list_append(pwm_list, pwm_data); + + return pwm_data; +} + +static int peripheral_bus_pwm_data_free(pb_pwm_data_h pwm_handle, GList **list) +{ + GList *pwm_list = *list; + GList *link; + pb_pwm_data_h pwm_data; + + link = pwm_list; + while (link) { + pwm_data = (pb_pwm_data_h)link->data; + + if (pwm_data == pwm_handle) { + *list = g_list_remove_link(pwm_list, link); + free(pwm_data); + g_list_free(link); + return 0; + } + link = g_list_next(link); + } + + return -1; } -int peripheral_bus_pwm_close(peripheral_pwm_context_h pwm) +int peripheral_bus_pwm_open(int device, int channel, pb_pwm_data_h *pwm, gpointer user_data) { - return pwm_close(pwm->device, pwm->channel); + peripheral_bus_s *pb_data = (peripheral_bus_s*)user_data; + pb_pwm_data_h pwm_handle; + int ret; + + if (peripheral_bus_pwm_data_get(device, channel, &pb_data->pwm_list)) { + _E("Resource is in use, device : %d, channel : %d", device, channel); + return PERIPHERAL_ERROR_RESOURCE_BUSY; + } + + if ((ret = pwm_open(device, channel)) < 0) + goto open_err; + + pwm_handle = peripheral_bus_pwm_data_new(&pb_data->pwm_list); + if (!pwm_handle) { + _E("peripheral_bus_pwm_data_new error"); + ret = PERIPHERAL_ERROR_OUT_OF_MEMORY; + goto err; + } + + pwm_handle->device = device; + pwm_handle->channel = channel; + *pwm = pwm_handle; + + return PERIPHERAL_ERROR_NONE; + +err: + pwm_close(device, channel); + +open_err: + return ret; +} + +int peripheral_bus_pwm_close(pb_pwm_data_h pwm, gpointer user_data) +{ + peripheral_bus_s *pb_data = (peripheral_bus_s*)user_data; + int ret; + + if ((ret = pwm_close(pwm->device, pwm->channel)) < 0) { + _E("gpio_close error (%d)", ret); + return ret; + } + + peripheral_bus_pwm_data_free(pwm, &pb_data->pwm_list); + + return PERIPHERAL_ERROR_NONE; } -int peripheral_bus_pwm_set_duty_cycle(peripheral_pwm_context_h pwm, int duty_cycle) +int peripheral_bus_pwm_set_duty_cycle(pb_pwm_data_h pwm, int duty_cycle) { return pwm_set_duty_cycle(pwm->device, pwm->channel, duty_cycle); } -int peripheral_bus_pwm_set_period(peripheral_pwm_context_h pwm, int period) +int peripheral_bus_pwm_set_period(pb_pwm_data_h pwm, int period) { return pwm_set_period(pwm->device, pwm->channel, period); } -int peripheral_bus_pwm_set_enable(peripheral_pwm_context_h pwm, int enable) +int peripheral_bus_pwm_set_enable(pb_pwm_data_h pwm, int enable) { return pwm_set_enable(pwm->device, pwm->channel, enable); } -int peripheral_bus_pwm_get_duty_cycle(peripheral_pwm_context_h pwm, int *duty_cycle) +int peripheral_bus_pwm_get_duty_cycle(pb_pwm_data_h pwm, int *duty_cycle) { return pwm_get_duty_cycle(pwm->device, pwm->channel, duty_cycle); } -int peripheral_bus_pwm_get_period(peripheral_pwm_context_h pwm, int *period) +int peripheral_bus_pwm_get_period(pb_pwm_data_h pwm, int *period) { return pwm_get_period(pwm->device, pwm->channel, period); } diff --git a/src/daemon/peripheral_bus_pwm.h b/src/daemon/peripheral_bus_pwm.h index ae8e7a6..c7ebf83 100644 --- a/src/daemon/peripheral_bus_pwm.h +++ b/src/daemon/peripheral_bus_pwm.h @@ -17,12 +17,12 @@ #ifndef __PERIPHERAL_BUS_PWM_H__ #define __PERIPHERAL_BUS_PWM_H__ -int peripheral_bus_pwm_open(peripheral_pwm_context_h pwm); -int peripheral_bus_pwm_close(peripheral_pwm_context_h pwm); -int peripheral_bus_pwm_set_duty_cycle(peripheral_pwm_context_h pwm, int duty_cycle); -int peripheral_bus_pwm_set_period(peripheral_pwm_context_h pwm, int period); -int peripheral_bus_pwm_set_enable(peripheral_pwm_context_h pwm, int enable); -int peripheral_bus_pwm_get_duty_cycle(peripheral_pwm_context_h pwm, int *duty_cycle); -int peripheral_bus_pwm_get_period(peripheral_pwm_context_h pwm, int*period); +int peripheral_bus_pwm_open(int device, int channel, pb_pwm_data_h *pwm, gpointer user_data); +int peripheral_bus_pwm_close(pb_pwm_data_h pwm, gpointer user_data); +int peripheral_bus_pwm_set_duty_cycle(pb_pwm_data_h pwm, int duty_cycle); +int peripheral_bus_pwm_set_period(pb_pwm_data_h pwm, int period); +int peripheral_bus_pwm_set_enable(pb_pwm_data_h pwm, int enable); +int peripheral_bus_pwm_get_duty_cycle(pb_pwm_data_h pwm, int *duty_cycle); +int peripheral_bus_pwm_get_period(pb_pwm_data_h pwm, int *period); #endif /* __PERIPHERAL_BUS_PWM_H__ */ diff --git a/src/daemon/peripheral_io.xml b/src/daemon/peripheral_io.xml index c6343c4..1987f8e 100644 --- a/src/daemon/peripheral_io.xml +++ b/src/daemon/peripheral_io.xml @@ -86,40 +86,35 @@ + - - + - - + - - + - - + - - + - - + -- 2.7.4