[Feature] add GA346 baseline version
Change-Id: Ic62933698569507dcf98240cdf5d9931ae34348f
diff --git a/packages/apps/clientTest/LICENSE b/packages/apps/clientTest/LICENSE
new file mode 100644
index 0000000..77f59ed
--- /dev/null
+++ b/packages/apps/clientTest/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/packages/apps/clientTest/main.cpp b/packages/apps/clientTest/main.cpp
new file mode 100644
index 0000000..e3b8c4a
--- /dev/null
+++ b/packages/apps/clientTest/main.cpp
@@ -0,0 +1,159 @@
+#include<stdio.h>
+#include<stdlib.h>
+#include<errno.h>
+#include<string.h>
+#include<sys/types.h>
+#include<netinet/in.h>
+#include<sys/socket.h>
+#include <arpa/inet.h>
+#include<sys/wait.h>
+#include <pthread.h>
+#include <unistd.h>
+#include <log/log.h>
+#include <string.h>
+#include <binder/Parcel.h>
+#define SERVER_PORT 8088
+#define BUFFER_SIZE 8192
+#define LOG_TAG "PLUGIN_MAIN"
+using::android::Parcel;
+int server_socket_fd;
+struct sockaddr_in client_addr;
+
+static int s_started =0;
+static pthread_mutex_t s_startupMutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t s_startupCond = PTHREAD_COND_INITIALIZER;
+static pthread_t s_tid_dispatch;
+
+int plugin_StartSerSocket()
+{
+ struct sockaddr_in server_addr;
+ bool count = true;
+ int ret = 0;
+ int dataSize = 0;
+ bzero(&server_addr, sizeof(server_addr));
+ Parcel parcel;
+ int32_t type= 0;
+ int32_t request = 0;
+ int32_t error = 0;
+ server_addr.sin_family = AF_INET;
+ server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
+ server_addr.sin_port = htons(SERVER_PORT);
+ /* create socket */
+ //int server_socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
+ server_socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
+ if(server_socket_fd == -1)
+ {
+ RLOGE("Create Socket Failed:");
+ exit(1);
+ }
+
+ /* bind socket port*/
+ if(-1 == (bind(server_socket_fd,(struct sockaddr*)&server_addr,sizeof(server_addr))))
+ {
+ RLOGE("Server Bind Failed:");
+ exit(1);
+ }
+
+ /* tranlate data */
+ while(true)
+ {
+ /* define address to catch the client addreess*/
+ //struct sockaddr_in client_addr;
+ socklen_t client_addr_length = sizeof(client_addr);
+ printf("read socket 8088!!\n");
+ /* receive the data */
+ char buffer[BUFFER_SIZE];
+ bzero(buffer, BUFFER_SIZE);
+ ret = recvfrom(server_socket_fd, buffer, BUFFER_SIZE,0,(struct sockaddr*)&client_addr, &client_addr_length);
+ if(ret == -1)
+ {
+ RLOGE("Receive Data Failed:");
+ continue;
+ }
+ if(count)
+ {
+ //uint8_t datalength[]=
+ uint8_t *datalength = (uint8_t *)buffer;
+ printf("PLUGIN:%s, receve: datalength[0] %x,datalength length = %d\n", inet_ntoa(client_addr.sin_addr),(datalength[0]<<8),ret);
+ if(ret==4)
+ {
+ if(((datalength[0]<<8)==0x5500)&&(datalength[1]==0xAA))
+ {
+ RLOGD("PLUGIN:%s, receve: dataSize1= %x,dataSize2= %x", inet_ntoa(client_addr.sin_addr), (datalength[2]<<8),datalength[3]);
+ printf("PLUGIN:%s, receve: dataSize1= %d,dataSize2= %d,dataSize = %d\n", inet_ntoa(client_addr.sin_addr), (datalength[2]<<8),datalength[3],((datalength[2]<<8)+datalength[3]));
+ dataSize = datalength[2]+datalength[3];
+ count=false;
+ }
+ }
+ }
+ else
+ {
+ count=true;
+ int32_t type= 0;
+ int32_t request = 0;
+ int32_t error = 0;
+ //parcel = (Parcel)buffer;
+ parcel.setData((unsigned char *)buffer, sizeof(buffer));
+ parcel.setDataPosition(0);
+ parcel.readInt32(&type);
+ parcel.readInt32(&request);
+ parcel.readInt32(&error);
+ RLOGD("PLUGIN:%s, receve: type= %d,request= %d,error = %d", inet_ntoa(client_addr.sin_addr), type,request,error);
+ printf("PLUGIN:%s, receve: type= %d,request= %d,error = %d\n", inet_ntoa(client_addr.sin_addr), type,request,error);
+ }
+ }
+
+ RLOGD("close socket fd");
+ close(server_socket_fd);
+ return 1;
+}
+void *eventLoop(void *param) {
+ pthread_mutex_lock(&s_startupMutex);
+ s_started = 1;
+ pthread_cond_broadcast(&s_startupCond);
+ pthread_mutex_unlock(&s_startupMutex);
+ //#ifdef ECALL_SUPPORT
+ //init_ecall_timer_all();
+ //#endif /**/ECALL_SUPPORT
+ plugin_StartSerSocket();
+ RLOGD("error in event_loop_base errno:%d", errno);
+ // kill self to restart on error
+ kill(0, SIGKILL);
+ return NULL;
+}
+void plugin_startEventLoop()
+{
+ RLOGD("RIL_startEventLoop()");
+ /* spin up eventLoop thread and wait for it to get started */
+ s_started = 0;
+ pthread_mutex_lock(&s_startupMutex);
+
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
+ int result = pthread_create(&s_tid_dispatch, &attr, eventLoop, NULL);
+ if (result != 0) {
+ RLOGW("Failed to create dispatch thread: %s", strerror(result));
+ goto done;
+ }
+ while (s_started == 0) {
+ pthread_cond_wait(&s_startupCond, &s_startupMutex);
+ }
+ done:
+ pthread_mutex_unlock(&s_startupMutex);
+}
+int onRequest()
+{
+ printf("this is callback function\n");
+ return 0;
+}
+int main(int argc, char **argv)
+{
+ plugin_startEventLoop();
+ while(1)
+ {
+ sleep(1);
+ }
+ return 0;
+}
\ No newline at end of file
diff --git a/packages/apps/clientTest/makefile b/packages/apps/clientTest/makefile
new file mode 100644
index 0000000..31682d9
--- /dev/null
+++ b/packages/apps/clientTest/makefile
@@ -0,0 +1,82 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+ -std=gnu++14 \
+ -g -Os \
+ -flto \
+ -DRIL_SHLIB \
+ -DATCI_PARSE \
+ -DKEEP_ALIVE \
+ -DECALL_SUPPORT
+
+$(warning ################# C2K support: $(RAT_CONFIG_C2K_SUPPORT))
+ifeq ($(strip $(RAT_CONFIG_C2K_SUPPORT)), yes)
+ LOCAL_CFLAGS += -DC2K_SUPPORT
+endif
+
+ifeq ($(strip $(MTK_MULTI_SIM_SUPPORT)), dsds)
+ LOCAL_CFLAGS += -DANDROID_SIM_COUNT_2 \
+ -DANDROID_MULTI_SIM \
+ -DMODE_DSDS
+endif
+
+ifeq ($(strip $(MTK_MULTI_SIM_SUPPORT)), dsss)
+ LOCAL_CFLAGS += -DMODE_DSSS
+endif
+
+$(warning ################# TARGET_PLATFORM: $(TARGET_PLATFORM))
+ifeq ($(strip $(TARGET_PLATFORM)), mt2731)
+$(warning ################# TARGET_PLATFORM_MT2731)
+ LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2731 \
+ -DMD_93_SUPPORT
+else ifeq ($(strip $(TARGET_PLATFORM)), mt2635)
+$(warning ################# TARGET_PLATFORM_MT2635)
+ LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2635 \
+ -DMD_90_SUPPORT
+endif
+
+ifeq ($(strip $(TARGET_PLATFORM)), mt2735)
+LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2735
+LOCAL_CFLAGS += -DBASELIB_DIR_LIB64 -DTELEMATIC_5G_SUPPORT
+endif
+
+LOCAL_PATH = .
+
+LOCAL_C_INCLUDES = \
+ -I. \
+ -I$(ROOT)$(includedir)/logger \
+
+
+LOCAL_LIBS := \
+ -L. \
+ -ldl \
+ -lrt \
+ -lstdc++ \
+ -llog \
+ -lbinder \
+ -lpthread \
+
+#ifeq ($(strip $(TARGET_PLATFORM)), mt2735)
+#LOCAL_LIBS += -luciwrapper
+#else
+#LOCAL_LIBS += -lsncfg
+#endif
+
+
+SOURCES = main.cpp
+
+EXECUTABLE = clientTest
+
+OBJECTS=$(SOURCES:.cpp=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+ $(CXX) $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o : %.cpp
+ $(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+ $(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/packages/apps/lynq-broadcast-receive/LICENSE b/packages/apps/lynq-broadcast-receive/LICENSE
new file mode 100644
index 0000000..77f59ed
--- /dev/null
+++ b/packages/apps/lynq-broadcast-receive/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/packages/apps/lynq-broadcast-receive/src/LICENSE b/packages/apps/lynq-broadcast-receive/src/LICENSE
new file mode 100644
index 0000000..77f59ed
--- /dev/null
+++ b/packages/apps/lynq-broadcast-receive/src/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/packages/apps/lynq-broadcast-receive/src/lynq_dbus_receive.c b/packages/apps/lynq-broadcast-receive/src/lynq_dbus_receive.c
new file mode 100644
index 0000000..da8b6b3
--- /dev/null
+++ b/packages/apps/lynq-broadcast-receive/src/lynq_dbus_receive.c
@@ -0,0 +1,86 @@
+#include <string.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <log/log.h>
+#include <gio/gio.h>
+#include <glib.h>
+
+#include "liblynq-broadcast/broadcast_receiver.h"
+
+
+static void CallbackByName( char*broadcast_name, int data_length,const char*data)
+{
+ printf("CallbackByName,str_arg:%s,data_length:%d,int_arg:%s\n", broadcast_name,data_length,data);
+
+ return;
+}
+static void CallbackByName1( char*broadcast_name, int data_length,const char*data)
+{
+ printf("CallbackByName1,str_arg:%s,data_length:%d,int_arg:%s\n", broadcast_name,data_length,data);
+
+ return;
+}
+static void CallbackById(int id, int data_length,const char*data)
+{
+ printf("CallbackById,id:%d,data_length:%d,data:%s\n", id,data_length,data);
+
+ return;
+}
+static void CallbackById1(int id, int data_length,const char*data)
+{
+ printf("CallbackById1,id:%d,data_length:%d,data:%s\n", id,data_length,data);
+
+ return;
+}
+static void callbackPrameUnfixed(char*broadcast_name,GVariant *parameters)
+{
+ gchar *out_a;
+ gchar *out_b;
+ gchar *out_c;
+ guchar out_d;
+ gboolean out_e;
+ gint16 out_f;
+ guint16 out_g;
+ gint out_h;
+ guint out_i;
+ gint64 out_j;
+ guint64 out_k;
+ gdouble out_l;
+
+ g_variant_get (parameters,
+ "(sogybnqiuxtd)",
+ &out_a,
+ &out_b,
+ &out_c,
+ &out_d,
+ &out_e,
+ &out_f,
+ &out_g,
+ &out_h,
+ &out_i,
+ &out_j,
+ &out_k,
+ &out_l);
+ printf("SignalCallback11111,,broadcast_name:%s\n", broadcast_name);
+ printf("%s,%s,%s,%u,%d,%.2fF\n", out_a,out_b,out_c,out_d,out_e,out_l);
+
+ return;
+}
+int main(int argc, char** argv)
+{
+ char data[] = "BrcastA";
+ char data1[] = "BrcastB";
+ GVariant *ret_struct;
+ register_broadcast_loop();
+//BOOL ServiceIsReady(void);
+ receive_callback_by_name(data, CallbackByName);
+ receive_callback_by_name(data1, CallbackByName1);
+ receive_callback_by_id(120, CallbackById);
+ receive_callback_by_id(128, CallbackById1);
+ while (1) {
+ sleep(10);
+ }
+
+
+}
diff --git "a/packages/apps/lynq-broadcast-receive/src/lynq_testprocess\050gpio\051.tmp" "b/packages/apps/lynq-broadcast-receive/src/lynq_testprocess\050gpio\051.tmp"
new file mode 100644
index 0000000..c07e271
--- /dev/null
+++ "b/packages/apps/lynq-broadcast-receive/src/lynq_testprocess\050gpio\051.tmp"
@@ -0,0 +1,144 @@
+#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>
+#define GPIO_SERVICE "lynq.gpio" /*well-known bus name */
+#define GPIO_DATA_INTERFACE "lynq.gpio.Data" /*interface name*/
+#define GPIO_DATA_PATH "/lynq/gpio/data" /*object name*/
+GMainLoop *loop = NULL;
+GDBusProxy *proxy = NULL;
+#define LOG_TAG "GPIO_CONTROL"
+int set_gpio (gchar * mode,guint *gpio_numb,guint param)
+{
+ GDBusConnection *c1;
+ GVariant *result;
+ GError *error;
+ guint set_result = -1;
+ g_type_init();
+ loop = g_main_loop_new(NULL, FALSE); /** create main loop, but do not start it.*/
+ c1 = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, 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));
+ g_variant_unref (result);
+ g_main_loop_run (loop);
+ g_main_loop_unref (loop);
+ return set_result;
+}
+int get_gpio (guint *gpio_numb)
+{
+ GDBusConnection *c1;
+ GVariant *result;
+ GError *error;
+ guint parm=0;
+ const gchar *set_result;
+ const gchar *mode ="gpio";
+ if(set_gpio(mode,gpio_numb,parm)== -1)
+ {
+ RLOGD("get_gpio number error");
+ return -1;
+ }
+ c1 = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, 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 */
+ "getGpio", /* method name */
+ NULL, /* parameters */
+ G_VARIANT_TYPE ("(s)"), /* return type */
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ g_assert_no_error (error);
+ g_assert (result != NULL);
+ g_variant_get(result, "((s))", &(set_result));
+ RLOGD("get_gpio,%s",set_result);
+ g_variant_unref (result);
+ return 1;
+}
+void proxy_ready(GObject *source, GAsyncResult *result, gpointer user_data) {
+ GError *error;
+
+ error = NULL;
+ proxy = g_dbus_proxy_new_for_bus_finish(result, &error);
+ if (proxy == NULL) {
+ RLOGE("create proxy fail");
+ return ;
+ }
+ RLOGD("proxy is ready");
+ gulong signal_handler_id;
+
+ // signal_handler_id = g_signal_connect(proxy, "g-signal",
+ // G_CALLBACK (proxy_signals_on_signal), NULL);
+ // if (signal_handler_id == 0) {
+ // RLOGE("listen singal fail!");
+ // }
+}
+
+void* init_data_gdbus_cb(void *param)
+{
+ /* all the tests rely on a shared main loop */
+ loop = g_main_loop_new(NULL, FALSE);
+
+ g_dbus_proxy_new_for_bus(G_BUS_TYPE_SYSTEM,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL, /* GDBusInterfaceInfo */
+ GPIO_SERVICE, /* name */
+ GPIO_DATA_PATH, /* object path */
+ GPIO_DATA_INTERFACE, /* interface */
+ NULL, /* GCancellable */
+ proxy_ready,
+ NULL);
+
+ g_main_loop_run(loop);
+
+ RLOGD("data gdbus main loop run()");
+ if(proxy != NULL) {
+ g_object_unref (proxy);
+ }
+ if(loop != NULL) {
+ g_main_loop_unref(loop);
+ }
+}
+
+
+void startGdbusLoop(void)
+{
+ pthread_t gpioThread;
+
+ RLOGD("startGdbusLoop()");
+ // pthread_mutex_lock(&s_startupMutex);
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
+ int result = pthread_create(&gpioThread, &attr, init_data_gdbus_cb, NULL);
+ if (result != 0) {
+ RLOGW("Failed to create gdbus thread: %s", strerror(result));
+ //goto done;
+ }
+//done:
+ // pthread_mutex_unlock(&s_startupMutex);
+}
diff --git a/packages/apps/lynq-broadcast-receive/src/makefile b/packages/apps/lynq-broadcast-receive/src/makefile
new file mode 100644
index 0000000..9245b6f
--- /dev/null
+++ b/packages/apps/lynq-broadcast-receive/src/makefile
@@ -0,0 +1,67 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+ -g -Os \
+ -flto \
+ -DRIL_SHLIB \
+ -DATCI_PARSE \
+ -DKEEP_ALIVE \
+ -D__LINUX_OS__ \
+ -DECALL_SUPPORT
+
+CXXFLAGS = -fpermissive
+LOCAL_PATH = .
+#CFLAGS = $(LOCAL_CFLAGS) -std=c99
+#CXXFLAGS = $(LOCAL_CFLAGS) -std=gnu++14
+$(warning ################# ZHOUQUNCHAO ROOT: $(ROOT),includedir:$(includedir),LOCAL_PATH:$(LOCAL_PATH))
+LOCAL_C_INCLUDES = \
+ -I. \
+ -I$(LOCAL_PATH) \
+ -I$(ROOT)$(includedir)/logger \
+ -I$(ROOT)$(includedir)/vendor-ril \
+ -I$(ROOT)$(includedir)/gstreamer-1.0 \
+ -I$(ROOT)$(includedir)/glib-2.0 \
+ -I$(ROOT)$(includedir)/liblynq-broadcast \
+ -I$(ROOT)$(libdir)/glib-2.0/include \
+ -I$(ROOT)$(libdir)/gstreamer-1.0/include\
+ -I$(ROOT)$(includedir)/dbus-1.0 \
+ -I$(ROOT)$(libdir)/dbus-1.0/include \
+
+LOCAL_C_INCLUDES+=$(DNS_FLAGS)
+
+LOCAL_LIBS := \
+ -L. \
+ -ldl \
+ -lstdc++ \
+ -llog \
+ -lcutils \
+ -lutils \
+ -lpthread \
+ -lpal \
+ -llynq-broadcast \
+ -lglib-2.0 \
+ -lgobject-2.0 \
+ -lgio-2.0 \
+ -lapn \
+ -ldbus-1 \
+
+LOCAL_SRC_FILES_CPP = $(wildcard *.cpp)
+LOCAL_SRC_FILES_C = $(wildcard *.c)
+EXECUTABLE = lynq-broadcast-receive
+
+OBJECTS=$(LOCAL_SRC_FILES_CPP:.cpp=.o) $(LOCAL_SRC_FILES_C:.c=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+ $(CXX) $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o: %.c
+ $(warning ----->build $<)
+ $(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+%.o : %.cpp
+ $(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+ $(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/packages/apps/lynq-broadcast-send/LICENSE b/packages/apps/lynq-broadcast-send/LICENSE
new file mode 100644
index 0000000..77f59ed
--- /dev/null
+++ b/packages/apps/lynq-broadcast-send/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/packages/apps/lynq-broadcast-send/src/LICENSE b/packages/apps/lynq-broadcast-send/src/LICENSE
new file mode 100644
index 0000000..77f59ed
--- /dev/null
+++ b/packages/apps/lynq-broadcast-send/src/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/packages/apps/lynq-broadcast-send/src/lynq_broadcast_send.c b/packages/apps/lynq-broadcast-send/src/lynq_broadcast_send.c
new file mode 100644
index 0000000..9b6396f
--- /dev/null
+++ b/packages/apps/lynq-broadcast-send/src/lynq_broadcast_send.c
@@ -0,0 +1,105 @@
+#include <string.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <log/log.h>
+#include <gio/gio.h>
+#include <glib.h>
+
+#include "liblynq-broadcast/broadcast_send.h"
+#include <gio/gio.h>
+#include <glib.h>
+#define LOG_TAG "BROADCAST_SEND_APP"
+
+int main(int argc, char** argv)
+{
+ char data[] = "BrcastA comming";
+ char dataB[] = "BrcastB,comming";
+ char data1[] = "120,comming";
+ char data2[] = "128,comming";
+ int select_argvi = -1;
+ GVariant *ret_struct;
+ ret_struct = g_variant_new ("(sogybnqiuxtd)",
+ "this is a string",
+ "/this/is/a/path",
+ "sad",
+ 42,
+ TRUE,
+ -42,
+ 60000,
+ -44,
+ 100000,
+ -(G_GUINT64_CONSTANT(2)<<34),
+ G_GUINT64_CONSTANT(0xffffffffffffffff),
+ 42.5);
+
+ /****************test prame data **************/
+ /*
+ register_broadcast_send_loop();
+ RLOGD("register_broadcast_send_loop,start");
+ while(1){
+ char str[8192]={ 0 };
+ fgets(str, 8192, stdin);
+ str[strlen(str)-1]='\0';
+ send_broadcast_by_name("BrcastA",sizeof(str),str);
+ }
+ while (1) {
+ sleep(10);
+ */
+ /********************test prame data *************/
+
+
+ /*******************test Multiple broadcasts ******************/
+ /*
+ register_broadcast_send_loop();
+ RLOGD("register_broadcast_send_loop,start");
+ if(argv[1] != NULL)
+ {
+ select_argvi = atoi(argv[1]);
+ }
+ if (1 == select_argvi ){
+ for (int i=0;i<1000;i++)
+ {
+ send_broadcast_by_name("BrcastA",sizeof(data),data);
+ //send_broadcast_by_name("BrcastB",sizeof(dataB),dataB);
+ send_broadcast_by_id(120,sizeof(data1),data1);
+ //send_broadcast_by_id(128,sizeof(data2),data2);
+ //send_broadcast_param_unfixed("Brcastc",ret_struct);
+
+ }
+ }
+ else {
+ for (int i=0;i<1000;i++)
+ {
+ //send_broadcast_by_name("BrcastA",sizeof(data),data);
+ send_broadcast_by_name("BrcastB",sizeof(dataB),dataB);
+ //send_broadcast_by_id(120,sizeof(data1),data1);
+ send_broadcast_by_id(128,sizeof(data2),data2);
+ //send_broadcast_param_unfixed("Brcastc",ret_struct);
+
+ }
+ }
+
+ while (1) {
+ sleep(10);
+ }*/
+ /**********************test Multiple broadcasts ********************/
+
+
+
+ register_broadcast_send();
+
+ RLOGD("register_broadcast_send,ok");
+ for (int i=0;i<1000;i++)
+ {
+ send_broadcast_by_name("BrcastA",sizeof(data),data);
+ send_broadcast_by_id("BrcastB",sizeof(dataB),dataB);
+ //send_broadcast_param_unfixed("Brcastc",ret_struct);
+ }
+ //send_broadcast_by_id(120,sizeof(data1),data1);
+ while(1){
+ sleep(10);
+ }
+ /**********************test Remove thread ********************/
+
+}
diff --git a/packages/apps/lynq-broadcast-send/src/makefile b/packages/apps/lynq-broadcast-send/src/makefile
new file mode 100644
index 0000000..d51ba19
--- /dev/null
+++ b/packages/apps/lynq-broadcast-send/src/makefile
@@ -0,0 +1,67 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+ -g -Os \
+ -flto \
+ -DRIL_SHLIB \
+ -DATCI_PARSE \
+ -DKEEP_ALIVE \
+ -D__LINUX_OS__ \
+ -DECALL_SUPPORT
+
+CXXFLAGS = -fpermissive
+LOCAL_PATH = .
+#CFLAGS = $(LOCAL_CFLAGS) -std=c99
+#CXXFLAGS = $(LOCAL_CFLAGS) -std=gnu++14
+$(warning ################# ZHOUQUNCHAO ROOT: $(ROOT),includedir:$(includedir),LOCAL_PATH:$(LOCAL_PATH))
+LOCAL_C_INCLUDES = \
+ -I. \
+ -I$(LOCAL_PATH) \
+ -I$(ROOT)$(includedir)/logger \
+ -I$(ROOT)$(includedir)/vendor-ril \
+ -I$(ROOT)$(includedir)/gstreamer-1.0 \
+ -I$(ROOT)$(includedir)/glib-2.0 \
+ -I$(ROOT)$(libdir)/glib-2.0/include \
+ -I$(ROOT)$(includedir)/liblynq-broadcast \
+ -I$(ROOT)$(libdir)/gstreamer-1.0/include\
+ -I$(ROOT)$(includedir)/dbus-1.0 \
+ -I$(ROOT)$(libdir)/dbus-1.0/include \
+
+LOCAL_C_INCLUDES+=$(DNS_FLAGS)
+
+LOCAL_LIBS := \
+ -L. \
+ -ldl \
+ -lstdc++ \
+ -llog \
+ -lcutils \
+ -lutils \
+ -lpthread \
+ -lpal \
+ -llynq-broadcast \
+ -lglib-2.0 \
+ -lgobject-2.0 \
+ -lgio-2.0 \
+ -lapn \
+ -ldbus-1 \
+
+LOCAL_SRC_FILES_CPP = $(wildcard *.cpp)
+LOCAL_SRC_FILES_C = $(wildcard *.c)
+EXECUTABLE = lynq-broadcast-send
+
+OBJECTS=$(LOCAL_SRC_FILES_CPP:.cpp=.o) $(LOCAL_SRC_FILES_C:.c=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+ $(CXX) $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o: %.c
+ $(warning ----->build $<)
+ $(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+%.o : %.cpp
+ $(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+ $(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/packages/apps/lynq-conti-plugin-test/LICENSE b/packages/apps/lynq-conti-plugin-test/LICENSE
new file mode 100644
index 0000000..77f59ed
--- /dev/null
+++ b/packages/apps/lynq-conti-plugin-test/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/packages/apps/lynq-conti-plugin-test/lynq-conti-plugin-response.c b/packages/apps/lynq-conti-plugin-test/lynq-conti-plugin-response.c
new file mode 100644
index 0000000..4d86952
--- /dev/null
+++ b/packages/apps/lynq-conti-plugin-test/lynq-conti-plugin-response.c
@@ -0,0 +1,35 @@
+//
+// Created by DELL on 2021/7/12.
+//
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include "nadif_hal_service.h"
+#include "nadif_hal_service_types.h"
+#include "lynq-conti-plugin-response.h"
+
+#define ARRAY_SIZE(X) (sizeof(X)/sizeof(X[0]))
+
+void parse_resp_imsi(int32_t sv_id, void *resp_data)
+{
+ NADIF_HAL_RESP_DATA *respData = (NADIF_HAL_RESP_DATA*)resp_data;
+ printf("get imsi: ret=%d ,imsi=%s\n", respData->imsi_resp.result, respData->imsi_resp.imsi);
+}
+
+extern parse_resp_t parse_resp_tables[] =
+{
+ {NADIF_HAL_SVC_GET_IMSI, parse_resp_imsi},
+ {0, NULL}
+};
+
+int list_param_for_sv_id(int32_t sv_id, void *data)
+{
+ for(int i= 0; i < ARRAY_SIZE(parse_resp_tables); i++)
+ {
+ if(sv_id == parse_resp_tables[i].sv_id)
+ {
+ parse_resp_tables[i].parse_response(sv_id, data);
+ }
+ }
+}
+
diff --git a/packages/apps/lynq-conti-plugin-test/lynq-conti-plugin-response.h b/packages/apps/lynq-conti-plugin-test/lynq-conti-plugin-response.h
new file mode 100644
index 0000000..3ef0624
--- /dev/null
+++ b/packages/apps/lynq-conti-plugin-test/lynq-conti-plugin-response.h
@@ -0,0 +1,15 @@
+//
+// Created by DELL on 2021/7/12.
+//
+
+#ifndef LYNQ_LYNQ_CONTI_PLUGIN_RESPONSE_H
+#define LYNQ_LYNQ_CONTI_PLUGIN_RESPONSE_H
+
+typedef struct{
+ int32_t sv_id;
+ void (*parse_response)(int32_t sv_id, void *resp_data);
+}parse_resp_t;
+
+int list_param_for_sv_id(int32_t sv_id, void *data);
+
+#endif //LYNQ_LYNQ_CONTI_PLUGIN_RESPONSE_H
diff --git a/packages/apps/lynq-conti-plugin-test/lynq-conti-plugin-test.c b/packages/apps/lynq-conti-plugin-test/lynq-conti-plugin-test.c
new file mode 100644
index 0000000..009f52f
--- /dev/null
+++ b/packages/apps/lynq-conti-plugin-test/lynq-conti-plugin-test.c
@@ -0,0 +1,111 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include<stdlib.h>
+#include <netinet/in.h>
+#include <strings.h>
+#include <stdlib.h>
+#include <dlfcn.h>
+#include "nadif.h"
+#include "nadif_hal_service.h"
+#include "nadif_hal_service_types.h"
+#include "liblog/liblog.h"
+#include "liblog/lynq_deflog.h"
+#include <vendor-ril/telephony/ril.h>
+#include <errno.h>
+#include "lynq-conti-plugin-response.h"
+
+#define USER_LOG_TAG "CONTI-PLUGIN-TEST"
+
+NADIF_HAL_SVC_ID req_sv_id = 0;
+
+typedef const NADIF_HAL_PluginFunctions *(*PLUGIN_INIT)(const NADIF_HAL_Callbacks *callbacks, void *token);
+
+const char *conti_plugin_path = "/lib64/liblynq-conti-plugin.so";
+
+static void conti_plugin_response(void *data, size_t datalen, NADIF_RESULT res, void *token);
+
+static void conti_plugin_unsol_response(NADIF_HAL_SVC_ID command, void *data, size_t datalen);
+
+static NADIF_RESULT conti_plugin_db_write(const gchar *key, const void *data, const size_t datalen);
+
+static NADIF_RESULT conti_plugin_db_read(const gchar *key, void *data, size_t datalen);
+
+static void conti_plugin_status(void *data, size_t datalen, void *init_token);
+
+NADIF_HAL_PluginFunctions *pluginFunctions = NULL;
+NADIF_HAL_Callbacks conti_callbacks =
+ {
+ conti_plugin_response,
+ conti_plugin_unsol_response,
+ conti_plugin_db_write,
+ conti_plugin_db_read,
+ conti_plugin_status,
+ };
+
+int main(int argc, const char *argv[]) {
+ //LYLOGEINIT(USER_LOG_TAG);
+ printf("conti Plugin test demo\n");
+
+#if 1
+ void *handle = dlopen(conti_plugin_path, RTLD_LAZY);
+ printf("conti Plugin test demo: %d\n", __LINE__);
+ if (!handle) {
+ printf("[%s][%d]dlopen get error: %s\n", __FILE__, __LINE__, dlerror());
+ exit(EXIT_FAILURE);
+ }
+ printf("conti Plugin test demo: %d\n", __LINE__);
+
+
+ PLUGIN_INIT plugin_init = (PLUGIN_INIT) dlsym(handle, "plugin_init");
+ printf("conti Plugin test demo: %d\n", __LINE__);
+ if (!plugin_init) {
+ printf("plugin_init error:%s\n", dlerror());
+ }
+
+ pluginFunctions = plugin_init(&conti_callbacks, "test");
+ printf("conti Plugin test demo: %d\n", __LINE__);
+
+
+ if (NULL != pluginFunctions)
+ printf("plugin init is ok\n");
+#endif
+
+ while (1) {
+ req_sv_id = NADIF_HAL_SVC_GET_IMSI;
+ char test_buf[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
+ pluginFunctions->plugin_request(req_sv_id, test_buf, 10, "test");
+ printf("conti-test: sv_iid=%d\n", req_sv_id);
+ sleep(2);
+ req_sv_id = NADIF_HAL_SVC_GET_VOICE_CALL_INFO;
+ char *phone_num = "+8615826484140";
+ pluginFunctions->plugin_request(req_sv_id, phone_num, strlen(phone_num), "test");
+ sleep(2);
+ }
+ return 0;
+}
+
+static void conti_plugin_response(void *data, size_t datalen, NADIF_RESULT res, void *token) {
+ list_param_for_sv_id(req_sv_id, data);
+ printf("[%s][%s][%d]:dataLen=%d, res=%d\n", __FILE__, __FUNCTION__, __LINE__, datalen, res);
+}
+
+static void conti_plugin_unsol_response(NADIF_HAL_SVC_ID command, void *data, size_t datalen) {
+ list_param_for_sv_id(command, data);
+ printf("[%s][%s][%d]:id=%d, dataLen=%d\n", __FILE__, __FUNCTION__, __LINE__, command, datalen);
+}
+
+static NADIF_RESULT conti_plugin_db_write(const gchar *key, const void *data, const size_t datalen) {
+ printf("[%s][%s][%d]:key=%s, dataLen=%d\n", __FILE__, __FUNCTION__, __LINE__, key, datalen);
+ return NADIF_RESULT_SUCCESS;
+}
+
+static NADIF_RESULT conti_plugin_db_read(const gchar *key, void *data, size_t datalen) {
+ printf("[%s][%s][%d]:key=%s, res=%d\n", __FILE__, __FUNCTION__, __LINE__, key, datalen);
+ return NADIF_RESULT_SUCCESS;
+}
+
+static void conti_plugin_status(void *data, size_t datalen, void *init_token) {
+ printf("[%s][%s][%d]:dataLen=%d\n", __FILE__, __FUNCTION__, __LINE__, datalen);
+}
diff --git a/packages/apps/lynq-conti-plugin-test/makefile b/packages/apps/lynq-conti-plugin-test/makefile
new file mode 100644
index 0000000..81ced95
--- /dev/null
+++ b/packages/apps/lynq-conti-plugin-test/makefile
@@ -0,0 +1,79 @@
+SHELL = /bin/sh
+RM = rm -f
+
+CC=aarch64-poky-linux-gcc -g -os
+
+$(warning ################# C2K support: $(RAT_CONFIG_C2K_SUPPORT))
+ifeq ($(strip $(RAT_CONFIG_C2K_SUPPORT)), yes)
+ $(CFLAGS) += -DC2K_SUPPORT
+
+endif
+
+ifeq ($(strip $(MTK_MULTI_SIM_SUPPORT)), dsds)
+ $(CFLAGS) += -DANDROID_SIM_COUNT_2 \
+ -DANDROID_MULTI_SIM \
+ -DMODE_DSDS
+endif
+
+ifeq ($(strip $(MTK_MULTI_SIM_SUPPORT)), dsss)
+ $(CFLAGS) += -DMODE_DSSS
+endif
+
+$(warning ################# TARGET_PLATFORM: $(TARGET_PLATFORM))
+ifeq ($(strip $(TARGET_PLATFORM)), mt2731)
+#$(warning #################add for debug $(ROOT), $(includedir))
+$(warning ################# TARGET_PLATFORM_MT2731)
+ $(CFLAGS) += -DTARGET_PLATFORM_MT2731 \
+ -DMD_93_SUPPORT
+else ifeq ($(strip $(TARGET_PLATFORM)), mt2635)
+$(warning ################# TARGET_PLATFORM_MT2635)
+ $(CFLAGS) += -DTARGET_PLATFORM_MT2635 \
+ -DMD_90_SUPPORT
+endif
+
+
+LOCAL_PATH = .
+#CFLAGS = $(LOCAL_CFLAGS) -std=c99
+#CXXFLAGS = $(LOCAL_CFLAGS) -std=gnu++14
+$(warning ################# ZHOUQUNCHAO ROOT: $(ROOT),includedir:$(includedir),LOCAL_PATH:$(LOCAL_PATH))
+LOCAL_C_INCLUDES = \
+ -I. \
+ -I$(LOCAL_PATH) \
+ -I$(ROOT)$(includedir)/glib-2.0 \
+ -I$(ROOT)$(libdir)/glib-2.0/include \
+ -I$(ROOT)$(includedir)/include/hal/external \
+ -I$(ROOT)$(includedir)/include/types/ \
+ -I$(ROOT)$(includedir)/include/ \
+ -I$(ROOT)$(includedir)/liblog \
+ -I$(ROOT)$(includedir)/vendor-ril \
+
+LOCAL_C_INCLUDES+=$(DNS_FLAGS)
+
+LOCAL_LIBS := \
+ -L. \
+ -ldl \
+ -lpthread \
+ -llynq-log \
+
+LOCAL_SRC_FILES_C = $(wildcard *.c )
+EXECUTABLE = lynq-conti-plugin-test
+
+OBJECTS=$(LOCAL_SRC_FILES_C:.c=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+ $(CXX) $(OBJECTS) $(CFLAGS) $(LOCAL_LIBS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o: %.c
+ $(warning ----->build $<)
+ echo $(CC)
+ echo $(CFLAGS)
+ $(CC) $(CFLAGS) $(LOCAL_C_INCLUDES) $(LOCAL_LIBS) -o $@ -c $<
+%.o : %.cpp
+ echo $(CXX)
+ echo $(CFLAGS)
+ $(CXX) $(CFLAGS) $(LOCAL_C_INCLUDES) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+ $(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/packages/apps/lynq-default/lynq_default.c b/packages/apps/lynq-default/lynq_default.c
new file mode 100644
index 0000000..4daf6e7
--- /dev/null
+++ b/packages/apps/lynq-default/lynq_default.c
@@ -0,0 +1,37 @@
+#include <stdio.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <strings.h>
+#include<stdlib.h>
+#include <include/lynq_uci.h>
+
+
+
+//#define USER_LOG_TAG "lynq_default"
+#define LYNQ_SW_VERSION "T800v01.MP1_GA.01b02"//needs to be modified if upgrade version
+
+
+//#define GET_DATA_LEN 64
+#define BUF_LEN 258
+#define LYNQ_UCI_RO_SECTION "lynq_version"
+#define LYNQ_UCI_RO_KEY "LYNQ_SW_VERSION"
+
+
+
+int main(int argc, const char *argv[])
+{
+ //char data[GET_DATA_LEN] = "";
+ char buf[BUF_LEN] = "";
+
+
+ //lynq_get_value(LYNQ_UCI_RO_FILE, LYNQ_UCI_RO_SECTION, LYNQ_UCI_RO_KEY, data);
+ //if(strncmp(LYNQ_SW_VERSION, data, sizeof(LYNQ_SW_VERSION))!=0)
+ //{
+ sprintf(buf,"%s.%s.%s=%s", LYNQ_UCI_RO_FILE, LYNQ_UCI_RO_SECTION, LYNQ_UCI_RO_KEY, LYNQ_SW_VERSION);
+ int ret = lynq_uci_set(buf);
+
+ //}
+
+ return ret;
+}
diff --git a/packages/apps/lynq-default/makefile b/packages/apps/lynq-default/makefile
new file mode 100644
index 0000000..fbb54dd
--- /dev/null
+++ b/packages/apps/lynq-default/makefile
@@ -0,0 +1,46 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+ -g -Os \
+ -flto \
+ -fpermissive \
+ -fPIC \
+
+
+
+
+LOCAL_PATH = .
+
+LOCAL_C_INCLUDES = \
+ -I. \
+ -I$(ROOT)$(includedir)/logger \
+ -I$(ROOT)$(includedir)/liblog \
+
+
+
+
+LOCAL_LIBS := \
+ -L. \
+ -ldl \
+ -lpthread \
+ -llynq-log \
+ -lssl \
+ -llynq-uci \
+
+SOURCES = $(wildcard *.c)
+
+EXECUTABLE = lynq-default
+
+OBJECTS=$(SOURCES:.c=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+ $(CXX) $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o : %.c
+ $(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+ $(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/packages/apps/lynq-dev-test/src/LICENSE b/packages/apps/lynq-dev-test/src/LICENSE
new file mode 100644
index 0000000..77f59ed
--- /dev/null
+++ b/packages/apps/lynq-dev-test/src/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/packages/apps/lynq-dev-test/src/lynq_dev_test.c b/packages/apps/lynq-dev-test/src/lynq_dev_test.c
new file mode 100644
index 0000000..9d65d85
--- /dev/null
+++ b/packages/apps/lynq-dev-test/src/lynq_dev_test.c
@@ -0,0 +1,58 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <log/log.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+//#include "libdev/lynq_dev_control.h"
+//#include "liblynq-media/lynq_medial.h"
+#ifdef __cplusplus
+}
+#endif
+static const char *devicename = "/data/ring.wav";
+#define LOG_TAG "DEV_TEST"
+int main(int argc, char **argv)
+{
+ char devicename[100] = {0};
+ char swversion[100] = {0};
+ char oemversion[100] = {0};
+ char manufacturer[100] = {0};
+ char hwversion[100] = {0};
+ int get_rtc ,set_rtc ,cancel_rtc,get_adc,get_usb_status;
+ struct tm timer_time;
+ gsdk_device_get_devicename(devicename);
+ printf("gsdk_device_get_devicename:%s \n",devicename);
+ gsdk_device_get_swversion(swversion);
+ printf("gsdk_device_get_swversion:%s \n",swversion);
+ gsdk_device_get_oemversion(oemversion);
+ printf("gsdk_device_get_oemversion:%s \n",oemversion);
+ gsdk_device_get_manufacturer(manufacturer);
+ printf("gsdk_device_get_manufacturer:%s \n",manufacturer);
+ gsdk_device_get_hwversion(hwversion);
+ printf("gsdk_device_get_hwversion:%s \n",hwversion);
+
+ //set_rtc = gsdk_device_set_rtc_timer();
+ //printf("gsdk_device_set_rtc_timer:%d \n",set_rtc);
+ //get_adc = gsdk_device_get_adc();
+ //printf("gsdk_device_get_adc:%d \n",get_adc);
+ //sleep(30);
+
+ //get_rtc = gsdk_device_get_rtc_timer(set_rtc,&timer_time);
+ //printf("gsdk_device_get_rtc_timer:%d,timer_time,year:%d\n",get_rtc,timer_time.tm_year);
+ //printf("timer_time,tm_mon:%d\n",timer_time.tm_mon);
+ //printf("timer_time,tm_mday:%d\n",timer_time.tm_mday);
+ //printf("timer_time,tm_hour:%d\n",timer_time.tm_hour);
+ //printf("timer_time,tm_min:%d\n",timer_time.tm_min);
+ //printf("timer_time,tm_sec:%d\n",timer_time.tm_sec);
+ //sleep(30);
+ //cancel_rtc = gsdk_device_cancel_rtc_timer(set_rtc);
+ //printf("gsdk_device_cancel_rtc_timer:%d \n",cancel_rtc);
+ //sleep(30);
+ get_usb_status = gsdk_device_get_usb_state();
+ printf("gsdk_device_get_usb_state,get_usb_status:%d\n",get_usb_status);
+ //gsdk_device_reboot_system();
+ //printf(" reboot_system");
+ while(1){sleep(10);}
+ return 0;
+}
\ No newline at end of file
diff --git "a/packages/apps/lynq-dev-test/src/lynq_testprocess\050gpio\051.tmp" "b/packages/apps/lynq-dev-test/src/lynq_testprocess\050gpio\051.tmp"
new file mode 100644
index 0000000..c07e271
--- /dev/null
+++ "b/packages/apps/lynq-dev-test/src/lynq_testprocess\050gpio\051.tmp"
@@ -0,0 +1,144 @@
+#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>
+#define GPIO_SERVICE "lynq.gpio" /*well-known bus name */
+#define GPIO_DATA_INTERFACE "lynq.gpio.Data" /*interface name*/
+#define GPIO_DATA_PATH "/lynq/gpio/data" /*object name*/
+GMainLoop *loop = NULL;
+GDBusProxy *proxy = NULL;
+#define LOG_TAG "GPIO_CONTROL"
+int set_gpio (gchar * mode,guint *gpio_numb,guint param)
+{
+ GDBusConnection *c1;
+ GVariant *result;
+ GError *error;
+ guint set_result = -1;
+ g_type_init();
+ loop = g_main_loop_new(NULL, FALSE); /** create main loop, but do not start it.*/
+ c1 = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, 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));
+ g_variant_unref (result);
+ g_main_loop_run (loop);
+ g_main_loop_unref (loop);
+ return set_result;
+}
+int get_gpio (guint *gpio_numb)
+{
+ GDBusConnection *c1;
+ GVariant *result;
+ GError *error;
+ guint parm=0;
+ const gchar *set_result;
+ const gchar *mode ="gpio";
+ if(set_gpio(mode,gpio_numb,parm)== -1)
+ {
+ RLOGD("get_gpio number error");
+ return -1;
+ }
+ c1 = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, 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 */
+ "getGpio", /* method name */
+ NULL, /* parameters */
+ G_VARIANT_TYPE ("(s)"), /* return type */
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ g_assert_no_error (error);
+ g_assert (result != NULL);
+ g_variant_get(result, "((s))", &(set_result));
+ RLOGD("get_gpio,%s",set_result);
+ g_variant_unref (result);
+ return 1;
+}
+void proxy_ready(GObject *source, GAsyncResult *result, gpointer user_data) {
+ GError *error;
+
+ error = NULL;
+ proxy = g_dbus_proxy_new_for_bus_finish(result, &error);
+ if (proxy == NULL) {
+ RLOGE("create proxy fail");
+ return ;
+ }
+ RLOGD("proxy is ready");
+ gulong signal_handler_id;
+
+ // signal_handler_id = g_signal_connect(proxy, "g-signal",
+ // G_CALLBACK (proxy_signals_on_signal), NULL);
+ // if (signal_handler_id == 0) {
+ // RLOGE("listen singal fail!");
+ // }
+}
+
+void* init_data_gdbus_cb(void *param)
+{
+ /* all the tests rely on a shared main loop */
+ loop = g_main_loop_new(NULL, FALSE);
+
+ g_dbus_proxy_new_for_bus(G_BUS_TYPE_SYSTEM,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL, /* GDBusInterfaceInfo */
+ GPIO_SERVICE, /* name */
+ GPIO_DATA_PATH, /* object path */
+ GPIO_DATA_INTERFACE, /* interface */
+ NULL, /* GCancellable */
+ proxy_ready,
+ NULL);
+
+ g_main_loop_run(loop);
+
+ RLOGD("data gdbus main loop run()");
+ if(proxy != NULL) {
+ g_object_unref (proxy);
+ }
+ if(loop != NULL) {
+ g_main_loop_unref(loop);
+ }
+}
+
+
+void startGdbusLoop(void)
+{
+ pthread_t gpioThread;
+
+ RLOGD("startGdbusLoop()");
+ // pthread_mutex_lock(&s_startupMutex);
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
+ int result = pthread_create(&gpioThread, &attr, init_data_gdbus_cb, NULL);
+ if (result != 0) {
+ RLOGW("Failed to create gdbus thread: %s", strerror(result));
+ //goto done;
+ }
+//done:
+ // pthread_mutex_unlock(&s_startupMutex);
+}
diff --git a/packages/apps/lynq-dev-test/src/makefile b/packages/apps/lynq-dev-test/src/makefile
new file mode 100644
index 0000000..478152b
--- /dev/null
+++ b/packages/apps/lynq-dev-test/src/makefile
@@ -0,0 +1,67 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+ -g -Os \
+ -flto \
+ -DRIL_SHLIB \
+ -DATCI_PARSE \
+ -DKEEP_ALIVE \
+ -D__LINUX_OS__ \
+ -DECALL_SUPPORT
+
+CXXFLAGS = -fpermissive
+LOCAL_PATH = .
+#CFLAGS = $(LOCAL_CFLAGS) -std=c99
+#CXXFLAGS = $(LOCAL_CFLAGS) -std=gnu++14
+$(warning ################# ZHOUQUNCHAO ROOT: $(ROOT),includedir:$(includedir),LOCAL_PATH:$(LOCAL_PATH))
+LOCAL_C_INCLUDES = \
+ -I. \
+ -I$(LOCAL_PATH) \
+ -I$(ROOT)$(includedir)/logger \
+ -I$(ROOT)$(includedir)/vendor-ril \
+ -I$(ROOT)$(includedir)/liblynq-dev \
+ -I$(ROOT)$(includedir)/liblynq-media \
+ -I$(ROOT)$(includedir)/glib-2.0 \
+ -I$(ROOT)$(libdir)/glib-2.0/include \
+ -I$(ROOT)$(includedir)/dbus-1.0 \
+ -I$(ROOT)$(libdir)/dbus-1.0/include \
+
+LOCAL_C_INCLUDES+=$(DNS_FLAGS)
+
+LOCAL_LIBS := \
+ -L. \
+ -ldl \
+ -lstdc++ \
+ -llog \
+ -lcutils \
+ -lutils \
+ -lpthread \
+ -llynq-dev \
+ -llynq-media \
+ -lpal \
+ -lglib-2.0 \
+ -lgobject-2.0 \
+ -lgio-2.0 \
+ -lapn \
+ -ldbus-1 \
+
+LOCAL_SRC_FILES_CPP = $(wildcard *.cpp)
+LOCAL_SRC_FILES_C = $(wildcard *.c)
+EXECUTABLE = lynq-dev-test
+
+OBJECTS=$(LOCAL_SRC_FILES_CPP:.cpp=.o) $(LOCAL_SRC_FILES_C:.c=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+ $(CXX) $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o: %.c
+ $(warning ----->build $<)
+ $(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+%.o : %.cpp
+ $(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+ $(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/packages/apps/lynq-factorytest/src/LICENSE b/packages/apps/lynq-factorytest/src/LICENSE
new file mode 100644
index 0000000..77f59ed
--- /dev/null
+++ b/packages/apps/lynq-factorytest/src/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/packages/apps/lynq-factorytest/src/autoFactoryTest.cpp b/packages/apps/lynq-factorytest/src/autoFactoryTest.cpp
new file mode 100644
index 0000000..5dea35f
--- /dev/null
+++ b/packages/apps/lynq-factorytest/src/autoFactoryTest.cpp
@@ -0,0 +1,13 @@
+#include <memory>
+
+#include "rfAutomaticTest.h"
+#include "autoFactoryTest.h"
+
+
+static RfAutomaticTest* mTx = NULL;
+int factory_auto_test() {
+ if(!mTx) {
+ mTx = RfAutomaticTest::getInstance();
+ }
+ return 0;
+}
diff --git a/packages/apps/lynq-factorytest/src/autoFactoryTest.h b/packages/apps/lynq-factorytest/src/autoFactoryTest.h
new file mode 100644
index 0000000..ede96fb
--- /dev/null
+++ b/packages/apps/lynq-factorytest/src/autoFactoryTest.h
@@ -0,0 +1,39 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein
+ * is confidential and proprietary to MediaTek Inc. and/or its licensors.
+ * Without the prior written permission of MediaTek inc. and/or its licensors,
+ * any reproduction, modification, use or disclosure of MediaTek Software,
+ * and information contained herein, in whole or in part, shall be strictly prohibited.
+ *
+ * MediaTek Inc. (C) 2016. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
+ * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+ * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+ * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+ * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
+ * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
+ * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
+ * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
+ * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
+ * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+ * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+ * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
+ * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek Software")
+ * have been modified by MediaTek Inc. All revisions are subject to any receiver's
+ * applicable license agreements with MediaTek Inc.
+ */
+
+#ifndef AUTOFACTORYTEST_H_
+#define AUTOFACTOYRTEST_H_
+ int factory_auto_test();
+#endif /* AUTOFACTOYRTEST_H_ */
diff --git a/packages/apps/lynq-factorytest/src/common.cpp b/packages/apps/lynq-factorytest/src/common.cpp
new file mode 100644
index 0000000..e23d0fc
--- /dev/null
+++ b/packages/apps/lynq-factorytest/src/common.cpp
@@ -0,0 +1,119 @@
+#include "common.h"
+#include "libtel/lynq_call.h"
+#include <log/log.h>
+#include <cutils/properties.h>
+int get_call(){
+ char property_value[PHONE_SIZE] = { 0 };
+ property_get(PHONE_NUMBER, property_value, "18964376469");
+ RLOGD("factory_manual,property_value:%s",property_value);
+ //RIL_Dial *mRIL_Dial = (RIL_Dial *)calloc(1, sizeof(RIL_Dial));
+ //mRIL_Dial->address = property_value;
+ //mRIL_Dial->clir = 0;
+ // return lynq_call(property_value);
+ return 1;
+}
+void register_factory_auto_hook_raw(RfAutomaticTest* rf){
+ if(!m_RfDesense) {
+ m_RfDesense = rf;
+ }
+}
+
+void unregister_factory_auto_hook_raw(){
+ if(m_RfDesense) {
+ m_RfDesense == NULL;
+ }
+}
+int getParameter(const int length, char* string, char* argv[])
+{
+ int num = 0;
+ int count = 0;
+ int i = 0;
+ char* pos= string;
+ //string++;
+ while (1)
+ {
+ if (*pos == '\0')
+ {
+ break;
+ }
+ argv[num++] = pos;
+ while (1)
+ {
+ if ((*pos == '\0'))
+ {
+ break;
+ }
+ if ((*pos == '|') && (*(pos - 1) != '\\'))
+ {
+ count++;
+ break;
+ }
+ pos++;
+ }
+ *pos++ = '\0';
+ }
+ /*
+ for (int i = 0;i < num-1;i++)
+ {
+ printf("agrv[%d]=%s\n", i, argv[i]);
+ }
+ */
+ if(count!=length)
+ {
+ return 0;
+ }
+ return count;
+}
+
+int removeFlag(int argc, char* argv[])
+{
+ char* temp = NULL;
+ char* temp1= NULL;
+ char** pos = argv;
+ for (int i = 0;i < argc+1;i++)
+ {
+ temp1 = pos[i];
+ while (1)
+ {
+ if (*pos[i] == '\0')
+ {
+ break;
+ }
+ if ((*pos[i] == '|') && (*(pos[i] - 1) == '\\'))
+ {
+ temp = pos[i];
+ while (1)
+ {
+ *(pos[i]-1) = *(pos[i]);
+ if (*(pos[i]) == '\0')
+ {
+ break;
+ }
+ pos[i]++;
+ }
+ pos[i] = temp;
+ }
+ pos[i]++;
+ }
+ pos[i] = temp1;
+ }
+ return 0;
+}
+int parseParam(const int length, char* string, char* argv[])
+{
+ int num = 0;
+ if(string ==NULL)
+ {
+ return 0;
+ }
+ if(num = getParameter(length, string, argv))
+ {
+ removeFlag(num,argv);
+ for (int i = 1;i < num + 1;i++)
+ {
+ printf("argv[%d]=%s\n", i, argv[i]);
+ }
+ return num;
+ }
+ return 0;
+}
\ No newline at end of file
diff --git a/packages/apps/lynq-factorytest/src/common.h b/packages/apps/lynq-factorytest/src/common.h
new file mode 100644
index 0000000..356e13a
--- /dev/null
+++ b/packages/apps/lynq-factorytest/src/common.h
@@ -0,0 +1,58 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein
+ * is confidential and proprietary to MediaTek Inc. and/or its licensors.
+ * Without the prior written permission of MediaTek inc. and/or its licensors,
+ * any reproduction, modification, use or disclosure of MediaTek Software,
+ * and information contained herein, in whole or in part, shall be strictly prohibited.
+ */
+/* MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
+ * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+ * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+ * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+ * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
+ * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
+ * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
+ * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
+ * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
+ * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+ * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+ * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
+ * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek Software")
+ * have been modified by MediaTek Inc. All revisions are subject to any receiver's
+ * applicable license agreements with MediaTek Inc.
+ */
+#ifndef __LYNQ_FACTORY_COMMON__
+#define __LYNQ_FACTORY_COMMON__
+#include "rfAutomaticTest.h"
+extern RfAutomaticTest* m_RfDesense;
+static int32_t auto_reqId = 0;
+static int32_t manu_reqId = 0;
+#define PHONE_SIZE 20
+#define PHONE_NUMBER "persist.factory.phone"
+#define NUM_ITEMS(a) (sizeof (a) / sizeof (a)[0])
+#define FACTORY_SH 0
+#define FACTORY_SINGLE_SH 1
+typedef struct factory_arry_{
+ char *name; /* main test name. */
+ int subcnt;
+ struct factory_arry_ *subarray; /* Function to call to do the job. */
+ int param; //0 :no parame ,1:normal parame,2:memory data ,3: normal parame and memory data
+ int go_thread; //goto rita thread
+} factory_arry_t;
+int get_call();
+void register_factory_auto_hook_raw(RfAutomaticTest* rf);
+void unregister_factory_auto_hook_raw();
+int parseParam(const int length, char* string, char* argv[]);
+int emResultNotify(const char *str,int command);
+#endif
diff --git a/packages/apps/lynq-factorytest/src/factoryManual.cpp b/packages/apps/lynq-factorytest/src/factoryManual.cpp
new file mode 100644
index 0000000..6e45ab1
--- /dev/null
+++ b/packages/apps/lynq-factorytest/src/factoryManual.cpp
@@ -0,0 +1,91 @@
+# include <stdio.h>
+#include "factoryManual.h"
+#include <unistd.h>
+#include <log/log.h>
+#include "libtel/lib_tele.h"
+#include <libtel/lynq_call.h>
+#include <libtel/lynq_sim.h>
+#include "gpio/gpio_test.h"
+#include<common.h>
+/*
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <gps/gps_test.h>
+#ifdef __cplusplus
+}
+#endif
+*/
+#include <string.h>
+
+#undef LOG_TAG
+#define LOG_TAG "FACTORY_MANUAL"
+//#include "Parcel.h"
+//extern void get_gps_test();
+
+
+int32_t factory_manual(int argc, int multicnt,int *item ,int command){
+
+ int propertyid = item[1];
+ int select = item[2];
+ int32_t token ;
+ /*
+ for (int i = 0;i<10;i++){
+ RLOGD("item%d: %d", i,item[i]);
+ }*/
+ switch (select) {
+ case 0:
+ {
+ int32_t status;
+ char output[1024] = {0};
+ const char *addr1 = "10086";
+ lynqCallList * test_call_info;
+ test_call_info = (lynqCallList*)malloc(sizeof(lynqCallList));
+ memset(test_call_info,0,sizeof(lynqCallList));
+ test_call_info->addr=(char *)malloc(sizeof(char));
+ memset(test_call_info->addr,0,sizeof(char));
+ status = lynq_call(addr1,test_call_info);
+ //printf("status is %x\n",status);
+ printf("[MAIN_LOG] request is %d,phone number is %s,token is %x,error is %d,call_state is %d\n",
+ test_call_info->base.request,test_call_info->addr,test_call_info->base.token,test_call_info->base.e,
+ test_call_info->call_state);
+ //free(test_call_info);
+ sprintf(output, "Factory_result error_code:%d\ndone\n",test_call_info->base.e);
+ emResultNotify(output,command);
+ break;
+ }
+ case 1:
+ {
+ char output[1024] = {0};
+ static int32_t token;
+ simStatus * sim_status=NULL;
+ sim_status = (simStatus *)malloc(sizeof(simStatus));
+ token = lynq_get_sim_status(sim_status);
+ printf("test process token %x\n",token);
+ printf("card_status:%d,card_type:%d,pin_state:%d,error_code:%d,request:%d,token:%x\n",sim_status->card_status,
+ sim_status->card_type,sim_status->pin_state,sim_status->base.e,sim_status->base.request,sim_status->base.token);
+ sprintf(output, "Factory_result Sim status error_code:%d\ndone\n",sim_status->base.e);
+ emResultNotify(output,command);
+ free(sim_status);
+ sim_status=NULL;
+ break;
+ }
+ case 2:
+ {
+ // get_gps_test();
+ break;
+ }
+ case 3:
+ {
+ int result=set_gpio143();
+ if(result == -1)
+ RLOGE("set gpio error :%d",result);
+ get_gpio143(command);
+ break;
+ }
+ default:
+ RLOGE("logic eror ");
+ return -1;
+ }
+ return token;
+}
diff --git a/packages/apps/lynq-factorytest/src/factoryManual.h b/packages/apps/lynq-factorytest/src/factoryManual.h
new file mode 100644
index 0000000..218c65c
--- /dev/null
+++ b/packages/apps/lynq-factorytest/src/factoryManual.h
@@ -0,0 +1,8 @@
+#ifndef __LYNQ_FACTORY_MANUAL_API__
+#define __LYNQ_FACTORY_MANUAL_API__
+
+
+#include <sys/types.h>
+int factory_manual(int argc, int multicnt,int *item,int command);
+#endif
+
diff --git a/packages/apps/lynq-factorytest/src/factoryOpen/factory.sh b/packages/apps/lynq-factorytest/src/factoryOpen/factory.sh
new file mode 100644
index 0000000..f493a6a
--- /dev/null
+++ b/packages/apps/lynq-factorytest/src/factoryOpen/factory.sh
@@ -0,0 +1,109 @@
+#!/bin/bash
+#Copyright (c) 2016, MediaTek Inc. All rights reserved.
+#This software/firmware and related documentation ("MediaTek Software") are protected under relevant copyright laws.
+#The information contained herein is confidential and proprietary to MediaTek Inc. and/or its licensors.
+#Except as otherwise provided in the applicable licensing terms with MediaTek Inc. and/or its licensors, any reproduction,
+#modification, use or disclosure of MediaTek Software, and information contained herein, in whole or in part, shall be strictly prohibited.
+echo "FactoryTest"
+QUITSTRING=""
+EM_COMMAND="FACTORY"
+EM_LAST_COMMAND="FACTORY"
+
+recv_data() {
+ cat <&9 | while read line
+ do
+ result=${line}
+
+ catp=$(ps | grep cat | awk '{print $1}')
+ #echo -e "recv_data,line:$line,QUITSTRING:$QUITSTRING"
+ if [ "$line" != "" ];then
+ if [ "$line" != "stopemdone" -a "$line" != "done" -a "$line" != "only_em_message" ];then
+ echo $line
+ fi
+ if [ "$line" = "done" ];then
+ QUITSTRING="quit"
+ echo $QUITSTRING > /tmp/factory_test/done.temp
+ fi
+ if [ "$line" = "only_em_message" ];then
+ QUITSTRING="only_em_message"
+ echo $QUITSTRING > /tmp/factory_test/done.temp
+ fi
+ if [ "$catp" != "" ];then
+ kill $catp
+ fi
+ fi
+ done
+}
+#open a socket, communicated with Service.
+exec 9<> /dev/udp/127.0.0.1/8000
+
+if [ ! -d "/tmp/factory_test" ];then
+ mkdir /tmp/factory_test
+else
+ rm -rf /tmp/factory_test
+ mkdir /tmp/factory_test
+fi
+
+echo "$EM_COMMAND" >&9
+recv_data
+echo $QUITSTRING
+ISDONE="no"
+while [ "$QUITSTRING" != "quit" ]; do
+ read -p "Select menu:" name
+ if [ $(expr match "$name" ".*quit") != 0 ];then
+ #echo -e "while quit"
+ break
+ fi
+ if [ $(expr match "$name" ".*back") != 0 ];then
+
+ echo "" > /tmp/factory_test/done.temp
+ echo -e "EM_COMMAND:$EM_COMMAND"
+ EM_COMMAND=${EM_COMMAND% *}
+ #EM_COMMAND=$EM_LAST_COMMAND
+ # echo -e "while back,$EM_COMMAND,EM_LAST_COMMAND:$EM_LAST_COMMAND"
+ echo "$EM_COMMAND" >&9
+ recv_data
+ continue
+ fi
+
+ echo -e "\nselect item $name"
+ if [ -n "$name" ]
+ then
+ echo "$EM_COMMAND $name" >&9
+ recv_data
+ fi
+
+ if test -e /tmp/factory_test/done.temp
+ then
+ ISDONE=$(cat /tmp/factory_test/done.temp)
+ fi
+
+
+ if [ "$ISDONE" = "quit" -o "$name" = "" ];then
+ echo "" > /tmp/factory_test/done.temp
+ echo "$EM_COMMAND" >&9
+ recv_data
+ elif [ "$ISDONE" = "only_em_message" ]
+ then
+ while [ "$ISDONE" != "quit" ]
+ do
+ echo "" > /tmp/factory_test/done.temp
+ recv_data
+ done
+ echo "" > /tmp/factory_test/done.temp
+ echo "$EM_COMMAND" >&9
+ recv_data
+ else
+ EM_LAST_COMMAND=$EM_COMMAND
+
+ EM_COMMAND="$EM_LAST_COMMAND $name"
+ #echo -e "EM_LAST_COMMAND:$EM_LAST_COMMAND,EM_COMMAND:$EM_COMMAND"
+ fi
+done
+
+
+echo "recived results done!"
+#close socket R/W
+exec 9>&-
+exec 9<&-
+exit 0
diff --git a/packages/apps/lynq-factorytest/src/factoryOpen/factory_singel.sh b/packages/apps/lynq-factorytest/src/factoryOpen/factory_singel.sh
new file mode 100644
index 0000000..5154994
--- /dev/null
+++ b/packages/apps/lynq-factorytest/src/factoryOpen/factory_singel.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+#Copyright (c) [2016], MediaTek Inc. All rights reserved.
+#This software/firmware and related documentation ("MediaTek Software") are protected under relevant copyright laws.
+#The information contained herein is confidential and proprietary to MediaTek Inc. and/or its licensors.
+#Except as otherwise provided in the applicable licensing terms with MediaTek Inc. and/or its licensors, any reproduction,
+#modification, use or disclosure of MediaTek Software, and information contained herein, in whole or in part, shall be strictly prohibited.
+
+echo "factory singel"
+Menu1=$1
+Menu2=$2
+Menu3=$3
+Menu4=$4
+Menu5=$5
+Menu6=$6
+#if [ -z $3 ]
+#then
+#echo "FACTORY $Menu1 $Menu2" >&9
+#else
+#Menu3=$3
+ #if [ -z $4 ]
+ #then
+ #echo "FACTORY $Menu1 $Menu2 $Menu3" >&9
+ #else
+ #Menu4=$4
+ #echo "FACTORY $Menu1 $Menu2 $Menu3 $Menu4" >&9
+ #fi
+#fi
+
+
+#open a socket, communicated with Service.
+exec 9<> /dev/udp/127.0.0.1/8000
+
+#send Terminal response CMD
+echo "FACTORY_SINGEL $Menu1 $Menu2 $Menu3 $Menu4 \"$Menu5\" $Menu6 " >&9
+#sleep 1
+
+#close socket R/W
+exec 9>&-
+exec 9<&-
+exit 0
diff --git a/packages/apps/lynq-factorytest/src/factoryOpen/factory_single.sh b/packages/apps/lynq-factorytest/src/factoryOpen/factory_single.sh
new file mode 100644
index 0000000..9a1c54a
--- /dev/null
+++ b/packages/apps/lynq-factorytest/src/factoryOpen/factory_single.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+#Copyright (c) [2016], MediaTek Inc. All rights reserved.
+#This software/firmware and related documentation ("MediaTek Software") are protected under relevant copyright laws.
+#The information contained herein is confidential and proprietary to MediaTek Inc. and/or its licensors.
+#Except as otherwise provided in the applicable licensing terms with MediaTek Inc. and/or its licensors, any reproduction,
+#modification, use or disclosure of MediaTek Software, and information contained herein, in whole or in part, shall be strictly prohibited.
+
+echo "function single"
+Menu1=$1
+Menu2=$2
+Menu3=$3
+Menu4=$4
+Menu5=$5
+Menu6=$6
+#if [ -z $3 ]
+#then
+#echo "FACTORY $Menu1 $Menu2" >&9
+#else
+#Menu3=$3
+ #if [ -z $4 ]
+ #then
+ #echo "FACTORY $Menu1 $Menu2 $Menu3" >&9
+ #else
+ #Menu4=$4
+ #echo "FACTORY $Menu1 $Menu2 $Menu3 $Menu4" >&9
+ #fi
+#fi
+
+
+#open a socket, communicated with Service.
+exec 9<> /dev/udp/127.0.0.1/8000
+
+#send Terminal response CMD
+echo "FUNCTION_SINGLE $Menu1 $Menu2 $Menu3 $Menu4 \"$Menu5\" $Menu6 " >&9
+#sleep 1
+
+#close socket R/W
+exec 9>&-
+exec 9<&-
+exit 0
diff --git a/packages/apps/lynq-factorytest/src/factory_main.cpp b/packages/apps/lynq-factorytest/src/factory_main.cpp
new file mode 100644
index 0000000..0733500
--- /dev/null
+++ b/packages/apps/lynq-factorytest/src/factory_main.cpp
Binary files differ
diff --git a/packages/apps/lynq-factorytest/src/factory_main.h b/packages/apps/lynq-factorytest/src/factory_main.h
new file mode 100644
index 0000000..f010f2b
--- /dev/null
+++ b/packages/apps/lynq-factorytest/src/factory_main.h
@@ -0,0 +1,80 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein
+ * is confidential and proprietary to MediaTek Inc. and/or its licensors.
+ * Without the prior written permission of MediaTek inc. and/or its licensors,
+ * any reproduction, modification, use or disclosure of MediaTek Software,
+ * and information contained herein, in whole or in part, shall be strictly prohibited.
+ */
+/* MediaTek Inc. (C) 2010. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
+ * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+ * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+ * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+ * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
+ * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
+ * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
+ * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
+ * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
+ * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+ * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+ * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
+ * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek Software")
+ * have been modified by MediaTek Inc. All revisions are subject to any receiver's
+ * applicable license agreements with MediaTek Inc.
+ */
+#ifndef __LYNQ_FACTORY_MAIN__
+#define __LYNQ_FACTORY_MAIN__
+#include <cutils/properties.h>
+#include <string>
+#include <vector>
+#include <sys/types.h>
+#include "common.h"
+#define SMS_MESSAGE "persist.factory.message"
+#define GPS_STATUS "persist.gps.status"
+static const int INDEX_PHONENUMB = 0;
+static const int INDEX_SMS_MESSAGE = 1;
+#define SERVER_PORT 8000
+#define BUFFER_SIZE 8192
+
+#define MAX_ARGS 101
+#define PRAME_NONE 0
+#define PARME_NORMAL 1
+#define PARME_DATA 2
+#define PRAME_NORMAL_DATA 3
+
+
+typedef enum {
+ FACTORY_TEST = 0,
+ API_TEST,
+ DEMO_TEST,
+}TEST_MAIN_ITEM;
+
+/*
+typedef enum {
+ WIFI_OPEN = 1,
+ // WIFI_SCAN,
+ WIFI_CONNECT,
+ WIFI_CLOSE,
+}WIFI_API;*/
+
+typedef enum {
+ CONFIG = 0,
+ AUTO_TESTING ,
+ MANUAL_TEST,
+}FACTORY_MAIN_ITEM;
+
+int32_t getRequestId();
+void lynqStartEventLoop(void);
+
+
+#endif
diff --git a/packages/apps/lynq-factorytest/src/gpio/gpio_test.cpp b/packages/apps/lynq-factorytest/src/gpio/gpio_test.cpp
new file mode 100644
index 0000000..08667cc
--- /dev/null
+++ b/packages/apps/lynq-factorytest/src/gpio/gpio_test.cpp
@@ -0,0 +1,175 @@
+#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 "common.h"
+#include "gpio/gpio_test.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*/
+GMainLoop *loop = NULL;
+GDBusProxy *proxy = NULL;
+#define LOG_TAG "GPIO_CONTROL"
+int 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 get_gpio (guint gpio_numb,gchar *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(int command){
+ char output[1024] = {0};
+ char output1[2048] = {0};
+ get_gpio (WIFI_LED_CONTROL,output);
+ printf("get_gpio143,%s\n",output);
+ sprintf(output1, "Factory_result gpio143 set state:%s\n",output);
+ printf("%s",output1);
+ emResultNotify(output1,command);
+}
+void proxy_ready(GObject *source, GAsyncResult *result, gpointer user_data) {
+ GError *error;
+
+ error = NULL;
+ proxy = g_dbus_proxy_new_for_bus_finish(result, &error);
+ if (proxy == NULL) {
+ RLOGE("create proxy fail");
+ return ;
+ }
+ RLOGD("proxy is ready");
+ // gulong signal_handler_id;
+
+ // signal_handler_id = g_signal_connect(proxy, "g-signal",
+ // G_CALLBACK (proxy_signals_on_signal), NULL);
+ // if (signal_handler_id == 0) {
+ // RLOGE("listen singal fail!");
+ // }
+}
+
+void* init_data_gdbus_cb(void *param)
+{
+ /* all the tests rely on a shared main loop */
+ loop = g_main_loop_new(NULL, FALSE);
+
+ g_dbus_proxy_new_for_bus(G_BUS_TYPE_SYSTEM,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL, /* GDBusInterfaceInfo */
+ GPIO_SERVICE, /* name */
+ GPIO_DATA_PATH, /* object path */
+ GPIO_DATA_INTERFACE, /* interface */
+ NULL, /* GCancellable */
+ proxy_ready,
+ NULL);
+
+ g_main_loop_run(loop);
+
+ RLOGD("data gdbus main loop run()");
+ if(proxy != NULL) {
+ g_object_unref (proxy);
+ }
+ if(loop != NULL) {
+ g_main_loop_unref(loop);
+ }
+}
+
+
+void startGdbusLoop(void)
+{
+ pthread_t gpioThread;
+
+ RLOGD("startGdbusLoop()");
+ // pthread_mutex_lock(&s_startupMutex);
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
+ int result = pthread_create(&gpioThread, &attr, init_data_gdbus_cb, NULL);
+ if (result != 0) {
+ RLOGW("Failed to create gdbus thread: %s", strerror(result));
+ //goto done;
+ }
+//done:
+ // pthread_mutex_unlock(&s_startupMutex);
+}
diff --git a/packages/apps/lynq-factorytest/src/gpio/gpio_test.h b/packages/apps/lynq-factorytest/src/gpio/gpio_test.h
new file mode 100644
index 0000000..9d7008c
--- /dev/null
+++ b/packages/apps/lynq-factorytest/src/gpio/gpio_test.h
@@ -0,0 +1,12 @@
+#ifndef __LYNQ_GPIO_CONTROL__
+#define __LYNQ_GPIO_CONTROL__
+
+#define GPIO_MODE "mode"
+#define GPIO_DIR "dir"
+#define GPIO_OUT "out"
+static constexpr int WIFI_LED_CONTROL = 143;
+int set_gpio143();
+void get_gpio143(int command);
+
+#endif
+
diff --git a/packages/apps/lynq-factorytest/src/gps/gps_cb.tmp b/packages/apps/lynq-factorytest/src/gps/gps_cb.tmp
new file mode 100644
index 0000000..bac3bd2
--- /dev/null
+++ b/packages/apps/lynq-factorytest/src/gps/gps_cb.tmp
@@ -0,0 +1,263 @@
+#include<pthread.h>
+#include<stdio.h>
+#include<unistd.h>
+#include<errno.h>
+#include<string.h>
+//#include <sys/time.h>
+//#include <time.h>
+#include"gps/gps_test.h"
+#include <gps/gps_test.h>
+#include"mtk_lbs_utility.h"
+#include <log/log.h>
+
+extern struct timespec mnld_test_gnss_open_tm;
+extern int mnld_test_ttff;
+extern int mnld_test_session_end;
+GpsLocation_ext location_rslt;
+mnld_test_result mnld_test_result_body;
+void mnld_test_gps_location_callback(GpsLocation_ext* location)
+{
+
+// memset(&result,0,sizeof(mnld_test_result));
+ if(location->legacyLocation.size == sizeof(GpsLocation_ext))
+ {
+ char output[2048] = {0};
+ RLOGD("===============Update Location Info==================");
+ RLOGD("flags:0x%x", location->legacyLocation.flags);
+ RLOGD("zqc latitude:%.10lf", location->legacyLocation.latitude);
+ RLOGD("zqc longitude:%.10lf", location->legacyLocation.longitude);
+ RLOGD("zqc altitude:%.10lf", location->legacyLocation.altitude);
+ RLOGD("zqc speed:%f", location->legacyLocation.speed);
+ RLOGD("bearing:%f", location->legacyLocation.bearing);
+ RLOGD("timestamp:%d", location->legacyLocation.timestamp);
+ RLOGD("horizontalAccuracyMeters:%f", location->horizontalAccuracyMeters);
+ RLOGD("verticalAccuracyMeters:%f", location->verticalAccuracyMeters);
+ RLOGD("speedAccuracyMetersPerSecond:%f", location->speedAccuracyMetersPerSecond);
+ RLOGD("bearingAccuracyDegrees:%f", location->bearingAccuracyDegrees);
+ memcpy(&(mnld_test_result_body.location), location, sizeof(GpsLocation_ext));
+ sprintf(output, "gps success latitude:%.10lf,longitude:%.10lf\n",
+ location->legacyLocation.latitude,location->legacyLocation.longitude);
+
+ }else {
+ RLOGE("GpsLocation_ext size is wrong");
+ }
+#if 0
+ memcpy(&(result.location), location, sizeof(GpsLocation_ext));
+ if((location->flags & GPS_LOCATION_HAS_ACCURACY) && (mnld_test_ttff == 0))
+ {
+ struct timespec fix_tm;
+ if(clock_gettime(CLOCK_BOOTTIME,&fix_tm) == -1)
+ {
+ result.ttff = 0;
+ RLOGE("[%s]Fail to get time(%s)\r\n",__func__,strerror(errno));
+ }else{
+ RLOGD("Flags:0x%x,start time:%ds,%dns; ttff time:%ds,%dns\r\n",result.location.flags,mnld_test_gnss_open_tm.tv_sec,mnld_test_gnss_open_tm.tv_nsec,fix_tm.tv_sec,fix_tm.tv_nsec);
+ result.ttff = (fix_tm.tv_sec-mnld_test_gnss_open_tm.tv_sec)*1000+((fix_tm.tv_nsec-mnld_test_gnss_open_tm.tv_nsec)/1000000);
+ mnld_test_ttff = result.ttff;
+ RLOGD("TTFF:%dms",mnld_test_ttff);
+ }
+ }else{
+ result.ttff = mnld_test_ttff;
+ }
+ result.location.timestamp = location->timestamp;
+ RLOGD("ts:%d,result.timestamp:%ld\r\n",location->timestamp,result.location.timestamp);
+ mnld_test_show_test_result(&result);
+ }else{
+ RLOGE("[%s]size error!\r\n", __func__);
+ }
+#endif
+
+}
+
+void mnld_test_gps_status_callback(GpsStatus* status)
+{
+ if(status->size == sizeof(GpsStatus))
+ {
+ RLOGD("GPS Status:%d", status->status);
+ if(status->status == GPS_STATUS_SESSION_BEGIN)
+ {
+ mnld_test_ttff = 0;
+ mnld_test_session_end = 0;
+// usleep(500000);
+ mnld_test_get_mnl_ver();
+ #ifdef MNLD_TEST_TTFF_SESSION_BEGIN
+ if(clock_gettime(CLOCK_BOOTTIME,&mnld_test_gnss_open_tm) == -1)
+ {
+ RLOGE("Fail to get time(%s).", strerror(errno));
+ }
+ #endif
+ }
+ if(status->status == GPS_STATUS_SESSION_BEGIN){
+ mnld_get_gps_status(0);
+ }else if(status->status == GPS_STATUS_NONE){
+ mnld_get_gps_status(1);
+ }
+ if(status->status == GPS_STATUS_SESSION_END)
+ {
+ mnld_test_session_end = 1;
+ }
+ }else{
+ RLOGE("size error!");
+ }
+}
+
+void mnld_test_gps_sv_status_callback(GpsSvStatus* sv_info)
+{
+ RLOGD("gps sv status");
+}
+
+#define NMEA_GGA "GGA"
+#define NMEA_GSA "GSA"
+#define NMEA_ACC "ACCURACY"
+extern int valid_ttff_cnt;
+extern int valid_ttff_sum;
+void mnld_test_gps_nmea_callback(GpsUtcTime timestamp, const char* nmea, int length)
+{
+// RLOGD("%d",timestamp);
+
+ //$GPGSA,A,3,...
+ if( strncmp(nmea+3,NMEA_GSA,strlen(NMEA_GSA)) == 0 )
+ {
+ mnld_test_result_body.fix_type = *(nmea+9) - '0';
+ if(mnld_test_result_body.fix_type == 1)
+ {
+ mnld_test_result_body.fix_type = 0;
+ }
+
+ if((mnld_test_ttff == 0) && mnld_test_result_body.fix_type != 0)
+ {
+ struct timespec fix_tm;
+
+ if(clock_gettime(CLOCK_BOOTTIME,&fix_tm) == -1)
+ {
+ mnld_test_result_body.ttff[CURR] = 0;
+ RLOGE("[%s]Fail to get time(%s)\r\n",__func__,strerror(errno));
+ }else{
+ // RLOGD("Flags:0x%x,start time:%ds,%dns; ttff time:%ds,%dns\r\n",mnld_test_result_body.location.flags,mnld_test_gnss_open_tm.tv_sec,mnld_test_gnss_open_tm.tv_nsec,fix_tm.tv_sec,fix_tm.tv_nsec);
+ mnld_test_ttff = (fix_tm.tv_sec-mnld_test_gnss_open_tm.tv_sec)*1000+((fix_tm.tv_nsec-mnld_test_gnss_open_tm.tv_nsec)/1000000);
+ mnld_test_result_body.ttff[CURR] = mnld_test_ttff;
+ valid_ttff_cnt++;
+ valid_ttff_sum+=mnld_test_result_body.ttff[CURR];
+
+ mnld_test_result_body.ttff[MEAN] = valid_ttff_sum/valid_ttff_cnt;
+ //Find the MIN TTFF
+ if((mnld_test_result_body.ttff[MIN] == 0 ) || (mnld_test_result_body.ttff[MIN] > mnld_test_result_body.ttff[CURR]))
+ {
+ mnld_test_result_body.ttff[MIN] = mnld_test_result_body.ttff[CURR];
+ }
+ // Find the MAX TTFF
+ if(mnld_test_result_body.ttff[MAX] < mnld_test_result_body.ttff[CURR])
+ {
+ mnld_test_result_body.ttff[MAX] = mnld_test_result_body.ttff[CURR];
+ }
+ RLOGD("TTFF:%dms",mnld_test_ttff);
+ }
+
+ }else{
+ mnld_test_result_body.ttff[CURR] = mnld_test_ttff;
+ }
+ }
+
+ if(mnld_test_result_body.fix_type != 0)
+ {
+ //GNGGA,hhmmss.mss,...
+ if(strncmp(nmea+3,NMEA_GGA,strlen(NMEA_GGA)) == 0)
+ {
+ strncpy(mnld_test_result_body.utc_time, nmea+7, MNL_UTC_TIME_LEN);
+ mnld_test_result_body.utc_time[MNL_UTC_TIME_LEN-1] = '\0';
+ }
+ }else{
+ memset(mnld_test_result_body.utc_time, 0, MNL_UTC_TIME_LEN);
+ mnld_test_result_body.utc_time[0] = '-';
+ }
+
+ if(strncmp(nmea+3,NMEA_ACC,strlen(NMEA_ACC)) == 0)
+ {
+ mnld_test_result_body.location.legacyLocation.timestamp = timestamp;
+ mnld_test_show_test_result(&mnld_test_result_body);
+ }
+
+}
+
+void mnld_test_gps_set_capabilities(uint32_t capabilities)
+{
+
+ RLOGD("gps set capabilities");
+}
+
+void mnld_test_gps_acquire_wakelock(void)
+{
+
+ RLOGD("gps acquire wakelock");
+}
+
+void mnld_test_gps_release_wakelock(void)
+{
+
+ RLOGD("gps release wakelock");
+}
+
+void mnld_test_gps_request_utc_time(void)
+{
+
+ RLOGD("gps request utc time");
+}
+
+void mnld_test_set_system_info_cb(const GnssSystemInfo* info)
+{
+ RLOGD("set system info");
+}
+
+void mnld_test_gnss_sv_status_cb(GnssSvStatus_ext* sv_info)
+{
+ RLOGD(" zqc gnss sv status");
+}
+
+pthread_t mnld_test_gps_create_thread(const char* name, void (*start)(void *), void* arg)
+{
+ pthread_t ntid = 0;
+ int ret = 0;
+ ret = pthread_create(&ntid, NULL, start, arg);
+
+ if(ret != 0)
+ {
+ RLOGE("thread %s create fail(%s)!", name, strerror(errno));
+ ntid = 0;
+ }else{
+ RLOGD("tread %s create success!", name);
+ }
+
+ return ntid;
+}
+
+void mnld_test_gnss_set_name_cb(const char* name, int length)
+{
+ RLOGD("gnss set name");
+}
+
+void mnld_test_gnss_request_location_cb(bool independentFromGnss)
+{
+ RLOGD("gnss request location");
+}
+
+GpsCallbacks_ext mnld_test_gps_callbacks = {
+ .size = sizeof(GpsCallbacks_ext),
+ .location_cb = mnld_test_gps_location_callback,
+ .status_cb = mnld_test_gps_status_callback,
+ .sv_status_cb = mnld_test_gps_sv_status_callback,
+ .nmea_cb = mnld_test_gps_nmea_callback,
+ .set_capabilities_cb = mnld_test_gps_set_capabilities,
+ .acquire_wakelock_cb = mnld_test_gps_acquire_wakelock,
+ .release_wakelock_cb = mnld_test_gps_release_wakelock,
+ .create_thread_cb = mnld_test_gps_create_thread,
+ .request_utc_time_cb = mnld_test_gps_request_utc_time,
+ .set_system_info_cb = mnld_test_set_system_info_cb,
+ .gnss_sv_status_cb = mnld_test_gnss_sv_status_cb,
+ .set_name_cb = mnld_test_gnss_set_name_cb,
+ .request_location_cb = mnld_test_gnss_request_location_cb,
+};
+
+GpsCallbacks_ext* mnld_test__get_gps_callbacks(void)
+{
+ return &mnld_test_gps_callbacks;
+}
diff --git a/packages/apps/lynq-factorytest/src/gps/gps_test.h.tmp b/packages/apps/lynq-factorytest/src/gps/gps_test.h.tmp
new file mode 100644
index 0000000..db07f43
--- /dev/null
+++ b/packages/apps/lynq-factorytest/src/gps/gps_test.h.tmp
@@ -0,0 +1,83 @@
+#ifndef __LYNQ_GPS_TEST_H__
+#define __LYNQ_GPS_TEST_H__
+#include <gps_mtk.h>
+
+#define MNLD_TEST_CMD_OPEN "start"
+#define MNLD_TEST_CMD_CLOSE "stop"
+#define MNLD_TEST_CMD_NETWORK "network"
+#define MNLD_TEST_NETWORK_WIFI "wifi"
+#define MNLD_TEST_NETWORK_MOBILE "mobile"
+#define MNLD_TEST_NETWORK_ROAMING "roaming"
+#define MNLD_TEST_NETWORK_DISABLE "disable"
+
+#define MNL_VER_LEN 52
+#define MNL_UTC_TIME_LEN 11
+#define MNLD_TEST_TTFF_SESSION_BEGIN
+
+typedef enum{
+ MNLD_TEST_ACTION_UNKNOWN = -1,
+ MNLD_TEST_ACTION_GNSS_OPEN,
+ MNLD_TEST_ACTION_GNSS_CLOSE,
+ MNLD_TEST_ACTION_SET_NETWORK,
+ MNLD_TEST_ACTION_MAX
+} MNLD_TEST_ACTION;
+
+typedef enum{
+ MNLD_TEST_RESTART_TYPE_UNKNOWN = -1,
+ MNLD_TEST_RESTART_TYPE_HOT,
+ MNLD_TEST_RESTART_TYPE_WARM,
+ MNLD_TEST_RESTART_TYPE_COLD,
+ MNLD_TEST_RESTART_TYPE_FULL,
+ MNLD_TEST_RESTART_TYPE_MAX
+} MNLD_TEST_RESTART_TYPE;
+
+typedef enum{
+ CURR = 0,
+ MIN = 1,
+ MAX = 2,
+ MEAN = 3,
+ TTFF_NUM
+}MNLD_TEST_TTFF;
+
+typedef struct {
+ char chip_ver[12];
+ char mnl_ver[MNL_VER_LEN];
+ char clk_type;
+ char clk_buff;
+ int ttff[TTFF_NUM];//time-to-first_fix in ms
+ int fix_type;
+ GpsLocation_ext location;
+ char utc_time[MNL_UTC_TIME_LEN];
+}mnld_test_result;
+
+typedef struct{
+ char type_int;
+ char type_str[10];
+}clock_type;
+
+#define MNLD_TEST_CMD_CNT_MAX 5
+#define GPS_DELETE_EPHEMERIS 0x0001
+#define GPS_DELETE_ALMANAC 0x0002
+#define GPS_DELETE_POSITION 0x0004
+#define GPS_DELETE_TIME 0x0008
+#define GPS_DELETE_IONO 0x0010
+#define GPS_DELETE_UTC 0x0020
+#define GPS_DELETE_HEALTH 0x0040
+#define GPS_DELETE_SVDIR 0x0080
+#define GPS_DELETE_SVSTEER 0x0100
+#define GPS_DELETE_SADATA 0x0200
+#define GPS_DELETE_RTI 0x0400
+#define GPS_DELETE_CELLDB_INFO 0x8000
+#define GPS_DELETE_ALL 0xFFFF
+
+typedef void (*gpsStatusCb)(int stauts);
+GpsCallbacks_ext* mnld_test__get_gps_callbacks(void);
+//GpsInterface* gps_device__get_gps_interface(struct gps_device_t* device);
+
+void mnld_test_show_test_result(mnld_test_result* result);
+void mnld_test_get_mnl_ver(void);
+void register_gps_callback(gpsStatusCb cb);
+void get_gps_test();
+
+
+#endif //__MNLD_TEST_H__
diff --git a/packages/apps/lynq-factorytest/src/gps/gps_test.tmp b/packages/apps/lynq-factorytest/src/gps/gps_test.tmp
new file mode 100644
index 0000000..a1a7222
--- /dev/null
+++ b/packages/apps/lynq-factorytest/src/gps/gps_test.tmp
@@ -0,0 +1,620 @@
+#include <stdio.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <sys/time.h>
+#include <time.h>
+#include <signal.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <arpa/inet.h>
+#include <dlfcn.h>
+#include <stdlib.h>
+#include "hal2mnl_interface.h"
+#include "gps_mtk.h"
+#include "gps/gps_test.h"
+#include "mtk_lbs_utility.h"
+#include <log/log.h>
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#define LOG_TAG "mnldtest"
+#endif
+
+
+#ifdef CONFIG_GPS_MT3303
+#define MNLD_TEST_CHIP_VER "MT3303"
+#else
+#define MNLD_TEST_CHIP_VER "MT6630"
+#endif
+#define MNLD_TEST_MNL_VER mnld_test_mnl_ver
+#define MNLD_TEST_CLOCK_TYPE 0xFF
+#define MNLD_TEST_CLOCK_BUFF 2
+
+/*Socket port nubmer*/
+#define PORT 7000
+/*The max length of socket receive buffer*/
+#define MNL_TEST_REC_BUFF_LEN 2048
+
+#define MNL_TEST_MNL_VER_PMTK "$PMTK705"
+#define mnld_test_printf printf
+
+GpsCallbacks_ext* mnld_test_cbs = NULL;
+GpsInterface_ext* mnld_test_gpsinfs = NULL;
+gpsStatusCb gps_status_cb = NULL;
+
+int valid_ttff_cnt = 0;
+int valid_ttff_sum = 0;
+
+int mnld_test_session_end = 0;
+int mnld_test_ttff = 0;
+int mnld_test_restart_cnt = 0;
+int mnld_test_restart_time = 0;
+int mnld_test_restart_interval = 0;
+
+int mnld_test_network_type = NETWORK_TYPE_WIFI;
+int mnld_test_network_on = 0;
+int mnld_test_network_roaming = 0;
+
+timer_t mnld_test_restart_timer = 0;
+MNLD_TEST_RESTART_TYPE mnld_test_restart_type = MNLD_TEST_RESTART_TYPE_HOT;
+struct timespec mnld_test_gnss_open_tm;
+char mnld_test_mnl_ver[MNL_VER_LEN];
+extern mnld_test_result mnld_test_result_body;
+
+clock_type mnld_test_clock_type[] = {
+ {0xFE,"Co-Clock"},
+ {0xFF,"TCXO"}
+};
+
+#define MNLD_TEST_NETWORK_TYPE_STR_LEN 8
+const char mnld_test_network_type_str[][MNLD_TEST_NETWORK_TYPE_STR_LEN] = {
+ {"mobile"},
+ {"wifi"}
+};
+
+void mnld_test_show_help(void)
+{
+ RLOGD("ZHOUQUNCHAO,START");
+ mnld_test_printf("MNLD client test :\r\n");
+ mnld_test_printf("------------------------------------------------------------------------------\r\n");
+ mnld_test_printf("The command to start GNSS test:\r\n");
+ mnld_test_printf("\tmnld_test start [start type] [restart times] [restart interval]\r\n");
+ mnld_test_printf("\t\t[start type]: \r\n\t\th/H: hot start;\r\n\t\tw/W: Warm start;\r\n\t\tc/C: Cold start;\r\n\t\tf/F: Full start\r\n");
+ mnld_test_printf("\t\t[restart times]: integer value, range is 0-1000, default is 0(no restart, always on). \r\n");
+ mnld_test_printf("\t\t[restart interval]: integer value, range is 0-3600, the unit is second; the default value is 60\r\n");
+ mnld_test_printf("------------------------------------------------------------------------------\r\n");
+ mnld_test_printf("The command to stop GNSS test:\r\n");
+ mnld_test_printf("\tmnld_test stop\r\n");
+ mnld_test_printf("------------------------------------------------------------------------------\r\n");
+ mnld_test_printf("The command to update network status:\r\n");
+ mnld_test_printf("\tmnld_test network [type] [roaming]\r\n");
+ mnld_test_printf("\t[type]: wifi, mobile, disable\r\n");
+ mnld_test_printf("\t[roaming]: roaming, the mobile network is in roaming state\r\n");
+}
+
+/*
+Function:mnld_test_socket_open
+Description:open and connect a INET socket by given port number
+Param:[IN] port, the port number of socket
+Param:[OUT] fd, the socket fd
+Return:NULL -- some thing is incorrect; Other value -- open and connect sokcet successfully
+*/
+int mnld_test_socket_open(int port)
+{
+ struct sockaddr_in servaddr;
+ int socketfd = 0;
+
+ if((socketfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
+ {
+ RLOGE("Create socket error:%d,%s\n", errno, strerror(errno));
+ return socketfd;
+ }
+
+ memset(&servaddr, 0, sizeof(servaddr));
+ servaddr.sin_family = AF_INET;
+ servaddr.sin_port = htons(port);
+ servaddr.sin_addr.s_addr = INADDR_ANY;
+
+ if( connect(socketfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0 )
+ {
+ RLOGE("connect error:%d,%s\n", errno, strerror(errno));
+ return -1;
+ }
+
+ return(socketfd);
+}
+
+#ifdef CONFIG_GPS_MT3303
+void mnld_test_get_mnl_ver(void )
+{
+ LOGI("GNSS chip is 3303, there is no MNL.");
+ strcpy(mnld_test_mnl_ver, "GNSS chip is 3303,there is no MNL");
+}
+#else
+#ifdef MTK_ADR_SUPPORT
+void mnld_test_get_mnl_ver(void )
+{
+ LOGI("ADR has used the port 7000, the mnl version is static.");
+ strcpy(mnld_test_mnl_ver, "MNL_VER_18070301ALPS05_5.5U_25");
+}
+#else
+void mnld_test_get_mnl_ver(void )
+{
+ int sock_fd = 0;
+ int rec_len = 0;
+ int raw_socket_connected = 1;
+ char rec_buff[MNL_TEST_REC_BUFF_LEN+1] = {0};
+ char *mnl_ver_addr = NULL;
+ int i = 0;
+ int got_mnl_ver = 0;
+ int retry_cnt = 0;
+
+ if((sock_fd = mnld_test_socket_open(PORT)) < 0 )
+ {
+ RLOGE("Socket open error\n");
+ strcpy(mnld_test_mnl_ver,"UNKNOWN");
+ //raw_socket_connected = 0;
+ }else// if(raw_socket_connected)
+ {
+ char *outbuff = "$PMTK605*31\r\n";
+ int cmd_sent = 0;
+ do{
+ // if((cmd_sent == 0) && send(sock_fd,outbuff,strlen(outbuff)+1, 0) == -1)
+ if((cmd_sent == 0) && hal2mnl_send_pmtk(outbuff,strlen(outbuff)) == -1)
+ {
+ cmd_sent = 0;
+ RLOGE("Socket send error(%s)\n",strerror(errno));
+ }else{
+ cmd_sent = 1;
+ if((rec_len = recv(sock_fd, rec_buff, MNL_TEST_REC_BUFF_LEN, 0)) < 0)
+ {
+ RLOGE("Recieve error(%d):%s\n",errno, strerror(errno));
+ usleep(20000);
+ }else{
+ rec_buff[rec_len] = '\0';
+ if(strncmp(rec_buff, MNL_TEST_MNL_VER_PMTK, strlen(MNL_TEST_MNL_VER_PMTK)) == 0)
+ {
+ mnl_ver_addr = strstr(rec_buff,"MNL_VER");
+ strncpy(mnld_test_mnl_ver, mnl_ver_addr, strlen(mnl_ver_addr));
+ for(i=0;i<strlen(mnld_test_mnl_ver);i++)
+ {
+ if(mnld_test_mnl_ver[i] == ',')
+ {
+ mnld_test_mnl_ver[i] = '\0';
+ break;
+ }
+ }
+ got_mnl_ver = 1;
+ RLOGD("\nRCV[%d]:%s\n", rec_len, rec_buff);
+ }
+ //Parser
+ }
+ }
+ if(retry_cnt ++ >= 5)
+ {
+ RLOGE("Get mnl version fail\r\n");
+ strcpy(mnld_test_mnl_ver,"UNKNOWN");
+ break;
+ }
+ }while(!got_mnl_ver);
+ close(sock_fd);
+ }
+}
+#endif
+#endif
+
+void mnld_test_open_gnss(MNLD_TEST_RESTART_TYPE restart_type, GpsInterface_ext* gps_interface, GpsCallbacks_ext* gps_cbs)
+{
+ GpsCallbacks_ext* cbs = gps_cbs;
+ GpsInterface_ext* gpsinterface = gps_interface;
+ switch(restart_type) {
+ case MNLD_TEST_RESTART_TYPE_HOT:
+ RLOGD("Hot Start\n");
+ hal2mnl_gps_delete_aiding_data(GPS_DELETE_RTI);
+ break;
+ case MNLD_TEST_RESTART_TYPE_WARM:
+ RLOGD("Warm Start\n");
+ hal2mnl_gps_delete_aiding_data(GPS_DELETE_EPHEMERIS);
+ break;
+ case MNLD_TEST_RESTART_TYPE_COLD:
+ RLOGD("Cold Start\n");
+ hal2mnl_gps_delete_aiding_data(GPS_DELETE_EPHEMERIS |
+ GPS_DELETE_POSITION | GPS_DELETE_TIME | GPS_DELETE_IONO |
+ GPS_DELETE_UTC | GPS_DELETE_HEALTH);
+ break;
+ case MNLD_TEST_RESTART_TYPE_FULL:
+ RLOGD("Full Start\n");
+ hal2mnl_gps_delete_aiding_data(GPS_DELETE_ALL);
+ break;
+ default:
+ RLOGE("ERR: read unhandled value=[%d]\n", restart_type);
+ return;
+ }
+ if(gpsinterface != NULL && cbs != NULL)
+ {
+ gpsinterface->init(cbs);
+ //hal2mnl_update_network_state(1,NETWORK_TYPE_WIFI,0,"NULL");
+ //hal2mnl_update_network_state(mnld_test_network_on,mnld_test_network_type,mnld_test_network_roaming,"NULL");
+ gpsinterface->start();
+ memset(&(mnld_test_result_body.location),0,sizeof(GpsLocation));
+ mnld_test_result_body.fix_type = 0;
+ mnld_test_ttff = 0;
+ mnld_test_session_end = 0;
+ // usleep(500000);
+ // mnld_test_connect_mnl();
+ #ifndef MNLD_TEST_TTFF_SESSION_BEGIN
+ if(clock_gettime(CLOCK_BOOTTIME,&mnld_test_gnss_open_tm) == -1)
+ {
+ RLOGE("Fail to get time(%s).",strerror(errno));
+ }
+ #endif
+ }else{
+ RLOGE("param error:%d, %d",gpsinterface, cbs);
+ }
+}
+
+void mnld_test_close_gnss(GpsInterface_ext* gps_interface)
+{
+ GpsInterface_ext* gpsinterface = gps_interface;
+// gpsinterface = gps_device__get_gps_interface("mnld_test stop");
+ if(gpsinterface != NULL)
+ {
+ gpsinterface->cleanup();
+ gpsinterface->stop();
+ }else{
+ RLOGE("[%s]param error\r\n",__func__);
+ }
+
+}
+
+
+void mnld_test_gnss_restart(void)
+{
+ int retry_cnt = 0;
+ if(mnld_test_restart_cnt < mnld_test_restart_time)
+ {
+ mnld_test_restart_cnt++;
+ mnld_test_close_gnss(mnld_test_gpsinfs);
+ while(!mnld_test_session_end)
+ {
+ if(retry_cnt++>500)
+ {
+ RLOGW("[%s] wait gnss close timeout\r\n",__func__);
+ break;
+ }
+ usleep(10000);
+ }
+ mnld_test_open_gnss(mnld_test_restart_type,mnld_test_gpsinfs,mnld_test_cbs);
+ start_timer(mnld_test_restart_timer,mnld_test_restart_interval*1000);
+ }else{
+ stop_timer(mnld_test_restart_timer);
+ }
+}
+
+char* mnld_test_get_clock_type_str(int clock_type_int)
+{
+ int i = 0;
+ int len = sizeof(mnld_test_clock_type)/sizeof(clock_type);
+
+ for(i=0;i<len;i++)
+ {
+ if(clock_type_int == mnld_test_clock_type[i].type_int)
+ {
+ break;
+ }
+ }
+
+ if(i < len)
+ {
+ return(mnld_test_clock_type[i].type_str);
+ }else{
+ return("Unknown");
+ }
+}
+
+void mnld_test_show_test_result(mnld_test_result* result)
+{
+ if(NULL != result)
+ {
+ memcpy(result->chip_ver,MNLD_TEST_CHIP_VER,sizeof(MNLD_TEST_CHIP_VER));
+ memcpy(result->mnl_ver,MNLD_TEST_MNL_VER,strlen(MNLD_TEST_MNL_VER));
+ result->clk_type = MNLD_TEST_CLOCK_TYPE;
+ result->clk_buff = MNLD_TEST_CLOCK_BUFF;
+
+ //system("clear");
+ RLOGD("---------------------------------------------");
+ RLOGD("Chip:%s",result->chip_ver);
+ RLOGD("MNL Version:%s",result->mnl_ver);
+ RLOGD("Clock Type:%s",mnld_test_get_clock_type_str(result->clk_type));
+ RLOGD("Clock Buffer:%d",result->clk_buff);
+ RLOGD("---------------------------------------------");
+ if(result->ttff[CURR] == 0)
+ {
+ RLOGD("TTFF: - ");
+ }else{
+ RLOGD("TTFF: %d ms",result->ttff[CURR]);
+ }
+
+ if(result->ttff[MIN] == 0)
+ {
+ RLOGD("TTFF min: - ");
+ }else{
+ RLOGD("TTFF min: %d ms",result->ttff[MIN]);
+ }
+
+ if(result->ttff[MAX] == 0)
+ {
+ RLOGD("TTFF max: - ");
+ }else{
+ RLOGD("TTFF max: %d ms",result->ttff[MAX]);
+ }
+
+ if(result->ttff[MEAN] == 0)
+ {
+ RLOGD("TTFF mean: - ");
+ }else{
+ RLOGD("TTFF mean: %d ms",result->ttff[MEAN]);
+ }
+ RLOGD("---------------------------------------------");
+ RLOGD("zqc Fix Type: %d",result->fix_type);
+ RLOGD("zqc Flags: 0x%x",result->location.legacyLocation.flags);
+ RLOGD("zqc Latitude: %.10lf",result->location.legacyLocation.latitude);
+ RLOGD("Longtitude: %.10lf",result->location.legacyLocation.longitude);
+ RLOGD("Altitude: %.10lf",result->location.legacyLocation.altitude);
+ RLOGD("Speed: %fm/s",result->location.legacyLocation.speed);
+ RLOGD("Bearing: %f",result->location.legacyLocation.bearing);
+// RLOGD("Time stamp: %d",result->location.timestamp);
+ RLOGD("horizontalAccuracyMeters: %f",result->location.horizontalAccuracyMeters);
+ RLOGD("verticalAccuracyMeters: %f",result->location.verticalAccuracyMeters);
+ RLOGD("speedAccuracyMetersPerSecond: %f",result->location.speedAccuracyMetersPerSecond);
+ RLOGD("bearingAccuracyDegrees: %f",result->location.bearingAccuracyDegrees);
+ RLOGD("Utc time: %s",result->utc_time);
+ RLOGD("---------------------------------------------");
+ RLOGD("GNSS testing(%d).",mnld_test_restart_cnt);
+ }
+}
+
+void get_gps_test(){
+ void *handle;
+ char *error;
+ struct gps_device_t_ext *gpsdev = NULL;
+ mnld_test_restart_time = 0;
+ mnld_test_restart_interval = 60;//Default is 60s
+ mnld_test_restart_type = MNLD_TEST_RESTART_TYPE_HOT;
+ handle = dlopen(LIB_GNSS_HAL_DIR"/libgpshal.so.0", RTLD_LAZY);
+ if (!handle) {
+ fprintf(stderr, "%s\n", dlerror());
+ exit(EXIT_FAILURE);
+ }
+ gpsdev = (struct gps_device_t_ext *)dlsym(handle, "linux_gps_device");
+ if ((error = dlerror()) != NULL) {
+ fprintf(stderr, "%s\n", error);
+ exit(EXIT_FAILURE);
+ }
+ mnld_test_gpsinfs = (GpsInterface_ext*)gpsdev->get_gps_interface(gpsdev);
+ RLOGE("zhouqunchao,%s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
+ mnld_test_cbs = mnld_test__get_gps_callbacks();//&mnld_test_gps_callbacks;
+ memset(&mnld_test_result_body,0,sizeof(mnld_test_result));
+ mnld_test_open_gnss(mnld_test_restart_type,mnld_test_gpsinfs,mnld_test_cbs);
+ if(mnld_test_restart_interval != 0)
+ {
+ mnld_test_restart_timer = init_timer(mnld_test_gnss_restart);
+ start_timer(mnld_test_restart_timer,mnld_test_restart_interval*1000);
+ }
+}
+
+
+
+void register_gps_callback(gpsStatusCb cb){
+ gps_status_cb = cb;
+}
+void mnld_get_gps_status(int result){
+ RLOGD("mnld_get_gps_status,%s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
+ gps_status_cb(result);
+}
+/*
+void main(int argc, char** argv)
+{
+ struct sigaction actions;
+
+ actions.sa_handler = daemon_sighlr;
+ sigemptyset(&actions.sa_mask);
+ actions.sa_flags = 0;
+ sigaction(SIGUSR1, &actions, NULL);
+ sigaction(SIGINT, &actions, NULL);
+ sigaction(SIGTTIN, &actions, NULL);
+ sigaction(SIGKILL, &actions, NULL);
+ sigaction(SIGTERM, &actions, NULL);
+ RLOGD("ZHOUQUNCHAO,START");
+ mnld_test_printf("main zhouqunchao:\r\n");
+ pthread_mutex_init(&main_mutex, NULL);
+ pthread_cond_init(&main_cond, NULL);
+
+ int exit_flag = 0;
+ int cnt = 0;
+ int index = 0;
+ int ret = 0;
+ char input_c = 0;
+ char *error;
+ struct gps_device_t_ext *gpsdev = NULL;
+ void *handle;
+ MNLD_TEST_ACTION action = MNLD_TEST_ACTION_UNKNOWN;
+ //Show the recieved command
+ RLOGD("ZHOUQUNCHAO,START");
+ for(index=0; index<argc; index++)
+ {
+ mnld_test_printf("%s ",argv[index]);
+ }
+ mnld_test_printf("\r\n");
+
+ if(argc >= 2 && argc <= MNLD_TEST_CMD_CNT_MAX)
+ {
+ if(!strncmp(argv[1], MNLD_TEST_CMD_OPEN, strlen(MNLD_TEST_CMD_OPEN)))//Open GNSS
+ {
+ action = MNLD_TEST_ACTION_GNSS_OPEN;
+ //re-init restart parameters
+ mnld_test_restart_time = 0;
+ mnld_test_restart_interval = 60;//Default is 60s
+ mnld_test_restart_type = MNLD_TEST_RESTART_TYPE_HOT;
+
+ switch(argc)
+ {
+ case 5://No break
+ mnld_test_restart_interval = atoi(&argv[4][0]);
+ case 4://No break
+ mnld_test_restart_time = atoi(&argv[3][0]);
+ case 3://No break
+ mnld_test_restart_type = mnld_test_get_restart_type(argv[2][0]);
+ case 2://No break
+ case 1://No break
+ default:
+ break;
+ }
+ RLOGD("mnld_test start.\r\n");
+ if(mnld_test_restart_time > 1000)
+ {
+ RLOGE("The max value of restart time is 1000, %d is over this range\r\n",mnld_test_restart_time);
+ mnld_test_restart_time = 1000;
+ }
+
+ if(mnld_test_restart_interval > 3600)
+ {
+ RLOGE("The max value of restart interval is 3600s(1h), %d is over this range\r\n",mnld_test_restart_interval);
+ mnld_test_restart_interval = 3600;
+ }
+
+ if(mnld_test_restart_time <= 0)//No restart
+ {
+ mnld_test_restart_interval = 0;
+ }
+ RLOGD("restart_time:%d, restart_interval:%ds,restart_type:%d\r\n",mnld_test_restart_time,mnld_test_restart_interval,mnld_test_restart_type);
+ exit_flag = 0;
+ }else if(!strncmp(argv[1],MNLD_TEST_CMD_CLOSE, strlen(MNLD_TEST_CMD_CLOSE))){//Close GNSS
+ action = MNLD_TEST_ACTION_GNSS_CLOSE;
+ RLOGD("mnld_test stop.\r\n");
+ exit_flag = 0;
+ }else if(!strncmp(argv[1], MNLD_TEST_CMD_NETWORK, strlen(MNLD_TEST_CMD_NETWORK))){
+ RLOGD("mnld_test set network.\r\n");
+ exit_flag = 0;
+ if(argc == 3)
+ {
+ if(!strncmp(argv[2], MNLD_TEST_NETWORK_WIFI, strlen(MNLD_TEST_NETWORK_WIFI)))
+ {
+ mnld_test_network_type = NETWORK_TYPE_WIFI;
+ mnld_test_network_on = 1;
+ mnld_test_network_roaming = 0;
+ }else if(!strncmp(argv[2],MNLD_TEST_NETWORK_MOBILE, strlen(MNLD_TEST_NETWORK_MOBILE))){
+ mnld_test_network_type = NETWORK_TYPE_MOBILE;
+ mnld_test_network_on = 1;
+ mnld_test_network_roaming = 0;
+ }else if(!strncmp(argv[2],MNLD_TEST_NETWORK_DISABLE, strlen(MNLD_TEST_NETWORK_DISABLE))) {
+ mnld_test_network_type = NETWORK_TYPE_WIFI;
+ mnld_test_network_on = 0;
+ mnld_test_network_roaming = 0;
+ }else{
+ LOGW("Network set fail!Unknown command!(%d)\r\n", argc);
+ mnld_test_show_help();
+ exit_flag = 1;
+ }
+ }else if(argc == 4){
+ if(!strncmp(argv[2],MNLD_TEST_NETWORK_MOBILE, strlen(MNLD_TEST_NETWORK_MOBILE)) && !strncmp(argv[3],MNLD_TEST_NETWORK_ROAMING, strlen(MNLD_TEST_NETWORK_ROAMING)))
+ {
+ mnld_test_network_type = NETWORK_TYPE_MOBILE;
+ mnld_test_network_on = 1;
+ mnld_test_network_roaming = 1;
+ }else{
+ LOGW("Network set fail!Unknown command!(%d)\r\n", argc);
+ mnld_test_show_help();
+ exit_flag = 1;
+ }
+ }else{
+ LOGW("Network set fail! Error cmd count(%d).\r\n",argc);
+ mnld_test_show_help();
+ exit_flag = 1;
+ }
+
+ RLOGD("network, type:%s, on:%d, roaming:%d.\r\n",mnld_test_network_type_str[mnld_test_network_type], mnld_test_network_on, mnld_test_network_roaming);
+ action = MNLD_TEST_ACTION_SET_NETWORK;
+ }else{
+ RLOGE("Unknown command!\r\n");
+ mnld_test_show_help();
+ exit_flag = 1;
+ }
+ }else{
+ RLOGE("Unknown command!\r\n");
+ mnld_test_show_help();
+ exit_flag = 1;
+ }
+
+ if(!exit_flag)
+ {
+ handle = dlopen(LIB_GNSS_HAL_DIR"/libgpshal.so.0", RTLD_LAZY);
+ if (!handle) {
+ fprintf(stderr, "%s\n", dlerror());
+ exit(EXIT_FAILURE);
+ }
+
+ gpsdev = (struct gps_device_t_ext *)dlsym(handle, "linux_gps_device");
+ if ((error = dlerror()) != NULL) {
+ fprintf(stderr, "%s\n", error);
+ exit(EXIT_FAILURE);
+ }
+ mnld_test_gpsinfs = (GpsInterface_ext*)gpsdev->get_gps_interface(gpsdev);
+ RLOGE("zhouqunchao,%s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
+ mnld_test_cbs = mnld_test__get_gps_callbacks();//&mnld_test_gps_callbacks;
+ switch(action)
+ {
+ case MNLD_TEST_ACTION_GNSS_OPEN:
+
+ valid_ttff_cnt = 0;
+ valid_ttff_sum = 0;
+
+ memset(&mnld_test_result_body,0,sizeof(mnld_test_result));
+ mnld_test_open_gnss(mnld_test_restart_type,mnld_test_gpsinfs,mnld_test_cbs);
+ //system("clear");
+ if(mnld_test_restart_interval != 0)
+ {
+ mnld_test_restart_timer = init_timer(mnld_test_gnss_restart);
+ start_timer(mnld_test_restart_timer,mnld_test_restart_interval*1000);
+ }
+ pthread_mutex_lock(&main_mutex);
+ while(main_running) {
+ LOGI("main thread going....\n");
+ pthread_cond_wait(&main_cond, &main_mutex);
+ LOGI("some signal catched, go to exit!!!\n");
+ }
+ pthread_mutex_unlock(&main_mutex);
+ exit_flag = 1;
+ break;
+
+ case MNLD_TEST_ACTION_GNSS_CLOSE:
+ mnld_test_close_gnss(mnld_test_gpsinfs);
+
+ exit_flag = 1;
+ break;
+
+ case MNLD_TEST_ACTION_SET_NETWORK:
+
+ ret = hal2mnl_update_network_state(mnld_test_network_on,mnld_test_network_type,mnld_test_network_roaming,"NULL");
+ if(-1 == ret)
+ {
+ RLOGE("Network set fail!\r\n");
+ }else{
+ RLOGD("Network set successfully! type: %s,on:%d,roaming:%d\r\n",mnld_test_network_type_str[mnld_test_network_type],mnld_test_network_on,mnld_test_network_roaming);
+ }
+ exit_flag = 1;
+ break;
+
+ default:
+ LOGW("Unknown action(%d)\r\n",action);
+ mnld_test_show_help();
+ break;
+ }
+
+ }
+ pthread_cond_destroy(&main_cond);
+ pthread_mutex_destroy(&main_mutex);
+}
+*/
diff --git a/packages/apps/lynq-factorytest/src/main.cpp b/packages/apps/lynq-factorytest/src/main.cpp
new file mode 100644
index 0000000..5736132
--- /dev/null
+++ b/packages/apps/lynq-factorytest/src/main.cpp
@@ -0,0 +1,75 @@
+/*
+* Copyright (C) 2014 MediaTek Inc.
+*
+* Modification based on code covered by the below mentioned copyright
+* and/or permission notice(s).
+*/
+
+/*
+**
+** Copyright 2006 The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <dlfcn.h>
+#include <string.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+//#include <vendor-ril/telephony/ril.h>
+#include <log/log.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <libtel/lib_tele.h>
+//#include "libtel/lynq_call.h"
+//#include "libtel/lynq_sim.h"
+#include <pthread.h>
+#include <sys/types.h>
+
+
+
+#include <factory_main.h>
+#include "common.h"
+
+
+#undef LOG_TAG
+#define LOG_TAG "FACTORY_TEST"
+void lynq_incoming_call_cb(RIL_SOCKET_ID soc_id,int index, char * addr, RIL_CallState state, int toa)
+{
+ printf("[SIM%d]index is %d,addr is %s,state is %d,toa is %d\n",soc_id,index,addr,state,toa);
+}
+
+void lynq_recive_new_sms_cb(RIL_SOCKET_ID soc_id,char * num, char * smsc, char * msg, int charset)
+{
+ printf("[SIM%d]num is %s,smsc is %s,msg is %s,charset is %d\n",soc_id,num,smsc,msg,charset);
+}
+static user_cb mytest={
+ lynq_recive_new_sms_cb,
+ lynq_incoming_call_cb
+};
+int main(int argc, char **argv) {
+ RLOGD("main\n");
+ lynqRegisterUnsolicitedResponse(&mytest);
+ //RLOGD("responseCallback,%p \n",responseCallback);
+ lynq_ril_init();
+ //call_Info_Init();
+ //init_sim();
+ lynqStartEventLoop();
+ while (true) {
+ sleep(UINT32_MAX);
+ }
+}
diff --git a/packages/apps/lynq-factorytest/src/makefile b/packages/apps/lynq-factorytest/src/makefile
new file mode 100644
index 0000000..38a00c8
--- /dev/null
+++ b/packages/apps/lynq-factorytest/src/makefile
@@ -0,0 +1,110 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+ -g -Os \
+ -flto \
+ -DRIL_SHLIB \
+ -DATCI_PARSE \
+ -DKEEP_ALIVE \
+ -D__LINUX_OS__ \
+ -DECALL_SUPPORT
+
+$(warning ################# C2K support: $(RAT_CONFIG_C2K_SUPPORT))
+ifeq ($(strip $(RAT_CONFIG_C2K_SUPPORT)), yes)
+ LOCAL_CFLAGS += -DC2K_SUPPORT
+
+endif
+
+ifeq ($(strip $(MTK_MULTI_SIM_SUPPORT)), dsds)
+ LOCAL_CFLAGS += -DANDROID_SIM_COUNT_2 \
+ -DANDROID_MULTI_SIM \
+ -DMODE_DSDS
+endif
+
+ifeq ($(strip $(MTK_MULTI_SIM_SUPPORT)), dsss)
+ LOCAL_CFLAGS += -DMODE_DSSS
+endif
+
+$(warning ################# TARGET_PLATFORM: $(TARGET_PLATFORM))
+ifeq ($(strip $(TARGET_PLATFORM)), mt2731)
+#$(warning #################add for debug $(ROOT), $(includedir))
+$(warning ################# TARGET_PLATFORM_MT2731)
+ LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2731 \
+ -DMD_93_SUPPORT
+else ifeq ($(strip $(TARGET_PLATFORM)), mt2635)
+$(warning ################# TARGET_PLATFORM_MT2635)
+ LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2635 \
+ -DMD_90_SUPPORT
+endif
+
+
+LOCAL_PATH = .
+#CFLAGS = $(LOCAL_CFLAGS) -std=c99
+#CXXFLAGS = $(LOCAL_CFLAGS) -std=gnu++14
+$(warning ################# ZHOUQUNCHAO ROOT: $(ROOT),includedir:$(includedir),LOCAL_PATH:$(LOCAL_PATH))
+LOCAL_C_INCLUDES = \
+ -I. \
+ -I$(LOCAL_PATH) \
+ -I$(ROOT)$(includedir)/logger \
+ -I$(ROOT)$(includedir)/vendor-ril \
+ -I$(ROOT)$(includedir)/libtel \
+ -I$(ROOT)$(includedir)/libdriver \
+ -I$(ROOT)$(includedir)/gstreamer-1.0 \
+ -I$(ROOT)$(includedir)/glib-2.0 \
+ -I$(ROOT)$(libdir)/glib-2.0/include \
+ -I$(ROOT)$(libdir)/gstreamer-1.0/include\
+ -I$(ROOT)$(includedir)/dbus-1.0 \
+ -I../gps_hal/inc \
+ -I../gps_hal/inc/hardware \
+ -I$(ROOT)$(libdir)/dbus-1.0/include \
+ -DLIB_GNSS_HAL_DIR='"$(libdir)"'
+
+LOCAL_C_INCLUDES+=$(DNS_FLAGS)
+
+LOCAL_LIBS := \
+ -L. \
+ -ldl \
+ -lstdc++ \
+ -llog \
+ -lsncfg \
+ -lcutils \
+ -lutils \
+ -lpower \
+ -lbinder \
+ -lpthread \
+ -lrt \
+ -ltel-ril \
+ -lcontrol \
+ -lgpshal \
+ -lasound \
+ -lpal \
+ -lgstreamer-1.0 \
+ -lglib-2.0 \
+ -lgstbase-1.0 \
+ -lgstreamer-1.0 \
+ -lgobject-2.0 \
+ -lgio-2.0 \
+ -ldtmf \
+ -lapn \
+ -ldbus-1 \
+
+LOCAL_SRC_FILES_CPP = $(wildcard *.cpp gpio/*.cpp ril/*.cpp)
+LOCAL_SRC_FILES_C = $(wildcard *.c gps/*.c)
+EXECUTABLE = lynq-factorytest
+
+OBJECTS=$(LOCAL_SRC_FILES_CPP:.cpp=.o) $(LOCAL_SRC_FILES_C:.c=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+ $(CXX) $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o: %.c
+ $(warning ----->build $<)
+ $(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+%.o : %.cpp
+ $(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+ $(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/packages/apps/lynq-factorytest/src/menu/api_menu.h b/packages/apps/lynq-factorytest/src/menu/api_menu.h
new file mode 100644
index 0000000..e4a84df
--- /dev/null
+++ b/packages/apps/lynq-factorytest/src/menu/api_menu.h
@@ -0,0 +1,96 @@
+#ifndef __LYNQ_TEST_MENU__
+#define __LYNQ_TEST_MENU__
+#include "common.h"
+/* module api test menu*/
+typedef enum {
+ RIL_API = 0,
+ GPIO_API,
+ WIFI_API,
+ GPS_API,
+ MQTT_API,
+}API_MENU;
+typedef enum {
+ SET_GPIO = 0,
+ GET_GPIO,
+}DRIVER_MENU;
+
+factory_arry_t call_api_menu[] ={
+ {"dail a call",0,NULL,1,0},
+ {"answer call",0,NULL,0,0},
+ {"hang up call",0,NULL,1,0},
+ {"reject call",0,NULL,0,0},
+ {"auto answer call",0,NULL,1,0},
+ {"set mute status",0,NULL,1,0},
+ {"get mute status",0,NULL,0,0},
+ {"set DTMF",0,NULL,1,0},
+ {"set DTMF volume",0,NULL,1,0},
+ {"do multi conference",0,NULL,0,0},
+ {"other call hold",0,NULL,1,0},
+ {"hang up waiting call",0,NULL,0,0},
+ {"hang up foreground and resume background",0,NULL,0,0},
+ {"switch waiting or holding and active ",0,NULL,0,0},
+ {"get last call fail cause",0,NULL,0,0},
+};
+factory_arry_t network_api_menu[] = {
+ {"query operator",0,NULL,0,0},
+ {"query network selection mode",0,NULL,0,0},
+ {"set network selection mode",0,NULL,1,0},
+ {"query available network",0,NULL,0,0},
+ {"query registration state",0,NULL,1,0},
+ {"query prefferred network type",0,NULL,0,0},
+ {"set prefferred network type",0,NULL,1,0},
+ {"query cell info",0,NULL,0,0},
+ {"set unsol cell info list rate",0,NULL,1,0},
+ {"query neighboring cell IDs",0,NULL,0,0},
+ {"set band mode",0,NULL,1,0},
+ {"query available band mode",0,NULL,0,0},
+ {"radio on",0,NULL,1,0},
+ {"query radio tech",0,NULL,0,0},
+ {"solicited signal strength",0,NULL,0,0},
+ {"modem on",0,NULL,1,0},
+};
+factory_arry_t data_api_menu[] ={
+ {"setup data call",0,NULL,0,0},
+ {"deactivte data call",0,NULL,0,0},
+ {"get data call list",0,NULL,0,0},
+
+};
+
+factory_arry_t sim_api_menu[] ={
+ {"get sim status",0,NULL,0,0},
+ {"get imsi",0,NULL,0,0},
+};
+
+factory_arry_t sms_api_menu[] ={
+ {"send sms",0,NULL,1,0},
+ {"ims send sms",0,NULL,1,0},
+ {"write sms to sim",0,NULL,1,0},
+ {"report sms memory status",0,NULL,1,0},
+ {"deleted sms on sim",0,NULL,1,0},
+ {"get smsc address",0,NULL,0,0},
+ {"set smsc address",0,NULL,1,0},
+};
+
+
+factory_arry_t ril_api_menu[] = {
+ {"CALL",NUM_ITEMS(call_api_menu),call_api_menu,1,0},
+ {"NETWORK",NUM_ITEMS(network_api_menu),network_api_menu,1,0},
+ {"DATA",NUM_ITEMS(data_api_menu),data_api_menu,1,0},
+ {"SMS",NUM_ITEMS(sms_api_menu),sms_api_menu,1,0},
+ {"SIM",NUM_ITEMS(sim_api_menu),sim_api_menu,1,0},
+};
+factory_arry_t gpio_api_menu[] = {
+ {"gpio set",0,NULL,1,0},
+ {"gpio get",0,NULL,1,0},
+};
+
+factory_arry_t api_menu[] = {
+ {"Ril",NUM_ITEMS(ril_api_menu),ril_api_menu,0,0},
+ {"gpio",NUM_ITEMS(gpio_api_menu),gpio_api_menu,0,0},
+ {"wifi",0,NULL,0,0},
+ {"gps",0,NULL,0,0},
+ {"mqtt",0,NULL,0,0},
+};
+
+
+#endif
diff --git a/packages/apps/lynq-factorytest/src/menu/demo_menu.h b/packages/apps/lynq-factorytest/src/menu/demo_menu.h
new file mode 100644
index 0000000..8f4b145
--- /dev/null
+++ b/packages/apps/lynq-factorytest/src/menu/demo_menu.h
@@ -0,0 +1,18 @@
+#ifndef __LYNQ_DEMO_MENU__
+#define __LYNQ_DEMO_MENU__
+#include "common.h"
+/* module api test menu*/
+typedef enum {
+ DEMO_TEST1 = 0,
+ DEMO_TEST2,
+ DEMO_TEST3,
+ DEMO_TEST4,
+}DEMO_ENUM;
+factory_arry_t demo_menu[] = {
+ {"demo1",0,NULL,0,0},
+ {"demo2",0,NULL,0,0},
+ {"demo3",0,NULL,0,0},
+ {"demo4",0,NULL,0,0},
+};
+
+#endif
diff --git a/packages/apps/lynq-factorytest/src/menu/factory_menu.h b/packages/apps/lynq-factorytest/src/menu/factory_menu.h
new file mode 100644
index 0000000..ffbc4d4
--- /dev/null
+++ b/packages/apps/lynq-factorytest/src/menu/factory_menu.h
@@ -0,0 +1,27 @@
+#ifndef __LYNQ_FACTORY_MENU__
+#define __LYNQ_FACTORY_MENU__
+#include "common.h"
+factory_arry_t manual_menu[] ={
+ {"telephone test",0,NULL,0,0},
+ {"Sim test",0,NULL,0,0},
+ {"gps test",0,NULL,0,0},
+ {"gpio test",0,NULL,0,0},
+};
+
+factory_arry_t imei_menu[] ={
+ {"imei",0,NULL,0,0},
+};
+
+
+factory_arry_t set_get[] = {
+ {"get",0,NULL,0,0},
+ {"set",0,NULL,1,0},
+};
+factory_arry_t phone_menu[] ={
+ {"phone",NUM_ITEMS(imei_menu),imei_menu,0,0},
+};
+factory_arry_t config[] ={
+ {"Phone number",NUM_ITEMS(set_get),set_get,0,0},
+ {"SMS message",NUM_ITEMS(set_get),set_get,0,0},
+};
+#endif
diff --git a/packages/apps/lynq-factorytest/src/rfAutomaticTest.cpp b/packages/apps/lynq-factorytest/src/rfAutomaticTest.cpp
new file mode 100644
index 0000000..7003dad
--- /dev/null
+++ b/packages/apps/lynq-factorytest/src/rfAutomaticTest.cpp
@@ -0,0 +1,202 @@
+#include "rfAutomaticTest.h"
+#include<common.h>
+/*
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "gps/gps_test.h"
+#ifdef __cplusplus
+}
+#endif
+*/
+#include <log/log.h>
+#include "libtel/lynq_call.h"
+#include "libtel/lynq_sim.h"
+#undef LOG_TAG
+#define LOG_TAG "Factory_RfAutomaticTxTest"
+//extern void get_gps_test();
+//extern C lynq_get_sim_status();
+const int RfAutomaticTest::MSG_TELE = 3;
+const int RfAutomaticTest::MSG_GPS = 2;
+const int RfAutomaticTest::MSG_SIM = 1;
+const int RfAutomaticTest::MSG_NULL = 0;
+
+RfAutomaticTest* RfAutomaticTest::m_instance = NULL;
+std::mutex RfAutomaticTest::mMutex;
+// Method implements of RequestHandleThread
+RfAutomaticTest::RequestHandleThread::RequestHandleThread(RfAutomaticTest* tx) : m_looper(NULL) {
+ mTx = tx;
+ RLOGD( "RequestHandleThread created");
+}
+
+RfAutomaticTest::RequestHandleThread::~RequestHandleThread() {
+ mTx = NULL;
+ RLOGD( "RequestHandleThread destroyed");
+}
+RfAutomaticTest::RfRequestMessage::RfRequestMessage(RfAutomaticTest* tx) : mTx(tx),mMsgType(0),
+ response(""),responselen(0), slot(0), e(ERROR) {
+}
+
+RfAutomaticTest::RfRequestMessage::~RfRequestMessage() {
+ RLOGD( "RequestHandleThread destroyed");
+}
+
+void RfAutomaticTest::RfRequestHandler::handleMessage(const Message& message) {
+ RLOGD( "handleMessage msg->mMsgType: %d", mMsg->mMsgType);
+ if(mTx != NULL) {
+ mTx->factory_test_onebyone(mMsg);
+ } else {
+ RLOGD( "handleMessage mTx is null");
+ }
+}
+void RfAutomaticTest::factory_test_onebyone(sp<RfRequestMessage> msg){
+ RLOGD( "FactoryTestOneByOne, type: %d,slot:%d,auto_reqId:%d", msg->mMsgType,msg->slot,auto_reqId);
+ int responselen = msg->responselen;
+ std::string response = msg->response;
+ if(msg->slot != 0){
+ RLOGD("%s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
+ if(msg->slot == auto_reqId){
+ RLOGD("%s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
+ switch (msg->mMsgType) {
+ // case MSG_NULL: {
+ // mCurrentFlag = MSG_SIM;
+ // auto_reqId = lynq_get_sim_status();
+ // }
+ case MSG_SIM: {
+ RLOGD("%s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
+
+ if(msg->e == SUCCESS){
+ mFactoryResult[0] = 1;
+ }else{
+ mFactoryResult[0] = 0;
+ mFactoryResult[1] = 0;
+ mCurrentFlag = MSG_GPS;
+ // get_gps_test();
+ break;
+ }
+ mCurrentFlag = MSG_TELE;
+ // auto_reqId = get_call();
+ auto_reqId = 88;
+ RLOGD( "get_call,auto_reqId:%d",auto_reqId);
+ break;
+ }
+ case MSG_TELE:{
+ if(msg->e == SUCCESS){
+ mFactoryResult[1] = 1;
+ RLOGD("%s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
+ }else{
+ mFactoryResult[1] = 0;
+ RLOGD("%s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
+
+ }
+ mCurrentFlag = MSG_GPS;
+ // get_gps_test();
+ break ;
+ }
+ default:
+ break;
+ }
+ }
+}else if(msg->mMsgType == MSG_NULL ){
+ RLOGD("%s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
+ mCurrentFlag = MSG_SIM;
+ auto_reqId = 99;
+ //auto_reqId = lynq_get_sim_status();
+ RLOGD( "lynq_get_sim_status,auto_reqId:%d",auto_reqId);
+
+ }
+else if(MSG_GPS == msg->mMsgType){
+ int i;
+ RLOGD("%s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
+
+ if(msg->e == SUCCESS){
+ mFactoryResult[2] = 1;
+ }else{
+ mFactoryResult[2] = 0;
+ }
+ mCurrentFlag = 0;
+ for(i = 0; i<3;i++){
+ RLOGD("mFactoryResult[%d]:%d",i,mFactoryResult[i]);
+ }
+ unregister_factory_auto_hook_raw();
+ }else{
+ RLOGE("Error11111,Unknown location");
+ }
+}
+
+sp<RfAutomaticTest::RfRequestHandler> RfAutomaticTest::sendMessage(sp<RfRequestMessage> msg, int delayms) {
+ RLOGD( "sendMessage msg token=%d delayms=%d", msg->mMsgType, delayms);
+ sp<RfRequestHandler> handler = new RfRequestHandler(this);
+ handler->mMsg = msg;
+ if(mRequestHandleThread.get()) {
+ sp<Looper> looper = mRequestHandleThread->getLooper();
+ if(looper.get()) {
+ if (delayms > 0) {
+ looper->sendMessageDelayed(ms2ns(delayms),handler, handler->m_dummyMsg);
+ } else {
+ looper->sendMessage(handler, handler->m_dummyMsg);
+ }
+ } else {
+ RLOGD( "looper fail");
+ }
+ } else {
+ RLOGD( "mRequestHandleThread fail");
+ }
+
+ return handler;
+}
+
+RfAutomaticTest::RfRequestHandler:: ~RfRequestHandler() {
+ mTx = NULL;
+ RLOGD( "RfRequestHandler destroyed");
+}
+
+bool RfAutomaticTest::RequestHandleThread::threadLoop() {
+ RLOGD( "RequestHandleThread threadLoop");
+ // start message loop
+ m_looper = Looper::prepare(0);
+ int result;
+ do {
+ result = m_looper->pollAll(-1);
+ RLOGD( "RequestHandleThread threadLoop, pull message result = %d", result);
+ } while (result == Looper::POLL_WAKE || result == Looper::POLL_CALLBACK);
+ return true;
+}
+
+sp<Looper> RfAutomaticTest::RequestHandleThread::getLooper() {
+ return m_looper;
+}
+RfAutomaticTest::RfAutomaticTest(): mCurrentFlag(0) {
+
+}
+
+RfAutomaticTest::~RfAutomaticTest() {
+ RLOGD("RfDesenseTxTest destroyed");
+}
+
+void RfAutomaticTest::handle_request(string response,int responselen,int slot, RIL_Errcode e) {
+ sp<RfRequestMessage> msg = new RfRequestMessage(this);
+ RLOGD("RfDesenseTxTest handle_request");
+ msg->mMsgType = mCurrentFlag;
+ msg->response = response;
+ msg->responselen = responselen;
+ msg->slot = slot;
+ msg->e = e;
+ sendMessage(msg, 1000);
+}
+void RfAutomaticTest::init() {
+ register_factory_auto_hook_raw(m_instance);
+ mRequestHandleThread = new RequestHandleThread(this);
+ mRequestHandleThread->run();
+}
+RfAutomaticTest* RfAutomaticTest::getInstance() {
+ if(!m_instance) {
+ mMutex.lock();
+ if(!m_instance) {
+ m_instance = new RfAutomaticTest();
+ m_instance->init();
+ }
+ mMutex.unlock();
+ }
+ return m_instance;
+}
diff --git a/packages/apps/lynq-factorytest/src/rfAutomaticTest.h b/packages/apps/lynq-factorytest/src/rfAutomaticTest.h
new file mode 100644
index 0000000..a15afd7
--- /dev/null
+++ b/packages/apps/lynq-factorytest/src/rfAutomaticTest.h
@@ -0,0 +1,131 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein
+ * is confidential and proprietary to MediaTek Inc. and/or its licensors.
+ * Without the prior written permission of MediaTek inc. and/or its licensors,
+ * any reproduction, modification, use or disclosure of MediaTek Software,
+ * and information contained herein, in whole or in part, shall be strictly prohibited.
+ *
+ * MediaTek Inc. (C) 2016. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
+ * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+ * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+ * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+ * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
+ * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
+ * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
+ * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
+ * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
+ * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+ * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+ * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
+ * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek Software")
+ * have been modified by MediaTek Inc. All revisions are subject to any receiver's
+ * applicable license agreements with MediaTek Inc.
+ */
+
+#ifndef RFAUTOMATICTEST_H_
+#define RFAUTOMATICTEST_H_
+
+#include <string>
+#include <vector>
+#include <memory>
+#include <mutex>
+#include <thread>
+#include <condition_variable>
+#include <vendor-ril/telephony/ril.h>
+#include <utils/Looper.h>
+#include <utils/Thread.h>
+#include <utils/RefBase.h>
+#include "libtel/lib_tele.h"
+using namespace std;
+using ::android::Looper;
+using ::android::Thread;
+using ::android::MessageHandler;
+using ::android::Message;
+using ::android::sp;
+using ::android::RefBase;
+
+static int mFactoryResult[3] = { 0, 0, 0 };
+
+class RfAutomaticTest: public android::RefBase {
+public:
+ RfAutomaticTest();
+ virtual ~RfAutomaticTest();
+ static RfAutomaticTest* getInstance();
+ int AutoFactoryStart();
+ class RequestHandleThread: public Thread {
+ public:
+ RequestHandleThread(RfAutomaticTest* tx);
+ virtual ~RequestHandleThread();
+ sp<Looper> getLooper();
+
+ protected:
+ RfAutomaticTest* mTx;
+ virtual bool threadLoop();
+ private:
+ sp<Looper> m_looper;
+ };
+
+ class RfRequestMessage: public RefBase {
+ public:
+ RfRequestMessage(RfAutomaticTest* tx);
+ virtual ~RfRequestMessage();
+ // void sendMessage(int delayms);
+ public:
+ int mMsgType;
+ string response;
+ int responselen;
+ int slot;
+ RIL_Errcode e;
+ private:
+ RfAutomaticTest* mTx;
+ };
+
+ class RfRequestHandler: public MessageHandler {
+ public:
+ RfRequestHandler(RfAutomaticTest* tx): mTx(tx){}
+ virtual ~RfRequestHandler();
+
+ public:
+ // void sendMessage(sp<RfRequestMessage> msg, int delayms);
+ void handleMessage(const Message& message);
+ sp<RfRequestMessage> mMsg;
+ // dummy message that makes handler happy
+ Message m_dummyMsg;
+ private:
+ RfAutomaticTest* mTx;
+ };
+public:
+ static const int MSG_NULL;
+ static const int MSG_TELE;
+ static const int MSG_SIM;
+ static const int MSG_GPS;
+ int mCurrentFlag;
+ sp<RequestHandleThread> mRequestHandleThread;
+ sp<RfRequestHandler> mRfRequestHandler;
+
+ sp<RfRequestHandler> sendMessage(sp<RfRequestMessage> msg, int delayms);
+ void handle_request(string response,int responselen,int slot, RIL_Errcode e);
+ void factory_test_onebyone(sp<RfRequestMessage> msg);
+ int factory_test_go();
+ //int factory_auto_test();
+
+private:
+ static RfAutomaticTest* m_instance;
+ static std::mutex mMutex;
+private:
+ void init();
+
+};
+
+#endif /* RFDESENSETXTEST_H_ */
diff --git a/packages/apps/lynq-factorytest/src/ril/ril_test.cpp b/packages/apps/lynq-factorytest/src/ril/ril_test.cpp
new file mode 100644
index 0000000..eab253b
--- /dev/null
+++ b/packages/apps/lynq-factorytest/src/ril/ril_test.cpp
@@ -0,0 +1,1403 @@
+#include "common.h"
+#include <log/log.h>
+#include "libtel/lib_tele.h"
+#include <libtel/lynq_call.h>
+#include <libtel/lynq_sim.h>
+#include <libtel/lynq_network.h>
+#include <libtel/lynq_data.h>
+#include <libtel/lynq_sms.h>
+#include <ril/ril_test.h>
+#include <cutils/properties.h>
+#define MAX_P 10
+static int strUpper(char * str)
+{
+ int i=0;
+ while(1)
+ {
+ if(str[i]=='\0')
+ {
+ break;
+ }
+ if(str[i]>='a'&&str[i]<='z')
+ {
+ //printf("str %c\n",str[i]-32);
+ str[i]=str[i]-32;
+ }
+ i++;
+ }
+ return 0;
+}
+
+int eventDial(const char *addr,int command)
+{
+ int32_t token;
+ //const char* addr = "10086";
+ char output[1024] = {0};
+ lynqCallList *msg = (lynqCallList*)malloc(sizeof(lynqCallList));
+ memset(msg,0,sizeof(lynqCallList));
+ msg->addr=(char *)malloc(sizeof(char));
+ memset(msg->addr,0,sizeof(char));
+ //printf("call start \n");
+ token = lynq_call(addr, msg);
+ RLOGD("[MAIN_LOG] request is %d,phone number is %s,token is %x,error is %d,call_state is %d",
+ msg->base.request,msg->addr,msg->base.token,msg->base.e,msg->call_state);
+ sprintf(output, "Factory_result error_code:%d\n",msg->base.e);
+ emResultNotify(output,command);
+ free(msg->addr);
+ msg->addr=NULL;
+ free(msg);
+ msg=NULL;
+ return 0;
+}
+
+int eventAnswer(int command)
+{
+ int32_t token;
+ char output[1024] = {0};
+ lynqCallList *msg = (lynqCallList*)malloc(sizeof(lynqCallList));
+ memset(msg,0,sizeof(lynqCallList));
+ msg->addr=(char *)malloc(sizeof(char));
+ memset(msg->addr,0,sizeof(char));
+ //printf("call start \n");
+ token = lynq_call_answer(msg);
+ //printf("[MAIN_LOG] request is %d,phone number is %s,token is %x,error is %d,call_state is %d\n",
+ //msg->base.request,msg->addr,msg->base.token,msg->base.e,msg->call_state);
+ RLOGD("[MAIN_LOG] request is %d,phone number is %s,token is %x,error is %d,call_state is %d",
+ msg->base.request,msg->addr,msg->base.request,msg->base.e,msg->call_state);
+ sprintf(output, "Factory_result error_code:%d\n",msg->base.e);
+ emResultNotify(output,command);
+ free(msg->addr);
+ msg->addr=NULL;
+ free(msg);
+ msg=NULL;
+ return 0;
+}
+int eventAutoAnswer(const int status,int command)
+{
+ int32_t token=0;
+ int mode=0;
+ char output[1024] = {0};
+ token = lynq_set_auto_answercall(status,&mode);
+ RLOGD("Auto answer mode is %d",mode);
+ sprintf(output, "Factory_result auto answer mode:%d\n",mode);
+ emResultNotify(output,command);
+ return 0;
+}
+int eventSetMute(const int mute,int command)
+{
+ int32_t token = 0;
+ int status =0;
+ char output[1024] = {0};
+ token = lynq_set_mute_mic(mute, &status);
+ RLOGD("set mute status is %s,current mute status is %s",mute>0?"mute on":"mute off",status>0?"mute on":"mute off");
+ //printf("set mute status is %s,current mute status is %s\n",mute>0?"mute on":"mute off",status>0?"mute on":"mute off");
+ sprintf(output, "Factory_result set mute status is %s,current mute status is %s\n",mute>0?"mute on":"mute off",status>0?"mute on":"mute off");
+ emResultNotify(output,command);
+ return 0;
+}
+int eventGetMute(int command)
+{
+ int32_t token = 0;
+ int status =0;
+ char output[1024] = {0};
+ token = lynq_get_mute_status(&status);
+ RLOGD("current mute status is %s",status>0?"mute on":"mute off");
+ //printf("current mute status is %s\n",status>0?"mute on":"mute off");
+ sprintf(output, "Factory_result current mute status is %s\n",status>0?"mute on":"mute off");
+ emResultNotify(output,command);
+ return 0;
+}
+int eventLastCallFailCause(int command)
+{
+ int32_t token = 0;
+ int status =0;
+ char output[1024] = {0};
+ lynqLastCallFailCause * msg = (lynqLastCallFailCause*)malloc(sizeof(lynqLastCallFailCause));
+ memset(msg,0,sizeof(lynqLastCallFailCause));
+ msg->vendor_cause = (char *)malloc(sizeof(char));
+ memset(msg->vendor_cause,0,sizeof(char));
+ token = lynq_get_last_call_fail_cause(msg);
+ RLOGD("token is %x,request is %d,error_code is %d,cause_code is %d,vendor_cause is %s",msg->base.token,
+ msg->base.request,msg->base.e,msg->cause_code,msg->vendor_cause);
+ //printf("token is %x,request is %d,error_code is %d,cause_code is %d,vendor_cause is %s\n",msg->base.token,
+ //msg->base.request,msg->base.e,msg->cause_code,msg->vendor_cause);
+ sprintf(output, "Factory_result error code %d\n",msg->base.e);
+ emResultNotify(output,command);
+ free(msg->vendor_cause);
+ free(msg);
+ return 0;
+}
+int eventCallHangUp(int index,int command)
+{
+ lynqBase msg;
+ char output[1024] = {0};
+ lynq_call_hang_up(index,&msg);
+ //printf("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);
+ RLOGD("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);
+ sprintf(output, "Factory_result erro code:%d\n",msg.e);
+ emResultNotify(output,command);
+ return 0;
+}
+int eventRejectCall(int command)
+{
+ lynqBase msg;
+ char output[1024] = {0};
+ lynq_reject_call(&msg);
+ //printf("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);
+ RLOGD("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);
+ sprintf(output, "Factory_result erro code:%d\n",msg.e);
+ emResultNotify(output,command);
+ return 0;
+}
+int eventSetDTMF(const char value,int command)
+{
+ lynqBase msg;
+ char output[1024] = {0};
+ lynq_set_DTMF(value,&msg);
+ //printf("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);
+ RLOGD("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);
+ sprintf(output, "Factory_result erro code:%d\n",msg.e);
+ emResultNotify(output,command);
+ return 0;
+}
+int eventSetDTMFVolume(const int volume,int command)
+{
+ int32_t token =0;
+ char output[1024] = {0};
+ token = lynq_set_DTMF_volume(volume);
+ //printf("set DTMF Volume is %s\n",(token>0?"success":"fail"));
+ sprintf(output, "Factory_result set DTMF Volume is %s\n",(token>0?"success":"fail"));
+ emResultNotify(output,command);
+ return 0;
+}
+int eventDoMultiConference(int command)
+{
+ lynqCallList msg;
+ msg.addr=NULL;
+ char output[1024] = {0};
+ lynq_do_multi_conference(&msg);
+ //printf("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);
+ //RLOGD("request is %d,token is %x,error is %d\n",msg.reqNumber,msg.token,msg.error_code);
+ //printf("[MAIN_LOG] request is %d,call id is %d,phone number is %s,type of address is %d,token is %x,error is %d,call_state is %d\n",
+ //msg.base.request,msg.call_id,msg.addr,msg.toa,msg.base.e,msg.base.e,msg.call_state);
+ RLOGD("[MAIN_LOG] request is %d,call id is %d,phone number is %s,type of address is %d,token is %x,error is %d,call_state is %d",
+ msg.base.request,msg.call_id,msg.addr,msg.toa,msg.base.token,msg.base.e,msg.call_state);
+ sprintf(output, "Factory_result error code:%d\n",msg.base.e);
+ emResultNotify(output,command);
+ return 0;
+}
+int eventOthercallHold(const int call_id,int command)
+{
+ lynqBase msg;
+ char output[1024] = {0};
+ lynq_othercall_hold(call_id,&msg);
+ //printf("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);
+ RLOGD("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);
+ sprintf(output, "Factory_result error code:%d\n",msg.e);
+ emResultNotify(output,command);
+ return 0;
+}
+int eventHangupWatingForCall(int command)
+{
+ lynqCallList msg;
+ msg.addr=NULL;
+ char output[1024] = {0};
+ lynq_hangup_wating_for_call(&msg);
+ //printf("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);
+ //RLOGD("request is %d,token is %x,error is %d\n",msg.reqNumber,msg.token,msg.error_code);
+ //printf("[MAIN_LOG] request is %d,call id is %d,phone number is %s,type of address is %d,token is %x,error is %d,call_state is %d\n",
+ //msg.base.request,msg.call_id,msg.addr,msg.toa,msg.base.token,msg.base.e,msg.call_state);
+ RLOGD("[MAIN_LOG] request is %d,call id is %d,phone number is %s,type of address is %d,token is %x,error is %d,call_state is %d",
+ msg.base.request,msg.call_id,msg.addr,msg.toa,msg.base.token,msg.base.e,msg.call_state);
+ sprintf(output, "Factory_result error code:%d\n",msg.base.e);
+ emResultNotify(output,command);
+ return 0;
+}
+int eventHangupForegroundResumeBackground(int command)
+{
+ lynqCallList msg;
+ msg.addr=NULL;
+ char output[1024] = {0};
+ lynq_hangup_foreground_resume_background(&msg);
+ //printf("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);
+ //RLOGD("request is %d,token is %x,error is %d\n",msg.reqNumber,msg.token,msg.error_code);
+ //printf("[MAIN_LOG] request is %d,call id is %d,phone number is %s,type of address is %d,token is %x,error is %d,call_state is %d\n",
+ //msg.base.request,msg.call_id,msg.addr,msg.toa,msg.base.token,msg.base.e,msg.call_state);
+ RLOGD("[MAIN_LOG] request is %d,call id is %d,phone number is %s,type of address is %d,token is %x,error is %d,call_state is %d",
+ msg.base.request,msg.call_id,msg.addr,msg.toa,msg.base.token,msg.base.e,msg.call_state);
+ sprintf(output, "Factory_result error code:%d\n",msg.base.e);
+ emResultNotify(output,command);
+ return 0;
+}
+int eventSwitchWaitOrHoldAndActiveCall(int command)
+{
+ lynqCallList msg;
+ msg.addr=NULL;
+ char output[1024] = {0};
+ lynq_switch_hold_and_active_call(&msg);
+ //printf("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);
+ //RLOGD("request is %d,token is %x,error is %d\n",msg.reqNumber,msg.token,msg.error_code);
+ //printf("[MAIN_LOG] request is %d,call id is %d,phone number is %s,type of address is %d,token is %x,error is %d,call_state is %d\n",
+ //msg.base.request,msg.call_id,msg.addr,msg.toa,msg.base.token,msg.base.e,msg.call_state);
+ RLOGD("[MAIN_LOG] request is %d,call id is %d,phone number is %s,type of address is %d,token is %x,error is %d,call_state is %d",
+ msg.base.request,msg.call_id,msg.addr,msg.toa,msg.base.token,msg.base.e,msg.call_state);
+ sprintf(output, "Factory_result error code:%d\n",msg.base.e);
+ emResultNotify(output,command);
+ return 0;
+}
+
+int eventQueryOperator(int command)
+{
+ operatorInfo msg;
+ char output[1024] = {0};
+ msg.OperatorFN=NULL;
+ msg.OperatorSH=NULL;
+ msg.MccMnc=NULL;
+ lynq_query_operater(&msg);
+ //printf("request is %d,token is %x,error is %d,OperatorFN is %s,OperatorSH is %s,MccMnc is %s\n",msg.base.request,msg.base.token,msg.base.e,msg.OperatorFN,msg.OperatorSH,msg.MccMnc);
+ RLOGD("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);
+ //printf("OperatorFN is %s,OperatorSH is %s,MccMnc is %s\n",msg.OperatorFN,msg.OperatorSH,msg.MccMnc);
+ RLOGD("OperatorFN is %s,OperatorSH is %s,MccMnc is %s\n",msg.OperatorFN,msg.OperatorSH,msg.MccMnc);
+ sprintf(output, "Factory_result error code:%d\n",msg.base.e);
+ emResultNotify(output,command);
+ return 0;
+}
+int eventQueryNetSelectMode(int command)
+{
+ char output[1024] = {0};
+ networkSelecttionMode msg;
+ lynq_query_network_selection_mode(& msg);
+ //printf("request is %d,token is %x,error is %d,mode is %d\n",msg.base.request,msg.base.token,msg.base.e,msg.mode);
+ RLOGD("request is %d,token is %x,error is %d,mode is %d",msg.base.request,msg.base.token,msg.base.e,msg.mode);
+ sprintf(output, "Factory_result error code:%d\n",msg.base.e);
+ emResultNotify(output,command);
+ return 0;
+}
+int eventSetNetSelectMode(const int mode,int command)
+{
+ char output[1024] = {0};
+ char str[100]={0};
+ const char * mccmnc = "46000";//just China Mobile Communications Group
+ lynqBase msg;
+ sprintf(str,"%s",(mode==0?"Auto":"Manual"));
+ if(mode==0)
+ {
+ lynq_set_network_selection_mode(str,NULL,&msg);
+ }
+ else if(mode ==1)
+ {
+ printf("You have selected manual mode, this command only supports CMCC SIM card temporarily");
+ lynq_set_network_selection_mode(str,mccmnc,&msg);
+ }
+ else
+ {
+ sprintf(output, "please input network selection mode:0 or 1,and try again\n");
+ emResultNotify(output,command);
+ return 0;
+ }
+ //lynq_set_network_selection_mode(argv[2],argv[3],&msg);//0:auto selection 1:manual selection
+ RLOGD("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);
+ sprintf(output, "Factory_result error code:%d\n",msg.e);
+ emResultNotify(output,command);
+ return 0;
+}
+int eventQueryAvailableNetwork(int command)
+{
+ int32_t token=0;
+ char output[1024] = {0};
+ availableNetwork msg;
+ msg.OperatorFN=NULL;
+ msg.OperatorSH=NULL;
+ msg.MccMnc=NULL;
+ msg.NetStatus=NULL;
+ lynq_query_available_network(&msg);
+ //printf("request is %d,token is %x,error is %d,OperatorFN is %s,OperatorSH is %s,MccMnc is %s,Netstatus is %s\n",msg.base.request,msg.base.token,msg.base.e,msg.OperatorFN,msg.OperatorSH,msg.MccMnc,msg.NetStatus);
+ RLOGD("request is %d,token is %x,error is %d",msg.base.request,msg.base.token,msg.base.e);
+ //printf("OperatorFN is %s,OperatorSH is %s,MccMnc is %s\n",msg.OperatorFN,msg.OperatorSH,msg.MccMnc);
+ RLOGD("OperatorFN is %s,OperatorSH is %s,MccMnc is %s,NetStatus is %s",msg.OperatorFN,msg.OperatorSH,msg.MccMnc,msg.NetStatus);
+ sprintf(output, "Factory_result error code:%d\n",msg.base.e);
+ emResultNotify(output,command);
+
+ return 0;
+
+}
+ int eventQueryRegistrationState(char *type,int command)
+{
+ char output[1024] = {0};
+ registrationStateInfo msg;
+ msg.CID=NULL;
+ msg.LAC=NULL;
+ char str[10];
+ if (strlen(type)>10)
+ {
+ RLOGD("the parameter is inavaliable !");
+ return -1;
+ }
+ memcpy(str,type,strlen(type)+1);
+ strUpper(str);
+ //printf("upper str is %s\n",str);
+ lynq_query_registration_state(str,&msg);
+ if(!strcmp(str,"VOICE")){
+ //printf("request is %d,token is %x,error is %d,registration state is %d\n",
+ //msg.base.request,msg.base.token,msg.base.e,msg.regState);
+ RLOGD("request is %d,token is %x,error is %d",msg.base.request,msg.base.token,msg.base.e);
+ RLOGD("registration state is %d",msg.regState);
+ }else if(!strcmp(str,"DATA")){
+ //printf("request is %d,token is %x,error is %d,registration state is %d,LAC is %s,CID is %s,network type is %d\n",
+ //msg.base.request,msg.base.token,msg.base.e,msg.regState,msg.LAC,msg.CID,msg.netType);
+ RLOGD("request is %d,token is %x,error is %d",msg.base.request,msg.base.token,msg.base.e);
+ RLOGD("registration state is %d,LAC is %s,CID is %s,network type is %d",msg.regState,msg.LAC,msg.CID,msg.netType);
+ }else if(!strcmp(str,"IMS")){
+ //printf("request is %d,token is %x,error is %d,ims registration state is %d,radio tech family is %d\n",
+ //msg.base.request,msg.base.token,msg.base.e,msg.imsRegState,msg.radioTechFam);
+ RLOGD("request is %d,token is %x,error is %d",msg.base.request,msg.base.token,msg.base.e);
+ RLOGD("ims registration state is %d,radio tech family is %d",msg.imsRegState,msg.radioTechFam);
+ }else{
+ printf("--------->[%s,%d] query ims registration state about voice, data, and ims!!! \n",__FUNCTION__,__LINE__);
+ return -1;
+ }
+ sprintf(output, "Factory_result error code:%d\n",msg.base.e);
+ emResultNotify(output,command);
+ return 0;
+ }
+ int eventQueryPrefferredNetworkType(int command)
+{
+ char output[1024] = {0};
+ prefferredNetworkType msg;
+ lynq_query_prefferred_networktype(&msg);
+ //printf("request is %d,token is %x,error is %d,preffered network is %d\n",
+ //msg.base.request,msg.base.token,msg.base.e,msg.pnt);
+ RLOGD("request is %d,token is %x,error is %d",msg.base.request,msg.base.token,msg.base.e);
+ RLOGD("preffered network is %d",msg.pnt);
+ sprintf(output, "Factory_result error code:%d\n",msg.base.e);
+ emResultNotify(output,command);
+ return 0;
+}
+ int eventSetPrefferredNetworkType(const int type,int command)
+{
+ lynqBase msg;
+ char output[1024] = {0};
+ lynq_set_prefferred_networktype(type,&msg);
+ //printf("request is %d,token is %x,error is %d\n",
+ //msg.request,msg.token,msg.e);
+ RLOGD("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);
+ sprintf(output, "Factory_result error code:%d\n",msg.e);
+ emResultNotify(output,command);
+ return 0;
+}
+int eventQueryCellInfo(int command)
+{
+ cellInfoList **msg;
+ char output[1024] = {0};
+ int num=5;
+ int realNum =0;
+ int32_t token=0;
+ msg = (cellInfoList **)malloc(sizeof(cellInfoList *)*num);
+ if(msg==NULL)
+ {
+ RLOGD("malloc LYNQ_Data_Call_Response_v11 fail \n");
+ return -1;
+ }
+ for(int i =0;i<num;i++)
+ {
+ msg[i] = (cellInfoList*)malloc(sizeof(cellInfoList));
+ if (msg[i]==NULL)
+ {
+ for (int n=0;n<i;n++)
+ {
+ free(msg[n]);
+ }
+ return -1;
+ }
+ memset(msg[i],0,sizeof(cellInfoList));
+ }
+ token = lynq_query_cell_info(msg, num, &realNum);
+ /*
+ printf("request is %d,\ntoken is %x,\ne is %d\n",msg[0]->base.request,msg[0]->base.token,msg[0]->base.e);
+ for(int i = 0; i<realNum; i++)
+ {
+ //printf("request is %d,\ntoken is %x,\ne is %d\n",msg[i]->base.request,msg[i]->base.token,msg[i]->base.e);
+ printf("cellInfoType is %d\n",msg[i]->cellinfo.cellInfoType);
+ printf("registered is %d\n",msg[i]->cellinfo.registered);
+ printf("timeStampType is %d\n",msg[i]->cellinfo.timeStampType);
+ printf("timeStamp is %d\n",msg[i]->cellinfo.timeStamp);
+ switch(msg[i]->cellinfo.cellInfoType) {
+ case RIL_CELL_INFO_TYPE_GSM: {
+ printf("gsm.cellIdentityGsm.mcc is %d\n",msg[i]->cellinfo.CellInfo.gsm.cellIdentityGsm.mcc);
+ printf("gsm.cellIdentityGsm.mnc is %d\n",msg[i]->cellinfo.CellInfo.gsm.cellIdentityGsm.mnc);
+ printf("gsm.cellIdentityGsm.lac is %d\n",msg[i]->cellinfo.CellInfo.gsm.cellIdentityGsm.lac);
+ printf("gsm.cellIdentityGsm.cid is %d\n",msg[i]->cellinfo.CellInfo.gsm.cellIdentityGsm.cid);
+ printf("gsm.signalStrengthGsm.signalStrength is %d\n",msg[i]->cellinfo.CellInfo.gsm.signalStrengthGsm.signalStrength);
+ printf("gsm.signalStrengthGsm.bitErrorRate is %d\n",msg[i]->cellinfo.CellInfo.gsm.signalStrengthGsm.bitErrorRate);
+ printf("gsm.signalStrengthGsm.timingAdvance is %d\n",msg[i]->cellinfo.CellInfo.gsm.signalStrengthGsm.timingAdvance);
+ break;
+ }
+ case RIL_CELL_INFO_TYPE_WCDMA: {
+ printf("wcdma.cellIdentityWcdma.mcc is %d\n",msg[i]->cellinfo.CellInfo.wcdma.cellIdentityWcdma.mcc);
+ printf("wcdma.cellIdentityWcdma.mnc is %d\n",msg[i]->cellinfo.CellInfo.wcdma.cellIdentityWcdma.mnc);
+ printf("wcdma.cellIdentityWcdma.lac is%d\n",msg[i]->cellinfo.CellInfo.wcdma.cellIdentityWcdma.lac);
+ printf("wcdma.cellIdentityWcdma.cid is %d\n",msg[i]->cellinfo.CellInfo.wcdma.cellIdentityWcdma.cid);
+ printf("wcdma.cellIdentityWcdma.psc is %d\n",msg[i]->cellinfo.CellInfo.wcdma.cellIdentityWcdma.psc);
+ printf("wcdma.signalStrengthWcdma.signalStrength is %d\n",msg[i]->cellinfo.CellInfo.wcdma.signalStrengthWcdma.signalStrength);
+ printf("wcdma.signalStrengthWcdma.bitErrorRate is %d\n",msg[i]->cellinfo.CellInfo.wcdma.signalStrengthWcdma.bitErrorRate);
+ break;
+ }
+ case RIL_CELL_INFO_TYPE_CDMA: {
+ printf("cdma.cellIdentityCdma.networkId is %d\n",msg[i]->cellinfo.CellInfo.cdma.cellIdentityCdma.networkId);
+ printf("cdma.cellIdentityCdma.systemId is %d\n",msg[i]->cellinfo.CellInfo.cdma.cellIdentityCdma.systemId);
+ printf("cdma.cellIdentityCdma.basestationId is %d\n",msg[i]->cellinfo.CellInfo.cdma.cellIdentityCdma.basestationId);
+ printf("cdma.cellIdentityCdma.longitude is %d\n",msg[i]->cellinfo.CellInfo.cdma.cellIdentityCdma.longitude);
+ printf("cdma.cellIdentityCdma.latitude is %d\n",msg[i]->cellinfo.CellInfo.cdma.cellIdentityCdma.latitude);
+ printf("cdma.signalStrengthCdma.dbm is %d\n",msg[i]->cellinfo.CellInfo.cdma.signalStrengthCdma.dbm);
+ printf("cdma.signalStrengthCdma.ecio is %d\n",msg[i]->cellinfo.CellInfo.cdma.signalStrengthCdma.ecio);
+ printf("cdma.signalStrengthEvdo.dbm is %d\n",msg[i]->cellinfo.CellInfo.cdma.signalStrengthEvdo.dbm);
+ printf("cdma.signalStrengthEvdo.ecio is %d\n",msg[i]->cellinfo.CellInfo.cdma.signalStrengthEvdo.ecio);
+ printf("cdma.signalStrengthEvdo.signalNoiseRatio is %d\n",msg[i]->cellinfo.CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio);
+ break;
+ }
+ case RIL_CELL_INFO_TYPE_LTE: {
+ printf("lte.cellIdentityLte.mcc is %d\n",msg[i]->cellinfo.CellInfo.lte.cellIdentityLte.mcc);
+ printf("lte.cellIdentityLte.mnc is %d\n",msg[i]->cellinfo.CellInfo.lte.cellIdentityLte.mnc);
+ printf("lte.cellIdentityLte.ci is %d\n",msg[i]->cellinfo.CellInfo.lte.cellIdentityLte.ci);
+ printf("lte.cellIdentityLte.pci is %d\n",msg[i]->cellinfo.CellInfo.lte.cellIdentityLte.pci);
+ printf("lte.cellIdentityLte.tac is %d\n",msg[i]->cellinfo.CellInfo.lte.cellIdentityLte.tac);
+ printf("lte.signalStrengthLte.signalStrength is %d\n",msg[i]->cellinfo.CellInfo.lte.signalStrengthLte.signalStrength);
+ printf("lte.signalStrengthLte.rsrp is %d\n",msg[i]->cellinfo.CellInfo.lte.signalStrengthLte.rsrp);
+ printf("lte.signalStrengthLte.rsrq is %d\n",msg[i]->cellinfo.CellInfo.lte.signalStrengthLte.rsrq);
+ printf("lte.signalStrengthLte.rssnr is %d\n",msg[i]->cellinfo.CellInfo.lte.signalStrengthLte.rssnr);
+ printf("lte.signalStrengthLte.cqi is %d\n",msg[i]->cellinfo.CellInfo.lte.signalStrengthLte.cqi);
+ printf("lte.signalStrengthLte.timingAdvance is %d\n",msg[i]->cellinfo.CellInfo.lte.signalStrengthLte.timingAdvance);
+ break;
+ }
+ case RIL_CELL_INFO_TYPE_TD_SCDMA: {
+ printf("tdscdma.cellIdentityTdscdma.mcc is %d\n",msg[i]->cellinfo.CellInfo.tdscdma.cellIdentityTdscdma.mcc);
+ printf("tdscdma.cellIdentityTdscdma.mnc is %d\n",msg[i]->cellinfo.CellInfo.tdscdma.cellIdentityTdscdma.mnc);
+ printf("tdscdma.cellIdentityTdscdma.lac is %d\n",msg[i]->cellinfo.CellInfo.tdscdma.cellIdentityTdscdma.lac);
+ printf("tdscdma.cellIdentityTdscdma.cid is %d\n",msg[i]->cellinfo.CellInfo.tdscdma.cellIdentityTdscdma.cid);
+ printf("tdscdma.cellIdentityTdscdma.cpid is %d\n",msg[i]->cellinfo.CellInfo.tdscdma.cellIdentityTdscdma.cpid);
+ printf("tdscdma.signalStrengthTdscdma.rscp is %d\n",msg[i]->cellinfo.CellInfo.tdscdma.signalStrengthTdscdma.rscp);
+ break;
+ }
+ }
+ }*/
+ sprintf(output, "Factory_result error code:%d\n",msg[0]->base.e);
+ emResultNotify(output,command);
+ for (int i = 0; i < num; i++)
+ {
+ if (msg[i]!=NULL)
+ {
+ free(msg[i]);
+ msg[i]=NULL;
+ }
+ }
+ free(msg);
+ msg=NULL;
+ return 0;
+}
+int eventSetUnsolCellInfoListrate(const int rate,int command)
+{
+ lynqBase msg;
+ char output[1024] = {0};
+ lynq_set_unsol_cell_info_listrate(rate,&msg);
+ //printf("request is %d,token is %x,error is %d\n",
+ //msg.request,msg.token,msg.e);
+ RLOGD("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);
+ sprintf(output, "Factory_result error code:%d\n",msg.e);
+ emResultNotify(output,command);
+ return 0;
+}
+int eventQueryNeighboringCellids(int command)
+{
+ neighboringCellIDs **msg=NULL;
+ char output[1024] = {0};
+ //printf("neighboring celll ids\n");
+ int num=5;
+ int realNum =0;
+ int32_t token=0;
+ msg = (neighboringCellIDs **)malloc(sizeof(neighboringCellIDs *)*num);
+ if(msg==NULL)
+ {
+ RLOGD("malloc LYNQ_Data_Call_Response_v11 fail \n");
+ return -1;
+ }
+ for(int i =0;i<num;i++)
+ {
+ msg[i] = (neighboringCellIDs*)malloc(sizeof(neighboringCellIDs));
+ msg[i]->cid = (char*)malloc(sizeof(char));
+ if (msg[i]==NULL)
+ {
+ for (int n=0;n<i;n++)
+ {
+ free(msg[n]->cid);
+ free(msg[n]);
+ }
+ return -1;
+ }
+ memset(msg[i],0,sizeof(neighboringCellIDs));
+ }
+ token = lynq_query_neighboring_cellids(msg, num, &realNum);
+ //printf("request is %d,token is %x,error is %d\n",
+ //msg[0]->base.request,msg[0]->base.token,msg[0]->base.e);
+ /*
+ for(int i =0;i<realNum;i++)
+ {
+ printf("request is %d,token is %x,error is %d,cid is %s,rssi is %d\n",
+ msg[i]->base.request,msg[i]->base.token,msg[i]->base.e,msg[i]->cid,msg[i]->rssi);
+ RLOGD("request is %d,token is %x,error is %d",msg[i]->base.request,msg[i]->base.token,msg[i]->base.e);
+ RLOGD("cid is %s,rssi is %d %d",msg[i]->cid,msg[i]->rssi);
+ }
+ */
+ sprintf(output, "Factory_result error code:%d\n",msg[0]->base.e);
+ emResultNotify(output,command);
+ for (int i = 0; i < num; i++)
+ {
+ if (msg[i]!=NULL)
+ {
+ free(msg[i]->cid);
+ msg[i]->cid=NULL;
+ free(msg[i]);
+ msg[i]=NULL;
+ }
+ }
+ free(msg);
+ msg=NULL;
+ return 0;
+}
+int eventSetBandMode(const int mode,int command)
+{
+ lynqBase msg;
+ char output[1024] = {0};
+ lynq_set_band_mode(mode,&msg);
+ //printf("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);
+ RLOGD("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);
+ sprintf(output, "Factory_result error code:%d\n",msg.e);
+ emResultNotify(output,command);
+ return 0;
+
+}
+int eventQueryAvailableBandmode(int command)
+{
+ availableBandMode msg;
+ char output[1024] = {0};
+ lynq_query_available_bandmode(&msg);
+ //printf("request is %d,token is %x,error is %d,\n",msg.base.request,msg.base.token,msg.base.e);
+ RLOGD("request is %d,token is %x,error is %d",msg.base.request,msg.base.token,msg.base.e);
+ if(msg.bandmode[0]>0)
+ {
+ printf("available band mode is:");
+ for(int i =1;i<=msg.bandmode[0];i++)
+ {
+ printf("%d,",msg.bandmode[i]);
+ }
+ printf("\n");
+ sprintf(output, "Factory_result error code:%d\n",msg.base.e);
+ emResultNotify(output,command);
+ return 0;
+ }
+ sprintf(output, "Factory_result error code:%d\n",msg.base.e);
+ emResultNotify(output,command);
+ RLOGD("available band mode is null");
+ return 0;
+}
+int eventRadioOn(const int state,int command)
+{
+ lynqBase msg;
+ char output[1024] = {0};
+ lynq_radio_on(state,&msg);
+ //printf("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);
+ RLOGD("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);
+ sprintf(output, "Factory_result error code:%d\n",msg.e);
+ emResultNotify(output,command);
+ return 0;
+}
+int eventQueryRadioTech(int command)
+{
+ radioTechnology msg;
+ char output[1024] = {0};
+ lynq_query_radio_tech(&msg);
+ //printf("request is %d,token is %x,error is %d,RadioTech is %d\n",
+ //msg.base.request,msg.base.token,msg.base.e,msg.radioTech);
+ RLOGD("request is %d,token is %x,error is %d",msg.base.request,msg.base.token,msg.base.e);
+ RLOGD("RadioTech %d",msg.radioTech);
+ sprintf(output, "Factory_result error code:%d\n",msg.base.e);
+ emResultNotify(output,command);
+ return 0;
+return 0;}
+int eventSolicitedSignalStrength(int command)
+{
+ solicitedSignalStrength msg;
+ char output[1024] = {0};
+ lynq_solicited_signal_strength(&msg);
+ //printf("request is %d,token is %x,error is %d\n",
+ //msg.base.request,msg.base.token,msg.base.e);
+ RLOGD("request is %d,token is %x,error is %d",msg.base.request,msg.base.token,msg.base.e);
+ if(msg.base.e!=RIL_E_SUCCESS)
+ {
+ return -1;
+ }
+ /*
+ printf("V5 GW signalStrength=%d\n", msg.signalStrength.GW_SignalStrength.signalStrength);
+ printf("GW bitErrorRate=%d\n", msg.signalStrength.GW_SignalStrength.bitErrorRate);
+ printf("GW timingAdvance=%d\n", msg.signalStrength.GW_SignalStrength.timingAdvance);
+ printf("CDMA dbm=%d\n", msg.signalStrength.CDMA_SignalStrength.dbm);
+ printf("CDMA ecio=%d\n", msg.signalStrength.CDMA_SignalStrength.ecio);
+ printf("EVDO dbm=%d\n", msg.signalStrength.EVDO_SignalStrength.dbm);
+ printf("EVDO ecio=%d\n", msg.signalStrength.EVDO_SignalStrength.ecio);
+ printf("EVDO signalNoiseRatio=%d\n", msg.signalStrength.EVDO_SignalStrength.signalNoiseRatio);
+ printf("V6 LTE signalStrength=%d\n", msg.signalStrength.LTE_SignalStrength.signalStrength);
+ printf("LTE rsrp=%d\n", msg.signalStrength.LTE_SignalStrength.rsrp);
+ printf("LTE rsrq=%d\n", msg.signalStrength.LTE_SignalStrength.rsrq);
+ printf("LTE rssnr=%d\n", msg.signalStrength.LTE_SignalStrength.rssnr);
+ printf("LTE cqi=%d\n", msg.signalStrength.LTE_SignalStrength.cqi);
+ printf("LTE timingAdvance=%d\n", msg.signalStrength.LTE_SignalStrength.timingAdvance);
+ printf("TD_SCDMA signalStrength=%d\n", msg.signalStrength.TD_SCDMA_SignalStrength.signalStrength);
+ printf("TD_SCDMA bitErrorRate=%d\n", msg.signalStrength.TD_SCDMA_SignalStrength.bitErrorRate);
+ printf("TD_SCDMA rscp=%d\n", msg.signalStrength.TD_SCDMA_SignalStrength.rscp);
+ printf("WCDMA signalStrength=%d\n", msg.signalStrength.WCDMA_SignalStrength.signalStrength);
+ printf("WCDMA bitErrorRate=%d\n", msg.signalStrength.WCDMA_SignalStrength.bitErrorRate);
+ printf("WCDMA rscp=%d\n", msg.signalStrength.WCDMA_SignalStrength.rscp);
+ printf("WCDMA ecno=%d\n", msg.signalStrength.WCDMA_SignalStrength.ecno);
+ */
+ sprintf(output, "Factory_result error code:%d\n",msg.base.e);
+ emResultNotify(output,command);
+ return 0;
+}
+int eventModemOn(const int state,int command)
+{
+ lynqBase msg;
+ char output[1024] = {0};
+ lynq_modem_on(state,&msg);
+ //printf("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);
+ RLOGD("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);
+ sprintf(output, "Factory_result error code:%d\n",msg.e);
+ emResultNotify(output,command);
+ return 0;
+}
+int eventSetupDataCall(int command)
+{
+ int32_t token;
+ char output[1024] = {0};
+ int state=0;
+ token = lynq_data_enable_data(&state);
+ //printf("pdn state is %s\n",state<0?"disconnect":"connect");
+ sprintf(output, "Factory_result pdn state is %s\n",state<0?"disconnect":"connect");
+ emResultNotify(output,command);
+ return 0;
+}
+int eventDeactiveDataCall(int command)
+{
+ int32_t token;
+ int state=0;
+ char output[1024] = {0};
+ token = lynq_data_dectivate_data_call(&state);
+ //printf("pdn state is %s\n",state<0?"connect":"disconnect");
+ sprintf(output, "Factory_result pdn state is %s\n",state<0?"connect":"disconnect");
+ emResultNotify(output,command);
+ return 0;
+}
+int eventGetDataCalllist(int command)
+{
+ int32_t token=0;
+ char output[1024] = {0};
+ int num=5;
+ int realNum=0;
+ LYNQ_Data_Call_Response_v11 **msg=(LYNQ_Data_Call_Response_v11**)malloc(sizeof(LYNQ_Data_Call_Response_v11*)*num);
+ if (msg == NULL)
+ {
+ printf("malloc LYNQ_Data_Call_Response_v11 fail \n");
+ return -1;
+ }
+ for(int i =0;i<num;i++)
+ {
+ msg[i] = (LYNQ_Data_Call_Response_v11*)malloc(sizeof(LYNQ_Data_Call_Response_v11));
+ if (msg[i]==NULL)
+ {
+ for (int n=0;n<i;n++)
+ {
+ free(msg[n]);
+ }
+ return -1;
+ }
+ memset(msg[i],0,sizeof(LYNQ_Data_Call_Response_v11));
+ }
+ token = lynq_get_data_call_list(msg, num,&realNum);
+ /*
+ for(int i = 0; i<realNum; i++)
+ {
+ printf("status is %d,\nsuggestedRetryTime is %d,\ncid is %d,\nactive is %d,\nmtu is %d\n",msg[i]->status,msg[i]->suggestedRetryTime,msg[i]->cid,msg[i]->active,msg[i]->mtu);
+ printf("type is %s\n",msg[i]->type);
+ printf("ifname is %s\n",msg[i]->ifname);
+ printf("addresses is %s\n",msg[i]->addresses);
+ printf("dnses is %s\n",msg[i]->dnses);
+ printf("gateways is %s\n",msg[i]->gateways);
+ printf("pcscf is %s\n",msg[i]->pcscf);
+ }
+ */
+ if(realNum>0)
+ {
+ sprintf(output, "Factory_result error code 1\n");
+ emResultNotify(output,command);
+ }
+ else
+ {
+ sprintf(output, "Factory_result error code 2\n");
+ emResultNotify(output,command);
+ }
+ for (int i = 0; i < num; i++)
+ {
+ if (msg[i]!=NULL)
+ {
+ free(msg[i]);
+ msg[i]=NULL;
+ }
+ }
+ free(msg);
+ msg=NULL;
+ return 0;
+}
+
+int eventGetSimStatus(int command)
+{
+ static int32_t token=0;
+ char output[1024] = {0};
+ simStatus * sim_status=NULL;
+ sim_status = (simStatus *)malloc(sizeof(simStatus));
+ token = lynq_get_sim_status(sim_status);
+ //printf("card_status:%d,card_type:%d,pin_state:%d,error_code:%d,request:%d,token:%x\n",sim_status->card_status,
+ //sim_status->card_type,sim_status->pin_state,sim_status->base.e,sim_status->base.request,sim_status->base.token);
+ RLOGD("card_status:%d,card_type:%d,pin_state:%d,error_code:%d,request:%d,token:%x",sim_status->card_status,
+ sim_status->card_type,sim_status->pin_state,sim_status->base.e,sim_status->base.request,sim_status->base.token);
+ sprintf(output, "Factory_result error code %d\n",sim_status->base.e);
+ emResultNotify(output,command);
+ if (sim_status->base.e==-1)
+ {
+ free(sim_status);
+ sim_status=NULL;
+ return -1;
+ }
+ free(sim_status);
+ sim_status=NULL;
+ return 0;
+}
+int eventGetImsi(int command)
+{
+ simImsi msg;
+ char output[1024] = {0};
+ lynq_get_imsi(&msg);
+ //printf("request is %d, token is %x,error_code %d,imsi is %s\n",msg.base.request,msg.base.token, msg.base.e,msg.imsi);
+ RLOGD("request is %d, token is %x,error_code %d,imsi is %s",msg.base.request,msg.base.token, msg.base.e,msg.imsi);
+ sprintf(output, "Factory_result error code %d\n",msg.base.e);
+ emResultNotify(output,command);
+ if (msg.base.e==-1)
+ {
+ return -1;
+ }
+ return 0;
+}
+int eventSendSms(const char *telephonyNumber, const char *msgcont,int command)
+{
+ int32_t token=0;
+ char output[1024] = {0};
+ smsResponse msg;
+ msg.smsResp.ackPDU=NULL;
+ //const char *telephonyNumber ="10086";
+ //const char * msgcont = "103";
+ token = lynq_send_sms(telephonyNumber, 0,msgcont, NULL,&msg);
+ //printf("request is %d,token is %x,error is %d,\nmessageRef is %d,ackPDU is %s,errorCode is %d\n",msg.base.request,msg.base.token,msg.base.e,
+ //msg.smsResp.messageRef,msg.smsResp.ackPDU,msg.smsResp.errorCode);
+ RLOGD("request is %d,token is %x,error is %d,messageRef is %d,ackPDU is %s,errorCode is %d",msg.base.request,msg.base.token,msg.base.e,
+ msg.smsResp.messageRef,msg.smsResp.ackPDU,msg.smsResp.errorCode);
+ sprintf(output, "Factory_result error code %d\n",msg.base.e);
+ emResultNotify(output,command);
+ return 0;
+}
+int eventImsSendSms(const char *telephonyNumber, const char *msgcont,int command)
+{
+ int32_t token=0;
+ char output[1024] = {0};
+ smsResponse msg;
+ msg.smsResp.ackPDU=NULL;
+ //const char *telephonyNumber ="10086";
+ //const char * msgcont = "103";
+ const char* retryNum ="0";
+ const char *messageRef = "201";
+ token = lynq_Ims_send_sms(telephonyNumber, 0,msgcont,retryNum,messageRef, NULL,&msg);
+ //printf("request is %d,token is %x,error is %d,\nmessageRef is %d,ackPDU is %s,errorCode is %d\n",msg.base.request,msg.base.token,msg.base.e,
+ //msg.smsResp.messageRef,msg.smsResp.ackPDU,msg.smsResp.errorCode);
+ RLOGD("request is %d,token is %x,error is %d,messageRef is %d,ackPDU is %s,errorCode is %d",msg.base.request,msg.base.token,msg.base.e,
+ msg.smsResp.messageRef,msg.smsResp.ackPDU,msg.smsResp.errorCode);
+ sprintf(output, "Factory_result error code %d\n",msg.base.e);
+ emResultNotify(output,command);
+ return 0;
+}
+int eventWriteSmsToSim(int smsStatus,const char *recPhonNum, const char *msgcont,int command)
+{
+ int32_t token=0;
+ char output[1024] = {0};
+ messageStoreInfo msg;
+ //const int smsStatus = 2;
+ //const char *recPhonNum = "10086";
+ //const char *msgcont = "103";
+ token = lynq_write_sms_to_sim(smsStatus,recPhonNum,0,msgcont,NULL,&msg);
+ //printf("request is %d,token is %x,error is %d,\nmessage strore index is %d\n",msg.base.request,msg.base.token,msg.base.e,
+ //msg.msgStoreIndex);
+ RLOGD("request is %d,token is %x,error is %d,\nmessage strore index is %d\n",msg.base.request,msg.base.token,msg.base.e,
+ msg.msgStoreIndex);
+ sprintf(output, "Factory_result error code %d\n",msg.base.e);
+ emResultNotify(output,command);
+ return 0;
+}
+int eventReportSmsMemoryStatus(const int value,int command)
+{
+ lynqBase msg;
+ char output[1024] = {0};
+ lynq_report_sms_memory_status(value,&msg);
+ //printf("request is %d,token is %x,error is %d,\n",msg.request,msg.token,msg.e);
+ RLOGD("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);
+ sprintf(output, "Factory_result error code %d\n",msg.e);
+ emResultNotify(output,command);
+ return 0;
+}
+int eventDeletSmsOnSim(const int value,int command)
+{
+ lynqBase msg;
+ char output[1024] = {0};
+ lynq_delet_sms_on_sim(value,&msg);
+ //printf("request is %d,token is %x,error is %d,\n",msg.request,msg.token,msg.e);
+ RLOGD("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);
+ sprintf(output, "Factory_result error code %d\n",msg.e);
+ emResultNotify(output,command);
+ return 0;
+}
+int eventGetSmscAddress(int command)
+{
+ smscCbInfo msg;
+ char output[1024] = {0};
+ lynq_get_smsc_address(&msg);
+ //printf("request is %d,token is %x,error is %d,smsc address is %s\n",msg.base.request,msg.base.token,msg.base.e,msg.smsc);
+ RLOGD("request is %d,token is %x,error is %d,smsc address is %s",msg.base.request,msg.base.token,msg.base.e,msg.smsc);
+ sprintf(output, "Factory_result error code %d\n",msg.base.e);
+ emResultNotify(output,command);
+ return 0;
+}
+int eventSetSmscAddress(const char* serviceNumber,int command)
+{
+ lynqBase msg;
+ char output[1024] = {0};
+ //const char* serviceNumber = "+8613800280500";
+ lynq_set_smsc_address(serviceNumber,&msg);
+ //printf("request is %d,token is %x,error is %d,\n",msg.request,msg.token,msg.e);
+ RLOGD("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);
+ sprintf(output, "Factory_result error code %d\n",msg.e);
+ emResultNotify(output,command);
+ return 0;
+}
+int callController(int *item, char *value,int command);
+int networkcontroller(int *item, char *value,int command);
+int datacontroller(int *item, char *value,int command);
+int simcontroller(int *item, char *value,int command);
+int smscontroller(int *item, char *value,int command);
+int ril_test(int *item, char *value,char *data,int command) {
+ int ril_api_choice = item[2];
+ switch (ril_api_choice) {
+ case CALL_API:
+ {
+ callController(item,value,command);
+ break;
+ }
+ case NETWORK_API:
+ {
+ networkcontroller(item,value,command);
+ break;
+ }
+ case DATA_API:
+ {
+ datacontroller(item,value,command);
+ break;
+ }
+ case SMS_API:
+ {
+ smscontroller(item,value,command);
+ //RLOGD("test_api,RIL_API");
+ break;
+ }
+ case SIM_API:
+ {
+ simcontroller(item,value,command);
+ break;
+ }
+ default:
+ break;
+ }
+ printf("value:%s\n",value);
+ return 0;
+}
+int callController(int *item, char *value,int command)
+{
+ int call_api_choice = item[3];
+ char output[1024] = {0};
+ switch(call_api_choice)
+ {
+ case DAIL:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num=parseParam(1, value,argv))
+ {
+ eventDial(argv[1],command);
+ }
+ else
+ {
+ sprintf(output, "please input caavaliable call number,and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case ANSWER_CALL:
+ {
+ eventAnswer(command);
+ break;
+ }
+ case HANGUP_CALL:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num=parseParam(1, value,argv))
+ {
+ eventCallHangUp(atoi(&argv[1][0]),command);
+ }
+ else
+ {
+ sprintf(output, "please input call id,and try again!\n");
+ emResultNotify(output ,command);
+ }
+ break;
+ }
+ case REJECT_CALL:
+ {
+ eventRejectCall(command);
+ break;
+ }
+ case AUTO_ANSWER_CALL:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num=parseParam(1, value,argv))
+ {
+ eventAutoAnswer(atoi(&argv[1][0]),command);
+ }
+ else
+ {
+ sprintf(output,"please input auto answer mode value:0 or 1,and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case SET_MUTE_STATUS:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num=parseParam(1, value,argv))
+ {
+ eventSetMute(atoi(&argv[1][0]),command);
+ }
+ else
+ {
+ sprintf(output,"please input set mute mode:0 or 1,and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case GET_MUTE_STATUS:
+ {
+ eventGetMute(command);
+ break;
+ }
+ case SET_DTMF:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num=parseParam(1, value,argv))
+ {
+ eventSetDTMF(argv[1][0],command);
+ }
+ else
+ {
+ sprintf(output,"please input DTMF value:0-9,8,#,and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case SET_DTMF_V:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num=parseParam(1, value,argv))
+ {
+ eventSetDTMFVolume(atoi(&argv[1][0]),command);
+ }
+ else
+ {
+ sprintf(output,"please input volume value,0-36,and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case DO_MULTI_CONF:
+ {
+ eventDoMultiConference(command);
+ break;
+ }
+ case OTHER_CALL_HOLD:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num=parseParam(1, value,argv))
+ {
+ eventOthercallHold(atoi(&argv[1][0]),command);
+ }
+ else
+ {
+ sprintf(output,"please input call id, and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case HANGUP_WAITING_CALL:
+ {
+ eventHangupWatingForCall(command);
+ break;
+ }
+ case HANGUP_FORE_RES_BACK:
+ {
+ eventHangupForegroundResumeBackground(command);
+ break;
+ }
+ case SWITCH_HOLD_AND_ACTIVE_CALL:
+ {
+ eventSwitchWaitOrHoldAndActiveCall(command);
+ break;
+ }
+ case GET_LAST_CALL_FAIL_CAUSE:
+ {
+ eventLastCallFailCause(command);
+ break;
+ }
+ default:
+ break;
+ }
+ return 0;
+}
+int networkcontroller(int *item, char *value,int command)
+{
+ int network_api_choice = item[3];
+ char output[1024] = {0};
+ switch(network_api_choice)
+ {
+ case QUERY_OPERATOR:
+ {
+ eventQueryOperator(command);
+ break;
+ }
+ case QUERY_NETWORK_SELECTION_MODE:
+ {
+ eventQueryNetSelectMode(command);
+ break;
+ }
+ case SET_NETWORK_SELECTION_MODE:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num=parseParam(1, value,argv))
+ {
+ eventSetNetSelectMode(atoi(&argv[1][0]),command);
+ }
+ else
+ {
+ sprintf(output,"please input network selection mode 0 or 1, and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case QUERY_AVAILABLE_NETWORKS:
+ {
+ eventQueryAvailableNetwork(command);
+ break;
+ }
+ case QUERY_REGISTRATION_STATE:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num=parseParam(1, value,argv))
+ {
+ eventQueryRegistrationState(argv[1],command);
+ }
+ else
+ {
+ sprintf(output,"please input type voice,data,or ims, and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case GET_PREFERRED_NETWORK_TYPE:
+ {
+ eventQueryPrefferredNetworkType(command);
+ break;
+ }
+ case SET_PREFERRED_NETWORK_TYPE:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num=parseParam(1, value,argv))
+ {
+ eventSetPrefferredNetworkType(atoi(&argv[1][0]),command);
+ }
+ else
+ {
+ sprintf(output,"please input preferred network type value , and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case GET_CELL_INFO_LIST:
+ {
+ eventQueryCellInfo(command);
+ break;
+ }
+ case SET_UNSOL_CELL_INFO_LIST_RATE:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num=parseParam(1, value,argv))
+ {
+ eventSetUnsolCellInfoListrate(atoi(&argv[1][0]),command);
+ }
+ else
+ {
+ sprintf(output,"please input unsolicited cell infomation list rate , and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case GET_NEIGHBORING_CELL_IDS:
+ {
+ eventQueryNeighboringCellids(command);
+ break;
+ }
+ case SET_BAND_MODE:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num=parseParam(1, value,argv))
+ {
+ eventSetBandMode(atoi(&argv[1][0]),command);
+ }
+ else
+ {
+ sprintf(output,"please input band mode, and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case QUERY_AVAILABLE_BAND_MODE:
+ {
+ eventQueryAvailableBandmode(command);
+ break;
+ }
+ case RADIO_POWER:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num=parseParam(1, value,argv))
+ {
+ eventRadioOn(atoi(&argv[1][0]),command);
+ }
+ else
+ {
+ sprintf(output,"please input radio power status value 0 or 1, and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case VOICE_RADIO_TECH:
+ {
+ eventQueryRadioTech(command);
+ break;
+ }
+ case SIGNAL_STRENGTH:
+ {
+ eventSolicitedSignalStrength(command);
+ break;
+ }
+ case MODEM_POWER:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num=parseParam(1, value,argv))
+ {
+ eventModemOn(atoi(&argv[1][0]),command);
+ }
+ else
+ {
+ sprintf(output,"please input modem power status value 0 or 1, and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ return 0;
+}
+int datacontroller(int *item, char *value,int command)
+{
+ int data_api_choice = item[3];
+ char output[1024] = {0};
+ switch(data_api_choice)
+ {
+ case SETUP_DATA_CALL:
+ {
+ eventSetupDataCall(command);
+ break;
+ }
+ case DEACTIVATE_DATA_CALL:
+ {
+ eventDeactiveDataCall(command);
+ break;
+ }
+ case GET_DATA_CALL_LIST:
+ {
+ eventGetDataCalllist(command);
+ break;
+ }
+ default:
+ break;
+ }
+ return 0;
+}
+int simcontroller(int *item, char *value,int command)
+{
+ int sim_api_choice = item[3];
+ char output[1024] = {0};
+ switch(sim_api_choice)
+ {
+ case GET_SIM_STATUS:
+ {
+ eventGetSimStatus(command);
+ break;
+ }
+ case GET_IMSI:
+ {
+ eventGetImsi(command);
+ break;
+ }
+ default:
+ break;
+ }
+ return 0;
+}
+int smscontroller(int *item, char *value,int command)
+{
+ int sms_api_choice = item[3];
+ char output[1024] = {0};
+ switch(sms_api_choice)
+ {
+ case SEND_SMS:
+ {
+ int num=0;
+ char *argv[MAX_P]={0};
+ if(num=parseParam(2, value,argv))
+ {
+ eventSendSms(argv[1], argv[2],command);
+ }
+ else
+ {
+ sprintf(output,"please input phone number and message, and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case IMS_SEND_SMS:
+ {
+ int num=0;
+ char *argv[MAX_P]={0};
+ if(num=parseParam(2, value,argv))
+ {
+ eventImsSendSms(argv[1], argv[2],command);
+ }
+ else
+ {
+ sprintf(output,"please input phone number and message, and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case WRITE_SMS_TO_SIM:
+ {
+ int num=0;
+ char *argv[MAX_P]={0};
+ if(num=parseParam(3, value,argv))
+ {
+ eventWriteSmsToSim(atoi(&argv[1][0]),argv[2], argv[3],command);
+ }
+ else
+ {
+ sprintf(output,"please input sms status,phone number and message, and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case REPORT_SMS_MEMORY_STATUS:
+ {
+ int num=0;
+ char *argv[MAX_P]={0};
+ if(num=parseParam(1, value,argv))
+ {
+ eventReportSmsMemoryStatus(atoi(&argv[1][0]),command);
+ }
+ else
+ {
+ sprintf(output,"please input memory status 0 or 1,and try agin!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case DELETE_SMS_ON_SIM:
+ {
+ int num=0;
+ char *argv[MAX_P]={0};
+ if(num=parseParam(1, value,argv))
+ {
+ eventDeletSmsOnSim(atoi(&argv[1][0]),command);
+ }
+ else
+ {
+ sprintf(output,"please input sms index,and try agin!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case GET_SMSC_ADDRESS:
+ {
+ eventGetSmscAddress(command);
+ break;
+ }
+ case SET_SMSC_ADDRESS:
+ {
+ int num=0;
+ char *argv[MAX_P]={0};
+ if(num=parseParam(1, value,argv))
+ {
+ eventSetSmscAddress(argv[1],command);
+ }
+ else
+ {
+ sprintf(output,"please input serviceNumber,and try agin!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ }
+ return 0;
+}
+
diff --git a/packages/apps/lynq-factorytest/src/ril/ril_test.h b/packages/apps/lynq-factorytest/src/ril/ril_test.h
new file mode 100644
index 0000000..5582b3f
--- /dev/null
+++ b/packages/apps/lynq-factorytest/src/ril/ril_test.h
@@ -0,0 +1,73 @@
+#ifndef __LYNQ_RIL_TEST_H__
+#define __LYNQ_RIL_TEST_H__
+typedef enum {
+ CALL_API = 0,
+ NETWORK_API,
+ DATA_API,
+ SMS_API,
+ SIM_API,
+ //GET_IMEI_API,
+}RIL_API_MENU;
+typedef enum{
+ DAIL= 0,
+ ANSWER_CALL,
+ HANGUP_CALL,
+ REJECT_CALL,
+ AUTO_ANSWER_CALL,
+ SET_MUTE_STATUS,
+ GET_MUTE_STATUS,
+ SET_DTMF,
+ SET_DTMF_V,
+ DO_MULTI_CONF,
+ OTHER_CALL_HOLD,
+ HANGUP_WAITING_CALL,
+ HANGUP_FORE_RES_BACK,
+ SWITCH_HOLD_AND_ACTIVE_CALL,
+ GET_LAST_CALL_FAIL_CAUSE,
+}RIL_CALL_MENU;
+
+typedef enum
+{
+ QUERY_OPERATOR=0,
+ QUERY_NETWORK_SELECTION_MODE,
+ SET_NETWORK_SELECTION_MODE,
+ QUERY_AVAILABLE_NETWORKS,
+ QUERY_REGISTRATION_STATE,
+ GET_PREFERRED_NETWORK_TYPE,
+ SET_PREFERRED_NETWORK_TYPE,
+ GET_CELL_INFO_LIST,
+ SET_UNSOL_CELL_INFO_LIST_RATE,
+ GET_NEIGHBORING_CELL_IDS ,
+ SET_BAND_MODE,
+ QUERY_AVAILABLE_BAND_MODE,
+ RADIO_POWER,
+ VOICE_RADIO_TECH,
+ SIGNAL_STRENGTH,
+ MODEM_POWER,
+}RIL_NETWORK_MENU;
+
+typedef enum{
+ SETUP_DATA_CALL=0,
+ DEACTIVATE_DATA_CALL,
+ GET_DATA_CALL_LIST,
+}RIL_DATA_MENU;
+
+typedef enum{
+ GET_SIM_STATUS=0,
+ GET_IMSI,
+}RIL_SIM_MENU;
+
+typedef enum{
+ SEND_SMS=0,
+ IMS_SEND_SMS,
+ WRITE_SMS_TO_SIM,
+ REPORT_SMS_MEMORY_STATUS,
+ DELETE_SMS_ON_SIM,
+ GET_SMSC_ADDRESS,
+ SET_SMSC_ADDRESS,
+}RIL_SMS_MENU;
+
+int ril_test(int *item, char *value,char *data,int command);
+
+
+#endif //__LYNQ_RIL_TEST_H__
diff --git a/packages/apps/lynq-function-test/src/audio_test.cpp b/packages/apps/lynq-function-test/src/audio_test.cpp
new file mode 100644
index 0000000..c99e61e
--- /dev/null
+++ b/packages/apps/lynq-function-test/src/audio_test.cpp
@@ -0,0 +1,127 @@
+
+
+
+/*=============================================================================
+** FileName: audio_test.cpp
+** Desc: about function test
+** Author: zhouqunchao
+** Version: V1.0
+** LastChange: 2021-08-18
+** History:
+=============================================================================*/
+
+
+#include "function_common.h"
+#include <log/log.h>
+#include "audio_test.h"
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include "liblog/liblog.h"
+#include "liblog/lynq_deflog.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "liblynq-media/lynq_medial.h"
+#include "liblynq-media/lynq_modem_voice.h"
+#ifdef __cplusplus
+}
+#endif
+void *media_handle = NULL;
+int check_spk_volume(int volume_level)
+{
+ if((volume_level>VOLUME_MAX)||(volume_level<VOLUME_MIN)){
+ // LYVERBLOG("+[audio][spk_volume_set]: error num = %d\n", AUDIO_PRAME_ERROR);
+ return 0;
+ }
+ return 1;
+}
+int check_mic_volume(int volume_level)
+{
+ if((volume_level>VOLUME_MAX)||(volume_level<VOLUME_MIN)){
+ LYVERBLOG("+[audio][mic_volume_set]: error num = %d\n", AUDIO_PRAME_ERROR);
+ return 0;
+ }
+ return 1;
+}
+int audio_test(char *api,char *string) {
+ char *argv[100] = {0};
+ int spk_volume,mic_volume;
+ parseParameters(string,argv);
+ for(int i = 0;i < 10;i++){
+ printf("argv[%d] = %s \n", i, argv[i]);
+ }
+ if(!strcmp(api, "spk_volume_set")){
+
+ int volume_level = atoi(argv[0]);
+ int ret;
+ if(check_spk_volume(volume_level))
+ {
+ ret = lynq_set_spk_volume(volume_level);
+ if(ret == 1)
+ LYVERBLOG("+[audio][spk_volume_set][success]\n");
+ else
+ LYVERBLOG("+[audio][spk_volume_set]: error num = %d\n", AUDIO_PRAME_ERROR);
+ }
+ else
+ {
+ LYVERBLOG("+[audio][spk_volume_set]: error num = %d\n", AUDIO_PRAME_ERROR);
+ return 0;
+ }
+ }
+ else if(!strcmp(api, "spk_volume_get")){
+ spk_volume = lynq_get_spk_volume();
+ LYVERBLOG("+[audio][spk_volume_get][success]: data = %d\n",spk_volume);
+ }
+ else if(!strcmp(api,"mic_volume_set")){
+ int volume_level = atoi(argv[0]);
+ if(check_mic_volume(volume_level))
+ {
+ lynq_set_spk_volume(volume_level);
+ LYVERBLOG("+[audio][spk_volume_set][success]\n");
+ }
+ else
+ {
+ LYVERBLOG("+[audio][mic_volume_set]: error num = %d\n", AUDIO_PRAME_ERROR);
+ return 0;
+ }
+ }
+ else if(!strcmp(api, "mic_volume_get")){
+ mic_volume = lynq_get_spk_volume();
+ LYVERBLOG("+[audio][mic_volume_get][success]: data = %d\n",mic_volume);
+ }
+ else if(!strcmp(api, "record_start")){
+ // if((access(argv[0],F_OK))!=-1)
+ //{
+ lynq_incall_record(argv[0]);
+ LYVERBLOG("+[audio][record_start][success]");
+ // }
+ // else
+ //{
+ // LYVERBLOG("+[audio][record_start]: error num = %d\n", AUDIO_PRAME_ERROR);
+ // }
+ }
+ else if(!strcmp(api, "record_stop")){
+ lynq_stop_record();
+ LYVERBLOG("+[audio][record_stop][success]");
+ }
+ else if(!strcmp(api,"play_audio")){
+ if((access(argv[0],F_OK))!=-1){
+ media_handle = lynq_media_play_audio(argv[0]);
+ LYVERBLOG("+[audio][play_audio][success]");
+ }
+ else
+ {
+ LYVERBLOG("+[audio][play_audio]: error num = %d\n", AUDIO_PRAME_ERROR);
+ }
+ }
+ else if(!strcmp(api,"stop_audio")){
+ lynq_media_stop_audio(media_handle);
+ }
+ else {
+ LYVERBLOG("+[command error]:error num = %d\n", AUDIO_API_ERROR);
+ }
+ return 0;
+}
diff --git a/packages/apps/lynq-function-test/src/audio_test.h b/packages/apps/lynq-function-test/src/audio_test.h
new file mode 100644
index 0000000..c596926
--- /dev/null
+++ b/packages/apps/lynq-function-test/src/audio_test.h
@@ -0,0 +1,10 @@
+typedef enum {
+ AUDIO_SUCCESS = 0 ,
+ AUDIO_API_ERROR ,
+ AUDIO_PRAME_ERROR ,
+
+}AUDIO_RESULT;
+
+int audio_test(char *api,char *string);
+
+
diff --git a/packages/apps/lynq-function-test/src/commands.h b/packages/apps/lynq-function-test/src/commands.h
new file mode 100644
index 0000000..71316d4
--- /dev/null
+++ b/packages/apps/lynq-function-test/src/commands.h
@@ -0,0 +1,60 @@
+/*=============================================================================
+** FileName: command.h
+** Desc: about function test
+** Author: Warren
+** Version: V1.0
+** LastChange: 2021-02-26
+** History:
+=============================================================================*/
+//call api
+{"dial",eventDial, "dial a call"},
+{"an",eventAnswer,"answer in coming call"},
+{"atan",eventAutoAnswer,"auto answer mode"},
+{"stme",eventSetMute, "set mute"},
+{"gtme",eventGetMute, "get mute status"},
+{"lcfc",eventLastCallFailCause, "last call fail cause"},
+{"hup",eventCallHangUp, "hang up a call"},
+{"udub",eventRejectCall, "hang up all call or reject a call"},
+{"dtmf",eventSetDTMF, "send DTMF number"},
+{"dtmfv",eventSetDTMFVolume, "set DTMF volume"},
+{"hwc",eventHangupWatingForCall, "hang up waiting or background call"},
+{"hfrb",eventHangupForegroundResumeBackground, "hang up foregound call and resume background call"},
+{"swha",eventSwitchWaitOrHoldAndActiveCall, "switch waiting or holding call to active"},
+{"dmc",eventDoMultiConference, "do multi conference"},
+{"och",eventOthercallHold, "separate conferece"},
+//data api
+{"edc",eventSetupDataCall, "enable data call"},
+{"ddc",eventDeactiveDataCall, "disable data call"},
+{"gdcl",eventGetDataCalllist,"get data call list"},
+//network
+{"qop",eventQueryOperator, "query operator"},
+{"qnsm",eventQueryNetSelectMode, "query network selection mode"},
+{"snsm",eventSetNetSelectMode,"set network selection mode"},
+{"qan",eventQueryAvailableNetwork, "query available network"},
+{"qrs",eventQueryRegistrationState, "query registration state"},
+{"gpnt",eventQueryPrefferredNetworkType,"get preferred network type"},
+{"spnt",eventSetPrefferredNetworkType, "set preferred network type"},
+{"gcil",eventQueryCellInfo, "get cell info list"},
+{"sucilr",eventSetUnsolCellInfoListrate,"set unsol cell info list rate"},
+{"gncid",eventQueryNeighboringCellids, "get neighboring cell IDs"},
+{"sbm",eventSetBandMode, "set band mode"},
+{"qabm",eventQueryAvailableBandmode,"query available band mode"},
+{"rpo",eventRadioOn,"set radio power on/off"},
+{"vrt",eventQueryRadioTech,"voice radio tech"},
+{"sst",eventSolicitedSignalStrength,"singal strength"},
+{"mpo",eventModemOn,"modem power"},
+//sim api
+{"gss",eventGetSimStatus, "get sim status"},
+{"gimsi",eventGetImsi, "get IMSI"},
+//sms api
+{"ssm",eventSendSms,"send sms"},
+{"iss",eventImsSendSms,"send sms over IMS"},
+{"wsts",eventWriteSmsToSim,"write sms to sim card"},
+{"rsms",eventReportSmsMemoryStatus,"report sms memory state"},
+{"dsos",eventDeletSmsOnSim,"delete sms on sim"},
+{"gsmsc",eventGetSmscAddress,"get smsc address"},
+{"ssmsc",eventSetSmscAddress,"set smsc address"},
+{"sstm",evenStoreSmsToMemory,"srore sms to memory"},
+{"gsfm",eventGetSmsFromMemory,"get sms from memory"},
+{"dmfm",eventDeleteMessageFromMemory,"delete sms from memory"},
+{(char *)NULL, NULL, (char *)NULL},
diff --git a/packages/apps/lynq-function-test/src/fota_test.cpp b/packages/apps/lynq-function-test/src/fota_test.cpp
new file mode 100644
index 0000000..35ee638
--- /dev/null
+++ b/packages/apps/lynq-function-test/src/fota_test.cpp
@@ -0,0 +1,286 @@
+/*=============================================================================
+** FileName: fota_test.c
+** Desc: about function test
+** Author: victor
+** Version: V1.0
+** LastChange: 2021-10-11
+** History:
+=============================================================================*/
+#include "function_common.h"
+#include <log/log.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "fota_test.h"
+#include "fcntl.h"
+#include "mtk_device_wrap.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "include/iot_rock.h"
+#include "ftp/lynq_ftp.h"
+#ifdef __cplusplus
+}
+#endif
+
+lynq_ftp_socker_info ftp_log_info;
+
+#define UPDATA_ADDR "/tmp/fota.delta"
+#define READ_BLOCK_SIZE 0x40000
+
+int lynq_fota_md5_flag = -1;
+
+#if 0
+#define FLASH_DEV_DELTA "/dev/disk/by-partlabel/delta"
+#else
+#define FLASH_DEV_DELTA "/dev/mtd41"
+#endif
+
+
+
+#if 0
+#define BUF_SIZE 1024
+int lynq_fota_str_arr(char *str, char *substr, char parts[][BUF_SIZE])
+{
+ char *p = NULL;
+ char *q = NULL;
+ char tmp[BUF_SIZE] = {0};
+ char end[BUF_SIZE] = {0};
+ int i = 0, j = 0, k = 0, par_num=0;
+
+ char *start = strdup(str);
+
+ while(*str != '\0')
+ {
+ p = str;
+ q = substr;
+ tmp[i] = *str;
+ i++;
+
+ while((*p == *q) && (*p != '\0') && (*q != '\0'))
+ {
+ p++;
+ q++;
+ }
+ if(*q == '\0')
+ {
+ memset(end, 0, sizeof(end));
+ strcpy(end, p);
+
+ memset(parts[j], 0, sizeof(parts[j]));
+
+ j == 0 ? memcpy(parts[j], tmp, strlen(tmp)-1) : memcpy(parts[j], tmp+1, strlen(tmp)-2) ;
+
+ j++;
+ memset(tmp, 0, sizeof(tmp));
+ i = 0;
+ par_num++;
+ }
+
+ str++;
+ }
+
+
+ if (!par_num) {
+ LYDBGLOG("[%s-%d] cmd is error!!!\n", __FUNCTION__, __LINE__);
+ LYVERBLOG("+[thhandle]: error \n");
+ return -1;
+ }
+
+
+ if (strcmp(end, "") != 0) {
+ memset(parts[j], 0, sizeof(parts[j]));
+ memcpy(parts[j], tmp+1, strlen(tmp)-2);
+ }
+
+ for (i = 0 ; i < par_num + 1 ; i++)
+ memcpy(parts[i], strchr(parts[i],'"')+1,strlen(parts[i]));
+
+ return par_num;
+}
+#endif
+
+int lynq_ftp_download_fota_package(char *string[])
+{
+
+ sprintf(ftp_log_info.sevname,"%s",string[1]);
+ LYVERBLOG("[+UP]: sevname:%s\n",ftp_log_info.sevname);
+ ftp_log_info.portnum = atoi(string[2]);
+ LYVERBLOG("[+UP]: portnum:%d\n",ftp_log_info.portnum);
+
+ sprintf(ftp_log_info.username,"%s",string[3]);
+ sprintf(ftp_log_info.pw,"%s",string[4]);
+LYVERBLOG("[+UP]: username:%s\n",ftp_log_info.username);
+LYVERBLOG("[+UP]: pw:%s\n",ftp_log_info.pw);
+
+ sprintf(ftp_log_info.is_pasv_mode,"%s",string[5]);
+ sprintf(ftp_log_info.file_type,"%s",string[6]);
+ sprintf(ftp_log_info.put_opt,"%s",string[7]);
+
+ sprintf(ftp_log_info.getfilename_path,"%s",string[8]);
+ sprintf(ftp_log_info.getfilename,"%s",string[9]);
+ LYVERBLOG("[+UP]: getfilename_path:%s\n",ftp_log_info.getfilename_path);
+
+ LYVERBLOG("[+UP]: Download the FTP data start\n");
+ lynq_ftp_login(&ftp_log_info);
+ lynq_ftp_download(&ftp_log_info);
+ LYVERBLOG("[+UP]: Download the FTP data end\n");
+
+ return 0;
+}
+
+int lynq_md5_fota_package(char *string[])
+{
+ int ret = 0;
+ int fd_down,size,fd_target;
+ char delta_data[READ_BLOCK_SIZE];
+ char input_md5_data[64] = {0};
+
+ sprintf(input_md5_data,"%s",string[0]);
+//LYVERBLOG("[+UP]: input_md5_data:%s\n",input_md5_data);
+ lynq_fota_md5_flag = lynq_md5_file_verfy(UPDATA_ADDR, input_md5_data);
+ if(lynq_fota_md5_flag == 0)
+ {
+ LYVERBLOG("[+UP]: md5 fota package success\n");
+ }
+ else
+ {
+ LYVERBLOG("[+UP]: md5 fota package fail\n");
+ return 1;
+ }
+
+ fd_down = open(UPDATA_ADDR,O_RDONLY);
+ if (fd_down < 0) {
+ LYVERBLOG("[+UP]: open source error\n");
+ return 1;
+ }
+
+ fd_target = mtk_device_wrap_open(FLASH_DEV_DELTA,O_RDWR);
+
+ if (fd_target < 0) {
+ close(fd_down);
+ LYERRLOG("+[UA]: open target error\n");
+ return 1;
+ }
+
+ LYVERBLOG("[+UP]: Get ftp data write to delta\n");
+ while(( size = read(fd_down,delta_data,READ_BLOCK_SIZE))>0) {
+ mtk_device_wrap_write(fd_target,delta_data,READ_BLOCK_SIZE);
+ memset(delta_data,0,READ_BLOCK_SIZE);
+ }
+
+ LYVERBLOG("[+UP]: Store upgrade data to delta success\n");
+
+ mtk_device_wrap_close(fd_target);
+ close(fd_down);
+
+ return 0;
+}
+
+#if 0
+int lynq_md5_fota_package_new(char *string[])
+{
+ int ret = 0;
+ int fd_down,size,fd_target;
+ int total_len = 0,pack_len = 0;
+ char delta_data[READ_BLOCK_SIZE];
+ char input_md5_data[64] = {0};
+
+ sprintf(input_md5_data,"%s",string[0]);
+ pack_len = atoi(string[1]);
+//LYVERBLOG("[+UP]: input_md5_data:%s\n",input_md5_data);
+ lynq_fota_md5_flag = md5_file_verfy_new(FLASH_DEV_DELTA, input_md5_data,pack_len);
+ if(lynq_fota_md5_flag == 0)
+ {
+ LYVERBLOG("[+UP]: md5 fota package success\n");
+ }
+ else
+ {
+ LYVERBLOG("[+UP]: md5 fota package fail\n");
+ return 1;
+ }
+
+ fd_down = open(UPDATA_ADDR,O_RDONLY);
+ if (fd_down < 0) {
+ LYVERBLOG("[+UP]: open source error\n");
+ return 1;
+ }
+
+ fd_target = mtk_device_wrap_open(FLASH_DEV_DELTA,O_RDWR);
+
+ if (fd_target < 0) {
+ close(fd_down);
+ LYERRLOG("+[UA]: open target error\n");
+ return 1;
+ }
+
+ LYVERBLOG("[+UP]: Get ftp data write to delta\n");
+ while(( size = read(fd_down,delta_data,READ_BLOCK_SIZE))>0) {
+ mtk_device_wrap_write(fd_target,delta_data,READ_BLOCK_SIZE);
+ memset(delta_data,0,READ_BLOCK_SIZE);
+ }
+ LYVERBLOG("[+UP]: Store upgrade data to delta success\n");
+
+ mtk_device_wrap_close(fd_target);
+ close(fd_down);
+
+ return 0;
+}
+#endif
+int lynq_fota_func_test(void)
+{
+ int first_run = 1;
+ LYVERBLOG("+[UA]: Upgrade to start\n");
+ if(lynq_fota_md5_flag == 0)
+ {
+ lynq_rock_main(first_run);
+ }
+ else
+ {
+ LYVERBLOG("+[UA]: MD5 verify fail\n");
+ return 1;
+ }
+ LYVERBLOG("+[UA]: Upgrade to end\n");
+ return 0;
+}
+
+int fota_test(char *api,char *string)
+{
+// char argv[20][BUF_SIZE] = {0};
+// int line = lynq_fota_str_arr(string, "\"&", argv)+1;
+ char *argv[100] = {0};
+ parseParameters(string,argv);
+ if(!strcmp(api, "download"))
+ {
+ if(!(strcmp(argv[0], "ftp")))
+ {
+ lynq_ftp_download_fota_package(argv);
+ }
+ else if(!(strcmp(argv[0], "http")))
+ {
+
+ }
+
+ }
+ else if(!(strcmp(api, "md5")))
+ {
+ lynq_md5_fota_package(argv);
+ }
+// else if(!(strcmp(api, "md5new")))
+// {
+// lynq_md5_fota_package_new(argv);
+// }
+ else if(!(strcmp(api, "upgrade")))
+ {
+ lynq_fota_func_test();
+ }
+ else
+ {
+ LYVERBLOG("+[fota][fota_test]: fota api error!!!\n");
+ }
+ return 0;
+}
+
+
diff --git a/packages/apps/lynq-function-test/src/fota_test.h b/packages/apps/lynq-function-test/src/fota_test.h
new file mode 100644
index 0000000..06187d8
--- /dev/null
+++ b/packages/apps/lynq-function-test/src/fota_test.h
@@ -0,0 +1,4 @@
+#ifndef __FOTA_TEST_H__
+#define __FOTA_TEST_H__
+int fota_test(char *api,char *string);
+#endif //__FOTA_TEST_H__
\ No newline at end of file
diff --git a/packages/apps/lynq-function-test/src/function_common.cpp b/packages/apps/lynq-function-test/src/function_common.cpp
new file mode 100644
index 0000000..1771661
--- /dev/null
+++ b/packages/apps/lynq-function-test/src/function_common.cpp
@@ -0,0 +1,188 @@
+/*=============================================================================
+** FileName: function_common.cpp
+** Desc: about function test
+** Author: Warren
+** Version: V1.0
+** LastChange: 2021-02-26
+** History:
+=============================================================================*/
+/*Get private menu,take only the first two parameters, and return the head pointer of the remaining string*/
+#include <stdio.h>
+#include <string.h>
+#include "function_common.h"
+#include <sys/time.h>
+#include <unistd.h>
+void set_timer(int it_interval_sec, int it_interval_usec,int it_value_sec,int it_value_usec)
+{
+ struct itimerval itv, oldtv;
+ itv.it_interval.tv_sec = it_interval_sec;
+ itv.it_interval.tv_usec = it_interval_usec;
+ itv.it_value.tv_sec = it_value_sec;
+ itv.it_value.tv_usec = it_value_usec;
+ setitimer(ITIMER_REAL, &itv, &oldtv);
+}
+
+int sleep_with_restart(int second)
+{
+ int left = second;
+ while (left > 0)
+ {
+ left = sleep(left);
+ }
+ return 0;
+}
+int millli_sleep_with_restart(int millisecond)
+{
+ int left = millisecond*1000;
+ while (left > 0)
+ {
+ left = usleep(left);
+ }
+
+ return 0;
+}
+//Get private menu,take only the first two parameters, and return the head pointer of the remaining string
+char* getMenu(char * str,char *argv[])
+{
+ char* pos = str;
+ int menu = 0;
+ int num = 0;
+ if (str == NULL)
+ {
+ return NULL;
+ }
+ while (1)
+ {
+ menu = 0;
+ if (num == 2)
+ {
+ break;
+ }
+ while (1)
+ {
+ if (*pos == '"')
+ {
+ if (menu == 0)
+ {
+ menu++;
+ argv[num++] = pos+1;
+ }
+ else if (menu == 1)
+ {
+ *pos++ = '\0';
+ break;
+ }
+ else
+ {
+ break;
+ }
+ }
+ pos++;
+ }
+
+ }
+ printf("moudle = %s\nAPI = %s\n", argv[0], argv[1]);
+ return pos;
+}
+/*parse the parameters,and then stroge every parameter to argv.*/
+/*return the number of parameters.*/
+int getParam(char * str,char *argv[])
+{
+ char* pos = str;
+ int num = 0;
+ if (str == NULL)
+ {
+ return 0;
+ }
+ while (1)
+ {
+ if (*pos == '\0')
+ {
+ break;
+ }
+ while (1)
+ {
+ if (*(pos - 1) == '=' && *pos == '"')// "="" as the basis for starting the parameter.
+ {
+ argv[num++] = pos+1;
+ }
+ else if (*(pos - 1) == '"' && *pos == '&')// "="" as the basis for the end of the parameter
+ {
+ *(pos - 1) = '\0';
+ pos++;
+ break;
+ }
+ else if (*pos == '\0'&&*(pos-1) == '"')//the string end.
+ {
+ *(pos - 1) = '\0';
+ break;
+ }
+ else if (*pos == '\0')//the string end.
+ {
+ break;
+ }
+ pos++;
+ }
+ }
+ // for (int i = 0;i < num;i++)
+ // {
+ // printf("argv[%d] = %s\n",i,argv[i]);
+ // }
+ return num;
+}
+
+/*remove the escape character '\'*/
+int removeTage(const int length,char* argv[])
+{
+ char* temp = NULL;
+ char* temp1 = NULL;
+ char** pos = argv;
+ for (int i = 0;i < length;i++)
+ {
+ temp1 = pos[i];
+ while (1)
+ {
+ if (*pos[i] == '\0')
+ {
+ break;
+ }
+ if ((*pos[i] == '"') && (*(pos[i] - 1) == '\\'))//Remove "\"" when encountering '\'
+ {
+ temp = pos[i];
+ while (1)
+ {
+ *(pos[i] - 1) = *(pos[i]);
+ if (*(pos[i]) == '\0')
+ {
+ break;
+ }
+ pos[i]++;
+ }
+ pos[i] = temp;
+ }
+ pos[i]++;
+ }
+ pos[i] = temp1;
+ }
+ return 0;
+}
+int parseParameters(char *str,char *argv[])
+{
+ int argc = 0;
+ argc = getParam(str,argv);
+ removeTage(argc,argv);
+ // for (int i = 0;i < argc; i++)
+ // {
+ // printf("param %d = %s\n",i, argv[i]);
+ // }
+ return 0;
+}
+RIL_COMMAND*find_command (char *name,RIL_COMMAND *Class)
+{
+ register int i;
+ for (i = 0; Class[i].name; i++)
+ if (strcmp (name, Class[i].name) == 0)
+ return (&Class[i]);
+ return ((RIL_COMMAND *)NULL);
+}
+
diff --git a/packages/apps/lynq-function-test/src/function_common.h b/packages/apps/lynq-function-test/src/function_common.h
new file mode 100644
index 0000000..42a0c7d
--- /dev/null
+++ b/packages/apps/lynq-function-test/src/function_common.h
@@ -0,0 +1,44 @@
+/*=============================================================================
+** FileName: function_common.h
+** Desc: about function test
+** Author: Warren
+** Version: V1.0
+** LastChange: 2021-02-26
+** History:
+=============================================================================*/
+
+
+#ifndef FUNCTION_COMMON_H
+#define FUNCTION_COMMON_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ #include "liblog/liblog.h"
+ #include "liblog/lynq_deflog.h"
+#ifdef __cplusplus
+}
+#endif
+typedef enum{
+ MENU_INPUT_ERROR=0,
+ MODULE_INPUT_ERROR,
+ API_INPUT_ERROR,
+ INVALID_CMD,
+}COMMAND_ERROR;
+typedef struct {
+ char *name; /* User printable name of the function. */
+ int (*func)(char **param); /* Function to call to do the job. */
+ char *doc;
+} RIL_COMMAND;
+RIL_COMMAND*find_command (char *name,RIL_COMMAND *Class);
+
+void set_timer(int it_interval_sec, int it_interval_usec,int it_value_sec,int it_value_usec);
+int sleep_with_restart(int second);
+int millli_sleep_with_restart(int millisecond);
+
+char* getMenu(char * str,char *argv[]);
+int parseParameters(char *str,char *argv[]);
+//int getParam(char * str,char *argv[]);
+//int removeTage(const int length,char* argv[]);
+
+#endif
\ No newline at end of file
diff --git a/packages/apps/lynq-function-test/src/gpio_test.cpp b/packages/apps/lynq-function-test/src/gpio_test.cpp
new file mode 100644
index 0000000..ca00017
--- /dev/null
+++ b/packages/apps/lynq-function-test/src/gpio_test.cpp
@@ -0,0 +1,91 @@
+/*=============================================================================
+** FileName: gpio_test.cpp
+** Desc: about function test
+** Author: zhou
+** Version: V1.0
+** LastChange: 2021-03-04
+** History:
+=============================================================================*/
+#include "function_common.h"
+#include <log/log.h>
+#include "gpio_test.h"
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "liblynq-driver/libdriver.h"
+#ifdef __cplusplus
+}
+#endif
+int check_mode(const char *mode)
+{
+if(!strcmp(mode, GPIO_DIR))
+{
+ return 1;
+}
+if(!strcmp(mode, GPIO_OUT))
+{
+ return 1;
+}
+if(!strcmp(mode, GPIO_MODE))
+{
+ return 1;
+}
+ return -1;
+}
+int check_status(int statu)
+{
+ if (statu == 0)
+ return 1;
+ if (statu ==1)
+ return 1;
+ return -1;
+}
+int gpio_test(char *api,char *string) {
+ char *argv[100] = {0};
+ parseParameters(string,argv);
+ if(!strcmp(api, "get")){
+ char output1[1024] = {0};
+ int value = atoi(argv[0]);
+ lynq_get_gpio (value,output1);
+ // printf("Factory_result get %d gpio:%s \n",value,output1)
+ LYVERBLOG("+[gpio][get]: data = %s\n",output1);
+
+ }
+ else if(!strcmp(api, "set")){
+ int gpio_numb = atoi(argv[1]);
+ int gpio_statu = atoi(argv[2]);
+ int check_prame;
+ check_prame = check_mode(argv[0]);
+ if(check_prame == -1)
+ {
+ LYVERBLOG("+[gpio][set]: error num = %d \n",GPIO_PRAME_ERROR);
+ return 0;
+ }
+ check_prame = check_status(gpio_statu);
+ if(check_prame == -1)
+ {
+ LYVERBLOG("+[gpio][set]: error num = %d \n",GPIO_PRAME_ERROR);
+ return 0;
+ }
+ int result = lynq_set_gpio(argv[0], gpio_numb,gpio_statu);
+ if(result == -1)
+ {
+ LYVERBLOG("+[gpio][set]: error num = %d \n",GPIO_SET_ERROR);
+ return 0;
+ }
+ else
+ {
+ LYVERBLOG("+[gpio][set]: ok!!\n",result);
+ return 1;
+ }
+ // printf("Factory_result gpio %d set state :%d\n",gpio_numb,result);
+ }
+ else {
+ LYVERBLOG("+[gpio][lynq_set_gpio]: error num =%d\n",GPIO_PRAME_ERROR);
+ }
+
+ return 0;
+}
\ No newline at end of file
diff --git a/packages/apps/lynq-function-test/src/gpio_test.h b/packages/apps/lynq-function-test/src/gpio_test.h
new file mode 100644
index 0000000..204cfe0
--- /dev/null
+++ b/packages/apps/lynq-function-test/src/gpio_test.h
@@ -0,0 +1,12 @@
+#ifndef __LYNQ_GPIO_TEST_H__
+#define __LYNQ_GPIO_TEST_H__
+#define GPIO_MODE "mode"
+#define GPIO_DIR "dir"
+#define GPIO_OUT "out"
+typedef enum {
+ GPIO_SET_SUCCESS = 0 ,
+ GPIO_PRAME_ERROR = 1,
+ GPIO_SET_ERROR = 2,
+}GPIO_SET_RESULT;
+int gpio_test(char *api,char *string);
+#endif //__LYNQ_GPIO_TEST_H__
\ No newline at end of file
diff --git a/packages/apps/lynq-function-test/src/main.cpp b/packages/apps/lynq-function-test/src/main.cpp
new file mode 100644
index 0000000..f490c22
--- /dev/null
+++ b/packages/apps/lynq-function-test/src/main.cpp
@@ -0,0 +1,437 @@
+
+/* gets example */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <libtel/lib_tele.h>
+#include "ril_test.h"
+#include "gpio_test.h"
+#include "fota_test.h"
+#include "audio_test.h"
+#include "system_test.h"
+//#include "service_test.h"
+#include "function_common.h"
+//#include "conti_plugin_test.h"
+//#include "exception_multicast.h"
+
+
+#include<unistd.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "liblynq-broadcast/broadcast_send.h"
+#include <gio/gio.h>
+#include <glib.h>
+#include "liblynq-driver/libdriver.h"
+
+#ifdef __cplusplus
+}
+#endif
+
+#define BUFFER_SIZE 8192
+#define USER_LOG_TAG "FUNCTION_TEST"
+#define MAX_ARGS 5
+typedef enum {
+ API_MENU = 1,
+ DEMO_MENU,
+}TEST_MAIN_ITEM;
+typedef enum{
+ API_RIL=0,
+ API_GPIO,
+ API_MQTT,
+ API_HTTP,
+ API_WIFI,
+ API_GNSS,
+ API_SERVICE,
+ API_AUDIO,
+ API_DHCP,
+ API_SYSTEM,
+ API_FOTA,
+} API_MOUDLE;
+
+
+void lynq_incoming_call_cb(RIL_SOCKET_ID soc_id,int index, char * addr, RIL_CallState state, int toa)
+{
+ // printf("[SIM%d]index is %d,addr is %s,state is %d,toa is %d\n",soc_id,index,addr,state,toa);
+ LYVERBLOG("[SIM%d]index is %d,addr is %s,state is %d,toa is %d\n",soc_id,index,addr,state,toa);
+}
+
+void lynq_recive_new_sms_cb(RIL_SOCKET_ID soc_id,char * num, char * smsc, char * msg, int charset)
+{
+ // printf("[SIM%d]num is %s,smsc is %s,msg is %s,charset is %d\n",soc_id,num,smsc,msg,charset);
+ LYVERBLOG("[SIM%d]num is %s,smsc is %s,msg is %s,charset is %d\n",soc_id,num,smsc,msg,charset);
+}
+
+static user_cb mytest={
+ lynq_recive_new_sms_cb,
+ lynq_incoming_call_cb
+};
+
+
+static void getCallback(const char* str_arg, int int_arg )
+{
+ //printf("SignalCallback,str_arg:%s,int_arg:%d\n", str_arg,int_arg);
+ LYVERBLOG("SignalCallback,str_arg:%s,int_arg:%d\n", str_arg,int_arg);
+
+ return;
+}
+
+void hold_on(){
+ char any[5]={ 0 };
+ printf("Press any key to return\n");
+ fgets(any, 5, stdin);
+}
+
+int parse_param(char *cmd, char *argv[], int max_args){
+ char *pos, *pos2;
+ int argc = 0;
+
+ pos = cmd;
+ while (1) {
+ // Trim the space characters.
+ while (*pos == ' ') {
+ pos++;
+ }
+
+ if (*pos == '\0') {
+ break;
+ }
+
+ // One token may start with '"' or other characters.
+ if (*pos == '"' && (pos2 = strchr(pos + 1, '"'))) {
+ argv[argc++] = pos + 1;
+ *pos2 = '\0';
+ pos = pos2 + 1;
+ if (*pos == '\n'){
+ *pos = '\0';
+ pos = pos + 1;
+ }
+ }
+ else {
+ argv[argc++] = pos;
+ while (*pos != '\0' && *pos != ' '&& *pos != '\n')
+ {
+ if (*pos == '"' && (pos2 = strchr(pos + 1, '"')))
+ {
+ pos = pos2 ;
+ }
+ else
+ pos++;
+ }
+ *pos++ = '\0';
+ }
+
+ // Check if the maximum of arguments is reached.
+ if (argc == max_args) {
+ break;
+ }
+ }
+
+ return argc;
+}
+int getRilModule(char *module)
+{
+ if (module==NULL)
+ {
+ //printf("[ERROR] Please input module,and try again!");
+ // LYVERBLOG("+[command error]:error num = %d\n",MENU_INPUT_ERROR);
+ return -1;
+ }
+ if(!strcmp(module,"ril"))
+ {
+ return API_RIL;
+ }
+ else if(!strcmp(module,"gpio"))
+ {
+ return API_GPIO;
+ }
+ else if(!strcmp(module,"MQTT"))
+ {
+ return API_MQTT;
+ }
+ else if(!strcmp(module,"HTTP"))
+ {
+ return API_HTTP;
+ }
+ else if(!strcmp(module,"WIFI"))
+ {
+ return API_WIFI;
+ }
+ else if(!strcmp(module,"GNSS"))
+ {
+ return API_GNSS;
+ }
+ // else if(!strcmp(module, "SERVICE"))
+ // {
+ // return API_SERVICE;
+ // }
+ else if(!strcmp(module, "AUDIO"))
+ {
+ return API_AUDIO;
+ }
+ else if(!strcmp(module,"DHCP"))
+ {
+ return API_DHCP;
+ }
+ else if(!strcmp(module,"SYSTEM"))
+ {
+ return API_SYSTEM;
+ }
+ else if(!strcmp(module, "fota"))
+ {
+ return API_FOTA;
+ }
+ else
+ {
+ LYVERBLOG("+[command error]:error num = %d\n",MENU_INPUT_ERROR);
+ // printf("can not find %s API module ",module);
+ return -1;
+ }
+ return -1;
+}
+
+int api_start(int argc, char *argv[]){
+ LYDBGLOG("api_start,argc:%d\n",argc);
+ char *menu[2] = {0};// menu[0] is the "moudle",menu[1] is the "API"
+ char* argvHead=NULL;
+ int module = -1;
+ argvHead = getMenu(argv[2],menu);//find the "module" and the "API"
+ module = getRilModule(menu[0]);
+ // if(argvHead == NULL)
+ // {
+ // printf("pram api error\n");
+ // return 0;
+ // }
+ switch(module)
+ {
+ case API_RIL:
+ {
+ if(argvHead)
+ {
+ ril_test(menu[1],argvHead);
+ break;
+ }
+ }
+ /* Add the code of the owner modules below*/
+ case API_GPIO:
+ {
+ gpio_test(menu[1],argvHead);
+ break;
+ }
+ // case API_SERVICE:
+ // {
+ // service_test(menu[1],argvHead);
+ // break;
+ // }
+ case API_AUDIO:
+ {
+ audio_test(menu[1],argvHead);
+ break;
+ }
+ case API_DHCP:
+ {
+ //dhcp_test(menu[1],argvHead);
+ break;
+ }
+ case API_SYSTEM:
+ {
+ system_test(menu[1],argvHead);
+ break;
+ }
+ case API_FOTA:
+ {
+ fota_test(menu[1],argvHead);
+ break;
+ }
+
+ case API_MQTT:
+ case API_HTTP:
+ case API_WIFI:
+ case API_GNSS:
+ break;
+ default:
+ // printf("pram module error\n");
+ LYVERBLOG("+[command error]:error num = %d\n",MENU_INPUT_ERROR);
+
+ break;
+ }
+ // hold_on(); //add by zhouqunchao delete help message
+ return 1;
+}
+
+int function_start(int argc, char *argv[])
+{
+ int select_menu = atoi(argv[0]);
+ int thread = atoi(argv[1]);
+ // printf("select_menu:%d,thread:%d\n",select_menu,thread);
+ switch(select_menu)
+ {
+ case API_MENU:
+ {
+ if (thread == 1)//rita add @2021.6.21 for threadhandle test
+ {
+ LYDBGLOG("[%s-%d] argv[2] = [%s]\n", __FUNCTION__, __LINE__, argv[2]);
+ if(strlen(argv[2])){//rita add @2021.6.21 for data error
+ LYDBGLOG("[%s-%d] argv[2] = [%s]\n", __FUNCTION__, __LINE__, argv[2]);
+ send_broadcast_by_name("function", strlen(argv[2]), argv[2]);
+ }
+ else{
+ LYVERBLOG("+[thhandle]: error num = %d\n", INVALID_CMD);
+ return INVALID_CMD;
+ }
+ }
+ else if(thread ==2){//rita add @2021.6.21 for local test
+ api_start(argc,argv);
+ }
+ else{
+ //printf("thread 1,local 2\n");
+ LYDBGLOG("thread 1,local 2\n");
+ }
+ break;
+ }
+ case DEMO_MENU:
+ {
+ //printf("DEMO_MENU\n");
+ LYDBGLOG("DEMO_MENU\n");
+ break;
+ }
+ default:
+ break;
+ }
+ return 0;
+}
+
+
+void help_display(){
+ printf("\n");
+ printf("*****************************************************************************\n");
+ printf("0:help ------- help\n");
+ printf("*****************************************************************************\n");
+ printf("1:API TEST\n" );
+ printf(" 1-1:Async api-\n" );
+ printf(" --MQTT\n" );
+ printf("\n");
+ printf(" --HTTP\n" );
+ printf(" 1-2:Sync api-\n" );
+ printf(" --GPIO\n" );
+ printf("\n");
+ printf(" --RIL\n" );
+ printf("\n");
+ printf(" --WIFI\n" );
+ printf("\n");
+ printf(" --GNSS\n" );
+ printf("\n");
+ printf(" --SERVICE\n" );
+ printf("*****************************************************************************\n");
+ printf("2:DEMO TEST:Subsequent updates\n" );
+ printf("*****************************************************************************\n");
+ printf("\n");
+ printf("1:API TEST The format is as follows :\n" );
+ printf("{menu}-{mode selection} moudle=\"{moudle}\"&API=\"{api interface}\"&session=\"{session id}\"\"¶meterA=\"{parameter A}\"\n" );
+ /*
+ printf("The main parameters are as follows:\n");
+ printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
+ printf("menu:1--API TEST,2--DEMO TEST\n" );
+ printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
+ printf("mode selection:1--async api,2--sync api\n" );
+ printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
+ printf("moudle:Test module--includes the following modules\n" );
+ printf("RIL, GPIO,MQTT,HTTP,WIFI,GNSS\n" );
+ printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
+ printf("api interface:--Interface corresponding to module\n" );
+ printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
+ printf("session id:--Used to distinguish different session groups of the same module\n" );
+ printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
+ printf("parameter A:--API parameter,Add format {\"¶meter_name=\"{parameter}\"} \n" );
+ printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
+ */
+ printf("Select menu:\n");
+}
+void menu_display(){
+ printf("\n");
+ printf("**********************\n");
+ printf("0:help menu\n");
+ printf("1:API TEST\n");
+ printf("2:DEMO TEST\n");
+ printf("**********************\n");
+ printf("\n");
+ printf("Select menu:\n");
+}
+int main()
+{
+
+ LYLOGEINIT(USER_LOG_TAG);
+ LYLOGSET(4);
+ registerTriggerCallback(getCallback);
+ register_key_info();
+ lynqRegisterUnsolicitedResponse(&mytest);
+
+ /*Check whether the modem works correctly and start the corresponding service*/ //add by liulei
+ char buf[1024]={0};
+ int fd[2];
+ int backfd;
+ pipe(fd);
+ backfd=dup(STDOUT_FILENO);//备份标准输出,用于恢复
+ dup2(fd[1],STDOUT_FILENO); //将标准输出重定向到fd[1]
+ system("cat /sys/kernel/ccci/boot");
+ read(fd[0],buf,1024);
+ dup2(backfd,STDOUT_FILENO); //恢复标准输出
+ LYVERBLOG("this is a test :\n%s",buf); //上面不恢复,则此处的执行结果无法再屏幕上打印
+ if(!strncmp(buf, "md1:4", 5)){
+ lynq_ril_init();
+ }
+ else{
+ printf("\033[40;31mmodem go wrong, May cause problems with your subsequent use of the service\033[0m\n");
+ printf("\033[40;31mmodem go wrong, May cause problems with your subsequent use of the service\033[0m\n");
+ printf("\033[40;31mmodem go wrong, May cause problems with your subsequent use of the service\033[0m\n");
+ }
+ /*Check whether the modem works correctly and start the corresponding service*/
+ sleep_with_restart(1);
+ register_broadcast_send();
+
+ while (1) {
+ char *argv[MAX_ARGS];
+ char str[BUFFER_SIZE]={ 0 };
+ menu_display();
+ fgets(str, BUFFER_SIZE, stdin);
+ LYDBGLOG("[%s-%d] str= [%s]\n", __FUNCTION__, __LINE__, str);
+ str[strlen(str)-1]='\0';
+ if(!strcmp(str, "0")){
+ help_display();
+ //hold_on(); //add by zhouqunchao delete help message
+ continue;
+ }
+ if(!strcmp(str,"quit"))
+ {
+ //system("killall lynq-framework-service");
+ break;
+ }
+ if ((strncmp(str,"1-",2) == 0)||
+ (strncmp(str,"2-",2)== 0))
+ {
+ char* at_cmd = strstr(str, "-");
+ strncpy(at_cmd, " ", 1);
+ LYDBGLOG("[%s-%d] at_cmd = [%s]\n", __FUNCTION__, __LINE__, at_cmd);
+
+
+ int argc = parse_param(str, argv, MAX_ARGS);
+ //add by zqc Format error judgment start
+ if(argv[2] == NULL)
+ {
+ LYVERBLOG("+[command error]:error num = %d\n",MENU_INPUT_ERROR);
+ continue;
+ }
+ //add by zqc Format error judgment end
+ function_start(argc,argv);
+ continue;
+ }
+ else{
+ // printf("pram error\n");
+ LYVERBLOG("+[command error]:error num = %d\n",MENU_INPUT_ERROR);
+ continue;
+ }
+ }
+return 0;
+}
+
diff --git a/packages/apps/lynq-function-test/src/makefile b/packages/apps/lynq-function-test/src/makefile
new file mode 100644
index 0000000..740ad4a
--- /dev/null
+++ b/packages/apps/lynq-function-test/src/makefile
@@ -0,0 +1,117 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+ -g -Os \
+ -flto \
+ -DRIL_SHLIB \
+ -DATCI_PARSE \
+ -DKEEP_ALIVE \
+ -D__LINUX_OS__ \
+ -DECALL_SUPPORT
+
+$(warning ################# C2K support: $(RAT_CONFIG_C2K_SUPPORT))
+ifeq ($(strip $(RAT_CONFIG_C2K_SUPPORT)), yes)
+ LOCAL_CFLAGS += -DC2K_SUPPORT
+
+endif
+
+ifeq ($(strip $(MTK_MULTI_SIM_SUPPORT)), dsds)
+ LOCAL_CFLAGS += -DANDROID_SIM_COUNT_2 \
+ -DANDROID_MULTI_SIM \
+ -DMODE_DSDS
+endif
+
+ifeq ($(strip $(MTK_MULTI_SIM_SUPPORT)), dsss)
+ LOCAL_CFLAGS += -DMODE_DSSS
+endif
+
+$(warning ################# TARGET_PLATFORM: $(TARGET_PLATFORM))
+ifeq ($(strip $(TARGET_PLATFORM)), mt2731)
+#$(warning #################add for debug $(ROOT), $(includedir))
+$(warning ################# TARGET_PLATFORM_MT2731)
+ LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2731 \
+ -DMD_93_SUPPORT
+else ifeq ($(strip $(TARGET_PLATFORM)), mt2635)
+$(warning ################# TARGET_PLATFORM_MT2635)
+ LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2635 \
+ -DMD_90_SUPPORT
+endif
+
+
+LOCAL_PATH = .
+#CFLAGS = $(LOCAL_CFLAGS) -std=c99
+#CXXFLAGS = $(LOCAL_CFLAGS) -std=gnu++14
+$(warning ################# ZHOUQUNCHAO ROOT: $(ROOT),includedir:$(includedir),LOCAL_PATH:$(LOCAL_PATH))
+LOCAL_C_INCLUDES = \
+ -I. \
+ -I$(LOCAL_PATH) \
+ -I$(ROOT)$(includedir)/ \
+ -I$(ROOT)$(includedir)/include \
+ -I$(ROOT)$(includedir)/logger \
+ -I$(ROOT)$(includedir)/liblynq-media \
+ -I$(ROOT)$(includedir)/liblynq-broadcast \
+ -I$(ROOT)$(includedir)/vendor-ril \
+ -I$(ROOT)$(includedir)/liblog \
+ -I$(ROOT)$(includedir)/ftp \
+ -I$(ROOT)$(includedir)/liblynq-driver \
+ -I$(ROOT)$(includedir)/gstreamer-1.0 \
+ -I$(ROOT)$(includedir)/glib-2.0 \
+ -I$(ROOT)$(libdir)/glib-2.0/include \
+ -I$(ROOT)$(libdir)/gstreamer-1.0/include\
+ -I$(ROOT)$(includedir)/dbus-1.0 \
+ -I$(ROOT)$(libdir)/dbus-1.0/include \
+ -DLIB_GNSS_HAL_DIR='"$(libdir)"'
+
+LOCAL_C_INCLUDES+=$(DNS_FLAGS)
+
+LOCAL_LIBS := \
+ -L. \
+ -ldl \
+ -lstdc++ \
+ -llog \
+ -lcutils \
+ -lutils \
+ -llynq-media \
+ -lpower \
+ -lbinder \
+ -llynq-log \
+ -lpthread \
+ -lrt \
+ -llynq-driver \
+ -lpal \
+ -lgstreamer-1.0 \
+ -lglib-2.0 \
+ -lgstbase-1.0 \
+ -lgstreamer-1.0 \
+ -lgobject-2.0 \
+ -lgio-2.0 \
+ -ldtmf \
+ -lapn \
+ -ldbus-1 \
+ -llynq-broadcast \
+ -llynq-system-own \
+ -llynq-tele-ril \
+ -llynq-protcl \
+ -llynq-fota \
+ -lnandapi \
+
+LOCAL_SRC_FILES_CPP = $(wildcard *.cpp gpio/*.cpp ril/*.cpp)
+LOCAL_SRC_FILES_C = $(wildcard *.c gps/*.c)
+EXECUTABLE = lynq-function-test
+
+OBJECTS=$(LOCAL_SRC_FILES_CPP:.cpp=.o) $(LOCAL_SRC_FILES_C:.c=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+ $(CXX) $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o: %.c
+ $(warning ----->build $<)
+ $(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+%.o : %.cpp
+ $(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+ $(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/packages/apps/lynq-function-test/src/ril_test.cpp b/packages/apps/lynq-function-test/src/ril_test.cpp
new file mode 100644
index 0000000..eb54b0b
--- /dev/null
+++ b/packages/apps/lynq-function-test/src/ril_test.cpp
@@ -0,0 +1,1770 @@
+/*=============================================================================
+** FileName: ril_test.cpp
+** Desc: about function test
+** Author: Warren
+** Version: V1.0
+** LastChange: 2021-02-26
+** History:
+=============================================================================*/
+#include "function_common.h"
+#include <log/log.h>
+#include <liblog/lynq_deflog.h>
+#include "libtel/lib_tele.h"
+#include <libtel/lynq_call.h>
+#include <libtel/lynq_sim.h>
+#include <libtel/lynq_network.h>
+#include <libtel/lynq_data.h>
+#include <libtel/lynq_sms.h>
+#include "ril_test.h"
+#include <cutils/properties.h>
+#include <string.h>
+#define MAX_P 1024
+RIL_COMMAND api_commands[] = {
+#include "commands.h"
+};
+static int strUpper(char * str)
+{
+ int i=0;
+ while(1)
+ {
+ if(str[i]=='\0')
+ {
+ break;
+ }
+ if(str[i]>='a'&&str[i]<='z')
+ {
+ //printf("str %c\n",str[i]-32);
+ str[i]=str[i]-32;
+ }
+ i++;
+ }
+ return 0;
+}
+
+int eventDial(char **argv)
+{
+ int32_t token;
+ if(argv[0]==NULL)
+ {
+ LYERRLOG("+[ril][dial]: Please input phony number,and try again\n");
+ return -1;
+ }
+ char* addr = argv[0];
+ char output[1024] = {0};
+ lynqCallList *msg = (lynqCallList*)malloc(sizeof(lynqCallList));
+ memset(msg,0,sizeof(lynqCallList));
+ msg->addr=(char *)malloc(sizeof(char));
+ memset(msg->addr,0,sizeof(char));
+ token = lynq_call(addr, msg);
+ LYINFLOG("[MAIN_LOG] request is %d,phone number is %s,token is %x,error is %d,call_state is %d\n",
+ msg->base.request,msg->addr,msg->base.token,msg->base.e,msg->call_state);
+ if(msg->base.e!=0)
+ {
+ LYVERBLOG( "+[ril][dial]: error num = %d\n",msg->base.e);
+ }
+ else
+ {
+ LYVERBLOG( "+[ril][dial]: ok!!\n");
+ }
+ free(msg->addr);
+ msg->addr=NULL;
+ free(msg);
+ msg=NULL;
+ return 0;
+}
+
+int eventAnswer(char **argv)
+{
+ int32_t token;
+ char output[1024] = {0};
+ lynqCallList *msg = (lynqCallList*)malloc(sizeof(lynqCallList));
+ memset(msg,0,sizeof(lynqCallList));
+ msg->addr=(char *)malloc(sizeof(char));
+ memset(msg->addr,0,sizeof(char));
+ //printf("call start \n");
+ token = lynq_call_answer(msg);
+ //printf("[MAIN_LOG] request is %d,phone number is %s,token is %x,error is %d,call_state is %d\n",
+ //msg->base.request,msg->addr,msg->base.token,msg->base.e,msg->call_state);
+ LYINFLOG("[MAIN_LOG] request is %d,phone number is %s,token is %x,error is %d,call_state is %d",
+ msg->base.request,msg->addr,msg->base.request,msg->base.e,msg->call_state);
+ if(msg->base.e==0)
+ {
+ LYVERBLOG( "+[ril][an]: error num = %d\n",msg->base.e);
+ }
+ else
+ {
+ LYVERBLOG( "+[ril][an]: ok!!\n");
+ }
+ //emResultNotify(output,command);
+ free(msg->addr);
+ msg->addr=NULL;
+ free(msg);
+ msg=NULL;
+ return 0;
+}
+int eventAutoAnswer(char **argv)
+{
+ int32_t token=0;
+ int mode=0;
+ char output[1024] = {0};
+ if(argv[0]==NULL)
+ {
+ LYERRLOG("+[ril][atan]: Please input auto answer mode value:0 or 1,and try again\n");
+ return -1;
+ }
+ int status = atoi(argv[0]);
+ if(!(status==1 ||status ==0))
+ {
+ LYERRLOG("+[ril][atan]: Please input auto answer mode value:0 or 1,and try again\n");
+ return -1;
+ }
+ token = lynq_set_auto_answercall(status,&mode);
+ if(mode!=status)
+ {
+ LYVERBLOG( "+[ril][atan]: error num = %d\n",RIL_E_GENERIC_FAILURE);
+ }
+ else
+ {
+ LYVERBLOG( "+[ril][atan]: ok!!\n");
+ }
+ return 0;
+}
+int eventSetMute(char **argv)
+{
+ int32_t token = 0;
+ int status =0;
+ if(argv[0]==NULL)
+ {
+ LYERRLOG("+[ril][stme]: Please input set mute mode:0 or 1,and try again!\n");
+ return -1;
+ }
+ int mute = atoi(argv[0]);
+ token = lynq_set_mute_mic(mute, &status);
+ LYINFLOG("set mute status is %s,current mute status is %s\n",mute>0?"mute on":"mute off",status>0?"mute on":"mute off");
+ if(mute!=status)
+ {
+ LYVERBLOG("+[ril][stme]: error num = %d\n",RIL_E_GENERIC_FAILURE);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][stme]: ok!!\n");
+ }
+ return 0;
+}
+int eventGetMute(char **argv)
+{
+ int32_t token = 0;
+ int status =0;
+ char output[1024] = {0};
+ token = lynq_get_mute_status(&status);
+ LYVERBLOG("+[ril][gtme]: status = %d\n",status>0?1:0);
+ LYVERBLOG("+[ril][gtme]: ok!!\n");
+ return 0;
+}
+int eventLastCallFailCause(char **argv)
+{
+ int32_t token = 0;
+ int status =0;
+ char output[1024] = {0};
+ lynqLastCallFailCause * msg = (lynqLastCallFailCause*)malloc(sizeof(lynqLastCallFailCause));
+ memset(msg,0,sizeof(lynqLastCallFailCause));
+ msg->vendor_cause = (char *)malloc(sizeof(char)*64);
+ memset(msg->vendor_cause,0,sizeof(char));
+ token = lynq_get_last_call_fail_cause(msg);
+ LYINFLOG("token is %x,request is %d,error_code is %d,cause_code is %d,vendor_cause is %s\n",msg->base.token,
+ msg->base.request,msg->base.e,msg->cause_code,msg->vendor_cause);
+ if(msg->base.e!=0)
+ {
+ LYVERBLOG("+[ril][lcfc]: error num = %d\n",msg->base.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][lcfc]: cause_code = %d,vendor_cause = %s\n",msg->cause_code,msg->vendor_cause);
+ LYVERBLOG("+[ril][lcfc]: ok!!\n");
+ }
+ free(msg->vendor_cause);
+ free(msg);
+ return 0;
+}
+int eventCallHangUp(char **argv)
+{
+ lynqBase msg;
+ char output[1024] = {0};
+ if(argv[0]==NULL)
+ {
+ LYERRLOG("+[ril][hup]: Please input call index,and try again!\n");
+ return -1;
+ }
+ int index = atoi(argv[0]);
+ lynq_call_hang_up(index,&msg);
+ //printf("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);
+ LYINFLOG("request is %d,token is %x,error is %d",msg.request,msg.token,msg.e);
+ if(msg.e!=0)
+ {
+ LYVERBLOG("+[ril][hup]: error num = %d\n",msg.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][hup]: ok!!\n");
+ }
+ return 0;
+}
+int eventRejectCall(char **argv)
+{
+ lynqBase msg;
+ char output[1024] = {0};
+ lynq_reject_call(&msg);
+ //printf("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);
+ LYINFLOG("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);
+ if(msg.e!=0)
+ {
+ LYVERBLOG("+[ril][udub]: error num = %d\n",msg.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][udub]: ok!!\n");
+ }
+ return 0;
+}
+int eventSetDTMF(char **argv)
+{
+ lynqBase msg;
+ char output[1024] = {0};
+ if(argv[0]==NULL)
+ {
+ LYERRLOG("+[ril][dtmf]: Please input DTMF value:0-9,8,#,and try again!\n");
+ return -1;
+ }
+ char value = argv[0][0];
+ lynq_set_DTMF(value,&msg);
+ LYINFLOG("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);
+ if(msg.e!=0)
+ {
+ LYVERBLOG("+[ril][dtmf]: error num = %d\n",msg.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][dtmf]: ok!!\n");
+ }
+ return 0;
+}
+int eventSetDTMFVolume(char **argv)
+{
+ int32_t token =0;
+ if(argv[0]==NULL)
+ {
+ LYERRLOG("+[ril][dtmfv]: Please input DTMF volume(0-36),and try again!\n");
+ return -1;
+ }
+ int volume = atoi(argv[0]);
+ token = lynq_set_DTMF_volume(volume);
+ LYVERBLOG("+[ril][dtmfv]: ok!!\n");
+ //printf("Factory_result set DTMF Volume is %s\n",(token>0?"success":"fail"));
+ return 0;
+}
+int eventDoMultiConference(char **argv)
+{
+ lynqCallList msg;
+ msg.addr=NULL;
+ lynq_do_multi_conference(&msg);
+ LYINFLOG("request is %d,call id is %d,phone number is %s,type of address is %d,token is %x,error is %d,call_state is %d\n",
+ msg.base.request,msg.call_id,msg.addr,msg.toa,msg.base.token,msg.base.e,msg.call_state);
+ if(msg.base.e!=0)
+ {
+ LYVERBLOG("+[ril][dmc]: error num = %d\n",msg.base.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][dmc]: ok!!\n");
+ }
+ return 0;
+}
+int eventOthercallHold(char **argv)
+{
+ lynqBase msg;
+ if(argv[0]==NULL)
+ {
+ LYERRLOG("+[ril][och]: Please input call id,and try again!\n");
+ return -1;
+ }
+ int call_id = atoi(argv[0]);
+ lynq_othercall_hold(call_id,&msg);
+ LYINFLOG("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);
+ if(msg.e!=0)
+ {
+ LYVERBLOG("+[ril][och]: error num = %d\n",msg.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][och]: ok!!\n");
+ }
+ return 0;
+}
+int eventHangupWatingForCall(char **argv)
+{
+ lynqCallList msg;
+ msg.addr=NULL;
+ lynq_hangup_wating_for_call(&msg);
+ LYINFLOG("[MAIN_LOG] request is %d,call id is %d,phone number is %s,type of address is %d,token is %x,error is %d,call_state is %d\n",
+ msg.base.request,msg.call_id,msg.addr,msg.toa,msg.base.token,msg.base.e,msg.call_state);
+ if(msg.base.e!=0)
+ {
+ LYVERBLOG("+[ril][hwc]: error num = %d\n",msg.base.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][hwc]: ok!!\n");
+ }
+ return 0;
+}
+int eventHangupForegroundResumeBackground(char **argv)
+{
+ lynqCallList msg;
+ msg.addr=NULL;
+ lynq_hangup_foreground_resume_background(&msg);
+ LYINFLOG("[MAIN_LOG] request is %d,call id is %d,phone number is %s,type of address is %d,token is %x,error is %d,call_state is %d\n",
+ msg.base.request,msg.call_id,msg.addr,msg.toa,msg.base.token,msg.base.e,msg.call_state);
+ if(msg.base.e!=0)
+ {
+ LYVERBLOG("+[ril][hfrb]: error num = %d\n",msg.base.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][hfrb]: ok!!\n");
+ }
+ return 0;
+}
+int eventSwitchWaitOrHoldAndActiveCall(char ** argv)
+{
+ lynqCallList msg;
+ msg.addr=NULL;
+ lynq_switch_hold_and_active_call(&msg);
+ LYINFLOG("[MAIN_LOG] request is %d,call id is %d,phone number is %s,type of address is %d,token is %x,error is %d,call_state is %d\n",
+ msg.base.request,msg.call_id,msg.addr,msg.toa,msg.base.token,msg.base.e,msg.call_state);
+ if(msg.base.e!=0)
+ {
+ LYVERBLOG("+[ril][swha]: error num = %d\n",msg.base.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][swha]: ok!!\n");
+ }
+ return 0;
+}
+
+int eventQueryOperator(char ** argv)
+{
+ operatorInfo msg;
+ msg.OperatorFN=NULL;
+ msg.OperatorSH=NULL;
+ msg.MccMnc=NULL;
+ lynq_query_operater(&msg);
+ LYINFLOG("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);
+ if(msg.base.e!=0)
+ {
+ LYVERBLOG("+[ril][qop]: error num = %d\n",msg.base.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][qop]: OperatorFN = %s,OperatorSH = %s,MccMnc = %s\n",msg.OperatorFN,msg.OperatorSH,msg.MccMnc);
+ LYVERBLOG("+[ril][qop]: ok!!\n");
+ }
+ return 0;
+}
+int eventQueryNetSelectMode(char ** argv)
+{
+ networkSelecttionMode msg;
+ lynq_query_network_selection_mode(& msg);
+ //printf("request is %d,token is %x,error is %d,mode is %d\n",msg.base.request,msg.base.token,msg.base.e,msg.mode);
+ LYINFLOG("request is %d,token is %x,error is %d,mode is %d\n",msg.base.request,msg.base.token,msg.base.e,msg.mode);
+ if(msg.base.e!=0)
+ {
+ LYVERBLOG("+[ril][qnsm]: error num = %d\n",msg.base.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][qnsm]: mode = %d\n",msg.mode);
+ LYVERBLOG("+[ril][qnsm]: ok!!\n");
+ }
+ return 0;
+}
+int eventSetNetSelectMode(char ** argv)
+{
+ char str[100]={0};
+ if(argv[0]==NULL)
+ {
+ LYERRLOG("+[ril][snsm]: Please input network selection mode,and try again!\n");
+ return -1;
+ }
+ int mode = atoi(argv[0]);
+ const char * mccmnc = "46000";//just China Mobile Communications Group
+ lynqBase msg;
+ sprintf(str,"%s",(mode==0?"Auto":"Manual"));
+ if(mode==0)
+ {
+ lynq_set_network_selection_mode(str,NULL,&msg);
+ }
+ else if(mode ==1)
+ {
+ LYVERBLOG("+[ril][snsm]: You have selected manual mode, this command only supports CMCC SIM card temporarily");
+ lynq_set_network_selection_mode(str,mccmnc,&msg);
+ }
+ else
+ {
+ LYERRLOG("+[ril][snsm]: please input network selection mode:0 or 1,and try again\n");
+ return 0;
+ }
+ if(msg.e!=0)
+ {
+ LYVERBLOG("+[ril][snsm]: error num = %d\n",msg.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][snsm]: ok!!\n");
+ }
+ return 0;
+}
+int eventQueryAvailableNetwork(char **argv)
+{
+ int32_t token=0;
+ availableNetwork msg;
+ msg.OperatorFN=NULL;
+ msg.OperatorSH=NULL;
+ msg.MccMnc=NULL;
+ msg.NetStatus=NULL;
+ lynq_query_available_network(&msg);
+ LYINFLOG("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);
+ if(msg.base.e!=0)
+ {
+ LYVERBLOG("+[ril][qan]: error num = %d\n",msg.base.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][qan]: OperatorFN = %s,OperatorSH = %s,MccMnc = %s,NetStatus = %s\n",msg.OperatorFN,msg.OperatorSH,msg.MccMnc,msg.NetStatus);
+ LYVERBLOG("+[ril][qan]: ok!!\n");
+ }
+ return 0;
+
+}
+ int eventQueryRegistrationState(char ** argv)
+{
+ registrationStateInfo msg;
+ msg.CID=NULL;
+ msg.LAC=NULL;
+ char str[10];
+ if(argv[0]==NULL)
+ {
+ LYERRLOG("+[ril][qrs]: Please input voice/data/ims,and try again!\n");
+ return -1;
+ }
+ char *type = argv[0];
+ if (strlen(type)>10)
+ {
+ LYERRLOG("+[ril][qrs]: the parameter is inavaliable !\n");
+ return -1;
+ }
+ memcpy(str,type,strlen(type)+1);
+ strUpper(str);
+ //printf("upper str is %s\n",str);
+ lynq_query_registration_state(str,&msg);
+ if(!strcmp(str,"VOICE")){
+ LYINFLOG("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);
+ if(msg.base.e!=0)
+ {
+ LYVERBLOG("+[ril][qrs]: error num = %d\n",msg.base.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][qrs]: registrationState = %d\n",msg.regState);
+ LYVERBLOG("+[ril][qrs]: ok!!\n");
+ }
+ }else if(!strcmp(str,"DATA")){
+
+ LYINFLOG("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);
+ if(msg.base.e!=0)
+ {
+ LYVERBLOG("+[ril][qrs]: error num = %d\n",msg.base.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][qrs]: registrationState = %d,LAC = %s,CID = %s,networkTyp = %d\n",msg.regState,msg.LAC,msg.CID,msg.netType);
+ LYVERBLOG("+[ril][qrs]: ok!!\n");
+ }
+ }else if(!strcmp(str,"IMS")){
+ LYINFLOG("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);
+ if(msg.base.e!=0)
+ {
+ LYVERBLOG("+[ril][qrs]: error num = %d\n",msg.base.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][qrs]: imsRegistrationState = %d,radioTechFamily = %d\n",msg.imsRegState,msg.radioTechFam);
+ LYVERBLOG("+[ril][qrs]: ok!!\n");
+ }
+ }else{
+ LYERRLOG("+[ril][qrs]: [%s][%d] query ims registration state about voice, data, and ims!!! \n",__FUNCTION__,__LINE__);
+ return -1;
+ }
+ return 0;
+ }
+ int eventQueryPrefferredNetworkType(char ** argv)
+{
+ prefferredNetworkType msg;
+ lynq_query_prefferred_networktype(&msg);
+ LYINFLOG("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);
+ if(msg.base.e!=0)
+ {
+ LYVERBLOG("+[ril][gpnt]: error num = %d\n",msg.base.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][gpnt]: pnt = %d\n",msg.pnt);
+ LYVERBLOG("+[ril][gpnt]: ok!!\n");
+ }
+ return 0;
+}
+ int eventSetPrefferredNetworkType(char ** argv)
+{
+ lynqBase msg;
+ if(argv[0]==NULL)
+ {
+ LYERRLOG("+[ril][spnt]: Please input prefferrend neteork type,and try again!\n");
+ return -1;
+ }
+ int type = atoi(argv[0]);
+ lynq_set_prefferred_networktype(type,&msg);
+ LYINFLOG("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);
+ if(msg.e!=0)
+ {
+ LYVERBLOG("+[ril][spnt]: error num = %d\n",msg.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][spnt]: ok!!\n");
+ }
+ return 0;
+}
+int eventQueryCellInfo(char ** argv)
+{
+ cellInfoList **msg;
+ int num=5;
+ int realNum =0;
+ int32_t token=0;
+ msg = (cellInfoList **)malloc(sizeof(cellInfoList *)*num);
+ if(msg==NULL)
+ {
+ LYERRLOG("+[ril][gcil]: malloc LYNQ_Data_Call_Response_v11 fail \n");
+ return -1;
+ }
+ for(int i =0;i<num;i++)
+ {
+ msg[i] = (cellInfoList*)malloc(sizeof(cellInfoList));
+ if (msg[i]==NULL)
+ {
+ for (int n=0;n<i;n++)
+ {
+ free(msg[n]);
+ }
+ return -1;
+ }
+ memset(msg[i],0,sizeof(cellInfoList));
+ }
+ token = lynq_query_cell_info(msg, num, &realNum);
+ LYINFLOG("+[ril][gcil]: request is %d,token is %x,e is %d\n",msg[0]->base.request,msg[0]->base.token,msg[0]->base.e);
+ if(msg[0]->base.e!=0)
+ {
+ LYVERBLOG("+[ril][gcil]: error num = %d\n",msg[0]->base.e);
+ }
+ else
+ {
+ for(int i = 0; i<realNum; i++)
+ {
+ LYVERBLOG("+[ril][gcil]: cellInfoType = %d,registered = %d,timeStampType = %d,timeStamp = %d\n",msg[i]->cellinfo.cellInfoType,msg[i]->cellinfo.registered,msg[i]->cellinfo.timeStampType,msg[i]->cellinfo.timeStamp);
+ switch(msg[i]->cellinfo.cellInfoType) {
+ case RIL_CELL_INFO_TYPE_GSM: {
+ LYVERBLOG("+[ril][gcil]: gsm_mcc = %d,gsm_mnc = %d,gsm_lac = %d,gsm_cid = %d,gsm_signalStrength = %d,gsm_bitErrorRate%d,gsm_timingAdvance = %d\n",
+ msg[i]->cellinfo.CellInfo.gsm.cellIdentityGsm.mcc,
+ msg[i]->cellinfo.CellInfo.gsm.cellIdentityGsm.mnc,
+ msg[i]->cellinfo.CellInfo.gsm.cellIdentityGsm.lac,
+ msg[i]->cellinfo.CellInfo.gsm.cellIdentityGsm.cid,
+ msg[i]->cellinfo.CellInfo.gsm.signalStrengthGsm.signalStrength,
+ msg[i]->cellinfo.CellInfo.gsm.signalStrengthGsm.bitErrorRate,
+ msg[i]->cellinfo.CellInfo.gsm.signalStrengthGsm.timingAdvance);
+ break;
+ }
+ case RIL_CELL_INFO_TYPE_WCDMA: {
+ LYVERBLOG("+[ril][gcil]: wcdma_mcc = %d,wcdma_mnc = %d,wcdma_lac = %d,wcdma_cid = %d,wcdma_psc = %d,wcdma_signalStrength = %d,wcdma_bitErrorRate = %d\n",
+ msg[i]->cellinfo.CellInfo.wcdma.cellIdentityWcdma.mcc,
+ msg[i]->cellinfo.CellInfo.wcdma.cellIdentityWcdma.mnc,
+ msg[i]->cellinfo.CellInfo.wcdma.cellIdentityWcdma.lac,
+ msg[i]->cellinfo.CellInfo.wcdma.cellIdentityWcdma.cid,
+ msg[i]->cellinfo.CellInfo.wcdma.cellIdentityWcdma.psc,
+ msg[i]->cellinfo.CellInfo.wcdma.signalStrengthWcdma.signalStrength,
+ msg[i]->cellinfo.CellInfo.wcdma.signalStrengthWcdma.bitErrorRate);
+ break;
+ }
+ case RIL_CELL_INFO_TYPE_CDMA: {
+ LYVERBLOG("+[ril][gcil]: cdma_networkId = %d,cdma_systemId = %d,cdma_basestationId = %d,cdma_longitude = %d,cdma_latitude = %d,cdma_dbm = %d,cdma_ecio = %d,cdma_Evdo_dbm = %d,cdma_Evdo_ecio = %d,cdma_Evdo_signalNoiseRatio = %d\n",
+ msg[i]->cellinfo.CellInfo.cdma.cellIdentityCdma.networkId,
+ msg[i]->cellinfo.CellInfo.cdma.cellIdentityCdma.systemId,
+ msg[i]->cellinfo.CellInfo.cdma.cellIdentityCdma.basestationId,
+ msg[i]->cellinfo.CellInfo.cdma.cellIdentityCdma.longitude,
+ msg[i]->cellinfo.CellInfo.cdma.cellIdentityCdma.latitude,
+ msg[i]->cellinfo.CellInfo.cdma.signalStrengthCdma.dbm,
+ msg[i]->cellinfo.CellInfo.cdma.signalStrengthCdma.ecio,
+ msg[i]->cellinfo.CellInfo.cdma.signalStrengthEvdo.dbm,
+ msg[i]->cellinfo.CellInfo.cdma.signalStrengthEvdo.ecio,
+ msg[i]->cellinfo.CellInfo.cdma.signalStrengthEvdo.signalNoiseRatio);
+ break;
+ }
+ case RIL_CELL_INFO_TYPE_LTE: {
+ LYVERBLOG("+[ril][gcil]: lte_mcc = %d,lte_mnc = %d,lte_ci = %d,lte_pci = %d,lte_tac = %d,lte_signalStrength = %d,lte_rsrp = %d,lte_rsrq = %d,lte_rssnr = %d,lte_cqi = %d,lte_timingAdvance = %d\n",
+ msg[i]->cellinfo.CellInfo.lte.cellIdentityLte.mcc,
+ msg[i]->cellinfo.CellInfo.lte.cellIdentityLte.mnc,
+ msg[i]->cellinfo.CellInfo.lte.cellIdentityLte.ci,
+ msg[i]->cellinfo.CellInfo.lte.cellIdentityLte.pci,
+ msg[i]->cellinfo.CellInfo.lte.cellIdentityLte.tac,
+ msg[i]->cellinfo.CellInfo.lte.signalStrengthLte.signalStrength,
+ msg[i]->cellinfo.CellInfo.lte.signalStrengthLte.rsrp,
+ msg[i]->cellinfo.CellInfo.lte.signalStrengthLte.rsrq,
+ msg[i]->cellinfo.CellInfo.lte.signalStrengthLte.rssnr,
+ msg[i]->cellinfo.CellInfo.lte.signalStrengthLte.cqi,
+ msg[i]->cellinfo.CellInfo.lte.signalStrengthLte.timingAdvance);
+ break;
+ }
+ case RIL_CELL_INFO_TYPE_TD_SCDMA: {
+ LYVERBLOG("+[ril][gcil]: tdscdma_mcc = %d,tdscdma_mnc = %d,tdscdma_lac = %d,tdscdma_cid = %d,tdscdma_cpid = %d,tdscdma_rscp = %d\n",
+ msg[i]->cellinfo.CellInfo.tdscdma.cellIdentityTdscdma.mcc,
+ msg[i]->cellinfo.CellInfo.tdscdma.cellIdentityTdscdma.mnc,
+ msg[i]->cellinfo.CellInfo.tdscdma.cellIdentityTdscdma.lac,
+ msg[i]->cellinfo.CellInfo.tdscdma.cellIdentityTdscdma.cid,
+ msg[i]->cellinfo.CellInfo.tdscdma.cellIdentityTdscdma.cpid,
+ msg[i]->cellinfo.CellInfo.tdscdma.signalStrengthTdscdma.rscp);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ LYVERBLOG("+[ril][gcil]: ok!!\n");
+ }
+ for (int i = 0; i < num; i++)
+ {
+ if (msg[i]!=NULL)
+ {
+ free(msg[i]);
+ msg[i]=NULL;
+ }
+ }
+ free(msg);
+ msg=NULL;
+ return 0;
+}
+int eventSetUnsolCellInfoListrate(char ** argv)
+{
+ lynqBase msg;
+ if(argv[0]==NULL)
+ {
+ LYERRLOG("+[ril][sucilr]:Please input unsolicited cell infomation list rate,and try again!\n");
+ return -1;
+ }
+ int rate = atoi(argv[0]);
+ lynq_set_unsol_cell_info_listrate(rate,&msg);
+ LYINFLOG("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);
+ if(msg.e!=0)
+ {
+ LYVERBLOG("+[ril][sucilr]: error num = %d\n",msg.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][sucilr]: ok!!\n");
+ }
+ return 0;
+}
+int eventQueryNeighboringCellids(char ** argv)
+{
+ neighboringCellIDs **msg=NULL;
+ int num=5;
+ int realNum =0;
+ int32_t token=0;
+ msg = (neighboringCellIDs **)malloc(sizeof(neighboringCellIDs *)*num);
+ if(msg==NULL)
+ {
+ RLOGD("malloc LYNQ_Data_Call_Response_v11 fail \n");
+ return -1;
+ }
+ for(int i =0;i<num;i++)
+ {
+ msg[i] = (neighboringCellIDs*)malloc(sizeof(neighboringCellIDs));
+ msg[i]->cid = (char*)malloc(sizeof(char));
+ if (msg[i]==NULL)
+ {
+ for (int n=0;n<i;n++)
+ {
+ free(msg[n]->cid);
+ free(msg[n]);
+ }
+ return -1;
+ }
+ memset(msg[i],0,sizeof(neighboringCellIDs));
+ }
+ msg[0]->base.e=(RIL_Errno)(-1);
+ token = lynq_query_neighboring_cellids(msg, num, &realNum);
+ if(msg[0]->base.e!=0)
+ {
+ LYVERBLOG("+[ril][gncid]: error num = %d\n",msg[0]->base.e);
+ }
+ else
+ {
+ LYINFLOG("request is %d,token is %x,error is %d\n",msg[0]->base.request,msg[0]->base.token,msg[0]->base.e);
+ for(int i =0;i<realNum;i++)
+ {
+ LYVERBLOG("+[ril][gncid]: cid = %s,rssi = %d\n",msg[i]->cid,msg[i]->rssi);
+ }
+ LYVERBLOG("+[ril][gncid]: ok!!\n");
+ }
+ for (int i = 0; i < num; i++)
+ {
+ if (msg[i]!=NULL)
+ {
+ free(msg[i]->cid);
+ msg[i]->cid=NULL;
+ free(msg[i]);
+ msg[i]=NULL;
+ }
+ }
+ free(msg);
+ msg=NULL;
+ return 0;
+}
+int eventSetBandMode(char ** argv)
+{
+ lynqBase msg;
+ if(argv[0]==NULL)
+ {
+ LYERRLOG("+[ril][sbm]: Please input band mode,and try again!\n");
+ return -1;
+ }
+ int mode = atoi(argv[0]);
+ lynq_set_band_mode(mode,&msg);
+ LYINFLOG("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);
+ if(msg.e!=0)
+ {
+ LYVERBLOG("+[ril][sbm]: error num = %d\n",msg.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][sbm]: ok!!\n");
+ }
+ return 0;
+}
+int eventQueryAvailableBandmode(char ** argv)
+{
+ availableBandMode msg;
+ lynq_query_available_bandmode(&msg);
+ char buffer[256] = {0};
+ char element[256] = {0};
+ LYINFLOG("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);
+ if(msg.bandmode[0]>0)
+ {
+ for(int i =1;i<=msg.bandmode[0];i++)
+ {
+ sprintf(element,"%d,",msg.bandmode[i]);
+ strncat(buffer, element, strlen(element));
+ }
+ LYVERBLOG("+[ril][qabm]: availableBandMode = %s\n",buffer);
+ LYVERBLOG("+[ril][qabm]: ok!!\n",buffer);
+ return 0;
+ }
+ LYVERBLOG("+[ril][qabm]: error num = %d\n",msg.base.e);
+ LYINFLOG("available band mode is null");
+ return 0;
+}
+int eventRadioOn(char ** argv)
+{
+ lynqBase msg;
+ if(argv[0]==NULL)
+ {
+ LYERRLOG("+[ril][rpo]: Please input radio on value,0 or 1,and try again!\n");
+ return -1;
+ }
+ int state = atoi(argv[0]);
+ lynq_radio_on(state,&msg);
+ LYINFLOG("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);
+ if(msg.e!=0)
+ {
+ LYVERBLOG("+[ril][rpo]: error num = %d\n",msg.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][rpo]: ok!!\n");
+ }
+ return 0;
+}
+int eventQueryRadioTech(char ** argv)
+{
+ radioTechnology msg;
+ char output[1024] = {0};
+ lynq_query_radio_tech(&msg);
+ LYINFLOG("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);
+ if(msg.base.e!=0)
+ {
+ LYVERBLOG("+[ril][vrt]: error num = %d\n",msg.base.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][vrt]: RadioTech = %d\n",msg.radioTech);
+ LYVERBLOG("+[ril][vrt]: ok!!\n");
+ }
+ return 0;
+}
+int eventSolicitedSignalStrength(char ** argv)
+{
+ solicitedSignalStrength msg;
+ lynq_solicited_signal_strength(&msg);
+ LYINFLOG("request is %d,token is %x,error is %d\n",msg.base.request,msg.base.token,msg.base.e);
+ if(msg.base.e!=0)
+ {
+ LYVERBLOG("+[ril][sst]: error num = %d\n",msg.base.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][sst]: GW_signalStrength = %d,GW_bitErrorRate = %d,GW_timingAdvance = %d\n",
+ msg.signalStrength.GW_SignalStrength.signalStrength,
+ msg.signalStrength.GW_SignalStrength.bitErrorRate,
+ msg.signalStrength.GW_SignalStrength.timingAdvance);
+ LYVERBLOG("+[ril][sst]: CDMA_dbm = %d,CDMA_ecio = %d\n",
+ msg.signalStrength.CDMA_SignalStrength.dbm,
+ msg.signalStrength.CDMA_SignalStrength.ecio);
+ LYVERBLOG("+[ril][sst]: EVDO_dbm = %d,EVDO_ecio = %d,EVDO_signalNoiseRatio = %d\n",
+ msg.signalStrength.EVDO_SignalStrength.dbm,
+ msg.signalStrength.EVDO_SignalStrength.ecio,
+ msg.signalStrength.EVDO_SignalStrength.signalNoiseRatio);
+ LYVERBLOG("+[ril][sst]: LTE_signalStrength = %d,LTE_rsrp = %d,LTE_rsrq = %d,LTE_rssnr = %d,LTE_cqi = %d,LTE_timingAdvance = %d\n",
+ msg.signalStrength.LTE_SignalStrength.signalStrength,
+ msg.signalStrength.LTE_SignalStrength.rsrp,
+ msg.signalStrength.LTE_SignalStrength.rsrq,
+ msg.signalStrength.LTE_SignalStrength.rssnr,
+ msg.signalStrength.LTE_SignalStrength.cqi,
+ msg.signalStrength.LTE_SignalStrength.timingAdvance);
+ LYVERBLOG("+[ril][sst]: TD_SCDMA_signalStrength = %d,TD_SCDMA_bitErrorRate = %d,TD_SCDMA_rscp = %d\n",
+ msg.signalStrength.TD_SCDMA_SignalStrength.signalStrength,
+ msg.signalStrength.TD_SCDMA_SignalStrength.bitErrorRate,
+ msg.signalStrength.TD_SCDMA_SignalStrength.rscp);
+ LYVERBLOG("+[ril][sst]: WCDMA_signalStrength = %d,WCDMA_bitErrorRate = %d,WCDMA_rscp = %d,WCDMA_ecno = %d\n",
+ msg.signalStrength.WCDMA_SignalStrength.signalStrength,
+ msg.signalStrength.WCDMA_SignalStrength.bitErrorRate,
+ msg.signalStrength.WCDMA_SignalStrength.rscp,
+ msg.signalStrength.WCDMA_SignalStrength.ecno);
+ LYVERBLOG("+[ril][sst]: ok!!\n");
+ }
+ return 0;
+}
+int eventModemOn(char **argv)
+{
+ lynqBase msg;
+ if(argv[0]==NULL)
+ {
+ LYERRLOG("+[ril][mpo]: Please input mode on value,0 or 1,and try again!\n");
+ return -1;
+ }
+ int state = atoi(argv[0]);
+ lynq_modem_on(state,&msg);
+ //printf("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);
+ LYINFLOG("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);
+ if(msg.e!=0)
+ {
+ LYVERBLOG("+[ril][mpo]: error num = %d\n",msg.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][mpo]: ok!!\n");
+ }
+ return 0;
+}
+int eventSetupDataCall(char ** argv)
+{
+ int32_t token;
+ int state=0;
+ token = lynq_data_enable_data(&state);
+ //printf("pdn state is %s\n",state<0?"disconnect":"connect");
+ if(state<0)
+ {
+ LYVERBLOG("+[ril][edc]: error num = %d\n",RIL_E_GENERIC_FAILURE);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][edc]: ok!!\n");
+ }
+ return 0;
+}
+int eventDeactiveDataCall(char ** argv)
+{
+ int32_t token;
+ int state=0;
+ token = lynq_data_dectivate_data_call(&state);
+ LYVERBLOG("+[ril][ddc]: ok!!\n");
+ //printf("Factory_result pdn state is %s\n",state<0?"connect":"disconnect");
+ return 0;
+}
+int eventGetDataCalllist(char ** argv)
+{
+ int32_t token=0;
+ int num=5;
+ int realNum=0;
+ LYNQ_Data_Call_Response_v11 **msg=(LYNQ_Data_Call_Response_v11**)malloc(sizeof(LYNQ_Data_Call_Response_v11*)*num);
+ if (msg == NULL)
+ {
+ LYERRLOG("+[ril][gdcl]: malloc LYNQ_Data_Call_Response_v11 fail \n");
+ return -1;
+ }
+ for(int i =0;i<num;i++)
+ {
+ msg[i] = (LYNQ_Data_Call_Response_v11*)malloc(sizeof(LYNQ_Data_Call_Response_v11));
+ if (msg[i]==NULL)
+ {
+ for (int n=0;n<i;n++)
+ {
+ free(msg[n]);
+ }
+ return -1;
+ }
+ memset(msg[i],0,sizeof(LYNQ_Data_Call_Response_v11));
+ }
+ token = lynq_get_data_call_list(msg, num,&realNum);
+ /*
+ for(int i = 0; i<realNum; i++)
+ {
+ printf("status is %d,\nsuggestedRetryTime is %d,\ncid is %d,\nactive is %d,\nmtu is %d\n",msg[i]->status,msg[i]->suggestedRetryTime,msg[i]->cid,msg[i]->active,msg[i]->mtu);
+ printf("type is %s\n",msg[i]->type);
+ printf("ifname is %s\n",msg[i]->ifname);
+ printf("addresses is %s\n",msg[i]->addresses);
+ printf("dnses is %s\n",msg[i]->dnses);
+ printf("gateways is %s\n",msg[i]->gateways);
+ printf("pcscf is %s\n",msg[i]->pcscf);
+ }
+ */
+ if(realNum>0)
+ {
+
+ //printf("Factory_result error code 1\n");
+ for(int i = 0; i<realNum; i++)
+ {
+ LYVERBLOG("+[ril][gdcl]: status = %d,suggestedRetryTime = %d,cid = %d,active = %d,mtu = %d\n",msg[i]->status,msg[i]->suggestedRetryTime,msg[i]->cid,msg[i]->active,msg[i]->mtu);
+ LYVERBLOG("+[ril][gdcl]: type = %s,ifname = %s,addresses = %s,dnses = %s,gateways = s%,pcscf = %s\n",msg[i]->type,msg[i]->ifname,msg[i]->addresses,msg[i]->dnses,msg[i]->gateways,msg[i]->pcscf);
+ }
+ LYVERBLOG("+[ril][gdcl]: ok!!\n");
+ }
+ else
+ {
+ LYVERBLOG("+[ril][gdcl]: error num = %d\n",RIL_E_GENERIC_FAILURE);
+ }
+ for (int i = 0; i < num; i++)
+ {
+ if (msg[i]!=NULL)
+ {
+ free(msg[i]);
+ msg[i]=NULL;
+ }
+ }
+ free(msg);
+ msg=NULL;
+ return 0;
+}
+
+int eventGetSimStatus(char ** argv)
+{
+ static int32_t token=0;
+ simStatus * sim_status=NULL;
+ sim_status = (simStatus *)malloc(sizeof(simStatus));
+ token = lynq_get_sim_status(sim_status);
+ LYINFLOG("card_status:%d,card_type:%d,pin_state:%d,error_code:%d,request:%d,token:%x\n",sim_status->card_status,
+ sim_status->card_type,sim_status->pin_state,sim_status->base.e,sim_status->base.request,sim_status->base.token);
+ if(sim_status->base.e!=0)
+ {
+ LYVERBLOG("+[ril][gss]: error num = %d\n",sim_status->base.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][gss]: card_status = %d,card_type = %d,pin_state = %d\n",sim_status->card_status,
+ sim_status->card_type,sim_status->pin_state);
+ LYVERBLOG("+[ril][gss]: ok!!\n");
+ }
+ if (sim_status->base.e==-1)
+ {
+ free(sim_status);
+ sim_status=NULL;
+ return -1;
+ }
+ free(sim_status);
+ sim_status=NULL;
+ return 0;
+}
+int eventGetImsi(char ** argv)
+{
+ simImsi msg;
+ lynq_get_imsi(&msg);
+ //printf("request is %d, token is %x,error_code %d,imsi is %s\n",msg.base.request,msg.base.token, msg.base.e,msg.imsi);
+ LYINFLOG("request is %d, token is %x,error_code %d,imsi is %s\n",msg.base.request,msg.base.token, msg.base.e,msg.imsi);
+ if(msg.base.e!=0)
+ {
+ LYVERBLOG("+[ril][gimsi]: error num = %d\n",msg.base.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][gimsi]: imsi = %s\n",msg.imsi);
+ LYVERBLOG("+[ril][gimsi]: ok!!\n");
+ }
+ if (msg.base.e==-1)
+ {
+ return -1;
+ }
+ return 0;
+}
+int eventSendSms(char ** argv)
+{
+ int32_t token=0;
+ if(argv[0]==NULL||argv[1]==NULL)
+ {
+ LYERRLOG("+[ril][ssm: Please input telephonyNumber and message,and try again!\n");
+ return -1;
+ }
+ char *telephonyNumber = argv[0];
+ char *msgcont = argv[1];
+ smsResponse msg;
+ msg.smsResp.ackPDU=NULL;
+ //const char *telephonyNumber ="10086";
+ //const char * msgcont = "103";
+ token = lynq_send_sms(telephonyNumber, 0,msgcont, NULL,&msg);
+ //printf("request is %d,token is %x,error is %d,\nmessageRef is %d,ackPDU is %s,errorCode is %d\n",msg.base.request,msg.base.token,msg.base.e,
+ //msg.smsResp.messageRef,msg.smsResp.ackPDU,msg.smsResp.errorCode);
+ LYINFLOG("request is %d,token is %x,error is %d,messageRef is %d,ackPDU is %s,errorCode is %d\n",msg.base.request,msg.base.token,msg.base.e,
+ msg.smsResp.messageRef,msg.smsResp.ackPDU,msg.smsResp.errorCode);
+ if(msg.base.e!=0)
+ {
+ LYVERBLOG("+[ril][ssm]: error num = %d\n",msg.base.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][ssm]: ok!!\n");
+ }
+ return 0;
+}
+int eventImsSendSms(char ** argv)
+{
+ int32_t token=0;
+ smsResponse msg;
+ if(argv[0]==NULL||argv[1]==NULL)
+ {
+ LYERRLOG("+[ril][iss]:Please input telephonyNumber and message,and try again!\n");
+ return -1;
+ }
+ char *telephonyNumber = argv[0];
+ char *msgcont = argv[1];
+ msg.smsResp.ackPDU=NULL;
+ //const char *telephonyNumber ="10086";
+ //const char * msgcont = "103";
+ const char* retryNum ="0";
+ const char *messageRef = "201";
+ token = lynq_Ims_send_sms(telephonyNumber, 0,msgcont,retryNum,messageRef, NULL,&msg);
+ LYINFLOG("request is %d,token is %x,error is %d,messageRef is %d,ackPDU is %s,errorCode is %d\n",msg.base.request,msg.base.token,msg.base.e,
+ msg.smsResp.messageRef,msg.smsResp.ackPDU,msg.smsResp.errorCode);
+ if(msg.base.e!=0)
+ {
+ LYVERBLOG("+[ril][iss]: error num = %d\n",msg.base.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][iss]: ok!!\n");
+ }
+ return 0;
+}
+int eventWriteSmsToSim(char ** argv)
+{
+ int32_t token=0;
+ messageStoreInfo msg;
+ if(argv[0]==NULL||argv[1]==NULL||argv[2]==NULL)
+ {
+ LYERRLOG("+[ril][wsts]: Please input telephonyNumber,message and sms status,and try again!\n");
+ return -1;
+ }
+ const int smsStatus = atoi(argv[0]);
+ const char *recPhonNum = argv[1];
+ const char *msgcont = argv[2];
+ token = lynq_write_sms_to_sim(smsStatus,recPhonNum,0,msgcont,NULL,&msg);
+ LYINFLOG("request is %d,token is %x,error is %d,\nmessage strore index is %d\n",msg.base.request,msg.base.token,msg.base.e,
+ msg.msgStoreIndex);
+ if(msg.base.e!=0)
+ {
+ LYVERBLOG("+[ril][wsts]: error num = %d\n",msg.base.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][wsts]: ok!!\n");
+ }
+ return 0;
+}
+int eventReportSmsMemoryStatus(char **argv)
+{
+ lynqBase msg;
+ char output[1024] = {0};
+ if(argv[0]==NULL)
+ {
+ LYERRLOG("+[ril][rsms]: Please input memory status,0 or 1,and try again!\n");
+ return -1;
+ }
+ int value = atoi(argv[0]);
+ lynq_report_sms_memory_status(value,&msg);
+ //printf("request is %d,token is %x,error is %d,\n",msg.request,msg.token,msg.e);
+ LYINFLOG("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);
+ if(msg.e!=0)
+ {
+ LYVERBLOG("+[ril][rsms]: error num = %d\n",msg.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][rsms]: ok!!\n");
+ }
+ return 0;
+}
+int eventDeletSmsOnSim(char **argv)
+{
+ lynqBase msg;
+ if(argv[0]==NULL)
+ {
+ LYERRLOG("+[ril][dsos]: Please input sms index,and try again!\n");
+ return -1;
+ }
+ int value = atoi(argv[0]);
+ lynq_delet_sms_on_sim(value,&msg);
+ //printf("request is %d,token is %x,error is %d,\n",msg.request,msg.token,msg.e);
+ LYINFLOG("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);
+ if(msg.e!=0)
+ {
+ LYVERBLOG("+[ril][dsos]: error num = %d\n",msg.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][dsos]: ok!!\n");
+ }
+ return 0;
+}
+int eventGetSmscAddress(char **argv)
+{
+ smscCbInfo msg;
+ lynq_get_smsc_address(&msg);
+ //printf("request is %d,token is %x,error is %d,smsc address is %s\n",msg.base.request,msg.base.token,msg.base.e,msg.smsc);
+ LYINFLOG("request is %d,token is %x,error is %d,smsc address is %s\n",msg.base.request,msg.base.token,msg.base.e,msg.smsc);
+ if(msg.base.e!=0)
+ {
+ LYVERBLOG("+[ril][gsmsc]: error num = %d\n",msg.base.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][gsmsc]: smsc = %s\n",msg.smsc);
+ LYVERBLOG("+[ril][gsmsc]: ok!!\n");
+ }
+ return 0;
+}
+int eventSetSmscAddress(char **argv)
+{
+ lynqBase msg;
+ if(argv[0]==NULL)
+ {
+ LYERRLOG("+[ril][ssmsc]: Please input smsc address,and try again!\n");
+ return -1;
+ }
+ const char* serviceNumber = argv[0];
+ lynq_set_smsc_address(serviceNumber,&msg);
+ //printf("request is %d,token is %x,error is %d,\n",msg.request,msg.token,msg.e);
+ LYINFLOG("request is %d,token is %x,error is %d\n",msg.request,msg.token,msg.e);
+ if(msg.e!=0)
+ {
+ LYVERBLOG("+[ril][ssmsc]: error num = %d\n",msg.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][ssmsc]: ok!!\n");
+ }
+ return 0;
+}
+int evenStoreSmsToMemory(char **argv)
+{
+ lynqBase msg;
+ msg.e = (RIL_Errno)(-1);
+ //printf("argv[2]%d,argv[3]%s,argv[4]%s\n",atoi(argv[2]), argv[3],argv[4]);
+ lynq_store_sms_to_memory(RIL_SOCKET_1,atoi(argv[0]), argv[1],argv[2],&msg);
+ if(msg.e!=0)
+ {
+ LYVERBLOG("+[ril][sstm]: error num = %d\n",msg.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][sstm]: ok!!\n");
+ }
+ return 0;
+}
+int eventGetSmsFromMemory(char **argv)
+{
+ lynqBase msg;
+ msg.e = (RIL_Errno)(-1);
+ storeMessageInfo sms;
+ lynq_get_sms_from_memory(atoi(argv[0]),&sms, &msg);
+ if(msg.e!=0)
+ {
+ LYVERBLOG("+[ril][gstfm]: error num = %d\n",msg.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][gsfm]: Index = %d,Message = %s,Status = %d,teleNum= %s\n",sms.index,sms.message,sms.status,sms.teleNum);
+ LYVERBLOG("+[ril][gsfm]: ok!!\n");
+ }
+ return 0;
+}
+int eventDeleteMessageFromMemory(char **argv)
+{
+ lynqBase msg;
+ msg.e = (RIL_Errno)(-1);
+ lynq_delete_message_from_memory(atoi(argv[0]), &msg);
+ if(msg.e!=0)
+ {
+ LYVERBLOG("+[ril][dmfm]: error num = %d\n",msg.e);
+ }
+ else
+ {
+ LYVERBLOG("+[ril][dmfm]: ok!!\n");
+ }
+ return 0;
+}
+
+//int callController(int *item, char *value,int command);
+//int networkcontroller(int *item, char *value,int command);
+//int datacontroller(int *item, char *value,int command);
+//int simcontroller(int *item, char *value,int command);
+//int smscontroller(int *item, char *value,int command);
+
+int ril_test(char *api,char *string) {
+ char *argv[MAX_P] = {0};
+ parseParameters(string,argv);
+ RIL_COMMAND *command = find_command(api,api_commands);
+ if(command)
+ {
+ (*(command->func)) (argv);
+ }
+ else
+ {
+ LYERRLOG("Can not find this command from function_test!!!\n");
+ }
+ /*
+ switch (module) {
+ case CALL_API:
+ {
+ callController(menu[1],argv);
+ break;
+ }
+ case NETWORK_API:
+ {
+ networkcontroller(menu[1],argv);
+ break;
+ }
+ case DATA_API:
+ {
+ datacontroller(menu[1],argv);
+ break;
+ }
+ case SMS_API:
+ {
+ smscontroller(menu[1],argv);
+ //RLOGD("test_api,RIL_API");
+ break;
+ }
+ case SIM_API:
+ {
+ simcontroller(menu[1],argv);
+ break;
+ }
+ default:
+ break;
+ }
+ */
+ return 0;
+}
+/*
+int callController(char *api,char **param)
+{
+ char output[1024] = {0};
+ RIL_COMMAND *command = find_command(api,api_commands);
+ (*(command->func)) (param);
+
+ switch(call_api_choice)
+ {
+ case DAIL:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num==parseParam(1, value,argv))
+ {
+ eventDial(argv[1],command);
+ }
+ else
+ {
+ printf("please input inavaliable call number,and try again!\n");
+ emResultNotify(output,command);
+ }
+
+ //eventDial(item[4],command);
+ //printf("please input inavaliable call number,and try again!\n");
+ //emResultNotify(output,command);
+
+ break;
+ }
+ case ANSWER_CALL:
+ {
+ eventAnswer(command);
+ break;
+ }
+ case HANGUP_CALL:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num==parseParam(1, value,argv))
+ {
+ eventCallHangUp(atoi(&argv[1][0]),command);
+ }
+ else
+ {
+ printf("please input call id,and try again!\n");
+ emResultNotify(output ,command);
+ }
+ break;
+ }
+ case REJECT_CALL:
+ {
+ eventRejectCall(command);
+ break;
+ }
+ case AUTO_ANSWER_CALL:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num==parseParam(1, value,argv))
+ {
+ eventAutoAnswer(atoi(&argv[1][0]),command);
+ }
+ else
+ {
+ sprintf(output,"please input auto answer mode value:0 or 1,and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case SET_MUTE_STATUS:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num==parseParam(1, value,argv))
+ {
+ eventSetMute(atoi(&argv[1][0]),command);
+ }
+ else
+ {
+ sprintf(output,"please input set mute mode:0 or 1,and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case GET_MUTE_STATUS:
+ {
+ eventGetMute(command);
+ break;
+ }
+ case SET_DTMF:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num==parseParam(1, value,argv))
+ {
+ eventSetDTMF(argv[1][0],command);
+ }
+ else
+ {
+ sprintf(output,"please input DTMF value:0-9,8,#,and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case SET_DTMF_V:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num==parseParam(1, value,argv))
+ {
+ eventSetDTMFVolume(atoi(&argv[1][0]),command);
+ }
+ else
+ {
+ sprintf(output,"please input volume value,0-36,and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case DO_MULTI_CONF:
+ {
+ eventDoMultiConference(command);
+ break;
+ }
+ case OTHER_CALL_HOLD:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num==parseParam(1, value,argv))
+ {
+ eventOthercallHold(atoi(&argv[1][0]),command);
+ }
+ else
+ {
+ sprintf(output,"please input call id, and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case HANGUP_WAITING_CALL:
+ {
+ eventHangupWatingForCall(command);
+ break;
+ }
+ case HANGUP_FORE_RES_BACK:
+ {
+ eventHangupForegroundResumeBackground(command);
+ break;
+ }
+ case SWITCH_HOLD_AND_ACTIVE_CALL:
+ {
+ eventSwitchWaitOrHoldAndActiveCall(command);
+ break;
+ }
+ case GET_LAST_CALL_FAIL_CAUSE:
+ {
+ eventLastCallFailCause(command);
+ break;
+ }
+ default:
+ break;
+ }
+ return 0;
+}
+int networkcontroller(char *api,char **param)
+{
+ int network_api_choice = item[3];
+ char output[1024] = {0};
+ switch(network_api_choice)
+ {
+ case QUERY_OPERATOR:
+ {
+ eventQueryOperator(command);
+ break;
+ }
+ case QUERY_NETWORK_SELECTION_MODE:
+ {
+ eventQueryNetSelectMode(command);
+ break;
+ }
+ case SET_NETWORK_SELECTION_MODE:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num==parseParam(1, value,argv))
+ {
+ eventSetNetSelectMode(atoi(&argv[1][0]),command);
+ }
+ else
+ {
+ sprintf(output,"please input network selection mode 0 or 1, and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case QUERY_AVAILABLE_NETWORKS:
+ {
+ eventQueryAvailableNetwork(command);
+ break;
+ }
+ case QUERY_REGISTRATION_STATE:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num==parseParam(1, value,argv))
+ {
+ eventQueryRegistrationState(argv[1],command);
+ }
+ else
+ {
+ sprintf(output,"please input type voice,data,or ims, and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case GET_PREFERRED_NETWORK_TYPE:
+ {
+ eventQueryPrefferredNetworkType(command);
+ break;
+ }
+ case SET_PREFERRED_NETWORK_TYPE:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num==parseParam(1, value,argv))
+ {
+ eventSetPrefferredNetworkType(atoi(&argv[1][0]),command);
+ }
+ else
+ {
+ sprintf(output,"please input preferred network type value , and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case GET_CELL_INFO_LIST:
+ {
+ eventQueryCellInfo(command);
+ break;
+ }
+ case SET_UNSOL_CELL_INFO_LIST_RATE:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num==parseParam(1, value,argv))
+ {
+ eventSetUnsolCellInfoListrate(atoi(&argv[1][0]),command);
+ }
+ else
+ {
+ sprintf(output,"please input unsolicited cell infomation list rate , and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case GET_NEIGHBORING_CELL_IDS:
+ {
+ eventQueryNeighboringCellids(command);
+ break;
+ }
+ case SET_BAND_MODE:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num==parseParam(1, value,argv))
+ {
+ eventSetBandMode(atoi(&argv[1][0]),command);
+ }
+ else
+ {
+ sprintf(output,"please input band mode, and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case QUERY_AVAILABLE_BAND_MODE:
+ {
+ eventQueryAvailableBandmode(command);
+ break;
+ }
+ case RADIO_POWER:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num==parseParam(1, value,argv))
+ {
+ eventRadioOn(atoi(&argv[1][0]),command);
+ }
+ else
+ {
+ sprintf(output,"please input radio power status value 0 or 1, and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case VOICE_RADIO_TECH:
+ {
+ eventQueryRadioTech(command);
+ break;
+ }
+ case SIGNAL_STRENGTH:
+ {
+ eventSolicitedSignalStrength(command);
+ break;
+ }
+ case MODEM_POWER:
+ {
+ int num=0;
+ char *argv[2]={0};
+ if(num==parseParam(1, value,argv))
+ {
+ eventModemOn(atoi(&argv[1][0]),command);
+ }
+ else
+ {
+ sprintf(output,"please input modem power status value 0 or 1, and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ return 0;
+}
+int datacontroller(char *api,char **param)
+{
+ int data_api_choice = item[3];
+ char output[1024] = {0};
+ switch(data_api_choice)
+ {
+ case SETUP_DATA_CALL:
+ {
+ eventSetupDataCall(command);
+ break;
+ }
+ case DEACTIVATE_DATA_CALL:
+ {
+ eventDeactiveDataCall(command);
+ break;
+ }
+ case GET_DATA_CALL_LIST:
+ {
+ eventGetDataCalllist(command);
+ break;
+ }
+ default:
+ break;
+ }
+ return 0;
+}
+int simcontroller(char *api,char **param)
+{
+ int sim_api_choice = item[3];
+ char output[1024] = {0};
+ switch(sim_api_choice)
+ {
+ case GET_SIM_STATUS:
+ {
+ eventGetSimStatus(command);
+ break;
+ }
+ case GET_IMSI:
+ {
+ eventGetImsi(command);
+ break;
+ }
+ default:
+ break;
+ }
+ return 0;
+}
+int smscontroller(int *item, char *value,int command)
+{
+ int sms_api_choice = item[3];
+ char output[1024] = {0};
+ switch(sms_api_choice)
+ {
+ case SEND_SMS:
+ {
+ int num=0;
+ char *argv[MAX_P]={0};
+ if(num==parseParam(2, value,argv))
+ {
+ eventSendSms(argv[1], argv[2],command);
+ }
+ else
+ {
+ sprintf(output,"please input phone number and message, and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case IMS_SEND_SMS:
+ {
+ int num=0;
+ char *argv[MAX_P]={0};
+ if(num==parseParam(2, value,argv))
+ {
+ eventImsSendSms(argv[1], argv[2],command);
+ }
+ else
+ {
+ sprintf(output,"please input phone number and message, and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case WRITE_SMS_TO_SIM:
+ {
+ int num=0;
+ char *argv[MAX_P]={0};
+ if(num==parseParam(3, value,argv))
+ {
+ eventWriteSmsToSim(atoi(&argv[1][0]),argv[2], argv[3],command);
+ }
+ else
+ {
+ sprintf(output,"please input sms status,phone number and message, and try again!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case REPORT_SMS_MEMORY_STATUS:
+ {
+ int num=0;
+ char *argv[MAX_P]={0};
+ if(num==parseParam(1, value,argv))
+ {
+ eventReportSmsMemoryStatus(atoi(&argv[1][0]),command);
+ }
+ else
+ {
+ sprintf(output,"please input memory status 0 or 1,and try agin!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case DELETE_SMS_ON_SIM:
+ {
+ int num=0;
+ char *argv[MAX_P]={0};
+ if(num==parseParam(1, value,argv))
+ {
+ eventDeletSmsOnSim(atoi(&argv[1][0]),command);
+ }
+ else
+ {
+ sprintf(output,"please input sms index,and try agin!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ case GET_SMSC_ADDRESS:
+ {
+ eventGetSmscAddress(command);
+ break;
+ }
+ case SET_SMSC_ADDRESS:
+ {
+ int num=0;
+ char *argv[MAX_P]={0};
+ if(num==parseParam(1, value,argv))
+ {
+ eventSetSmscAddress(argv[1],command);
+ }
+ else
+ {
+ sprintf(output,"please input serviceNumber,and try agin!\n");
+ emResultNotify(output,command);
+ }
+ break;
+ }
+ }
+ return 0;
+}
+*/
+
+
diff --git a/packages/apps/lynq-function-test/src/ril_test.h b/packages/apps/lynq-function-test/src/ril_test.h
new file mode 100644
index 0000000..7b1aa66
--- /dev/null
+++ b/packages/apps/lynq-function-test/src/ril_test.h
@@ -0,0 +1,130 @@
+/*=============================================================================
+** FileName: ril_test.h
+** Desc: about function test
+** Author: Warren
+** Version: V1.0
+** LastChange: 2021-02-26
+** History:
+=============================================================================*/
+
+#ifndef __LYNQ_RIL_TEST_H__
+#define __LYNQ_RIL_TEST_H__
+typedef enum {
+ SIM_API = 0,
+ CALL_API,
+ NETWORK_API,
+ DATA_API,
+ SMS_API,
+}RIL_API_MENU;
+
+typedef enum{
+ DAIL= 0,
+ ANSWER_CALL,
+ HANGUP_CALL,
+ REJECT_CALL,
+ AUTO_ANSWER_CALL,
+ SET_MUTE_STATUS,
+ GET_MUTE_STATUS,
+ SET_DTMF,
+ SET_DTMF_V,
+ DO_MULTI_CONF,
+ OTHER_CALL_HOLD,
+ HANGUP_WAITING_CALL,
+ HANGUP_FORE_RES_BACK,
+ SWITCH_HOLD_AND_ACTIVE_CALL,
+ GET_LAST_CALL_FAIL_CAUSE,
+}RIL_CALL_MENU;
+
+typedef enum
+{
+ QUERY_OPERATOR=0,
+ QUERY_NETWORK_SELECTION_MODE,
+ SET_NETWORK_SELECTION_MODE,
+ QUERY_AVAILABLE_NETWORKS,
+ QUERY_REGISTRATION_STATE,
+ GET_PREFERRED_NETWORK_TYPE,
+ SET_PREFERRED_NETWORK_TYPE,
+ GET_CELL_INFO_LIST,
+ SET_UNSOL_CELL_INFO_LIST_RATE,
+ GET_NEIGHBORING_CELL_IDS ,
+ SET_BAND_MODE,
+ QUERY_AVAILABLE_BAND_MODE,
+ RADIO_POWER,
+ VOICE_RADIO_TECH,
+ SIGNAL_STRENGTH,
+ MODEM_POWER,
+}RIL_NETWORK_MENU;
+
+typedef enum{
+ SETUP_DATA_CALL=0,
+ DEACTIVATE_DATA_CALL,
+ GET_DATA_CALL_LIST,
+}RIL_DATA_MENU;
+
+typedef enum{
+ GET_SIM_STATUS=0,
+ GET_IMSI,
+}RIL_SIM_MENU;
+
+typedef enum{
+ SEND_SMS=0,
+ IMS_SEND_SMS,
+ WRITE_SMS_TO_SIM,
+ REPORT_SMS_MEMORY_STATUS,
+ DELETE_SMS_ON_SIM,
+ GET_SMSC_ADDRESS,
+ SET_SMSC_ADDRESS,
+}RIL_SMS_MENU;
+int eventDial(char **argv);
+int eventAnswer(char **argv);
+int eventAutoAnswer(char **argv);
+int eventSetMute(char **argv);
+int eventGetMute(char **argv);
+int eventLastCallFailCause(char **argv);
+int eventCallHangUp(char **argv);
+int eventRejectCall(char **argv);
+int eventSetDTMF(char **argv);
+int eventSetDTMFVolume(char **argv);
+int eventDoMultiConference(char **argv);
+int eventOthercallHold(char **argv);
+int eventHangupWatingForCall(char **argv);
+int eventHangupForegroundResumeBackground(char **argv);
+int eventSwitchWaitOrHoldAndActiveCall(char ** argv);
+int eventQueryOperator(char ** argv);
+int eventQueryNetSelectMode(char ** argv);
+int eventSetNetSelectMode(char ** argv);
+int eventQueryAvailableNetwork(char **argv);
+int eventQueryRegistrationState(char ** argv);
+int eventQueryPrefferredNetworkType(char ** argv);
+int eventSetPrefferredNetworkType(char ** argv);
+int eventQueryCellInfo(char ** argv);
+int eventSetUnsolCellInfoListrate(char ** argv);
+int eventQueryNeighboringCellids(char ** argv);
+int eventSetBandMode(char ** argv);
+int eventQueryAvailableBandmode(char ** argv);
+int eventRadioOn(char ** argv);
+int eventQueryRadioTech(char ** argv);
+int eventSolicitedSignalStrength(char ** argv);
+int eventModemOn(char **argv);
+int eventSetupDataCall(char ** argv);
+int eventDeactiveDataCall(char ** argv);
+int eventGetDataCalllist(char ** argv);
+int eventGetSimStatus(char ** argv);
+int eventGetImsi(char ** argv);
+int eventSendSms(char ** argv);
+int eventImsSendSms(char ** argv);
+int eventWriteSmsToSim(char ** argv);
+int eventReportSmsMemoryStatus(char **argv);
+int eventDeletSmsOnSim(char **argv);
+int eventGetSmscAddress(char **argv);
+int eventSetSmscAddress(char **argv);
+int evenStoreSmsToMemory(char **argv);
+int eventGetSmsFromMemory(char **argv);
+int eventDeleteMessageFromMemory(char **argv);
+
+
+int ril_test(char *api,char *string);
+
+
+#endif //__LYNQ_RIL_TEST_H__
+
diff --git a/packages/apps/lynq-function-test/src/system_test.cpp b/packages/apps/lynq-function-test/src/system_test.cpp
new file mode 100644
index 0000000..155d4f2
--- /dev/null
+++ b/packages/apps/lynq-function-test/src/system_test.cpp
@@ -0,0 +1,82 @@
+
+
+
+/*=============================================================================
+** FileName: dhcp_test.cpp
+** Desc: about function test
+** Author: grays
+** Version: V1.0
+** LastChange: 2021-08-18
+** History:
+=============================================================================*/
+
+
+#include "function_common.h"
+#include <log/log.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include "liblog/liblog.h"
+#include "liblog/lynq_deflog.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "include/lynq-system-own.h"
+#ifdef __cplusplus
+}
+#endif
+
+void* thread(void* arg)
+{
+ #if 1
+ pthread_detach(pthread_self());
+ int edge=0;
+ while(LYNQ_Lpm_Handler){
+ lynq_lpm_handler(edge);//gpio电平变化则上报
+ }
+ #endif
+ pthread_exit(0);
+}
+
+int system_test(char *api,char *string) {
+ char *argv[100] = {0};
+ pthread_t id;
+ int ret;
+ parseParameters(string,argv);
+ int Flag=0;
+ if(!strcmp(api, "init")){
+ LYNQ_Lpm_Init(lynq_lpm_handler);//初始化lpm,监听gpio电平上报事件
+ ret = pthread_create(&id,NULL,thread,NULL); //创建线程来监听gpio电平变化
+ if(ret != 0)
+ {
+ printf("Create pthread error!\n");
+ exit(1);
+ }
+ sleep(2);
+ }else if(!strcmp(api, "deinit")){
+ LYNQ_Lpm_Deinit();//注销lpm。
+ }else if(!strcmp(api,"adc")){
+ int adc_n = atoi(argv[0]);
+ printf("api = %s adc=%d\n", api,LYNQ_Adc_Show(adc_n));//当前电源电压
+ }else if(!strcmp(api, "suspend")){
+ Flag = atoi(argv[0]);
+ LYNQ_Autosleep_Enable(Flag);//使能系统睡眠
+ }else if(!strcmp(api, "Lock")){
+ LYNQ_SLP_WakeLock_Lock(argv[0]);//创建wakelock锁,此时系统无法进入睡眠
+ }else if(!strcmp(api, "Unlock")){
+ LYNQ_SLP_WakeLock_Unlock(argv[0]);//解锁wakelock,此时系统可进入睡眠
+ }else if(!strcmp(api, "powerdown")){
+ Flag = atoi(argv[0]);
+ LYNQ_Power_Down(Flag);//开关机接口,用于选择关机或重启
+ }else if(!strcmp(api, "changemod")){
+ LYNQ_Power_Mode(argv[0]);//开关机接口,用于选择关机或重启
+ }else {
+ printf("invalid api \n" );
+ }
+
+ return 0;
+}
diff --git a/packages/apps/lynq-function-test/src/system_test.h b/packages/apps/lynq-function-test/src/system_test.h
new file mode 100644
index 0000000..331da81
--- /dev/null
+++ b/packages/apps/lynq-function-test/src/system_test.h
@@ -0,0 +1,6 @@
+#ifndef __LYNQ_SYSTEM_TEST_H__
+#define __LYNQ_SYSTEM_TEST_H__
+int system_test(char *api,char *string);
+
+#endif //__LYNQ_SYSTEM_TEST_H__
+
diff --git a/packages/apps/lynq-media-test/src/LICENSE b/packages/apps/lynq-media-test/src/LICENSE
new file mode 100644
index 0000000..77f59ed
--- /dev/null
+++ b/packages/apps/lynq-media-test/src/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/packages/apps/lynq-media-test/src/lynq_media_test.c b/packages/apps/lynq-media-test/src/lynq_media_test.c
new file mode 100644
index 0000000..2ca202d
--- /dev/null
+++ b/packages/apps/lynq-media-test/src/lynq_media_test.c
@@ -0,0 +1,30 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <log/log.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "liblynq-media/lynq_medial.h"
+#include "liblynq-media/lynq_modem_voice.h"
+#ifdef __cplusplus
+}
+#endif
+#include <pthread.h>
+
+#define LOG_TAG "DEV_TEST"
+
+void *media_handle = NULL;
+int main(int argc, char **argv)
+{
+ char *devicename = "/data/ring.wav";
+ char *devicesavename = "/data/ring11.wav";
+ media_handle=lynq_media_play_audio(devicename);
+ lynq_incall_record(devicesavename);
+ sleep(20);
+ lynq_stop_record();
+ printf("going to stop play\n");
+ lynq_media_stop_audio(media_handle);
+ printf("stop play\n");
+ return 0;
+}
\ No newline at end of file
diff --git a/packages/apps/lynq-media-test/src/lynq_media_test1.c.tmp b/packages/apps/lynq-media-test/src/lynq_media_test1.c.tmp
new file mode 100644
index 0000000..5d167f5
--- /dev/null
+++ b/packages/apps/lynq-media-test/src/lynq_media_test1.c.tmp
@@ -0,0 +1,106 @@
+#include <gst/gst.h>
+
+#define GST_CAT_DEFAULT myelement_debug
+
+typedef struct _CustomData {
+ GstElement *pipeline;
+ GstElement *playbin;
+} CustomData;
+
+ static gboolean
+ bus_call (GstBus * bus, GstMessage * msg, gpointer data)
+ {
+ GMainLoop *loop = (GMainLoop *) data;
+
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_EOS:{
+ g_print ("End-of-stream\n");
+ g_main_loop_quit (loop);
+ break;
+ }
+ case GST_MESSAGE_ERROR:{
+ gchar *debug;
+ GError *err;
+
+ gst_message_parse_error (msg, &err, &debug);
+ g_printerr ("Debugging info: %s\n", (debug) ? debug : "none");
+ g_free (debug);
+
+ g_print ("Error: %s\n", err->message);
+ g_error_free (err);
+
+ g_main_loop_quit (loop);
+
+ break;
+ }
+ default:
+ break;
+ }
+ return TRUE;
+ }
+/* Handler for the pad-added signal */
+GST_DEBUG_CATEGORY_STATIC (myelement_debug);
+static void pad_added_handler (GstElement *src, GstPad *pad, CustomData *data);
+
+int main(int argc, char *argv[]) {
+ CustomData data;
+ GstBus *bus;
+ GstMessage *msg;
+ GstStateChangeReturn ret;
+ gboolean terminate = FALSE;
+ GMainLoop *loop;
+ guint bus_watch_id;
+ /* Initialize GStreamer */
+ gst_init (&argc, &argv);
+ GST_DEBUG_CATEGORY_INIT (myelement_debug, "myelement", 0, "My own element");
+ /* Create the elements */
+ data.playbin = gst_element_factory_make ("playbin", "playbin");
+
+ g_print ("main start.\n");
+ /* Create the empty pipeline */
+ data.pipeline = gst_pipeline_new ("test-pipeline");
+
+ if (!data.pipeline || !data.playbin) {
+ g_printerr ("Not all elements could be created.\n");
+ return -1;
+ }
+
+
+ /* Set the URI to play */
+ g_object_set (data.playbin, "uri", "file:///data/ring.wav", NULL);
+
+
+
+ g_object_set (data.playbin, "flags", 0x42 , NULL);
+ g_object_set (data.playbin, "volume", 1.0 , NULL);
+ g_object_set (data.playbin, "mute", 0 , NULL);
+ /* Start playing */
+ ret = gst_element_set_state (data.pipeline, GST_STATE_PLAYING);
+ if (ret == GST_STATE_CHANGE_FAILURE) {
+ g_printerr ("Unable to set the pipeline to the playing state.\n");
+ gst_object_unref (data.pipeline);
+ return -1;
+ }
+
+ // loop = g_main_loop_new (NULL, FALSE);
+
+ // bus = gst_element_get_bus (data.playbin);
+ // bus_watch_id = gst_bus_add_watch (bus, bus_call, loop);
+ // g_object_unref (bus);
+ g_print ("gst_bus_add_watch.\n");
+ /* start play back and listed to events */
+ gst_element_set_state (data.playbin, GST_STATE_PLAYING);
+ sleep(10);
+ g_object_set (data.playbin, "mute", 1 , NULL);
+ g_print ("g_main_loop_run start.\n");
+ // g_main_loop_run (loop);
+ g_print ("g_main_loop_run stop.\n");
+ /* cleanup */
+ // gst_element_set_state (data.playbin, GST_STATE_NULL);
+ // g_object_unref (data.playbin);
+ // g_source_remove (bus_watch_id);
+ // g_main_loop_unref (loop);
+ return 0;
+}
+
+
diff --git a/packages/apps/lynq-media-test/src/lynq_media_test_old.c.tmp b/packages/apps/lynq-media-test/src/lynq_media_test_old.c.tmp
new file mode 100644
index 0000000..3443f4a
--- /dev/null
+++ b/packages/apps/lynq-media-test/src/lynq_media_test_old.c.tmp
@@ -0,0 +1,152 @@
+#include <gst/gst.h>
+
+/* Structure to contain all our information, so we can pass it to callbacks */
+typedef struct _CustomData {
+ GstElement *pipeline;
+ GstElement *source;
+ GstElement *convert;
+ GstElement *sink;
+} CustomData;
+
+/* Handler for the pad-added signal */
+static void pad_added_handler (GstElement *src, GstPad *pad, CustomData *data);
+
+int main(int argc, char *argv[]) {
+ CustomData data;
+ GstBus *bus;
+ GstMessage *msg;
+ GstStateChangeReturn ret;
+ gboolean terminate = FALSE;
+
+
+ /* Initialize GStreamer */
+ gst_init (&argc, &argv);
+
+ /* Create the elements */
+ data.source = gst_element_factory_make ("uridecodebin", "source");
+ data.convert = gst_element_factory_make ("audioconvert", "convert");
+ data.sink = gst_element_factory_make ("autoaudiosink", "sink");
+ g_print ("main start.\n");
+ printf ("main start.\n");
+ /* Create the empty pipeline */
+ data.pipeline = gst_pipeline_new ("test-pipeline");
+
+ if (!data.pipeline || !data.source || !data.convert || !data.sink) {
+ g_printerr ("Not all elements could be created.\n");
+ return -1;
+ }
+
+ /* Build the pipeline. Note that we are NOT linking the source at this
+ * point. We will do it later. */
+ gst_bin_add_many (GST_BIN (data.pipeline), data.source, data.convert , data.sink, NULL);
+ if (!gst_element_link (data.convert, data.sink)) {
+ g_printerr ("Elements could not be linked.\n");
+ gst_object_unref (data.pipeline);
+ return -1;
+ }
+
+ /* Set the URI to play */
+ g_object_set (data.source, "uri", "file:///data/ring.wav", NULL);
+
+ /* Connect to the pad-added signal */
+ g_signal_connect (data.source, "pad-added", G_CALLBACK (pad_added_handler), &data);
+
+ /* Start playing */
+ ret = gst_element_set_state (data.pipeline, GST_STATE_PLAYING);
+ if (ret == GST_STATE_CHANGE_FAILURE) {
+ g_printerr ("Unable to set the pipeline to the playing state.\n");
+ gst_object_unref (data.pipeline);
+ return -1;
+ }
+
+ /* Listen to the bus */
+ bus = gst_element_get_bus (data.pipeline);
+ do {
+ msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE,
+ GST_MESSAGE_STATE_CHANGED | GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
+
+ /* Parse message */
+ if (msg != NULL) {
+ GError *err;
+ gchar *debug_info;
+
+ switch (GST_MESSAGE_TYPE (msg)) {
+ case GST_MESSAGE_ERROR:
+ gst_message_parse_error (msg, &err, &debug_info);
+ g_printerr ("Error received from element %s: %s\n", GST_OBJECT_NAME (msg->src), err->message);
+ g_printerr ("Debugging information: %s\n", debug_info ? debug_info : "none");
+ g_clear_error (&err);
+ g_free (debug_info);
+ terminate = TRUE;
+ break;
+ case GST_MESSAGE_EOS:
+ g_print ("End-Of-Stream reached.\n");
+ terminate = TRUE;
+ break;
+ case GST_MESSAGE_STATE_CHANGED:
+ /* We are only interested in state-changed messages from the pipeline */
+ if (GST_MESSAGE_SRC (msg) == GST_OBJECT (data.pipeline)) {
+ GstState old_state, new_state, pending_state;
+ gst_message_parse_state_changed (msg, &old_state, &new_state, &pending_state);
+ g_print ("Pipeline state changed from %s to %s:\n",
+ gst_element_state_get_name (old_state), gst_element_state_get_name (new_state));
+ }
+ break;
+ default:
+ /* We should not reach here */
+ g_printerr ("Unexpected message received.\n");
+ break;
+ }
+ gst_message_unref (msg);
+ }
+ } while (!terminate);
+
+ /* Free resources */
+ gst_object_unref (bus);
+ gst_element_set_state (data.pipeline, GST_STATE_NULL);
+ gst_object_unref (data.pipeline);
+ return 0;
+}
+
+/* This function will be called by the pad-added signal */
+static void pad_added_handler (GstElement *src, GstPad *new_pad, CustomData *data) {
+ GstPad *sink_pad = gst_element_get_static_pad (data->convert, "sink");
+ GstPadLinkReturn ret;
+ GstCaps *new_pad_caps = NULL;
+ GstStructure *new_pad_struct = NULL;
+ const gchar *new_pad_type = NULL;
+
+ g_print ("Received new pad '%s' from '%s':\n", GST_PAD_NAME (new_pad), GST_ELEMENT_NAME (src));
+
+ /* If our converter is already linked, we have nothing to do here */
+ if (gst_pad_is_linked (sink_pad)) {
+ g_print (" We are already linked. Ignoring.\n");
+ goto exit;
+ }
+
+ /* Check the new pad's type */
+ new_pad_caps = gst_pad_get_current_caps (new_pad);
+ new_pad_struct = gst_caps_get_structure (new_pad_caps, 0);
+ new_pad_type = gst_structure_get_name (new_pad_struct);
+ if (!g_str_has_prefix (new_pad_type, "audio/x-raw")) {
+ g_print (" It has type '%s' which is not raw audio. Ignoring.\n", new_pad_type);
+ goto exit;
+ }
+
+ /* Attempt the link */
+ ret = gst_pad_link (new_pad, sink_pad);
+ if (GST_PAD_LINK_FAILED (ret)) {
+ g_print (" Type is '%s' but link failed.\n", new_pad_type);
+ } else {
+ g_print (" Link succeeded (type '%s').\n", new_pad_type);
+ }
+
+exit:
+ /* Unreference the new pad's caps, if we got them */
+ if (new_pad_caps != NULL)
+ gst_caps_unref (new_pad_caps);
+
+ /* Unreference the sink pad */
+ gst_object_unref (sink_pad);
+}
+
diff --git "a/packages/apps/lynq-media-test/src/lynq_testprocess\050gpio\051.tmp" "b/packages/apps/lynq-media-test/src/lynq_testprocess\050gpio\051.tmp"
new file mode 100644
index 0000000..c07e271
--- /dev/null
+++ "b/packages/apps/lynq-media-test/src/lynq_testprocess\050gpio\051.tmp"
@@ -0,0 +1,144 @@
+#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>
+#define GPIO_SERVICE "lynq.gpio" /*well-known bus name */
+#define GPIO_DATA_INTERFACE "lynq.gpio.Data" /*interface name*/
+#define GPIO_DATA_PATH "/lynq/gpio/data" /*object name*/
+GMainLoop *loop = NULL;
+GDBusProxy *proxy = NULL;
+#define LOG_TAG "GPIO_CONTROL"
+int set_gpio (gchar * mode,guint *gpio_numb,guint param)
+{
+ GDBusConnection *c1;
+ GVariant *result;
+ GError *error;
+ guint set_result = -1;
+ g_type_init();
+ loop = g_main_loop_new(NULL, FALSE); /** create main loop, but do not start it.*/
+ c1 = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, 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));
+ g_variant_unref (result);
+ g_main_loop_run (loop);
+ g_main_loop_unref (loop);
+ return set_result;
+}
+int get_gpio (guint *gpio_numb)
+{
+ GDBusConnection *c1;
+ GVariant *result;
+ GError *error;
+ guint parm=0;
+ const gchar *set_result;
+ const gchar *mode ="gpio";
+ if(set_gpio(mode,gpio_numb,parm)== -1)
+ {
+ RLOGD("get_gpio number error");
+ return -1;
+ }
+ c1 = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, 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 */
+ "getGpio", /* method name */
+ NULL, /* parameters */
+ G_VARIANT_TYPE ("(s)"), /* return type */
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ g_assert_no_error (error);
+ g_assert (result != NULL);
+ g_variant_get(result, "((s))", &(set_result));
+ RLOGD("get_gpio,%s",set_result);
+ g_variant_unref (result);
+ return 1;
+}
+void proxy_ready(GObject *source, GAsyncResult *result, gpointer user_data) {
+ GError *error;
+
+ error = NULL;
+ proxy = g_dbus_proxy_new_for_bus_finish(result, &error);
+ if (proxy == NULL) {
+ RLOGE("create proxy fail");
+ return ;
+ }
+ RLOGD("proxy is ready");
+ gulong signal_handler_id;
+
+ // signal_handler_id = g_signal_connect(proxy, "g-signal",
+ // G_CALLBACK (proxy_signals_on_signal), NULL);
+ // if (signal_handler_id == 0) {
+ // RLOGE("listen singal fail!");
+ // }
+}
+
+void* init_data_gdbus_cb(void *param)
+{
+ /* all the tests rely on a shared main loop */
+ loop = g_main_loop_new(NULL, FALSE);
+
+ g_dbus_proxy_new_for_bus(G_BUS_TYPE_SYSTEM,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL, /* GDBusInterfaceInfo */
+ GPIO_SERVICE, /* name */
+ GPIO_DATA_PATH, /* object path */
+ GPIO_DATA_INTERFACE, /* interface */
+ NULL, /* GCancellable */
+ proxy_ready,
+ NULL);
+
+ g_main_loop_run(loop);
+
+ RLOGD("data gdbus main loop run()");
+ if(proxy != NULL) {
+ g_object_unref (proxy);
+ }
+ if(loop != NULL) {
+ g_main_loop_unref(loop);
+ }
+}
+
+
+void startGdbusLoop(void)
+{
+ pthread_t gpioThread;
+
+ RLOGD("startGdbusLoop()");
+ // pthread_mutex_lock(&s_startupMutex);
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
+ int result = pthread_create(&gpioThread, &attr, init_data_gdbus_cb, NULL);
+ if (result != 0) {
+ RLOGW("Failed to create gdbus thread: %s", strerror(result));
+ //goto done;
+ }
+//done:
+ // pthread_mutex_unlock(&s_startupMutex);
+}
diff --git a/packages/apps/lynq-media-test/src/makefile b/packages/apps/lynq-media-test/src/makefile
new file mode 100644
index 0000000..21f876f
--- /dev/null
+++ b/packages/apps/lynq-media-test/src/makefile
@@ -0,0 +1,67 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+ -g -Os \
+ -flto \
+ -DRIL_SHLIB \
+ -DATCI_PARSE \
+ -DKEEP_ALIVE \
+ -D__LINUX_OS__ \
+ -DECALL_SUPPORT
+
+CXXFLAGS = -fpermissive
+LOCAL_PATH = .
+#CFLAGS = $(LOCAL_CFLAGS) -std=c99
+#CXXFLAGS = $(LOCAL_CFLAGS) -std=gnu++14
+$(warning ################# ZHOUQUNCHAO ROOT: $(ROOT),includedir:$(includedir),LOCAL_PATH:$(LOCAL_PATH))
+LOCAL_C_INCLUDES = \
+ -I. \
+ -I$(LOCAL_PATH) \
+ -I$(ROOT)$(includedir)/logger \
+ -I$(ROOT)$(includedir)/vendor-ril \
+ -I$(ROOT)$(includedir)/liblynq-dev \
+ -I$(ROOT)$(includedir)/liblynq-media \
+ -I$(ROOT)$(includedir)/glib-2.0 \
+ -I$(ROOT)$(libdir)/glib-2.0/include \
+ -I$(ROOT)$(includedir)/dbus-1.0 \
+ -I$(ROOT)$(libdir)/dbus-1.0/include \
+
+LOCAL_C_INCLUDES+=$(DNS_FLAGS)
+
+LOCAL_LIBS := \
+ -L. \
+ -ldl \
+ -lstdc++ \
+ -llog \
+ -lcutils \
+ -lutils \
+ -lpthread \
+ -llynq-dev \
+ -llynq-media \
+ -lpal \
+ -lglib-2.0 \
+ -lgobject-2.0 \
+ -lgio-2.0 \
+ -lapn \
+ -ldbus-1 \
+
+LOCAL_SRC_FILES_CPP = $(wildcard *.cpp)
+LOCAL_SRC_FILES_C = $(wildcard *.c)
+EXECUTABLE = lynq-media-test
+
+OBJECTS=$(LOCAL_SRC_FILES_CPP:.cpp=.o) $(LOCAL_SRC_FILES_C:.c=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+ $(CXX) $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o: %.c
+ $(warning ----->build $<)
+ $(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+%.o : %.cpp
+ $(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+ $(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/packages/apps/lynq-tcpcli/LICENSE b/packages/apps/lynq-tcpcli/LICENSE
new file mode 100644
index 0000000..77f59ed
--- /dev/null
+++ b/packages/apps/lynq-tcpcli/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/packages/apps/lynq-tcpcli/lynq_tcpcli.c b/packages/apps/lynq-tcpcli/lynq_tcpcli.c
new file mode 100644
index 0000000..b131b76
--- /dev/null
+++ b/packages/apps/lynq-tcpcli/lynq_tcpcli.c
@@ -0,0 +1,66 @@
+#include <stdio.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <strings.h>
+#include<stdlib.h>
+#include "liblog/liblog.h"
+#include "liblog/lynq_deflog.h"
+
+#define USER_LOG_TAG "TCPCLI"
+#define SA struct sockaddr
+#define BUF_LEN 128
+#define ERR_CMDVALID 2
+#define ERR_SOCK 3
+
+int main(int argc, const char *argv[])
+{
+ int sockfd;
+ char buf[BUF_LEN];
+ int ret_con;
+
+ LYLOGEINIT(USER_LOG_TAG);
+ if(argc<3)
+ {
+ LYDBGLOG("arg is wrong, please input ip and port\n");
+ LYVERBLOG("+[tcpcli]: error num = %d\n", ERR_CMDVALID);
+ return ERR_CMDVALID;
+ }
+
+ sockfd=socket(AF_INET,SOCK_STREAM,0);
+
+ if(sockfd<0)
+ {
+ LYDBGLOG("fail to socket\n");
+ return ERR_SOCK;
+ }
+ struct sockaddr_in seraddr;
+ seraddr.sin_family=AF_INET;
+ seraddr.sin_port=htons(atoi(argv[2]));
+ seraddr.sin_addr.s_addr=inet_addr(argv[1]);
+
+
+ while(1)
+ {
+ ret_con=connect(sockfd,(SA *)&seraddr,sizeof(seraddr));
+ if(ret_con<0)
+ {
+ LYDBGLOG("fail to connect\n");
+ return ERR_SOCK;
+ }
+ while(1)
+ {
+ bzero(buf,sizeof(buf));
+ fgets(buf,sizeof(buf),stdin);
+
+ send(sockfd,buf,sizeof(buf),0);
+
+ bzero(buf,sizeof(buf));
+ recv(sockfd,buf,sizeof(buf),0);
+
+ LYVERBLOG("+[tcpcli]: cli_rcv = %s\n",buf);
+ }
+ }
+
+ return 0;
+}
diff --git a/packages/apps/lynq-tcpcli/makefile b/packages/apps/lynq-tcpcli/makefile
new file mode 100644
index 0000000..5719a8a
--- /dev/null
+++ b/packages/apps/lynq-tcpcli/makefile
@@ -0,0 +1,51 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+ -g -Os \
+ -flto \
+ -fpermissive \
+ -fPIC \
+
+
+
+
+LOCAL_PATH = .
+
+LOCAL_C_INCLUDES = \
+ -I. \
+ -I$(ROOT)$(includedir)/logger \
+ -I$(ROOT)$(includedir)/liblog \
+ -I$(ROOT)$(includedir)/glib-2.0 \
+ -I$(ROOT)$(libdir)/glib-2.0/include \
+ -I$(ROOT)$(includedir)/dbus-1.0 \
+ -I$(ROOT)$(libdir)/dbus-1.0/include \
+
+
+LOCAL_LIBS := \
+ -L. \
+ -ldl \
+ -lpthread \
+ -llog-ril \
+ -lssl \
+ -lglib-2.0 \
+ -lgobject-2.0 \
+ -lgio-2.0 \
+ -ldbus-1 \
+
+SOURCES = $(wildcard *.c)
+
+EXECUTABLE = lynq-tcpcli
+
+OBJECTS=$(SOURCES:.c=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+ $(CXX) -shared -Wl,--no-undefined $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o : %.c
+ $(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+ $(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/packages/apps/lynq-tcpser/LICENSE b/packages/apps/lynq-tcpser/LICENSE
new file mode 100644
index 0000000..77f59ed
--- /dev/null
+++ b/packages/apps/lynq-tcpser/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/packages/apps/lynq-tcpser/lynq_tcpser.c b/packages/apps/lynq-tcpser/lynq_tcpser.c
new file mode 100644
index 0000000..fb97a16
--- /dev/null
+++ b/packages/apps/lynq-tcpser/lynq_tcpser.c
@@ -0,0 +1,80 @@
+#include <stdio.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <strings.h>
+#include <unistd.h>
+#include "liblog/liblog.h"
+#include "liblog/lynq_deflog.h"
+
+#define USER_LOG_TAG "TCPSER"
+#define SA struct sockaddr
+#define BUF_LEN 128
+#define ERR_SOCK 3
+
+int main(int argc, const char *argv[])
+{
+ int sockfd,confd;
+ char buf[BUF_LEN];
+ int ret_recv;
+ int ret_bind;
+
+ LYLOGEINIT(USER_LOG_TAG);
+ sockfd=socket(AF_INET,SOCK_STREAM,0);
+
+ if(sockfd<0)
+ {
+ LYDBGLOG("fail to socket\n");
+ return ERR_SOCK;
+ }
+ struct sockaddr_in seraddr;
+ seraddr.sin_family=AF_INET;
+ seraddr.sin_port=htons(50000);
+ seraddr.sin_addr.s_addr=inet_addr("0.0.0.0");
+
+ ret_bind=bind(sockfd,(SA *)&seraddr,sizeof(seraddr));
+ if(ret_bind<0)
+ {
+ LYDBGLOG("fail to bind\n");
+ return ERR_SOCK;
+ }
+
+ listen(sockfd,5);
+
+ while(1)
+ {
+ confd=accept(sockfd,NULL,NULL);
+ //printf("confd =%d\n",confd);
+ if(confd<0)
+ {
+ LYDBGLOG("fail to accept\n");
+ return ERR_SOCK;
+ }
+
+ while(1)
+ {
+ bzero(buf,sizeof(buf));
+
+ ret_recv=recv(confd,buf,sizeof(buf),0);
+
+ if(ret_recv<0)
+ {
+ LYDBGLOG("fail to recv\n");
+ return ERR_SOCK;
+ }
+ if(ret_recv==0)
+ {
+ close(confd);
+ LYDBGLOG("closed,confd =%d\n",confd);
+ break;
+ }
+
+ LYVERBLOG("+[tcpser]: ser_rcv = %s\n",buf);
+ send(confd,buf,sizeof(buf),0);
+ }
+
+ }
+
+
+ return 0;
+}
diff --git a/packages/apps/lynq-tcpser/makefile b/packages/apps/lynq-tcpser/makefile
new file mode 100644
index 0000000..4fdc5ce
--- /dev/null
+++ b/packages/apps/lynq-tcpser/makefile
@@ -0,0 +1,50 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+ -g -Os \
+ -flto \
+ -fpermissive \
+ -fPIC \
+
+
+
+LOCAL_PATH = .
+
+LOCAL_C_INCLUDES = \
+ -I. \
+ -I$(ROOT)$(includedir)/logger \
+ -I$(ROOT)$(includedir)/liblog \
+ -I$(ROOT)$(includedir)/glib-2.0 \
+ -I$(ROOT)$(libdir)/glib-2.0/include \
+ -I$(ROOT)$(includedir)/dbus-1.0 \
+ -I$(ROOT)$(libdir)/dbus-1.0/include \
+
+
+LOCAL_LIBS := \
+ -L. \
+ -ldl \
+ -lpthread \
+ -llog-ril \
+ -lssl \
+ -lglib-2.0 \
+ -lgobject-2.0 \
+ -lgio-2.0 \
+ -ldbus-1 \
+
+SOURCES = $(wildcard *.c)
+
+EXECUTABLE = lynq-tcpser
+
+OBJECTS=$(SOURCES:.c=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+ $(CXX) -shared -Wl,--no-undefined $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o : %.c
+ $(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+ $(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/packages/apps/lynq-threadhandle/LICENSE b/packages/apps/lynq-threadhandle/LICENSE
new file mode 100644
index 0000000..77f59ed
--- /dev/null
+++ b/packages/apps/lynq-threadhandle/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/packages/apps/lynq-threadhandle/include/common.h b/packages/apps/lynq-threadhandle/include/common.h
new file mode 100644
index 0000000..02fcdeb
--- /dev/null
+++ b/packages/apps/lynq-threadhandle/include/common.h
@@ -0,0 +1,19 @@
+#ifndef _COMMON_H_
+#define _COMMON_H_
+
+
+#define NO_ERROR 0
+#define ERR_VALID 70 //valid error
+#define ERR_CMDVALID 71 //cmd error
+#define ERR_SESSIONVALID 72 //session error
+#define ERR_MALLOCVALID 73 //malloc error
+#define ERR_INVOKE 74 //invoke error
+#define ERR_SYSTEM 75 //system error
+#define ERR_TIMEOUT 76 //time out error
+
+#define BUF_SIZE 8192
+//int th_error;
+
+int str_arr(char *str, char *substr, char parts[][BUF_SIZE]);
+#endif
+
diff --git a/packages/apps/lynq-threadhandle/include/double_list.h b/packages/apps/lynq-threadhandle/include/double_list.h
new file mode 100644
index 0000000..b8682c0
--- /dev/null
+++ b/packages/apps/lynq-threadhandle/include/double_list.h
@@ -0,0 +1,49 @@
+#ifndef __DOUBLE_LIST__H__
+#define __DOUBLE_LIST__H__
+
+
+#include "syn_primitive.h"
+
+
+typedef struct tag_d_list
+{
+ void *data;
+ unsigned int data_len;
+ struct tag_d_list *pre;
+ struct tag_d_list *next;
+}d_list_node_t;
+
+
+typedef struct
+{
+ unsigned int node_count;
+ d_list_node_t *head;
+ d_list_node_t *tail;
+
+ d_list_node_t *cur_idx;
+}d_list_t;
+
+
+typedef int (*compare_func)(void *usr_data, unsigned int udata_len, void *list_data, unsigned int ldata_len);
+
+BOOL is_empty_d_list(d_list_t *list);
+unsigned int get_d_list_node_count(d_list_t *list);
+d_list_t *create_d_list(void);
+void destroy_d_list(d_list_t *list);
+BOOL insert_d_list_head(d_list_t *list, void *data, unsigned int data_len);
+BOOL insert_d_list_tail(d_list_t *list, void *data, unsigned int data_len);
+BOOL insert_d_list_head_node(d_list_t *list, d_list_node_t *node);
+BOOL insert_d_list_tail_node(d_list_t *list, d_list_node_t *node);
+BOOL delete_d_list_head(d_list_t *list);
+BOOL delete_d_list_tail(d_list_t *list);
+BOOL delete_d_list_node_all(d_list_t *list);
+BOOL remove_d_list_node(d_list_t *list, d_list_node_t *node);
+d_list_node_t *remove_d_list_head_node(d_list_t *list);
+d_list_node_t *remove_d_list_tail_node(d_list_t *list);
+d_list_node_t *find_d_list_node(d_list_t *list, void *user_data, unsigned int data_len, compare_func func);
+d_list_node_t *get_d_list_node(d_list_t *list, int idx);
+d_list_node_t *get_next_node(d_list_t *list);
+
+#endif //__DOUBLE_LIST__H__
+
+
diff --git a/packages/apps/lynq-threadhandle/include/ftp_manager.h b/packages/apps/lynq-threadhandle/include/ftp_manager.h
new file mode 100644
index 0000000..bb833ab
--- /dev/null
+++ b/packages/apps/lynq-threadhandle/include/ftp_manager.h
@@ -0,0 +1,29 @@
+#ifndef _FTP_MANAGER_H
+#define _FTP_MANAGER_H
+
+#include "thread_pool.h"
+#include "list.h"
+#include "ftp/lynq_ftp.h"
+#include "common.h"
+
+typedef struct
+{
+ int id;
+ char *action;
+ int (*ftp_action)(lynq_ftp_socker_info* FTP);
+}FTP_MAG_S;
+
+
+typedef struct FTP_LIST_LINK
+{
+ struct list_head list;
+ lynq_ftp_socker_info data;
+}FTP_LIST_LINK_S;
+
+
+void ftp_list_init(void);
+int ftp_list_locate(void);
+int ftp_param_verification(char result[][BUF_SIZE] , int line);
+int ftp_act_handler(thread_pool_t *pool);
+
+#endif
\ No newline at end of file
diff --git a/packages/apps/lynq-threadhandle/include/http_manager.h b/packages/apps/lynq-threadhandle/include/http_manager.h
new file mode 100644
index 0000000..21f5e70
--- /dev/null
+++ b/packages/apps/lynq-threadhandle/include/http_manager.h
@@ -0,0 +1,26 @@
+#ifndef _HTTP_MANAGER_H
+#define _HTTP_MANAGER_H
+
+
+#include "http/lynq_http.h"
+#include "thread_pool.h"
+#include "list.h"
+#include "common.h"
+
+
+
+typedef struct
+{
+ struct list_head list;
+ lynq_http_client_t data;
+}HTTP_LIST_LINK_S;
+
+void http_list_init(void);
+int http_list_locate(void);
+int http_param_verification(char result[][BUF_SIZE], int line);
+int http_act_handler(thread_pool_t *pool);
+
+
+
+#endif
+
diff --git a/packages/apps/lynq-threadhandle/include/list.h b/packages/apps/lynq-threadhandle/include/list.h
new file mode 100644
index 0000000..697ff6f
--- /dev/null
+++ b/packages/apps/lynq-threadhandle/include/list.h
@@ -0,0 +1,122 @@
+#ifndef _LINUX_LIST_H
+#define _LINUX_LIST_H
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+
+#ifndef offsetof
+#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
+#endif
+
+#ifndef container_of
+#define container_of(ptr, type, member) ((type *)((char *)ptr - offsetof(type,member)))
+#endif
+
+#define prefetch(x) ((void)x)
+#define LIST_POISON1 (NULL)
+#define LIST_POISON2 (NULL)
+
+struct list_head{
+ struct list_head *next, *prev;
+};
+
+struct hlist_node{
+ struct hlist_node *next, **pprev;
+};
+
+struct hlist_head{
+ struct hlist_node *first;
+};
+
+#define LIST_HEAD_INIT(name) { &(name), &(name) }
+
+#define LIST_HEAD(name) \
+ struct list_head name = LIST_HEAD_INIT(name)
+
+static void INIT_LIST_HEAD(struct list_head *list)
+{
+ list->next = list;
+ list->prev = list;
+}
+
+
+static void __list_add(struct list_head *node,
+ struct list_head *prev,
+ struct list_head *next)
+{
+ next->prev = node;
+ node->next = next;
+ node->prev = prev;
+ prev->next = node;
+}
+
+static void list_add(struct list_head *node, struct list_head *head)
+{
+ __list_add(node, head, head->next);
+}
+
+
+static void list_add_tail(struct list_head *node, struct list_head *head)
+{
+ __list_add(node, head->prev, head);
+}
+
+/*
+ * Delete a list entry by making the prev/next entries
+ * point to each other.
+ *
+ * This is only for internal list manipulation where we know
+ * the prev/next entries already!
+ */
+static void __list_del(struct list_head * prev, struct list_head * next)
+{
+ next->prev = prev;
+ prev->next = next;
+}
+
+/**
+ * list_del - deletes entry from list.
+ * @entry: the element to delete from the list.
+ * Note: list_empty() on entry does not return true after this, the entry is
+ * in an undefined state.
+ */
+static void __list_del_entry(struct list_head *entry)
+{
+ __list_del(entry->prev, entry->next);
+}
+
+static void list_del(struct list_head *entry)
+{
+ __list_del(entry->prev, entry->next);
+ entry->next = LIST_POISON1;
+ entry->prev = LIST_POISON2;
+}
+
+/**
+ * list_entry - get the struct for this entry
+ * @ptr: the &struct list_head pointer.
+ * @type: the type of the struct this is embedded in.
+ * @member: the name of the list_struct within the struct.
+ */
+#define list_entry(ptr, type, member) \
+ container_of(ptr, type, member)
+
+
+/**
+ * list_for_each - iterate over a list
+ * @pos: the &struct list_head to use as a loop cursor.
+ * @head: the head for your list.
+ */
+#define list_for_each(pos, head) \
+ for (pos = (head)->next; prefetch(pos->next), pos != (head); \
+ pos = pos->next)
+
+#define list_safe_reset_next(pos, n, member) \
+ n = list_entry(pos->member.next, typeof(*pos), member)
+
+#define hlist_entry(ptr, type, member) container_of(ptr,type,member)
+
+#endif
+
diff --git a/packages/apps/lynq-threadhandle/include/model_manager.h b/packages/apps/lynq-threadhandle/include/model_manager.h
new file mode 100644
index 0000000..78fb3c7
--- /dev/null
+++ b/packages/apps/lynq-threadhandle/include/model_manager.h
@@ -0,0 +1,31 @@
+#ifndef _MODEL_MANAGER_H
+#define _MODEL_MANAGER_H
+
+#include "http_manager.h"
+#include "ftp_manager.h"
+#include "list.h"
+#include "thread_pool.h"
+#include <log/log.h>
+#include "ril_manager.h"
+#include "mqtt_manager.h"
+#include "common.h"
+
+typedef struct
+{
+ char *name;
+ void (*func_list_init)(void);
+ int (*func_param_verification)(char result[][BUF_SIZE], int line);
+ int (*func_list_locate)(void);
+ int (*func_act_handler)(thread_pool_t *pool);
+ int (*func_del)(void);
+ int (*func_get)(void);
+ int (*func_set)(void);
+ int (*func_next)(void);
+}MAG_LIST_S;
+
+
+MAG_LIST_S *list_manager_proc(const char *name);
+
+
+#endif
+
diff --git a/packages/apps/lynq-threadhandle/include/mqtt_manager.h b/packages/apps/lynq-threadhandle/include/mqtt_manager.h
new file mode 100644
index 0000000..5f8cbee
--- /dev/null
+++ b/packages/apps/lynq-threadhandle/include/mqtt_manager.h
@@ -0,0 +1,25 @@
+#ifndef _MQTT_MANAGER_H
+#define _MQTT_MANAGER_H
+
+#include "lynq_mqtt/lynq_mqtt.h"
+#include "thread_pool.h"
+#include "list.h"
+#include "common.h"
+
+
+
+typedef struct
+{
+ struct list_head list;
+ struct mqtt_set_parament data;
+}MQTT_LIST_LINK_S;
+
+
+void mqtt_list_init();
+int mqtt_param_verification(char result[][BUF_SIZE] , int line);
+int mqtt_list_locate();
+int mqtt_act_handler(thread_pool_t *pool);
+
+
+#endif
+
diff --git a/packages/apps/lynq-threadhandle/include/ril_manager.h b/packages/apps/lynq-threadhandle/include/ril_manager.h
new file mode 100644
index 0000000..c491cda
--- /dev/null
+++ b/packages/apps/lynq-threadhandle/include/ril_manager.h
@@ -0,0 +1,7 @@
+#include "model_manager.h"
+#include "common.h"
+
+void ril_list_init();
+int ril_param_verification(char result[][BUF_SIZE] , int line);
+int ril_list_locate();
+int ril_act_handler(thread_pool_t *pool);
diff --git a/packages/apps/lynq-threadhandle/include/seq_queue.h b/packages/apps/lynq-threadhandle/include/seq_queue.h
new file mode 100644
index 0000000..2aed03e
--- /dev/null
+++ b/packages/apps/lynq-threadhandle/include/seq_queue.h
@@ -0,0 +1,43 @@
+#ifndef __SEQ_QUEUE__H_
+#define __SEQ_QUEUE__H_
+
+#include "syn_primitive.h"
+
+
+#ifndef in
+#define in
+#define out
+#endif
+
+#define EXPAND_BLOCK_NUM 100
+
+typedef struct
+{
+ BOOL expandabilit;
+ unsigned int expand_blocks;
+
+ unsigned int block_size;
+ unsigned int total_block;
+
+ unsigned int current_block;
+ unsigned int tail_block;
+ unsigned int used_block;
+
+ void *block_buffer;
+
+ //mutex_handle task_queue_lock;
+ sem_handle task_queue_lock;
+
+}seq_queue_t;
+
+
+seq_queue_t *create_seq_queue(in unsigned int block_size, in unsigned int total_block, in BOOL expand);
+void destroy_seq_queue(in seq_queue_t *queue);
+BOOL en_seq_queue(in seq_queue_t *queue, in void *data);
+BOOL de_seq_queue(in seq_queue_t *queue, out void *data);
+unsigned int get_count_seq_queue(in seq_queue_t *queue);
+unsigned int get_total_seq_queue(in seq_queue_t *queue);
+
+
+#endif //__SEQ_QUEUE__H_
+
diff --git a/packages/apps/lynq-threadhandle/include/syn_primitive.h b/packages/apps/lynq-threadhandle/include/syn_primitive.h
new file mode 100644
index 0000000..77dc2d5
--- /dev/null
+++ b/packages/apps/lynq-threadhandle/include/syn_primitive.h
@@ -0,0 +1,43 @@
+#ifndef __SYN_PRIMITIVE__H_
+#define __SYN_PRIMITIVE__H_
+
+#include <pthread.h>
+#include <semaphore.h>
+#include "typedefs.h"
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "liblog/liblog.h"
+#include "liblog/lynq_deflog.h"
+
+typedef pthread_t thread_id;
+typedef pthread_t thread_handle;
+typedef pthread_cond_t condition_handle;
+typedef pthread_mutex_t mutex_handle;
+typedef sem_t sem_handle;
+
+
+
+#define TIME_WAIT_INFINITE 0x7fffffff
+
+
+
+int init_condition_handle(condition_handle *cond);
+int destroy_condition_handle(condition_handle *cond);
+//int wait_condition(condition_handle *cond, mutex_handle *mutex);
+int wait_condition(condition_handle *cond, mutex_handle *mutex, unsigned int wait);
+int post_condition_signal(condition_handle *cond);
+int init_mutex_handle(mutex_handle *mutex);
+int mutex_lock(mutex_handle *mutex);
+int mutex_unlock(mutex_handle *mutex);
+int mutex_destroy(mutex_handle *mutex);
+int create_sem(sem_handle *sem, int init_count);
+int wait_sem(sem_handle *sem);
+int post_sem(sem_handle *sem);
+int destroy_sem(sem_handle *sem);
+
+
+
+#endif //__SYN_PRIMITIVE__H_
+
+
diff --git a/packages/apps/lynq-threadhandle/include/thread_pool.h b/packages/apps/lynq-threadhandle/include/thread_pool.h
new file mode 100644
index 0000000..cc2cd29
--- /dev/null
+++ b/packages/apps/lynq-threadhandle/include/thread_pool.h
@@ -0,0 +1,83 @@
+#ifndef __THREAD_POOL__H_
+#define __THREAD_POOL__H_
+
+#include "syn_primitive.h"
+#include "double_list.h"
+#include "seq_queue.h"
+
+typedef enum {EThread_pool_unknown, EThread_pool_alloc, EThread_pool_init
+, EThread_pool_run, EThread_pool_exit, EThread_pool_MAX}EThread_pool_status;
+
+
+#define RELEASE_THREAD_INTERVAL 5*60
+
+
+typedef void (*THREAD_FUNC)(void *);
+typedef void (*USER_FUNC)(void *thread_para);
+
+
+typedef struct {
+ USER_FUNC timeout_callback;
+ unsigned long time_out;
+}time_out_t;
+
+typedef struct
+{
+ USER_FUNC process_func;
+ USER_FUNC release_func;
+ void *args;
+ time_out_t time_out_info;
+}thread_func_t;
+
+typedef struct
+{
+ thread_func_t thread_para;
+ unsigned int pri;
+
+ BOOL busy;
+ BOOL release;
+
+ unsigned long launch_time;
+ unsigned long time_out;
+
+ EThread_pool_status *pool_status;
+
+ thread_handle h_thread;
+ condition_handle thread_cond;
+ mutex_handle thread_lock;
+
+}thread_info_t;
+
+typedef struct
+{
+ unsigned int pri;
+ unsigned int min_thread_num;
+ unsigned int max_thread_num;
+
+ unsigned int pool_thread_num;
+
+ condition_handle manage_cond;
+ mutex_handle mange_lock;
+
+ unsigned long release_threads_interval;
+
+ d_list_t *idle_threads;
+ d_list_t *busy_threads;
+ seq_queue_t *task_queue;
+
+ sem_handle sem_inc;
+ thread_handle h_id;
+
+ EThread_pool_status status;
+}thread_pool_t;
+
+
+thread_pool_t *threadpool_create(unsigned int min_thread_num, unsigned int max_thread_num);
+void threadpool_destroy(thread_pool_t *pool);
+BOOL threadpool_add(thread_pool_t *pool, USER_FUNC process_func, void *args);
+BOOL threadpool_add_timeout(thread_pool_t *pool, USER_FUNC process_func
+ , USER_FUNC release_func, void *args, time_out_t *time_out);
+void tp_sleep(unsigned int ms);
+
+#endif //__THREAD_POOL__H_
+
diff --git a/packages/apps/lynq-threadhandle/include/typedefs.h b/packages/apps/lynq-threadhandle/include/typedefs.h
new file mode 100644
index 0000000..d205b1c
--- /dev/null
+++ b/packages/apps/lynq-threadhandle/include/typedefs.h
@@ -0,0 +1,21 @@
+#ifndef __TYPE_DEFS__H_
+#define __TYPE_DEFS__H_
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+#ifndef BOOL
+#define BOOL unsigned char
+#endif
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+
+#endif //__TYPE_DEFS__H_
diff --git a/packages/apps/lynq-threadhandle/makefile b/packages/apps/lynq-threadhandle/makefile
new file mode 100644
index 0000000..281cea7
--- /dev/null
+++ b/packages/apps/lynq-threadhandle/makefile
@@ -0,0 +1,61 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+ -std=gnu++14 \
+ -g -Os \
+ -flto \
+ -fpermissive \
+ -fPIC \
+
+
+
+
+LOCAL_PATH = .
+
+LOCAL_C_INCLUDES = \
+ -I. \
+ -I$(ROOT)$(includedir)/logger \
+ -I$(ROOT)$(includedir)/vendor-ril \
+ -I$(LOCAL_PATH)/include \
+ -I$(ROOT)$(includedir)/liblog \
+ -I$(ROOT)$(includedir)/glib-2.0 \
+ -I$(ROOT)$(libdir)/glib-2.0/include \
+ -I$(ROOT)$(includedir)/dbus-1.0 \
+ -I$(ROOT)$(libdir)/dbus-1.0/include \
+ -I$(ROOT)$(includedir)/ftp \
+ -I$(ROOT)$(includedir)/http \
+ -I$(ROOT)$(includedir)/lynq_mqtt \
+ -I$(ROOT)$(includedir)/liblynq-broadcast \
+
+
+LOCAL_LIBS := \
+ -L. \
+ -ldl \
+ -lpthread \
+ -llynq-log \
+ -lssl \
+ -lglib-2.0 \
+ -lgobject-2.0 \
+ -lgio-2.0 \
+ -ldbus-1 \
+ -llynq-protcl \
+ -llog \
+ -llynq-broadcast \
+
+SOURCES = $(wildcard *.c src/*.c)
+
+EXECUTABLE = lynq-threadhandle
+
+OBJECTS=$(SOURCES:.c=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+ $(CXX) $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o : %.c
+ $(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+ $(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/packages/apps/lynq-threadhandle/src/common.c b/packages/apps/lynq-threadhandle/src/common.c
new file mode 100644
index 0000000..e8a5968
--- /dev/null
+++ b/packages/apps/lynq-threadhandle/src/common.c
@@ -0,0 +1,65 @@
+#include <stdio.h>
+#include <malloc.h>
+#include <string.h>
+#include "common.h"
+#include "liblog/lynq_deflog.h"
+
+int str_arr(char *str, char *substr, char parts[][BUF_SIZE])
+{
+ char *p = NULL;
+ char *q = NULL;
+ char tmp[BUF_SIZE] = "";
+ char end[BUF_SIZE] = "";
+ char *start = strdup(str);
+ int i = 0, j = 0, k = 0, par_num=0;
+
+
+ while(*str != '\0')
+ {
+ p = str;
+ q = substr;
+ tmp[i] = *str;
+ i++;
+
+ while((*p == *q) && (*p != '\0') && (*q != '\0'))
+ {
+ p++;
+ q++;
+ }
+ if(*q == '\0')
+ {
+ memset(end, 0, sizeof(end));
+ strcpy(end, p);
+
+ memset(parts[j], 0, sizeof(parts[j]));
+
+ j == 0 ? memcpy(parts[j], tmp, strlen(tmp)-1) : memcpy(parts[j], tmp+1, strlen(tmp)-2) ;
+
+ j++;
+ memset(tmp, 0, sizeof(tmp));
+ i = 0;
+ par_num++;
+ }
+
+ str++;
+ }
+
+
+ if (!par_num) {
+ LYDBGLOG("[%s-%d] cmd is error!!!\n", __FUNCTION__, __LINE__);
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_CMDVALID);
+ return ERR_CMDVALID;
+ }
+
+
+ if (strcmp(end, "") != 0) {
+ memset(parts[j], 0, sizeof(parts[j]));
+ memcpy(parts[j], tmp+1, strlen(tmp)-2);
+ }
+
+ for (i = 0 ; i < par_num + 1 ; i++)
+ memcpy(parts[i], strchr(parts[i],'"')+1,strlen(parts[i]));
+
+ return par_num;
+}
+
diff --git a/packages/apps/lynq-threadhandle/src/double_list.c b/packages/apps/lynq-threadhandle/src/double_list.c
new file mode 100644
index 0000000..030e677
--- /dev/null
+++ b/packages/apps/lynq-threadhandle/src/double_list.c
@@ -0,0 +1,378 @@
+#include "double_list.h"
+
+
+BOOL is_empty_d_list(d_list_t *list) {
+ BOOL ret = FALSE;
+ if (list == NULL)
+ return FALSE;
+
+ if (list->node_count == 0 && list->head == NULL && list->tail == NULL)
+ ret = TRUE;
+
+ return ret;
+}
+
+
+unsigned int get_d_list_node_count(d_list_t *list) {
+ return list->node_count;
+}
+
+
+d_list_t *create_d_list(void) {
+ d_list_t *temp_list = (d_list_t *)malloc(sizeof(d_list_t));
+ if (temp_list) {
+ memset(temp_list, 0, sizeof(d_list_t));
+ }
+
+ return temp_list;
+}
+
+
+d_list_node_t *create_d_list_node(void *data, unsigned int data_len) {
+
+ d_list_node_t *temp_node = (d_list_node_t *)malloc(sizeof(d_list_node_t));
+ if (temp_node) {
+
+ memset(temp_node, 0, sizeof(d_list_node_t));
+ temp_node->data = data;
+ temp_node->data_len = data_len;
+ }
+
+ return temp_node;
+}
+
+
+d_list_node_t *insert_d_list_node_head_n(d_list_node_t *head, d_list_node_t *node) {
+
+ if (head && node) {
+ node->pre = head->pre;
+ node->next = head;
+
+ head->pre = node;
+ }
+
+ return node;
+}
+
+
+d_list_node_t *insert_d_list_node_tail_n(d_list_node_t *tail, d_list_node_t *node) {
+
+ if (tail && node) {
+
+ tail->next = node;
+ node->pre = tail;
+ node->next = NULL;
+ }
+
+ return node;
+}
+
+
+d_list_node_t *insert_d_list_node_head(d_list_node_t *head, void *data, unsigned int data_len) {
+
+ d_list_node_t *temp_node = create_d_list_node(data, data_len);
+
+ return insert_d_list_node_head_n(head, temp_node);
+}
+
+d_list_node_t *insert_d_list_node_tail(d_list_node_t *tail, void *data, unsigned int data_len) {
+
+ d_list_node_t *temp_node = create_d_list_node(data, data_len);
+
+ return insert_d_list_node_tail_n(tail, temp_node);
+}
+
+
+BOOL insert_d_list_head(d_list_t *list, void *data, unsigned int data_len) {
+
+ if (list) {
+
+ if (list->node_count == 0) {
+ list->head = insert_d_list_node_head(list->head, data, data_len);
+ list->tail = list->head;
+ } else {
+ list->head = insert_d_list_node_head(list->head, data, data_len);
+ }
+
+ list->node_count++;
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
+BOOL insert_d_list_head_node(d_list_t *list, d_list_node_t *node) {
+
+ if (list) {
+
+ node->next = NULL;
+ node->pre = NULL;
+ if (list->node_count == 0) {
+ list->head = insert_d_list_node_head_n(list->head, node);
+ list->tail = list->head;
+ } else {
+ list->head = insert_d_list_node_head_n(list->head, node);
+ }
+
+ list->node_count++;
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
+BOOL insert_d_list_tail(d_list_t *list, void *data, unsigned int data_len) {
+
+ if (list && data) {
+
+ if (list->node_count == 0) {
+ list->tail = insert_d_list_node_tail(list->tail, data, data_len);
+ list->head = list->tail;
+ } else {
+ list->tail = insert_d_list_node_tail(list->tail, data, data_len);
+ }
+
+ list->node_count++;
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
+BOOL insert_d_list_tail_node(d_list_t *list, d_list_node_t *node) {
+
+ BOOL ret = FALSE;
+ if (list) {
+
+ node->next = NULL;
+ node->pre = NULL;
+ if (list->node_count == 0) {
+ list->tail = insert_d_list_node_tail_n(list->tail, node);
+ list->head = list->tail;
+ } else {
+ list->tail = insert_d_list_node_tail_n(list->tail, node);
+ }
+ list->node_count++;
+ ret = TRUE;
+ }
+
+ return ret;
+}
+
+
+BOOL delete_d_list_head(d_list_t *list) {
+
+ BOOL ret = FALSE;
+ if (list == NULL)
+ return FALSE;
+
+ if (list->node_count > 0) {
+ d_list_node_t *temp_node = list->head;
+
+ list->head = list->head->next;
+ list->node_count--;
+ if (list->node_count == 0 && list->head == NULL) {
+ list->tail = NULL;
+ } else {
+ list->head->pre = NULL;
+ }
+
+ free(temp_node);
+ ret = TRUE;
+ }
+
+
+ return ret;
+}
+
+
+BOOL delete_d_list_tail(d_list_t *list) {
+
+ BOOL ret = FALSE;
+ if (list == NULL)
+ return FALSE;
+
+ if (list->node_count > 0) {
+ d_list_node_t *temp_node = list->tail;
+
+ list->tail = list->tail->pre;
+ list->node_count--;
+ if (list->node_count == 0 && list->tail == NULL) {
+ list->head = NULL;
+ } else {
+ list->tail->next = NULL;
+ }
+
+ free(temp_node);
+ ret = TRUE;
+ }
+
+ return ret;
+}
+
+
+BOOL remove_d_list_node(d_list_t *list, d_list_node_t *node) {
+
+ if (node == NULL || list == NULL || list->node_count == 0)
+ return FALSE;
+
+ if (list->head == node) {
+ list->head = node->next;
+ if (list->head != NULL) {
+ node->next->pre = NULL;
+ } else {
+ list->tail = NULL;
+ }
+ } else {
+ node->pre->next = node->next;
+ if (node->next == NULL) {
+ list->tail = node->pre;
+ } else {
+ node->next->pre = node->pre;
+ }
+ }
+
+ node->next = NULL;
+ node->pre = NULL;
+ list->node_count--;
+
+ return TRUE;
+}
+
+
+d_list_node_t *remove_d_list_head_node(d_list_t *list) {
+
+ d_list_node_t *temp_node = NULL;
+ if (list == NULL)
+ return NULL;
+
+ if (list->head != NULL) {
+
+ temp_node = list->head;
+ list->head = list->head->next;
+ if (list->head == NULL)
+ list->tail = NULL;
+ else
+ list->head->pre = NULL;
+
+ list->node_count--;
+ }
+
+ return temp_node;
+}
+
+
+d_list_node_t *remove_d_list_tail_node(d_list_t *list) {
+
+ d_list_node_t *temp_node = NULL;
+ if (list == NULL)
+ return NULL;
+
+ if (list->tail != NULL) {
+
+ temp_node = list->tail;
+ list->tail = list->tail->pre;
+ if (list->tail == NULL)
+ list->head = NULL;
+ else
+ list->tail->next = NULL;
+
+ list->node_count--;
+ }
+
+ return temp_node;
+}
+
+
+BOOL delete_d_list_node_all(d_list_t *list) {
+
+ if (list) {
+ while (delete_d_list_head(list)) {
+
+ }
+
+ if (list->node_count == 0) {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+void destroy_d_list(d_list_t *list) {
+ if (list == NULL)
+ return;
+
+ delete_d_list_node_all(list);
+ free(list);
+}
+
+
+d_list_node_t *find_d_list_node(d_list_t *list, void *user_data, unsigned int data_len, compare_func func) {
+
+ d_list_node_t *temp_node = NULL;
+ if (list == NULL)
+ return NULL;
+
+ if (list->node_count > 0) {
+ temp_node = list->head;
+ while (temp_node)
+ {
+ if (func(user_data, data_len, temp_node->data, temp_node->data_len) == 0) {
+ break;
+ }
+
+ temp_node = temp_node->next;
+ }
+ }
+
+ return temp_node;
+}
+
+
+d_list_node_t *get_d_list_node(d_list_t *list, int idx) {
+ d_list_node_t *temp_node = NULL;
+ if (list == NULL)
+ return NULL;
+
+ if (list->node_count >= (unsigned int)abs(idx) && idx != 0) {
+
+ if (idx > 0) {
+ temp_node = list->head;
+ while (--idx)
+ {
+ temp_node = temp_node->next;
+ }
+ } else {
+ temp_node = list->tail;
+ while (++idx)
+ {
+ temp_node = temp_node->pre;
+ }
+ }
+ }
+
+ return temp_node;
+}
+
+
+d_list_node_t *get_next_node(d_list_t *list) {
+
+ d_list_node_t *temp_node;
+ if (list == NULL)
+ return NULL;
+
+ temp_node = list->cur_idx;
+ if (temp_node == NULL)
+ list->cur_idx = list->head;
+ else
+ list->cur_idx = list->cur_idx->next;
+
+ return temp_node;
+}
diff --git a/packages/apps/lynq-threadhandle/src/ftp_manager.c b/packages/apps/lynq-threadhandle/src/ftp_manager.c
new file mode 100644
index 0000000..8f453cc
--- /dev/null
+++ b/packages/apps/lynq-threadhandle/src/ftp_manager.c
@@ -0,0 +1,327 @@
+#include "ftp_manager.h"
+#include "common.h"
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+
+
+enum FTP_ID {
+ FTP_LOGIN_ID = 0,
+ FTP_GET_ID,
+ FTP_UP_ID,
+ FTP_QUIT_ID,
+ FTP_LS_ID,
+ FTP_CD_ID = 5,
+ FTP_MKDIR_ID,
+ FTP_RMD_ID,
+ FTP_DELETE_ID
+};
+
+
+
+FTP_MAG_S ftp_manager[] = {
+ {FTP_LOGIN_ID, "login", lynq_ftp_login},
+ {FTP_GET_ID, "get", lynq_ftp_download},
+ {FTP_UP_ID, "up", lynq_ftp_up},
+ {FTP_QUIT_ID, "quit", lynq_ftp_quit},
+ {FTP_LS_ID, "ls", lynq_ftp_ls},
+ {FTP_CD_ID, "cd", lynq_ftp_cd},
+ {FTP_MKDIR_ID, "mkdir", lynq_ftp_creat_mkd},
+ {FTP_RMD_ID, "rmd", lynq_ftp_delete_mkd},
+ {FTP_DELETE_ID, "delete", lynq_ftp_deletefile_mkd},
+};
+
+
+static int ftp_init = 0;
+static struct list_head lynq_ftp_list;
+static FTP_LIST_LINK_S* ftp_slider;
+static lynq_ftp_socker_info ftp_cmd = {0};
+
+FTP_MAG_S *ftp_mag_ret = NULL;
+
+
+void *ftp_handler(void * list)
+{
+ FTP_LIST_LINK_S* pos_list = (FTP_LIST_LINK_S *)list;
+ int ftp_login = 0;
+ char cmpybuf[64] = "";
+
+ while(1)
+ {
+ if (pos_list->data.modify_thread != 1 && pos_list->data.add_thread != 1)
+ continue;
+
+ //LYDBGLOG("[%s-%d] rita thread_id %lu start.\n",__FUNCTION__, __LINE__, pthread_self());
+
+ pos_list->data.add_thread = 0;
+ pos_list->data.modify_thread = 0;
+#if 0
+ LYDBGLOG("**************************ftp_handler debug************************************\n");
+ LYDBGLOG("[%s %d] ---------- > pos_list->data.session = %d\n", __FUNCTION__, __LINE__, pos_list->data.session);
+ LYDBGLOG("[%s %d] ---------- > pos_list->data.sevname = %s\n", __FUNCTION__, __LINE__, pos_list->data.sevname);
+ LYDBGLOG("[%s %d] ---------- > pos_list->data.username = %s\n", __FUNCTION__, __LINE__, pos_list->data.username);
+ LYDBGLOG("[%s %d] ---------- > pos_list->data.pw = %s\n", __FUNCTION__, __LINE__, pos_list->data.pw);
+ LYDBGLOG("[%s %d] ---------- > pos_list->data.is_pasv_mode = %s\n", __FUNCTION__, __LINE__, pos_list->data.is_pasv_mode);
+ LYDBGLOG("[%s %d] ---------- > pos_list->data.action = %s\n", __FUNCTION__, __LINE__, pos_list->data.action);
+ LYDBGLOG("[%s %d] ---------- > pos_list->data.id = %d\n", __FUNCTION__, __LINE__, pos_list->data.id);
+ LYDBGLOG("**************************debug end************************************\n");
+#endif
+ if (ftp_login == 0 && FTP_QUIT_ID != pos_list->data.id) {
+ ftp_login = lynq_ftp_login(&pos_list->data);
+ LYDBGLOG("[%s-%d] rita test for debuging ftp,ftp_login = %d\n", __FUNCTION__, __LINE__, ftp_login);
+ if(!ftp_login)//rita add @2021.7.19 for error connect,reconnect failure
+ {
+ LYDBGLOG("[%s-%d] rita test for debuging ftp,error!!!\n", __FUNCTION__, __LINE__);
+ list_del((struct list_head* )pos_list);
+ }
+ }
+ else {
+ LYDBGLOG("[%s-%d] +ftplogin: Device logged in before !!!\n", __FUNCTION__, __LINE__);
+ }
+
+ ftp_mag_ret->ftp_action(&pos_list->data);
+ }
+}
+
+
+int ftp_act_handler(thread_pool_t *pool)
+{
+ FTP_LIST_LINK_S* tmp_list = (FTP_LIST_LINK_S *)ftp_slider;
+ struct list_head* slider = NULL;
+ FTP_LIST_LINK_S* tmp = NULL;
+ if(tmp == NULL)
+ {
+ tmp = (FTP_LIST_LINK_S*)malloc(sizeof(FTP_LIST_LINK_S));
+ if(tmp == NULL)
+ {
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_MALLOCVALID);
+ return ERR_MALLOCVALID;
+ }
+ }
+ memset(tmp, 0, sizeof(FTP_LIST_LINK_S));
+ LYDBGLOG("[%s-%d] ftp_cmd.id = %d\n", __FUNCTION__, __LINE__, ftp_cmd.id);
+
+ switch(ftp_cmd.id)
+ {
+ case FTP_LOGIN_ID:
+ case FTP_GET_ID:
+ case FTP_UP_ID:
+ case FTP_QUIT_ID:
+ case FTP_LS_ID:
+ case FTP_CD_ID:
+ case FTP_MKDIR_ID:
+ case FTP_RMD_ID:
+ case FTP_DELETE_ID:
+ if (tmp_list == NULL ) {
+ LYDBGLOG("[%s-%d] first time\n", __FUNCTION__, __LINE__);
+ tmp->data = ftp_cmd;
+ tmp->data.add_thread = 1;
+ list_add_tail(&tmp->list, &lynq_ftp_list);
+
+ ftp_list_locate();
+ if (!threadpool_add(pool, ftp_handler, (void *)ftp_slider)) {
+ LYDBGLOG("add error!!!\n");
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_INVOKE);
+ return ERR_INVOKE;
+ }
+ }
+ else {
+ LYDBGLOG("[%s-%d] change ftp_cmd.file_type = %s \n",__func__, __LINE__, ftp_cmd.file_type);
+ LYDBGLOG("[%s-%d] change ftp_cmd.is_pasv_mode = %s \n",__func__, __LINE__, ftp_cmd.is_pasv_mode);
+ LYDBGLOG("[%s-%d] tmp_list->data.control_sockfd = %d \n", __FUNCTION__, __LINE__, tmp_list->data.control_sockfd);
+
+ // Save sockfd. If you don't save it, it will be overridden to 0, resulting in unable to connect
+ ftp_cmd.control_sockfd = tmp_list->data.control_sockfd;
+ tmp_list->data = ftp_cmd;
+ tmp_list->data.modify_thread = 1;
+ }
+
+ break;
+ default:
+ LYDBGLOG("[%s-%d] cmd error \n", __FUNCTION__, __LINE__);
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_CMDVALID);
+
+ if (tmp != NULL)
+ free(tmp);
+ return ERR_CMDVALID;
+ }
+
+ tmp = NULL;
+ return NO_ERROR;
+}
+
+
+FTP_MAG_S *ftp_manager_proc(const char *action)
+{
+ int type_num = sizeof(ftp_manager) / sizeof(FTP_MAG_S);
+ int i = 0;
+ for (i = 0; i < type_num; i++)
+ {
+ if (0 == strcmp(ftp_manager[i].action, action))
+ {
+ //LYDBGLOG("[%s-%d] action is ftp %s\n", __FUNCTION__, __LINE__, ftp_manager[i].action);//rita add @2021.07.19 for debug description
+ return &ftp_manager[i];
+ }
+ }
+ //LYDBGLOG("[%s-%d] error action %s\n", __FUNCTION__, __LINE__, action);
+ return NULL;
+}
+
+
+int ftp_param_verification(char result[][BUF_SIZE] , int line)
+{
+
+ for (int i = 0; i < line; i++) {
+ LYDBGLOG("[%s-%d]=======>rita,str[%d] = %s \n", __FUNCTION__, __LINE__, i, result[i]);
+ }
+
+ if (line < 3) {
+ LYDBGLOG("[%s-%d] command error\n", __FUNCTION__, __LINE__);
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_CMDVALID);
+ return ERR_CMDVALID;
+ }
+
+
+ memcpy(ftp_cmd.protocol, result[0], sizeof(ftp_cmd.protocol));//rita add @2021.07.19 for protocol type mismatch
+
+ if(!atoi(result[2])) {
+ LYDBGLOG("[%s %d] session error\n", __FUNCTION__, __LINE__);
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_SESSIONVALID);
+ return ERR_SESSIONVALID;
+ }
+ ftp_cmd.session = atoi(result[2]);
+ memcpy(ftp_cmd.action, result[1], sizeof(ftp_cmd.action));//rita add @2021.07.19 for action type mismatch
+ strcpy(ftp_cmd.sevname, result[3]);
+
+ ftp_cmd.portnum = atoi(result[4]);
+ strcpy(ftp_cmd.username, result[5]);
+ strcpy(ftp_cmd.pw, result[6]);
+
+ //LYDBGLOG("[%s-%d] sevname=%s, portnum=%d, username=%s,pw=%s \n", __FUNCTION__, __LINE__, ftp_cmd.sevname, ftp_cmd.portnum, ftp_cmd.username, ftp_cmd.pw);
+
+ ftp_mag_ret = ftp_manager_proc(ftp_cmd.action);
+
+
+ ftp_cmd.id = ftp_mag_ret->id;
+
+ LYDBGLOG("[%s-%d] ftp_cmd.id = %d\n", __FUNCTION__, __LINE__, ftp_cmd.id);
+
+ switch (ftp_mag_ret->id)
+ {
+ case FTP_LOGIN_ID:
+ if(line != 7)
+ {
+ LYDBGLOG("[%s-%d] command error\n", __FUNCTION__, __LINE__);
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_CMDVALID);
+ return ERR_CMDVALID;
+ }
+ break;
+
+ case FTP_GET_ID:
+ if(line != 12)
+ {
+ LYDBGLOG("[%s-%d] command error\n", __FUNCTION__, __LINE__);
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_CMDVALID);
+ return ERR_CMDVALID;
+ }
+ strcpy(ftp_cmd.getfilename_path, result[9]);
+ strcpy(ftp_cmd.getfilename, result[10]);
+ case FTP_UP_ID:
+ if (line != 12) {
+ LYDBGLOG("[%s-%d] command error id = %d\n", __FUNCTION__, __LINE__, ftp_mag_ret->id);
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_CMDVALID);
+ return ERR_CMDVALID;
+ }
+ strcpy(ftp_cmd.file_type, result[7]);
+ strcpy(ftp_cmd.is_pasv_mode, result[8]);
+ strcpy(ftp_cmd.put_opt , result[11]);
+
+ if (ftp_mag_ret->id == FTP_UP_ID) {
+ strcpy(ftp_cmd.putfilename_path, result[9]);
+ strcpy(ftp_cmd.putfilename, result[10]);
+ }
+ break;
+
+ case FTP_QUIT_ID:
+ if (line < 8) {
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_CMDVALID);
+ return ERR_CMDVALID;
+ }
+ break;
+
+ case FTP_LS_ID:
+ if (line !=9) {
+ LYDBGLOG("[%s-%d] command error id = %d\n", __FUNCTION__, __LINE__, ftp_mag_ret->id);
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_CMDVALID);
+ return ERR_CMDVALID;
+ }
+
+ strcpy(ftp_cmd.dir, result[8]);//rita add @2021.7.19 for ls bug
+ strcpy(ftp_cmd.is_pasv_mode, result[7]);
+ break;
+ case FTP_CD_ID:
+ case FTP_MKDIR_ID:
+ case FTP_RMD_ID:
+ case FTP_DELETE_ID:
+ if (line != 8) {
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_CMDVALID);
+ return ERR_CMDVALID;
+ }
+ strcpy(ftp_cmd.del_mkr_filename, result[7]);
+ //strcpy(ftp_cmd.is_pasv_mode, result[7]);
+ break;
+
+ default:
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_CMDVALID);
+ break;
+
+ }
+
+ return NO_ERROR;
+
+}
+
+
+int ftp_list_locate()
+{
+ struct list_head* slider = NULL;
+ ftp_slider = NULL;
+ list_for_each(slider, &lynq_ftp_list) {
+ ftp_slider = (FTP_LIST_LINK_S*)slider;
+ LYDBGLOG("[%s-%d] =============START====================== \n", __func__, __LINE__);
+ LYDBGLOG("[%s-%d] protocol : %s \n", __FUNCTION__, __LINE__, ftp_slider->data.protocol);
+ LYDBGLOG("[%s-%d] session : %d \n", __FUNCTION__, __LINE__, ftp_slider->data.session);
+ LYDBGLOG("[%s-%d] action : %s \n", __FUNCTION__, __LINE__, ftp_slider->data.action);
+ LYDBGLOG("[%s-%d] port : %d \n", __FUNCTION__, __LINE__, ftp_slider->data.portnum);
+ LYDBGLOG("[%s-%d] sevname : %s \n", __FUNCTION__, __LINE__, ftp_slider->data.sevname);
+ LYDBGLOG("[%s-%d] username : %s \n", __FUNCTION__, __LINE__, ftp_slider->data.username);
+ LYDBGLOG("[%s-%d] pw : %s \n", __FUNCTION__, __LINE__, ftp_slider->data.pw);
+ LYDBGLOG("[%s-%d] index : %d \n", __FUNCTION__, __LINE__, ftp_slider->data.index);
+ LYDBGLOG("[%s-%d] ==============END===================== \n", __func__, __LINE__);
+
+ if (!strcmp(ftp_slider->data.protocol, ftp_cmd.protocol) && ftp_slider->data.session == ftp_cmd.session) {
+ //LYDBGLOG("[%s-%d] Node found\n", __FUNCTION__, __LINE__);
+ if (strcmp(ftp_slider->data.sevname, ftp_cmd.sevname) != 0 || strcmp(ftp_slider->data.username, ftp_cmd.username) != 0 || strcmp(ftp_slider->data.pw, ftp_cmd.pw) != 0 || ftp_slider->data.portnum != ftp_cmd.portnum) {
+ LYDBGLOG("[%s-%d] sevname error\n", __FUNCTION__, __LINE__);
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_CMDVALID);
+ return ERR_CMDVALID;
+ }
+ LYDBGLOG("[%s-%d]=======> Node found\n", __FUNCTION__, __LINE__);
+ return NO_ERROR;
+ }
+ }
+ ftp_slider = NULL;
+
+ LYDBGLOG("[%s-%d] Not found\n", __FUNCTION__, __LINE__);
+ return NO_ERROR;
+}
+
+
+void ftp_list_init()
+{
+ if (ftp_init == 0) {
+ INIT_LIST_HEAD(&lynq_ftp_list);
+ ftp_init = 1;
+ }
+
+}
diff --git a/packages/apps/lynq-threadhandle/src/http_manager.c b/packages/apps/lynq-threadhandle/src/http_manager.c
new file mode 100644
index 0000000..259b10c
--- /dev/null
+++ b/packages/apps/lynq-threadhandle/src/http_manager.c
@@ -0,0 +1,359 @@
+#include "http_manager.h"
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+
+static struct list_head http_list;
+static HTTP_LIST_LINK_S* http_slider;
+static lynq_http_client_t http_cmd = {0};
+
+
+void *http_handler(void * list)
+{
+ int error_code = 0;
+ HTTP_LIST_LINK_S* pos_list = (HTTP_LIST_LINK_S *)list;
+
+ while(1)
+ {
+ if (pos_list->data.modify_thread != 1 && pos_list->data.add_thread != 1)
+ continue;
+
+ pos_list->data.add_thread = 0;
+ pos_list->data.modify_thread = 0;
+
+ if (!strcmp(pos_list->data.action, "init")) {}
+ else if (!strcmp(pos_list->data.action, "send")) {}
+ else if (!strcmp(pos_list->data.action, "get")) {
+ lynq_http_init();
+ lynq_http_client_t * http_data = lynq_http_new();
+
+ http_data->session = pos_list->data.session;
+ memcpy(http_data->action, pos_list->data.action, sizeof(http_data->action));//rita add @2021.7.19 for action type mismatch
+ lynq_http_sync_request(http_data , pos_list->data.url, M_GET, M_CLOSE);
+
+ error_code = lynq_http_get_error_code(http_data);
+ if(error_code!=0){
+ LYDBGLOG("[%s-%d] get error!!!\n", __FUNCTION__, __LINE__);//rita add @2021.7.19 for debuging error
+ LYVERBLOG("+[http][%s][session%d]: error num = %d\n", http_data->action, http_data->session, error_code);
+ }
+
+ if (pos_list->data.url)
+ free(pos_list->data.url);
+
+ if (pos_list->data.post_data)
+ free(pos_list->data.post_data);
+
+ list_del((struct list_head* )pos_list);
+ return NULL;
+ }
+
+ else if (!strcmp(pos_list->data.action, "getfile")) {//rita add @2021.7.19 for http get
+ lynq_http_init();
+ lynq_http_client_t * http_data = lynq_http_new();
+
+ http_data->session = pos_list->data.session;
+ memcpy(http_data->action, pos_list->data.action, sizeof(http_data->action));
+ lynq_http_sync_download_file(http_data, pos_list->data.url, "",M_GET, M_CLOSE);
+
+ error_code = lynq_http_get_error_code(http_data);
+ if(error_code!=0){
+ LYDBGLOG("[%s-%d] get file error!!!\n", __FUNCTION__, __LINE__);//rita add @2021.7.19 for debuging error
+ LYVERBLOG("[http][%s][session%d]: error num = %d\n", http_data->action, http_data->session, error_code);
+ }
+
+ if (pos_list->data.url) {
+ free(pos_list->data.url);
+ }
+
+ if (pos_list->data.post_data) {
+ free(pos_list->data.post_data);
+ }
+
+ list_del((struct list_head* )pos_list);
+ return NULL;
+ }
+ else if (!strcmp(pos_list->data.action, "post")) {
+ lynq_http_init();
+ lynq_http_client_t * http_data = lynq_http_new();
+
+ http_data->session = pos_list->data.session;
+ memcpy(http_data->action, pos_list->data.action, sizeof(http_data->action));
+ lynq_http_sync_post_request(http_data , pos_list->data.url, pos_list->data.post_data, M_POST, M_CLOSE);
+
+ error_code = lynq_http_get_error_code(http_data);
+ if(error_code!=0){
+ LYDBGLOG("[%s-%d] post error!!!\n", __FUNCTION__, __LINE__);//rita add @2021.7.19 for debuging error
+ LYVERBLOG("+[http][%s][session%d]: error num = %d\n", http_data->action, http_data->session, error_code);
+ }
+ if (pos_list->data.url) {
+ free(pos_list->data.url);
+ }
+
+ if (pos_list->data.post_data) {
+ free(pos_list->data.post_data);
+ }
+
+ list_del((struct list_head* )pos_list);
+ return NULL;
+ }
+
+ else if (!strcmp(pos_list->data.action, "lpost")) {
+ lynq_http_init();
+ lynq_http_client_t *http_data = lynq_http_new();
+
+ memcpy(http_data->action, pos_list->data.action, sizeof(http_data->action));
+ memcpy(http_data->protocol, pos_list->data.protocol, sizeof(http_data->protocol));
+ http_data->session = pos_list->data.session;
+
+ if (pos_list->data.index != 1) {
+ http_data->index = 1;
+ lynq_http_sync_post_request(http_data , pos_list->data.url, pos_list->data.post_data, M_POST, M_KEEP);
+ }
+ else {
+ http_data->fd = pos_list->data.fd;
+ http_data->url = pos_list->data.url;
+ http_data->post_data = pos_list->data.post_data;
+ http_data->post_data_len = pos_list->data.post_data_len;
+ http_data->method = M_POST;
+ http_data->conn_method= M_KEEP;
+
+ if( http_parser_parse_url(http_data->url, strlen(http_data->url), 0, &http_data->u) != 0 )
+ {
+ //printf("[%s-%d] \n", __FUNCTION__, __LINE__);
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_INVOKE);
+ return NULL;
+ }
+
+ lynq_http_write_head_data(http_data);
+ }
+
+ error_code = lynq_http_get_error_code(http_data);
+ if(error_code != 0) {
+ LYVERBLOG("+[http][%s][session%d]: error num = %d\n", http_data->action, http_data->session, error_code);
+ if (pos_list->data.url)
+ free(pos_list->data.url);
+
+ if (pos_list->data.post_data)
+ free(pos_list->data.post_data);
+
+ list_del((struct list_head* )pos_list);
+ return NULL;
+ }
+
+ memcpy(&pos_list->data, http_data, sizeof(lynq_http_client_t));
+ pos_list->data.index = 1;
+ }
+
+ else if (!strcmp(pos_list->data.action, "close")) {
+ lynq_http_client_t *http_data = lynq_http_new();
+
+ http_data->session = pos_list->data.session;
+ memcpy(http_data->action, pos_list->data.action, sizeof(http_data->action));
+ http_data->fd = pos_list->data.fd;
+ http_data->url = pos_list->data.url;
+ http_data->conn_method = M_CLOSE;
+ http_data->post_data = pos_list->data.post_data;
+
+
+ pos_list->data.index = 0;
+ if( http_parser_parse_url(http_data->url, strlen(http_data->url), 0, &http_data->u) != 0 )
+ {
+ //printf("[%s-%d]\n", __FUNCTION__, __LINE__);
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_INVOKE);
+ return NULL;
+ }
+
+ lynq_http_write_head_data(http_data);
+ error_code = lynq_http_get_error_code(http_data);
+ if(error_code!=0)
+ LYVERBLOG("+[http][%s][session%d]: error num = %d\n", http_data->action, http_data->session, error_code);
+
+ lynq_http_data_send("close");
+
+ if (pos_list->data.url)
+ free(pos_list->data.url);
+
+ if (pos_list->data.post_data)
+ free(pos_list->data.post_data);
+
+ list_del((struct list_head* )pos_list);
+ return NULL;
+ }
+ }
+}
+
+
+
+int http_act_handler(thread_pool_t *pool)
+{
+ HTTP_LIST_LINK_S* tmp_list = (HTTP_LIST_LINK_S *)http_slider;
+ struct list_head* slider = NULL;
+ HTTP_LIST_LINK_S* tmp = NULL;
+ if(tmp == NULL)
+ {
+ tmp = (HTTP_LIST_LINK_S*)malloc(sizeof(HTTP_LIST_LINK_S));
+ if(tmp == NULL)
+ {
+ return ERR_MALLOCVALID;
+ }
+ }
+ memset(tmp, 0, sizeof(HTTP_LIST_LINK_S));
+
+ if (tmp_list == NULL ) {
+ if(!strcmp(http_cmd.action, "init") || !strcmp(http_cmd.action, "conn") || !strcmp(http_cmd.action, "send") || !strcmp(http_cmd.action, "get") || !strcmp(http_cmd.action, "post") || !strcmp(http_cmd.action, "lpost") || !strcmp(http_cmd.action, "getfile")) {
+ tmp->data = http_cmd;
+ if (http_cmd.url != NULL)
+ {
+
+ tmp->data.url = (char *)malloc(strlen(http_cmd.url)+1);
+ if (tmp->data.url == NULL)
+ return ERR_MALLOCVALID;
+
+ memset(tmp->data.url, 0x00, strlen(http_cmd.url)+1);
+ memcpy(tmp->data.url, http_cmd.url, strlen(http_cmd.url));
+ }
+
+ if (http_cmd.post_data != NULL)
+ {
+ tmp->data.post_data = (char *)malloc(strlen(http_cmd.post_data)+1);
+ if (tmp->data.post_data == NULL)
+ return ERR_MALLOCVALID;
+
+ memset(tmp->data.post_data, 0x00, strlen(http_cmd.post_data)+1);
+ memcpy(tmp->data.post_data, http_cmd.post_data, strlen(http_cmd.post_data));
+ }
+
+ tmp->data.add_thread = 1;
+ list_add_tail(&tmp->list, &http_list);
+ http_list_locate();
+
+ if (!threadpool_add(pool, http_handler, (void *)http_slider)) {
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_INVOKE);
+ return ERR_INVOKE;
+ }
+ }
+ else {
+ LYDBGLOG("[%s-%d] cmd error \n", __FUNCTION__, __LINE__);
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_CMDVALID);
+ if (tmp != NULL)
+ free(tmp);
+ return ERR_CMDVALID;
+ }
+ }
+ else {
+ if(!strcmp(http_cmd.action, "send") || !strcmp(http_cmd.action, "lpost") || !strcmp(http_cmd.action, "close")) {
+ memcpy(tmp_list->data.action, http_cmd.action, sizeof(tmp_list->data.action));
+ memcpy(tmp_list->data.post_data, http_cmd.post_data, strlen(http_cmd.post_data));
+ tmp_list->data.modify_thread = 1;
+ }
+ else {
+ LYDBGLOG("[%s-%d] cmd error \n", __FUNCTION__, __LINE__);
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_CMDVALID);
+ return ERR_CMDVALID;
+ }
+ }
+
+ tmp = NULL;
+ return NO_ERROR;
+}
+
+
+
+int http_param_verification(char result[][BUF_SIZE] , int line)
+{
+ if (line < 3) {
+ LYDBGLOG("[%s-%d] command error\n", __FUNCTION__, __LINE__);
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_CMDVALID);
+ return ERR_CMDVALID;
+ }
+
+ http_cmd.url = NULL;
+ http_cmd.post_data = NULL;
+ memcpy(http_cmd.protocol, result[0], sizeof(http_cmd.protocol));
+
+ if(!atoi(result[2])) { //session
+ LYDBGLOG("[%s-%d] session error\n", __FUNCTION__, __LINE__);
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_SESSIONVALID);
+ return ERR_SESSIONVALID;
+ }
+
+ http_cmd.session = atoi(result[2]);
+ memcpy(http_cmd.action, result[1], sizeof(http_cmd.action));
+
+ if (!(strcmp(result[1], "post"))) {
+ http_cmd.url = result[3];
+ http_cmd.post_data = result[4];
+ }
+
+ else if (!(strcmp(result[1], "lpost"))) {
+ http_cmd.url = result[3];
+ http_cmd.post_data = result[4];
+ }
+
+ else if (!(strcmp(result[1], "get"))) {
+ strcat(result[3], result[4]);
+ http_cmd.url = result[3];
+ }
+
+ else if (!(strcmp(result[1], "getfile"))) {
+ http_cmd.url = result[3];
+ strcat(http_cmd.url, result[4]);//path
+
+ }
+
+ else if (!(strcmp(result[1], "close"))) {
+ http_cmd.conn_method = M_CLOSE;
+ http_cmd.post_data = "s=close";
+ }
+ else {
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_CMDVALID);
+ return ERR_CMDVALID;
+ }
+
+ return NO_ERROR;
+}
+
+
+int http_list_locate()
+{
+ struct list_head* slider = NULL;
+ http_slider = NULL;
+ list_for_each(slider, &http_list)
+ {
+ http_slider = (HTTP_LIST_LINK_S*)slider;
+#if 0
+ LYDBGLOG("[%s-%d] =================================== \n", __func__, __LINE__);
+ LYDBGLOG("[%s-%d] protocol : %s \n", __FUNCTION__, __LINE__, http_slider->data.protocol);
+ LYDBGLOG("[%s-%d] session : %d \n", __FUNCTION__, __LINE__, http_slider->data.session);
+ LYDBGLOG("[%s-%d] action : %s \n", __FUNCTION__, __LINE__, http_slider->data.action);
+ LYDBGLOG("[%s-%d] index : %d \n", __FUNCTION__, __LINE__, http_slider->data.index);
+ LYDBGLOG("[%s-%d] =================================== \n", __func__, __LINE__);
+#endif
+
+ if (!strcmp(http_slider->data.protocol, http_cmd.protocol) && http_slider->data.session == http_cmd.session) {
+ if (strcmp(http_cmd.action, "close") != 0) {
+ if (strcmp(http_slider->data.url, http_cmd.url) != 0) {
+ //LYDBGLOG("[%s-%d] URL error\n", __FUNCTION__, __LINE__);
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_CMDVALID);
+ return ERR_CMDVALID;
+ }
+ }
+ return NO_ERROR;
+ }
+ }
+ http_slider = NULL;
+
+ return NO_ERROR;
+}
+
+
+static int http_init = 0;
+void http_list_init()
+{
+ if (http_init == 0) {
+ INIT_LIST_HEAD(&http_list);
+ http_init = 1;
+ }
+
+}
+
diff --git a/packages/apps/lynq-threadhandle/src/model_manager.c b/packages/apps/lynq-threadhandle/src/model_manager.c
new file mode 100644
index 0000000..a63a291
--- /dev/null
+++ b/packages/apps/lynq-threadhandle/src/model_manager.c
@@ -0,0 +1,34 @@
+#include "model_manager.h"
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+
+
+
+
+MAG_LIST_S list_manager[] = {
+ {"http", http_list_init, http_param_verification, http_list_locate, http_act_handler, NULL, NULL, NULL, NULL },
+ {"ftp", ftp_list_init, ftp_param_verification, ftp_list_locate, ftp_act_handler, NULL, NULL, NULL},
+ {"mqtt", mqtt_list_init, mqtt_param_verification, mqtt_list_locate, mqtt_act_handler, NULL, NULL, NULL,NULL},
+ //{"ril", ril_list_init,ril_param_verification, ril_list_locate, ril_act_handler, NULL, NULL, NULL,NULL},
+};
+
+
+MAG_LIST_S *list_manager_proc(const char *name)
+{
+ int type_num = sizeof(list_manager) / sizeof(MAG_LIST_S);
+ int i = 0;
+ for (i = 0; i < type_num; i++)
+ {
+ if (0 == strcmp(list_manager[i].name, name))
+ {
+ LYDBGLOG("[%s-%d] recognized message type is %s\n", __FUNCTION__, __LINE__, list_manager[i].name);
+ return &list_manager[i];
+ }
+ }
+ LYDBGLOG("[%s-%d] Unrecognized message type %s\n", __FUNCTION__, __LINE__, name);
+
+ return NULL;
+}
+
+
diff --git a/packages/apps/lynq-threadhandle/src/mqtt_manager.c b/packages/apps/lynq-threadhandle/src/mqtt_manager.c
new file mode 100644
index 0000000..922a7e7
--- /dev/null
+++ b/packages/apps/lynq-threadhandle/src/mqtt_manager.c
Binary files differ
diff --git a/packages/apps/lynq-threadhandle/src/seq_queue.c b/packages/apps/lynq-threadhandle/src/seq_queue.c
new file mode 100644
index 0000000..787a601
--- /dev/null
+++ b/packages/apps/lynq-threadhandle/src/seq_queue.c
@@ -0,0 +1,132 @@
+#include "seq_queue.h"
+
+
+seq_queue_t *create_seq_queue(in unsigned int block_size, in unsigned int total_block, in BOOL expand) {
+
+ seq_queue_t *queue = (seq_queue_t *)malloc(sizeof(seq_queue_t));
+ if (queue) {
+
+ memset(queue, 0, sizeof(seq_queue_t));
+ queue->block_buffer = malloc(total_block * block_size);
+ if (queue->block_buffer == NULL) {
+ free(queue);
+ queue = NULL;
+ } else {
+ queue->block_size = block_size;
+ queue->total_block = total_block;
+ queue->expandabilit = expand;
+ queue->expand_blocks = EXPAND_BLOCK_NUM;
+
+ create_sem(&queue->task_queue_lock, 1);
+// init_mutex_handle(&queue->task_queue_lock);
+ }
+ }
+
+ return queue;
+}
+
+void destroy_seq_queue(in seq_queue_t *queue) {
+
+ if (queue == NULL)
+ return ;
+
+ destroy_sem(&queue->task_queue_lock);
+// mutex_destroy(&queue->task_queue_lock);
+ free(queue->block_buffer);
+ free(queue);
+}
+
+
+BOOL expand_seq_queue(in seq_queue_t *queue) {
+
+ void *new_buffer;
+ BOOL ret = FALSE;
+ if (queue == NULL || !queue->expandabilit)
+ return FALSE;
+
+ new_buffer = malloc((queue->total_block+queue->expand_blocks) * queue->block_size);
+ if (new_buffer) {
+ if (queue->current_block > queue->tail_block) {
+ memcpy(new_buffer, (char *)queue->block_buffer, queue->total_block * queue->block_size);
+ } else if (queue->current_block < queue->tail_block || (queue->current_block == queue->tail_block && queue->used_block != 0)) {
+ int head_block = queue->total_block - queue->tail_block;
+ int head_data_len = head_block * queue->block_size;
+ memcpy(new_buffer, (char *)queue->block_buffer + queue->tail_block * queue->block_size, head_data_len);
+ memcpy((char *)new_buffer + head_data_len, (char *)queue->block_buffer, queue->current_block * queue->block_size);
+ queue->tail_block = 0;
+ queue->current_block = head_block + queue->current_block;
+ } else if (queue->current_block == queue->tail_block){
+ queue->current_block = 0;
+ queue->tail_block = 0;
+ }
+
+ queue->total_block += queue->expand_blocks;
+
+ free(queue->block_buffer);
+ queue->block_buffer = new_buffer;
+ ret = TRUE;
+ }
+
+ return ret;
+}
+
+
+BOOL en_seq_queue(in seq_queue_t *queue, in void *data) {
+
+ if (queue == NULL || data == NULL)
+ return FALSE;
+
+ wait_sem(&queue->task_queue_lock);
+ //mutex_lock(&queue->task_queue_lock);
+ if (queue->used_block >= queue->total_block) {
+ static int times= 0;
+ times++;
+ if (!expand_seq_queue(queue)) {
+
+ return FALSE;
+ }
+ }
+
+ memcpy((char *)queue->block_buffer + queue->current_block * queue->block_size
+ , data, queue->block_size);
+ queue->current_block++;
+ queue->current_block = queue->current_block % queue->total_block;
+ queue->used_block++;
+
+ post_sem(&queue->task_queue_lock);
+ //mutex_unlock(&queue->task_queue_lock);
+
+ return TRUE;
+}
+
+BOOL de_seq_queue(in seq_queue_t *queue, out void *data) {
+
+ BOOL ret = FALSE;
+ if (queue == NULL)
+ return FALSE;
+
+ wait_sem(&queue->task_queue_lock);
+ //mutex_lock(&queue->task_queue_lock);
+ if (queue->used_block != 0) {
+ memcpy(data, (char *)queue->block_buffer + queue->tail_block * queue->block_size
+ , queue->block_size);
+ queue->tail_block++;
+ queue->tail_block = queue->tail_block % queue->total_block;
+ queue->used_block--;
+ ret = TRUE;
+ }
+ post_sem(&queue->task_queue_lock);
+ //mutex_unlock(&queue->task_queue_lock);
+
+ return ret;
+}
+
+unsigned int get_count_seq_queue(in seq_queue_t *queue) {
+ return queue->used_block;
+}
+
+unsigned int get_size_seq_queue(in seq_queue_t *queue) {
+ return queue->total_block;
+}
+
+
diff --git a/packages/apps/lynq-threadhandle/src/syn_primitive.c b/packages/apps/lynq-threadhandle/src/syn_primitive.c
new file mode 100644
index 0000000..9494df7
--- /dev/null
+++ b/packages/apps/lynq-threadhandle/src/syn_primitive.c
@@ -0,0 +1,65 @@
+
+#include "syn_primitive.h"
+#define SEM_VALUE_MAX 32767
+
+int init_condition_handle(condition_handle *cond) {
+ return pthread_cond_init(cond, NULL);
+}
+
+
+int destroy_condition_handle(condition_handle *cond) {
+ return pthread_cond_destroy(cond);
+}
+
+
+int wait_condition(condition_handle *cond, mutex_handle *mutex, unsigned int wait) {
+ struct timespec wait_time;
+ if (wait == TIME_WAIT_INFINITE)
+ wait_time.tv_sec = TIME_WAIT_INFINITE;
+ else
+ wait_time.tv_sec = wait + time(0);
+ wait_time.tv_nsec = 0;
+
+ return pthread_cond_timedwait(cond, mutex, &wait_time);
+}
+
+
+int post_condition_signal(condition_handle *cond) {
+ return pthread_cond_signal(cond);
+}
+
+
+int init_mutex_handle(mutex_handle *mutex) {
+ return pthread_mutex_init(mutex, NULL);
+}
+
+int mutex_lock(mutex_handle *mutex) {
+ return pthread_mutex_lock(mutex);
+}
+
+int mutex_unlock(mutex_handle *mutex) {
+ return pthread_mutex_unlock(mutex);
+}
+
+int mutex_destroy(mutex_handle *mutex) {
+ return pthread_mutex_destroy(mutex);
+}
+
+
+int create_sem(sem_handle *sem, int init_count) {
+ return sem_init(sem, 0, init_count>SEM_VALUE_MAX ? SEM_VALUE_MAX:init_count );
+}
+
+
+int wait_sem(sem_handle *sem) {
+ return sem_wait(sem);
+}
+
+int post_sem(sem_handle *sem) {
+ return sem_post(sem);
+}
+
+int destroy_sem(sem_handle *sem) {
+ return sem_destroy(sem);
+}
+
diff --git a/packages/apps/lynq-threadhandle/src/thread_main.c b/packages/apps/lynq-threadhandle/src/thread_main.c
new file mode 100644
index 0000000..6a4e453
--- /dev/null
+++ b/packages/apps/lynq-threadhandle/src/thread_main.c
@@ -0,0 +1,86 @@
+#include "model_manager.h"
+#include "list.h"
+#include "thread_pool.h"
+#include "common.h"
+#include <signal.h>
+#include <stdio.h>
+#include <malloc.h>
+#include <gio/gio.h>
+#include <stdlib.h>
+#include <unistd.h>
+//#include <libtel/lib_tele.h>
+#include "liblynq-broadcast/broadcast_receiver.h"
+
+
+#define USER_LOG_TAG "THHANDLE"
+#define MIN_THR_NUM 10
+#define MAX_THR_NUM 100
+
+
+
+thread_pool_t *pool = NULL;
+char cmd_buf[BUF_SIZE] = "";
+
+static void CallbackByName( char*broadcast_name, int data_length,const char*data)
+{
+ LYDBGLOG("[%s-%d] str_arg = %s, data_length = %d, int_arg = %s\n", broadcast_name, data_length, data);
+ memcpy(cmd_buf, data, strlen(data));
+
+ return;
+}
+
+void *cmd_thread_func(void* argv_list)
+{
+ int runing = 1 ;
+ int ret = NO_ERROR;
+
+ while(runing)
+ {
+ char result[20][BUF_SIZE] = {0};
+ while (strcmp(cmd_buf, "") == 0) {
+ usleep(100);
+ }
+ LYDBGLOG("[%s-%d]========cmd_buf = %s\n", __FUNCTION__, __LINE__, cmd_buf );
+ int line = str_arr(cmd_buf, "\"&", result)+1;
+ memset(cmd_buf, 0, sizeof(cmd_buf));
+ LYDBGLOG("[%s-%d]========result[0] = %s\n", __FUNCTION__, __LINE__, result[0] );
+ MAG_LIST_S *list_manager = list_manager_proc(result[0]);
+ if (list_manager == NULL) {
+ memset(cmd_buf, 0, sizeof(cmd_buf));
+ continue;
+ }
+
+ ret = list_manager->func_param_verification(result, line);
+ if (ret != NO_ERROR){
+ memset(cmd_buf, 0, sizeof(cmd_buf));
+ continue;
+ }
+
+ list_manager->func_list_init();
+ ret = list_manager->func_list_locate();
+ if (ret != NO_ERROR)
+ continue;
+ list_manager->func_act_handler(pool);
+ }
+}
+
+
+int main(void)
+{
+ LYLOGEINIT(USER_LOG_TAG);
+ LYDBGLOG("======lynq-threadhandle start=======\n");
+ pool = threadpool_create(MIN_THR_NUM, MAX_THR_NUM);
+
+ register_broadcast_loop();
+ receive_callback_by_name("function", CallbackByName);//rita add @2021.6.21 for receive dbus info
+
+ if (!threadpool_add(pool, cmd_thread_func, NULL)) {
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_INVOKE);
+ return 0;
+ }
+
+ while (1) {
+ usleep(100);
+ }
+ return 0;
+}
diff --git a/packages/apps/lynq-threadhandle/src/thread_pool.c b/packages/apps/lynq-threadhandle/src/thread_pool.c
new file mode 100644
index 0000000..50da0a9
--- /dev/null
+++ b/packages/apps/lynq-threadhandle/src/thread_pool.c
@@ -0,0 +1,504 @@
+#include "thread_pool.h"
+#include <time.h>
+#include "common.h"
+
+EThread_pool_status get_threadpool_status(thread_pool_t *pool);
+void set_threadpool_status(thread_pool_t *pool, EThread_pool_status state);
+thread_info_t *create_thread_info(EThread_pool_status *pool_status);
+thread_handle pool_thread_create(THREAD_FUNC threadFun, int pri, void *para);
+BOOL init_threadpool(thread_pool_t *pool);
+thread_handle get_self_thread_id(void);
+
+#define THREAD_PRI_NOMAL_LEVEL 60
+#define THREAD_PRI_ABOVE_LEVEL 70
+#define THREAD_PRI_HIGH_LEVEL 80
+
+
+#define TASK_QUEUE_COUNT_MAX 100
+#define CONDITION_WAIT_TIME 1000
+#define INCRE_THREADS_UNIT 5
+
+
+
+thread_handle get_self_thread_id() {
+ return pthread_self();
+}
+
+void tp_sleep(unsigned int ms) {
+ struct timeval delay;
+
+ delay.tv_sec = ms/1000;
+ delay.tv_usec = (ms%1000) * 1000;
+ select(0, NULL, NULL, NULL, &delay);
+}
+
+
+unsigned long get_current_time(void) {
+ return time(NULL);
+}
+
+void force_exit_thread(thread_info_t *thread_info) {
+
+ int ret;
+ pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
+ pthread_cancel(thread_info->h_thread);
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
+
+ ret = destroy_condition_handle(&thread_info->thread_cond);
+ if (ret) {
+ post_condition_signal(&thread_info->thread_cond);
+ destroy_condition_handle(&thread_info->thread_cond);
+ }
+
+ ret = mutex_destroy(&thread_info->thread_lock);
+ if (ret) {
+ mutex_unlock(&thread_info->thread_lock);
+ mutex_destroy(&thread_info->thread_lock);
+ }
+}
+
+
+int compare_thread_id(void *usr_data, unsigned int sdata_len, void *list_data, unsigned int ldata_len) {
+ if (((thread_info_t *)usr_data)->h_thread == ((thread_info_t *)list_data)->h_thread) {
+ return 0;
+ } else {
+ return -1;
+ }
+}
+
+
+static void pool_thread_work(void *para)
+{
+ int ret = 0;
+
+ thread_info_t *thread_info = (thread_info_t *)para;
+ thread_func_t *thread_func;
+
+ if (thread_info == NULL) {
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_INVOKE);
+ return;
+ }
+
+ while (*thread_info->pool_status != EThread_pool_exit) {
+ mutex_lock(&thread_info->thread_lock);
+ while (!thread_info->busy) {
+ ret = wait_condition(&thread_info->thread_cond, &thread_info->thread_lock, TIME_WAIT_INFINITE);
+ }
+
+ mutex_unlock(&thread_info->thread_lock);
+
+ if (*thread_info->pool_status == EThread_pool_exit || thread_info->release)
+ break;
+
+ thread_func = &thread_info->thread_para;
+ thread_info->time_out = thread_func->time_out_info.time_out;
+ thread_info->launch_time = get_current_time();
+ thread_info->thread_para.process_func(thread_info->thread_para.args);
+ if (thread_info->thread_para.release_func) {
+ thread_info->thread_para.release_func(thread_info->thread_para.args);
+ }
+ thread_info->launch_time = TIME_WAIT_INFINITE;
+
+ mutex_lock(&thread_info->thread_lock);
+ thread_info->busy = FALSE;
+ mutex_unlock(&thread_info->thread_lock);
+ }
+
+ LYDBGLOG(" thread %lu exit.\n", get_self_thread_id());
+
+ pthread_exit(0);
+}
+
+
+BOOL scan_idle_thread_from_busy(thread_pool_t *pool) {
+
+ BOOL ret = FALSE;
+
+ d_list_t *idle_list = pool->idle_threads;
+ d_list_t *busy_list = pool->busy_threads;
+
+ d_list_node_t *temp_node;
+ thread_info_t *info;
+ if (busy_list == NULL || idle_list == NULL)
+ return FALSE;
+
+ while ((temp_node = get_next_node(busy_list)) != NULL)
+ {
+ if (temp_node == NULL || temp_node->data == NULL)
+ break;
+
+ info = (thread_info_t *)temp_node->data;
+ if (!info->busy) {
+
+ if (remove_d_list_node(busy_list, temp_node)) {
+ insert_d_list_tail_node(idle_list, temp_node);
+ ret = TRUE;
+ //break;
+ }
+ } else {
+ if (info->time_out == 0 || info->launch_time == TIME_WAIT_INFINITE) {
+ continue;
+ }
+
+ if (get_current_time() - info->time_out > info->launch_time) {
+ //if (get_current_time() - info->launch_time > info->time_out) {
+ LYDBGLOG("[%s-%d] ####### time out , force exit thread. %lu #########\n", __FUNCTION__, __LINE__, info->h_thread);
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_TIMEOUT);
+ if (remove_d_list_node(busy_list, temp_node)) {
+ force_exit_thread(info);
+
+ if (info->thread_para.time_out_info.timeout_callback) {
+ info->thread_para.time_out_info.timeout_callback(&info->thread_para);
+ }
+
+ init_condition_handle(&info->thread_cond);
+ init_mutex_handle(&info->thread_lock);
+
+ info->busy = FALSE;
+ info->release = FALSE;
+ info->launch_time = TIME_WAIT_INFINITE;
+ info->h_thread = pool_thread_create(pool_thread_work, info->pri, info);
+ if (info->h_thread < 0) {
+
+ free(info);
+ free(temp_node);
+ pool->pool_thread_num--;
+ } else {
+
+ insert_d_list_tail_node(idle_list, temp_node);
+ ret = TRUE;
+ }
+ }
+ }
+
+ }
+ }
+
+ return ret;
+}
+
+
+static void pool_thread_manage(void *para)
+{
+ thread_func_t thread_para;
+ d_list_node_t *list_node;
+ thread_info_t *thread_info;
+ thread_pool_t *pool = (thread_pool_t *)para;
+
+ if (pool == NULL) {
+ return;
+ }
+
+ while (get_threadpool_status(pool) != EThread_pool_exit) {
+
+ if (get_count_seq_queue(pool->task_queue) > 0) {
+
+ pool->release_threads_interval = 0;
+
+ list_node = remove_d_list_head_node(pool->idle_threads);
+ if (list_node && list_node->data) {
+
+ memset(&thread_para, 0, sizeof(thread_func_t));
+ if (de_seq_queue(pool->task_queue, &thread_para)) {
+
+ thread_info = (thread_info_t *)list_node->data;
+ post_sem(&pool->sem_inc);
+
+ mutex_lock(&thread_info->thread_lock);
+ memcpy(&thread_info->thread_para, &thread_para, sizeof(thread_func_t));
+ thread_info->busy = TRUE;
+ post_condition_signal(&thread_info->thread_cond);
+ mutex_unlock(&thread_info->thread_lock);
+
+ insert_d_list_tail_node(pool->busy_threads, list_node);
+
+ } else {
+
+ insert_d_list_head_node(pool->idle_threads, list_node);
+ }
+
+
+ } else {
+ if (scan_idle_thread_from_busy(pool))
+ continue;
+
+ if (pool->pool_thread_num < pool->max_thread_num) {
+
+ int i;
+ for (i=0; i<INCRE_THREADS_UNIT; i++) {
+ thread_info_t *thread_inf = create_thread_info(&pool->status);
+ insert_d_list_tail(pool->idle_threads, thread_inf, sizeof(thread_info_t));
+ pool->pool_thread_num++;
+ }
+
+ } else {
+ //continue;
+ }
+ }
+
+ } else {
+ if (get_d_list_node_count(pool->busy_threads) > 0) {
+ pool->release_threads_interval = 0;
+ scan_idle_thread_from_busy(pool);
+ } else {
+ BOOL is_release_threads = FALSE;
+ if (pool->release_threads_interval == 0) {
+ pool->release_threads_interval = get_current_time();
+ } else {
+ is_release_threads = (get_current_time() - pool->release_threads_interval) > RELEASE_THREAD_INTERVAL;
+ }
+
+ if (is_release_threads && get_d_list_node_count(pool->idle_threads) > pool->min_thread_num) {
+ //
+ list_node = remove_d_list_head_node(pool->idle_threads);
+ if (list_node && list_node->data) {
+ thread_info = (thread_info_t *)list_node->data;
+ if (!thread_info->busy) {
+ mutex_lock(&thread_info->thread_lock);
+ thread_info->release = TRUE;
+ mutex_unlock(&thread_info->thread_lock);
+ post_condition_signal(&thread_info->thread_cond);
+ pool->pool_thread_num--;
+ free(thread_info);
+ free(list_node);
+ } else {
+ insert_d_list_tail(pool->busy_threads, thread_info, sizeof(thread_info_t));
+ }
+ }
+
+ } else {
+ mutex_lock(&pool->mange_lock);
+ wait_condition(&pool->manage_cond, &pool->mange_lock, CONDITION_WAIT_TIME);
+ mutex_unlock(&pool->mange_lock);
+ }
+ }
+
+ }
+ }
+}
+
+
+thread_handle pool_thread_create(THREAD_FUNC threadFun, int pri, void *para) {
+
+ thread_handle h_thread;
+ pthread_attr_t attr;
+ struct sched_param p;
+
+ pthread_attr_init(&attr);
+ p.sched_priority = pri;
+
+ pthread_attr_setschedpolicy(&attr,SCHED_OTHER);
+ pthread_attr_setschedparam(&attr,&p);
+
+ pthread_create(&h_thread, &attr, (void *)threadFun, para);
+ return h_thread;
+}
+
+void pool_thread_release(thread_handle h_thread)
+{
+ pthread_join(h_thread, NULL);
+}
+
+EThread_pool_status get_threadpool_status(thread_pool_t *pool) {
+
+ if (pool) {
+ return pool->status;
+ } else {
+ return EThread_pool_unknown;
+ }
+}
+
+void set_threadpool_status(thread_pool_t *pool, EThread_pool_status state) {
+
+ if (pool) {
+ pool->status = state;
+ }
+}
+
+thread_pool_t *threadpool_create(unsigned int min_thread_num, unsigned int max_thread_num)
+{
+ thread_pool_t *pool = (thread_pool_t *)malloc(sizeof(thread_pool_t));
+
+ if (pool) {
+ memset(pool, 0, sizeof(thread_pool_t));
+ pool->min_thread_num = min_thread_num;
+ pool->max_thread_num = max_thread_num;
+ pool->pri = THREAD_PRI_HIGH_LEVEL;
+ pool->status = EThread_pool_alloc;
+
+ if (!init_threadpool(pool)) {
+ free(pool);
+ pool = NULL;
+ }
+ }
+
+ return pool;
+}
+
+thread_info_t *create_thread_info(EThread_pool_status *pool_status) {
+ thread_info_t *thread_inf = (thread_info_t *)malloc(sizeof(thread_info_t));
+ if (thread_inf == NULL)
+ return NULL;
+
+ memset(thread_inf, 0, sizeof(thread_info_t));
+
+ thread_inf->busy = FALSE;
+ thread_inf->release = FALSE;
+ thread_inf->pri = THREAD_PRI_ABOVE_LEVEL;
+ thread_inf->launch_time = TIME_WAIT_INFINITE;
+ thread_inf->pool_status = pool_status;
+
+ init_condition_handle(&thread_inf->thread_cond);
+ init_mutex_handle(&thread_inf->thread_lock);
+
+ thread_inf->h_thread = pool_thread_create(pool_thread_work, thread_inf->pri, thread_inf);
+ if (thread_inf->h_thread < 0) {
+ destroy_condition_handle(&thread_inf->thread_cond);
+ mutex_destroy(&thread_inf->thread_lock);
+
+ free(thread_inf);
+ thread_inf = NULL;
+ }
+
+ return thread_inf;
+}
+
+
+void destroy_thread_info(thread_info_t *thread_info) {
+ if (thread_info == NULL)
+ return;
+
+ thread_info->release = TRUE;
+ pool_thread_release(thread_info->h_thread);
+
+ destroy_condition_handle(&thread_info->thread_cond);
+ mutex_destroy(&thread_info->thread_lock);
+}
+
+BOOL init_threadpool(thread_pool_t *pool) {
+
+ unsigned int thread_num = 0;
+ if (pool == NULL)
+ return FALSE;
+
+ pool->busy_threads = create_d_list();
+ pool->idle_threads = create_d_list();
+ pool->task_queue = create_seq_queue(sizeof(thread_func_t), TASK_QUEUE_COUNT_MAX, TRUE);
+ if (pool->busy_threads == NULL || pool->idle_threads == NULL || pool->task_queue == NULL)
+ goto err_flag;
+
+ for (thread_num=0; thread_num<pool->min_thread_num; thread_num++) {
+ thread_info_t *thread_inf = create_thread_info(&pool->status);
+
+ if (!insert_d_list_tail(pool->idle_threads, thread_inf, sizeof(thread_info_t)))
+ goto err_flag;
+
+ }
+
+ create_sem(&pool->sem_inc, TASK_QUEUE_COUNT_MAX);
+ init_condition_handle(&pool->manage_cond);
+ init_mutex_handle(&pool->mange_lock);
+ pool->h_id = pool_thread_create(pool_thread_manage, pool->pri, pool);
+
+ pool->status = EThread_pool_init;
+ pool->pool_thread_num = pool->min_thread_num;
+
+ return TRUE;
+
+
+err_flag:
+ LYDBGLOG("[%s-%d]##################### err ################\n", __FUNCTION__, __LINE__);
+ LYVERBLOG("+[thhandle]: error num = %d\n", ERR_INVOKE);
+ threadpool_destroy(pool);
+
+ return FALSE;
+}
+
+void threadpool_destroy(thread_pool_t *pool)
+{
+ d_list_node_t *temp_node;
+ if (pool == NULL)
+ return;
+
+ set_threadpool_status(pool, EThread_pool_exit);
+
+ destroy_sem(&pool->sem_inc);
+ mutex_lock(&pool->mange_lock);
+ post_condition_signal(&pool->manage_cond);
+ mutex_unlock(&pool->mange_lock);
+ pool_thread_release(pool->h_id);
+
+ mutex_destroy(&pool->mange_lock);
+ destroy_condition_handle(&pool->manage_cond);
+
+ while ((temp_node = remove_d_list_head_node(pool->idle_threads))) {
+ thread_info_t *info = (thread_info_t *)temp_node->data;
+ post_condition_signal(&info->thread_cond);
+ destroy_thread_info(info);
+ free(info);
+ free(temp_node);
+ }
+
+ while ((temp_node = remove_d_list_head_node(pool->busy_threads))) {
+ thread_info_t *info = (thread_info_t *)temp_node->data;
+ post_condition_signal(&info->thread_cond);
+ destroy_thread_info(info);
+ free(info);
+ free(temp_node);
+ }
+
+ destroy_d_list(pool->busy_threads);
+ destroy_d_list(pool->idle_threads);
+ destroy_seq_queue(pool->task_queue);
+
+ free(pool);
+}
+
+BOOL threadpool_add(thread_pool_t *pool, USER_FUNC process_func, void *args)
+{
+ BOOL ret = FALSE;
+ thread_func_t function;
+
+ if (pool == NULL)
+ return FALSE;
+
+ memset(&function, 0, sizeof(thread_func_t));
+ function.process_func = process_func;
+ function.args = args;
+
+ wait_sem(&pool->sem_inc);
+ ret = en_seq_queue(pool->task_queue, &function);
+
+ mutex_lock(&pool->mange_lock);
+ post_condition_signal(&pool->manage_cond);
+ mutex_unlock(&pool->mange_lock);
+
+ return ret;
+}
+
+BOOL threadpool_add_timeout(thread_pool_t *pool, USER_FUNC process_func
+ , USER_FUNC release_func, void *args, time_out_t *time_out)
+{
+ BOOL ret = FALSE;
+ thread_func_t function;
+
+ if (pool == NULL)
+ return FALSE;
+
+ memset(&function, 0, sizeof(thread_func_t));
+ function.process_func = process_func;
+ function.release_func = release_func;
+ function.args = args;
+ memcpy(&function.time_out_info, time_out, sizeof(time_out_t));
+
+ wait_sem(&pool->sem_inc);
+ ret = en_seq_queue(pool->task_queue, &function);
+
+ mutex_lock(&pool->mange_lock);
+ post_condition_signal(&pool->manage_cond);
+ mutex_unlock(&pool->mange_lock);
+
+ return ret;
+}
+
+
diff --git a/packages/apps/lynq-udpcli/LICENSE b/packages/apps/lynq-udpcli/LICENSE
new file mode 100644
index 0000000..77f59ed
--- /dev/null
+++ b/packages/apps/lynq-udpcli/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/packages/apps/lynq-udpcli/lynq_udpcli.c b/packages/apps/lynq-udpcli/lynq_udpcli.c
new file mode 100644
index 0000000..de42922
--- /dev/null
+++ b/packages/apps/lynq-udpcli/lynq_udpcli.c
@@ -0,0 +1,60 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include<stdlib.h>
+#include <netinet/in.h>
+#include <strings.h>
+#include "liblog/liblog.h"
+#include "liblog/lynq_deflog.h"
+
+
+#define USER_LOG_TAG "UDPCLI"
+#define BUF_LEN 128
+#define ERR_CMDVALID 2
+#define ERR_SOCK 3
+#define SA struct sockaddr
+
+int main(int argc, const char *argv[])
+{
+ int sockfd;
+ char buf[BUF_LEN];
+
+
+ LYLOGEINIT(USER_LOG_TAG);
+ if(argc!=3)
+ {
+ LYDBGLOG("argv is wrong, please input ip and port\n");
+ LYVERBLOG("+[udpcli]: error num = %d\n", ERR_CMDVALID);
+ return ERR_CMDVALID;
+ }
+
+ sockfd=socket(AF_INET,SOCK_DGRAM,0);
+
+ if(sockfd<0)
+ {
+ LYDBGLOG("fail to sockfd\n");
+ return ERR_SOCK;
+ }
+
+ struct sockaddr_in seraddr;
+ seraddr.sin_family=AF_INET;
+ seraddr.sin_port=htons(atoi(argv[2]));
+ seraddr.sin_addr.s_addr=inet_addr(argv[1]);
+
+ int len=sizeof(seraddr);
+
+ while(1)
+ {
+ bzero(buf,sizeof(buf));
+
+ fgets(buf,sizeof(buf),stdin);
+
+ sendto(sockfd,buf,sizeof(buf),0,(SA *)&seraddr,len);
+
+ recvfrom(sockfd,buf,sizeof(buf),0,NULL,NULL);
+
+ LYVERBLOG("+[udpcli]: cli_rcv = %s\n",buf);
+ }
+ return 0;
+}
diff --git a/packages/apps/lynq-udpcli/makefile b/packages/apps/lynq-udpcli/makefile
new file mode 100644
index 0000000..71a4d23
--- /dev/null
+++ b/packages/apps/lynq-udpcli/makefile
@@ -0,0 +1,50 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+ -g -Os \
+ -flto \
+ -fpermissive \
+ -fPIC \
+
+
+
+LOCAL_PATH = .
+
+LOCAL_C_INCLUDES = \
+ -I. \
+ -I$(ROOT)$(includedir)/logger \
+ -I$(ROOT)$(includedir)/liblog \
+ -I$(ROOT)$(includedir)/glib-2.0 \
+ -I$(ROOT)$(libdir)/glib-2.0/include \
+ -I$(ROOT)$(includedir)/dbus-1.0 \
+ -I$(ROOT)$(libdir)/dbus-1.0/include \
+
+
+LOCAL_LIBS := \
+ -L. \
+ -ldl \
+ -lpthread \
+ -llog-ril \
+ -lssl \
+ -lglib-2.0 \
+ -lgobject-2.0 \
+ -lgio-2.0 \
+ -ldbus-1 \
+
+SOURCES = $(wildcard *.c)
+
+EXECUTABLE = lynq-udpcli
+
+OBJECTS=$(SOURCES:.c=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+ $(CXX) -shared -Wl,--no-undefined $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o : %.c
+ $(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+ $(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/packages/apps/lynq-udpser/LICENSE b/packages/apps/lynq-udpser/LICENSE
new file mode 100644
index 0000000..77f59ed
--- /dev/null
+++ b/packages/apps/lynq-udpser/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/packages/apps/lynq-udpser/lynq_udpser.c b/packages/apps/lynq-udpser/lynq_udpser.c
new file mode 100644
index 0000000..fba98b0
--- /dev/null
+++ b/packages/apps/lynq-udpser/lynq_udpser.c
@@ -0,0 +1,56 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <strings.h>
+#include "liblog/liblog.h"
+#include "liblog/lynq_deflog.h"
+
+#define USER_LOG_TAG "UDPSER"
+#define BUF_LEN 128
+#define ERR_SOCK 3
+#define SA struct sockaddr
+
+int main(int argc, const char *argv[])
+{
+ int sockfd;
+ char buf[128];
+
+ LYLOGEINIT(USER_LOG_TAG);
+ sockfd=socket(AF_INET,SOCK_DGRAM,0);
+
+ if(sockfd<0)
+ {
+ LYDBGLOG("fail to sockfd\n");
+ return -1;
+ }
+
+ struct sockaddr_in seraddr,peeraddr;
+ seraddr.sin_family=AF_INET;
+ seraddr.sin_port=htons(50000);
+
+ seraddr.sin_addr.s_addr=inet_addr("0.0.0.0");
+
+ int ret_bind;
+ ret_bind=bind(sockfd,(struct sockaddr *)&seraddr,sizeof(seraddr));
+
+ if(ret_bind<0)
+ {
+ LYDBGLOG("fail to bind\n");
+ return -1;
+ }
+
+ int len=sizeof(peeraddr);
+
+ while(1)
+ {
+ bzero(buf,sizeof(buf));
+
+ recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr*)&peeraddr,&len);
+
+ LYVERBLOG("+[udpser]: ser_rcv = %s\n", buf);
+ sendto(sockfd,buf,sizeof(buf),0,(SA *)&peeraddr,len);
+ }
+ return 0;
+}
diff --git a/packages/apps/lynq-udpser/makefile b/packages/apps/lynq-udpser/makefile
new file mode 100644
index 0000000..0a0559f
--- /dev/null
+++ b/packages/apps/lynq-udpser/makefile
@@ -0,0 +1,50 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+ -g -Os \
+ -flto \
+ -fpermissive \
+ -fPIC \
+
+
+
+LOCAL_PATH = .
+
+LOCAL_C_INCLUDES = \
+ -I. \
+ -I$(ROOT)$(includedir)/logger \
+ -I$(ROOT)$(includedir)/liblog \
+ -I$(ROOT)$(includedir)/glib-2.0 \
+ -I$(ROOT)$(libdir)/glib-2.0/include \
+ -I$(ROOT)$(includedir)/dbus-1.0 \
+ -I$(ROOT)$(libdir)/dbus-1.0/include \
+
+
+LOCAL_LIBS := \
+ -L. \
+ -ldl \
+ -lpthread \
+ -llog-ril \
+ -lssl \
+ -lglib-2.0 \
+ -lgobject-2.0 \
+ -lgio-2.0 \
+ -ldbus-1 \
+
+SOURCES = $(wildcard *.c)
+
+EXECUTABLE = lynq-udpser
+
+OBJECTS=$(SOURCES:.c=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+ $(CXX) -shared -Wl,--no-undefined $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o : %.c
+ $(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+ $(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/packages/apps/lynq_dbus_test/src/LICENSE b/packages/apps/lynq_dbus_test/src/LICENSE
new file mode 100644
index 0000000..77f59ed
--- /dev/null
+++ b/packages/apps/lynq_dbus_test/src/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/packages/apps/lynq_dbus_test/src/lynq_dbus_test.c b/packages/apps/lynq_dbus_test/src/lynq_dbus_test.c
new file mode 100644
index 0000000..8a4ea04
--- /dev/null
+++ b/packages/apps/lynq_dbus_test/src/lynq_dbus_test.c
@@ -0,0 +1,263 @@
+#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>
+
+#define TEST_SERVICE "test.lynq" /*well-known bus name */
+#define TEST_DATA_INTERFACE "test.lynq.Data" /*interface name*/
+#define TEST_DATA_PATH "/test/lynq/data" /*object name*/
+GMainLoop *loop = NULL;
+GDBusProxy *proxy = NULL;
+#define LOG_TAG "TEST_CONTROL"
+int test_decrease (int a,int b,int select_argvi){
+ GDBusConnection *c1;
+ GVariant *result;
+ GError *error;
+ GMainLoop *loop;
+ gint32 set_result = -1;
+ RLOGD("%dzqcstart%s, %s, %d",select_argvi, __FILE__, __FUNCTION__, __LINE__);
+ g_type_init();
+ loop = g_main_loop_new(NULL, FALSE);
+ 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,
+ TEST_SERVICE, //bus name
+ TEST_DATA_PATH, //object path
+ TEST_DATA_INTERFACE, // interface name
+ "reduce", // method name
+ g_variant_new ("(ii)", a,select_argvi), //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));
+ g_variant_unref (result);
+ RLOGD("%s, %s, %d,hgh %dzqcend:%d", __FILE__, __FUNCTION__, __LINE__,select_argvi,set_result);
+ //g_main_loop_run (loop);
+ g_main_loop_unref (loop);
+
+ return set_result;
+}
+
+int test_add (int a,int b,int select_argvi){
+ GDBusConnection *c1;
+ GVariant *result;
+ GError *error;
+ GMainLoop *loop;
+ gint32 set_result = -1;
+ RLOGD("%dzqcstart%s, %s, %d",select_argvi, __FILE__, __FUNCTION__, __LINE__);
+ g_type_init();
+ loop = g_main_loop_new(NULL, FALSE);
+ 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,
+ TEST_SERVICE, //bus name
+ TEST_DATA_PATH, //object path
+ TEST_DATA_INTERFACE, // interface name
+ "add", // method name
+ g_variant_new ("(ii)", a,select_argvi), //parameters
+ G_VARIANT_TYPE ("(i)"), // return type
+ G_DBUS_CALL_FLAGS_NONE,
+ 30000,
+ NULL,
+ &error);
+
+
+
+ g_assert_no_error (error);
+ g_assert (result != NULL);
+ g_variant_get(result, "(i)", &(set_result));
+ g_variant_unref (result);
+ RLOGD("%s, %s, %d,hgh %dzqcend:%d", __FILE__, __FUNCTION__, __LINE__,select_argvi,set_result);
+ //g_main_loop_run (loop);
+ g_main_loop_unref (loop);
+
+ return set_result;
+}
+int test_call (int state,int select_argvi){
+ GDBusConnection *c1;
+ GVariant *result;
+ GError *error;
+ GMainLoop *loop;
+ gint32 set_result = -1;
+ RLOGD("select_argvi %d,start %s, %s, %d",select_argvi, __FILE__, __FUNCTION__, __LINE__);
+ g_type_init();
+ loop = g_main_loop_new(NULL, FALSE);
+ 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,
+ TEST_SERVICE, //bus name
+ TEST_DATA_PATH, //object path
+ TEST_DATA_INTERFACE, // interface name
+ "callstate",// method name
+ g_variant_new ("(i)", state,select_argvi),//parameters
+ G_VARIANT_TYPE ("(i)"), // return type
+ G_DBUS_CALL_FLAGS_NONE,
+ 30000,
+ NULL,
+ &error);
+
+
+
+ g_assert_no_error (error);
+ g_assert (result != NULL);
+ g_variant_get(result, "(i)", &(set_result));
+ g_variant_unref (result);
+ RLOGD("%s, %s, %d,hgh %d,state:%d", __FILE__, __FUNCTION__, __LINE__,select_argvi,set_result);
+ //g_main_loop_run (loop);
+ g_main_loop_unref (loop);
+
+ return set_result;
+}
+
+/*
+static GVariantBuilder *
+get_platform_data (void){
+GVariantBuilder builder;
+GVariant *value;
+RLOGD("%s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
+ g_variant_builder_init (&builder, G_VARIANT_TYPE_STRING_ARRAY);
+ RLOGD("%s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
+g_variant_builder_add (&builder, "s", "when");
+g_variant_builder_add (&builder, "s", "in");
+g_variant_builder_add (&builder, "s", "the");
+g_variant_builder_add (&builder, "s", "course");
+RLOGD("%s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
+//value = g_variant_builder_end (&builder);
+return g_variant_builder_end (&builder);
+}
+
+void gvariant_test(){
+ GVariant *value;
+ GVariantIter *iter;
+ gchar *str;
+ g_variant_get (get_platform_data(), "as", &iter);
+ while (g_variant_iter_loop (iter, "s", &str))
+ RLOGD("%s, %s, %d,%s\n", __FILE__, __FUNCTION__, __LINE__,str);
+ g_variant_iter_free (iter);
+}
+void gvariant_test2(int a,int b,int select_argvi,GVariant*parameters){
+ test_add (a, b, select_argvi,parameters);
+}
+int test_add (int a,int b,int select_argvi){
+ //,GVariant*parameters){
+ GDBusConnection *c1;
+ GVariant *result;
+ GVariantBuilder builder;
+ GError *error;
+ GMainLoop *loop;
+ gint32 set_result = -1;
+ RLOGD("%dzqcstart%s, %s, %d",select_argvi, __FILE__, __FUNCTION__, __LINE__);
+ //if(parameters == NULL)
+ //RLOGD("%s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
+
+ g_type_init();
+ loop = g_main_loop_new(NULL, FALSE);
+ 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));
+ RLOGD("%s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
+ g_variant_builder_init (&builder, G_VARIANT_TYPE_STRING_ARRAY);
+ RLOGD("%s, %s, %d", __FILE__, __FUNCTION__, __LINE__);
+ g_variant_builder_add (&builder, "s", "when");
+ g_variant_builder_add (&builder, "s", "in");
+ g_variant_builder_add (&builder, "s", "the");
+ g_variant_builder_add (&builder, "s", "course");
+ result = g_dbus_connection_call_sync (c1,
+ TEST_SERVICE, //bus name
+ TEST_DATA_PATH, //object path
+ TEST_DATA_INTERFACE, // interface name
+ "add", // method name
+ g_variant_new ("(as)", builder), //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));
+ g_variant_unref (result);
+ RLOGD("%s, %s, %d,hgh %dzqcend:%d", __FILE__, __FUNCTION__, __LINE__,select_argvi,set_result);
+ //g_main_loop_run (loop);
+ g_main_loop_unref (loop);
+
+ return set_result;
+}
+*/
+int main(int agrc, char** argv)
+{
+ int select_argvi = 99;
+ if(argv[1] != NULL)
+ {
+ select_argvi = atoi(argv[1]);
+ }
+ for(int i=1;i<agrc;i++)
+ {
+ printf("initGDBus:%d\n",atoi(argv[i]));
+ }
+ if(select_argvi == 1)
+ {
+ for(int i=0;i<10000;i++)
+ {
+ //gvariant_test2(i,5,select_argvi,get_platform_data());
+ test_add(i,5,select_argvi);
+ //gvariant_test();
+ }
+ }
+ else if(select_argvi == 0)
+ {
+ for(int i=0;i<10000;i++)
+ {
+ //gvariant_test2(i,5,select_argvi,get_platform_data());
+ test_decrease(i,5,select_argvi);
+ //gvariant_test();
+ }
+ }
+ else if(select_argvi == 2)
+ {
+ for(int i=0;i<10;i++)
+ {
+ //gvariant_test2(i,5,select_argvi,get_platform_data());
+ test_call(i,select_argvi);
+ //gvariant_test();
+ }
+ }
+ else
+ {
+ RLOGD("other test");
+ }
+ while(1){sleep(10);}
+ return 0;
+}
+
diff --git "a/packages/apps/lynq_dbus_test/src/lynq_testprocess\050gpio\051.tmp" "b/packages/apps/lynq_dbus_test/src/lynq_testprocess\050gpio\051.tmp"
new file mode 100644
index 0000000..c07e271
--- /dev/null
+++ "b/packages/apps/lynq_dbus_test/src/lynq_testprocess\050gpio\051.tmp"
@@ -0,0 +1,144 @@
+#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>
+#define GPIO_SERVICE "lynq.gpio" /*well-known bus name */
+#define GPIO_DATA_INTERFACE "lynq.gpio.Data" /*interface name*/
+#define GPIO_DATA_PATH "/lynq/gpio/data" /*object name*/
+GMainLoop *loop = NULL;
+GDBusProxy *proxy = NULL;
+#define LOG_TAG "GPIO_CONTROL"
+int set_gpio (gchar * mode,guint *gpio_numb,guint param)
+{
+ GDBusConnection *c1;
+ GVariant *result;
+ GError *error;
+ guint set_result = -1;
+ g_type_init();
+ loop = g_main_loop_new(NULL, FALSE); /** create main loop, but do not start it.*/
+ c1 = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, 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));
+ g_variant_unref (result);
+ g_main_loop_run (loop);
+ g_main_loop_unref (loop);
+ return set_result;
+}
+int get_gpio (guint *gpio_numb)
+{
+ GDBusConnection *c1;
+ GVariant *result;
+ GError *error;
+ guint parm=0;
+ const gchar *set_result;
+ const gchar *mode ="gpio";
+ if(set_gpio(mode,gpio_numb,parm)== -1)
+ {
+ RLOGD("get_gpio number error");
+ return -1;
+ }
+ c1 = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, 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 */
+ "getGpio", /* method name */
+ NULL, /* parameters */
+ G_VARIANT_TYPE ("(s)"), /* return type */
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ g_assert_no_error (error);
+ g_assert (result != NULL);
+ g_variant_get(result, "((s))", &(set_result));
+ RLOGD("get_gpio,%s",set_result);
+ g_variant_unref (result);
+ return 1;
+}
+void proxy_ready(GObject *source, GAsyncResult *result, gpointer user_data) {
+ GError *error;
+
+ error = NULL;
+ proxy = g_dbus_proxy_new_for_bus_finish(result, &error);
+ if (proxy == NULL) {
+ RLOGE("create proxy fail");
+ return ;
+ }
+ RLOGD("proxy is ready");
+ gulong signal_handler_id;
+
+ // signal_handler_id = g_signal_connect(proxy, "g-signal",
+ // G_CALLBACK (proxy_signals_on_signal), NULL);
+ // if (signal_handler_id == 0) {
+ // RLOGE("listen singal fail!");
+ // }
+}
+
+void* init_data_gdbus_cb(void *param)
+{
+ /* all the tests rely on a shared main loop */
+ loop = g_main_loop_new(NULL, FALSE);
+
+ g_dbus_proxy_new_for_bus(G_BUS_TYPE_SYSTEM,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL, /* GDBusInterfaceInfo */
+ GPIO_SERVICE, /* name */
+ GPIO_DATA_PATH, /* object path */
+ GPIO_DATA_INTERFACE, /* interface */
+ NULL, /* GCancellable */
+ proxy_ready,
+ NULL);
+
+ g_main_loop_run(loop);
+
+ RLOGD("data gdbus main loop run()");
+ if(proxy != NULL) {
+ g_object_unref (proxy);
+ }
+ if(loop != NULL) {
+ g_main_loop_unref(loop);
+ }
+}
+
+
+void startGdbusLoop(void)
+{
+ pthread_t gpioThread;
+
+ RLOGD("startGdbusLoop()");
+ // pthread_mutex_lock(&s_startupMutex);
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
+ int result = pthread_create(&gpioThread, &attr, init_data_gdbus_cb, NULL);
+ if (result != 0) {
+ RLOGW("Failed to create gdbus thread: %s", strerror(result));
+ //goto done;
+ }
+//done:
+ // pthread_mutex_unlock(&s_startupMutex);
+}
diff --git a/packages/apps/lynq_dbus_test/src/makefile b/packages/apps/lynq_dbus_test/src/makefile
new file mode 100644
index 0000000..7963d4a
--- /dev/null
+++ b/packages/apps/lynq_dbus_test/src/makefile
@@ -0,0 +1,65 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+ -g -Os \
+ -flto \
+ -DRIL_SHLIB \
+ -DATCI_PARSE \
+ -DKEEP_ALIVE \
+ -D__LINUX_OS__ \
+ -DECALL_SUPPORT
+
+CXXFLAGS = -fpermissive
+LOCAL_PATH = .
+#CFLAGS = $(LOCAL_CFLAGS) -std=c99
+#CXXFLAGS = $(LOCAL_CFLAGS) -std=gnu++14
+$(warning ################# ZHOUQUNCHAO ROOT: $(ROOT),includedir:$(includedir),LOCAL_PATH:$(LOCAL_PATH))
+LOCAL_C_INCLUDES = \
+ -I. \
+ -I$(LOCAL_PATH) \
+ -I$(ROOT)$(includedir)/logger \
+ -I$(ROOT)$(includedir)/vendor-ril \
+ -I$(ROOT)$(includedir)/gstreamer-1.0 \
+ -I$(ROOT)$(includedir)/glib-2.0 \
+ -I$(ROOT)$(libdir)/glib-2.0/include \
+ -I$(ROOT)$(libdir)/gstreamer-1.0/include\
+ -I$(ROOT)$(includedir)/dbus-1.0 \
+ -I$(ROOT)$(libdir)/dbus-1.0/include \
+
+LOCAL_C_INCLUDES+=$(DNS_FLAGS)
+
+LOCAL_LIBS := \
+ -L. \
+ -ldl \
+ -lstdc++ \
+ -llog \
+ -lcutils \
+ -lutils \
+ -lpthread \
+ -lpal \
+ -lglib-2.0 \
+ -lgobject-2.0 \
+ -lgio-2.0 \
+ -lapn \
+ -ldbus-1 \
+
+LOCAL_SRC_FILES_CPP = $(wildcard *.cpp)
+LOCAL_SRC_FILES_C = $(wildcard *.c)
+EXECUTABLE = lynq_dbus_test
+
+OBJECTS=$(LOCAL_SRC_FILES_CPP:.cpp=.o) $(LOCAL_SRC_FILES_C:.c=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+ $(CXX) $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o: %.c
+ $(warning ----->build $<)
+ $(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+%.o : %.cpp
+ $(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+ $(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/packages/apps/power-test/LICENSE b/packages/apps/power-test/LICENSE
new file mode 100644
index 0000000..77f59ed
--- /dev/null
+++ b/packages/apps/power-test/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/packages/apps/power-test/makefile b/packages/apps/power-test/makefile
new file mode 100644
index 0000000..979de7b
--- /dev/null
+++ b/packages/apps/power-test/makefile
@@ -0,0 +1,47 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+ -g -Os \
+ -flto \
+ -DRIL_SHLIB \
+ -DATCI_PARSE \
+ -DKEEP_ALIVE \
+ -D__LINUX_OS__ \
+ -DECALL_SUPPORT
+
+CXXFLAGS = -fpermissive
+LOCAL_PATH = .
+#CFLAGS = $(LOCAL_CFLAGS) -std=c99
+#CXXFLAGS = $(LOCAL_CFLAGS) -std=gnu++14
+$(warning ################# ZHOUQUNCHAO ROOT: $(ROOT),includedir:$(includedir),LOCAL_PATH:$(LOCAL_PATH))
+LOCAL_C_INCLUDES = \
+ -I. \
+ -I$(LOCAL_PATH) \
+
+LOCAL_C_INCLUDES+=$(DNS_FLAGS)
+
+LOCAL_LIBS := \
+ -L. \
+ -ldl \
+ -lstdc++ \
+
+LOCAL_SRC_FILES_CPP = $(wildcard *.cpp)
+LOCAL_SRC_FILES_C = $(wildcard *.c)
+EXECUTABLE = power-test
+
+OBJECTS=$(LOCAL_SRC_FILES_CPP:.cpp=.o) $(LOCAL_SRC_FILES_C:.c=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+ $(CXX) $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o: %.c
+ $(warning ----->build $<)
+ $(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+%.o : %.cpp
+ $(CXX) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+.PHONY: clean
+clean:
+ $(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/packages/apps/power-test/power-test.c b/packages/apps/power-test/power-test.c
new file mode 100644
index 0000000..94b3f53
--- /dev/null
+++ b/packages/apps/power-test/power-test.c
@@ -0,0 +1,28 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+void lynq_power_mode(char *power_mode)
+{
+ char gyCmd[64] = {0};
+ sprintf(gyCmd,"sh /etc/powerscript/power_mode.sh %s",power_mode);
+ system(gyCmd);
+}
+
+
+int main(int argc, char *argv[])
+{
+ if(argc==1){
+ printf("pls choose power mode\n");
+ return -1;
+ }
+ if(!strcmp(argv[1],"flight")){
+ lynq_power_mode(argv[1]);
+ }else if(!strcmp(argv[1],"standby")){
+ lynq_power_mode(argv[1]);
+ }else{
+ printf("invalid power mode\n");
+ }
+
+ return 0;
+}
\ No newline at end of file
diff --git a/packages/apps/power-test/powerscript/power_mode.sh b/packages/apps/power-test/powerscript/power_mode.sh
new file mode 100644
index 0000000..7d2ed29
--- /dev/null
+++ b/packages/apps/power-test/powerscript/power_mode.sh
@@ -0,0 +1,25 @@
+#!/bin/sh
+
+case "$1" in
+ "flight")
+ echo "Sys flight mode" >/dev/console
+ echo 11 | emdlogger_ctrl ##set log status
+ sleep 1
+ mdlogctlstop ##stop modem log
+ echo mem > /sys/power/autosleep ##set autosleep modem
+ /usr/bin/telephony & ##initialize Ril function.
+ sleep 5
+ sh/usr/bin/demoscript/DSDS/set_default_sim_all_except_data.sh 0 ##switch sim card 0
+ echo "RIL_REQUEST_RADIO_POWER 0" > dev/udp/127.0.0.1/8000 ##turn off radio off sim card 0
+ sh/usr/bin/demoscript/DSDS/set_default_sim_all_except_data.sh 1 ##switch sim card 1
+ echo "RIL_REQUEST_RADIO_POWER 0" >/dev/udp/127.0.0.1/8000 ##turn off radio off sim card 1
+ ;;
+
+ "standby")
+ echo "Sys standby mode" >/dev/console
+ ;;
+
+ *)
+ echo $0 'power - start system'
+ ;;
+esac
\ No newline at end of file
diff --git a/packages/apps/power-test/powerscript/standby_mode.sh b/packages/apps/power-test/powerscript/standby_mode.sh
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/packages/apps/power-test/powerscript/standby_mode.sh