blob: 62137a52c52f581d24920793028ea0cba7f69b4d [file] [log] [blame]
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <ctype.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <gio/gio.h>
#include <log/log.h>
#include <glib.h>
#include "libdriver.h"
#define GPIO_SERVICE "gpio.lynq" /*well-known bus name */
#define GPIO_DATA_INTERFACE "gpio.lynq.Data" /*interface name*/
#define GPIO_DATA_PATH "/gpio/lynq/data" /*object name*/
#define LOG_TAG "GPIO_CONTROL"
static GMainLoop *loop = NULL;
static GDBusProxy *pProxy = NULL;
triggerCallback mtriggerCallback = NULL;;
void proxy_signals_on_signal (GDBusProxy *proxy,
const gchar *sender_name,
const gchar *signal_name,
GVariant *parameters,
gpointer user_data)
{
gint32 status;
RLOGD("signal_name: %s\n", signal_name);
g_variant_get (parameters,"(i)",&status);
//RLOGD("listen singal ok,%d",status);
if(mtriggerCallback){
mtriggerCallback(signal_name,status);
}
else
{
RLOGE("mbroadcastcallback NULL");
}
printf("trigger status is %d\n",status);
}
BOOL registerClientSignalHandler(GDBusProxy *proxy)
{
gulong signal_handler_id;
signal_handler_id = g_signal_connect(proxy, "g-signal",
G_CALLBACK (proxy_signals_on_signal), NULL);
RLOGD("proxy is ready");
if (signal_handler_id == 0) {
RLOGD("listen singal fail!");
return FALSE;
}
return TRUE;
}
void registerTriggerCallback(triggerCallback callback)
{
if (NULL != callback){
//memcpy(&mbroadcastcallback, callback, sizeof(broadcastCallback));
mtriggerCallback = callback;
}
else{
RLOGD("registerSignalCallback: parameter point is NULL");
}
}
void *run(void* arg)
{
/** start the main event loop which manages all available sources of events */
g_main_loop_run(loop);
return ((void*)0);
}
void disconnect_key(void)
{
if(pProxy != NULL) {
g_object_unref (pProxy);
}
if(loop != NULL) {
g_main_loop_unref(loop);
}
}
int thread_create(void)
{
int err;
pthread_t thr;
err = pthread_create(&thr, NULL, run, NULL);
if(0 != err){
RLOGD("Can't create thread: %s\n", strerror(err));
}
else{
RLOGD("New thread created: %s\n", strerror(err));
}
return err;
}
int trigger_loop()
{
g_main_loop_run(loop);
}
BOOL service_ready(void)
{
gchar *owner_name = NULL;
owner_name = g_dbus_proxy_get_name_owner((GDBusProxy*)pProxy);
if(NULL != owner_name)
{
RLOGD("Owner Name: %s\n", owner_name);
g_free(owner_name);
return TRUE;
}
else
{
g_print("Owner Name is NULL.");
return FALSE;
}
}
void register_key_info(void){
GError *error = NULL;
RLOGD("go!\n");
loop = g_main_loop_new(NULL, FALSE);
pProxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_NONE,
NULL, /* GDBusInterfaceInfo */
GPIO_SERVICE,
GPIO_DATA_PATH,
GPIO_DATA_INTERFACE,
NULL, /* GCancellable */
&error);
if (pProxy == NULL)
{
RLOGD ("Error creating proxy: %s\n", error->message);
disconnect_key();
}
if (registerClientSignalHandler(pProxy)== FALSE){
RLOGD ("register Error");
disconnect_key();
}
while(service_ready() != TRUE);
thread_create();
}
int lynq_set_gpio (char * mode,int gpio_numb,int param)
{
GDBusConnection *c1;
GVariant *result;
GError *error;
GMainLoop *loop;
gint32 set_result = -1;
g_type_init();
loop = g_main_loop_new(NULL, FALSE); /** create main loop, but do not start it.*/
error = NULL;
c1 = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
g_assert_no_error (error);
error = NULL;
g_assert (c1 != NULL);
g_assert (!g_dbus_connection_is_closed (c1));
result = g_dbus_connection_call_sync (c1,
GPIO_SERVICE, /* bus name */
GPIO_DATA_PATH, /* object path */
GPIO_DATA_INTERFACE, /* interface name */
"setGpio", /* method name */
g_variant_new ("(sii)", mode,gpio_numb,param), /* parameters */
G_VARIANT_TYPE ("(i)"), /* return type */
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
&error);
g_assert_no_error (error);
g_assert (result != NULL);
g_variant_get(result, "(i)", &(set_result));
// RLOGD("%s, %s, %d,result:%d", __FILE__, __FUNCTION__, __LINE__,set_result);
g_variant_unref (result);
//g_main_loop_run (loop);
g_main_loop_unref (loop);
return set_result;
}
/*
int set_gpio143(){
int result;
result = set_gpio (GPIO_MODE,WIFI_LED_CONTROL,1);
return result;
// sprintf(output, "gpio set stauts %d\n",result);
// printf("%s",output);
// emResultNotify(output);
}*/
void lynq_get_gpio (int gpio_numb,char *response)
{
GDBusConnection *c1;
GError *error;
GMainLoop *loop;
//char output[2048] = {0};
//gchar *response;
GVariant *get;
gsize n_elts=0;
GVariantIter *iter;
//guchar *response;
gchar *get_res;
// const char *p;
g_type_init();
loop = g_main_loop_new(NULL, FALSE); /** create main loop, but do not start it.*/
error = NULL;
c1 = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
g_assert_no_error (error);
error = NULL;
g_assert (c1 != NULL);
g_assert (!g_dbus_connection_is_closed (c1));
error = NULL;
get = g_dbus_connection_call_sync (c1,
GPIO_SERVICE,
GPIO_DATA_PATH,
GPIO_DATA_INTERFACE,
"getGpio",
g_variant_new ("(i)",gpio_numb),
G_VARIANT_TYPE ("(s)"),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
&error);
g_assert_no_error (error);
g_assert (get != NULL);
g_variant_get (get, "(s)",&get_res);
strcpy(response, get_res);
g_variant_unref (get);
RLOGD("get_gpio,%s",response);
g_main_loop_unref (loop);
}
/*
void get_gpio143(){
char output[1024] = {0};
char output1[2048] = {0};
get_gpio (WIFI_LED_CONTROL,output);
printf("get_gpio143,%s\n",output);
}
*/