[Feature]rgmii/lynq-low-power
Change-Id: Ifeee65004ab690ef1f9cbfa815610b4efcf02c37
diff --git a/meta/meta-mediatek-mt2731/recipes-lynq/lynq-low-power/lynq-low-power.bb b/meta/meta-mediatek-mt2731/recipes-lynq/lynq-low-power/lynq-low-power.bb
new file mode 100755
index 0000000..53af55c
--- /dev/null
+++ b/meta/meta-mediatek-mt2731/recipes-lynq/lynq-low-power/lynq-low-power.bb
@@ -0,0 +1,30 @@
+inherit externalsrc package
+
+DESCRIPTION = "function test"
+LICENSE = "CLOSED"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=e1696b147d49d491bcb4da1a57173fff"
+DEPENDS += "platform-libs liblynq-sim"
+inherit workonsrc
+WORKONSRC = "${TOPDIR}/../src/lynq/packages/apps/lynq-low-power/src"
+
+TARGET_CC_ARCH += "${LDFLAGS}"
+
+#Parameters passed to do_compile()
+EXTRA_OEMAKE = "'RAT_CONFIG_C2K_SUPPORT = ${RAT_CONFIG_C2K_SUPPORT}'\
+ 'MTK_MULTI_SIM_SUPPORT = ${MTK_MULTI_SIM_SUPPORT}'\
+ 'TARGET_PLATFORM = ${TARGET_PLATFORM}'"
+
+#INHIBIT_PACKAGE_STRIP = "1"
+do_compile () {
+ if test "${PACKAGE_ARCH}" = "cortexa7hf-vfp-vfpv4-neon" || test "${PACKAGE_ARCH}" = "cortexa7hf-neon-vfpv4"; then
+ oe_runmake all ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -mhard-float"
+ else
+ oe_runmake all ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST}"
+ fi
+}
+
+do_install() {
+ install -d ${D}${bindir}/
+ install -m 0755 ${S}/lynq-low-power ${D}${bindir}/
+ install -d ${D}${includedir}
+}
diff --git a/meta/meta-mediatek-mt2731/recipes-lynq/packagegroups/packagegroup-lync-mt2731.bb b/meta/meta-mediatek-mt2731/recipes-lynq/packagegroups/packagegroup-lync-mt2731.bb
index 6fa3a85..f20ac38 100755
--- a/meta/meta-mediatek-mt2731/recipes-lynq/packagegroups/packagegroup-lync-mt2731.bb
+++ b/meta/meta-mediatek-mt2731/recipes-lynq/packagegroups/packagegroup-lync-mt2731.bb
@@ -22,5 +22,6 @@
lynq-logrotate-service \
lynq-konoda-rock \
lynq-atsvc \
+ lynq-low-power \
liblynq-logdata-handle \
"
diff --git a/src/lynq/framework/lynq-atsvc/src/factory/lynq_factory.cpp b/src/lynq/framework/lynq-atsvc/src/factory/lynq_factory.cpp
index a8ef998..c88ae9f 100755
--- a/src/lynq/framework/lynq-atsvc/src/factory/lynq_factory.cpp
+++ b/src/lynq/framework/lynq-atsvc/src/factory/lynq_factory.cpp
@@ -88,30 +88,64 @@
return 0;
}
+/**
+ * @brief parse ipv4 eg:192.168.131.222 ->192.168.131.1
+ * @param buf My Param doc
+ */
+static void parse_ipv4(char *buf)
+{
+ char *p = buf;
+ int cnt = 0;
+ while(*p != '\0')
+ {
+ if(*p == '.')
+ {
+ cnt++;
+ if(cnt == 3)
+ {
+ *p++;
+ *p = '1';
+ *p++;
+ *p = '\0';
+ }
+ }
+ *p++;
+ }
+
+}
+
void *thread_test_RGMII(void *arg){
FILE *fp;
- fp=popen("ping -c 4 baidu.com 2>&1", "r");
+ char ipv4[128] = {0};
+ fp= popen("ifconfig 'eth0' | grep \"inet addr\" | cut -f 2 -d \":\" | cut -f 1 -d \" \" 2>&1", "r");
if(NULL == fp){
- printf("popen errorn");
+ lynq_factory_response_ttyGS3("popen errorn\n");
return 0;
}
- char lynq_factory_buf[1024] = {0};
- if(NULL == fgets(lynq_factory_buf,sizeof(lynq_factory_buf),fp)){
- lynq_factory_response_ttyGS3("UNKONE ERROR\n");
+ fgets(ipv4,sizeof(ipv4),fp);
+ if(strstr(ipv4, "error"))
+ {
+ lynq_factory_response_ttyGS3("RGMII don't insert\n");
+ return 0;
+ }
+ else
+ {
+ parse_ipv4(ipv4);
+ char cmd[128] = {0};
+ sprintf(cmd, "%s %s %s", "ping -c 4", ipv4, "2>&1");
+ fp=popen(cmd, "r");
+ if(NULL == fp){
+ lynq_factory_response_ttyGS3("popen errorn\n");
+ return 0;
+ }
+ char lynq_factory_buf[1024] = {0};
+ while (NULL != fgets(lynq_factory_buf,sizeof(lynq_factory_buf),fp))
+ {
+ lynq_factory_response_ttyGS3(lynq_factory_buf);
+ }
pclose(fp);
return 0;
}
- else{
- lynq_factory_response_ttyGS3(lynq_factory_buf);
- if(strstr(lynq_factory_buf, "bad"))
- return 0;
- }
- while (NULL != fgets(lynq_factory_buf,sizeof(lynq_factory_buf),fp))
- {
- lynq_factory_response_ttyGS3(lynq_factory_buf);
- }
- pclose(fp);
- return 0;
}
static void lynq_test_RGMII(void){
diff --git a/src/lynq/framework/lynq-atsvc/src/network.cpp b/src/lynq/framework/lynq-atsvc/src/network.cpp
old mode 100644
new mode 100755
index 639f4c6..9e0dc57
--- a/src/lynq/framework/lynq-atsvc/src/network.cpp
+++ b/src/lynq/framework/lynq-atsvc/src/network.cpp
@@ -345,6 +345,8 @@
signal_strength_printf=atoi(argv[1]);
printf("\nthe signal strength printf log will %s\n", signal_strength_printf == 0 ? "close" : "open");
free(pRI);
+ /*lei add for bugfix of mtk*/
+ return 0;
}
//RIL_REQUEST_MODEM_POWEROFF
int setModemPowerOFF (int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI) {
diff --git a/src/lynq/framework/lynq-atsvc/src/powerManager.cpp b/src/lynq/framework/lynq-atsvc/src/powerManager.cpp
old mode 100644
new mode 100755
index efa8f6d..41effe2
--- a/src/lynq/framework/lynq-atsvc/src/powerManager.cpp
+++ b/src/lynq/framework/lynq-atsvc/src/powerManager.cpp
@@ -104,6 +104,8 @@
}
RLOGD("read_wakeup_reason is %s", buf);
reason = buf;
+ /*lei add for bugfix of mtk*/
+ buf[49]='\0';
fail:
close(fd);
return reason;
diff --git a/src/lynq/lib/liblynq-sim/Makefile b/src/lynq/lib/liblynq-sim/Makefile
index d01b9ca..f34e6b0 100755
--- a/src/lynq/lib/liblynq-sim/Makefile
+++ b/src/lynq/lib/liblynq-sim/Makefile
@@ -2,62 +2,85 @@
RM = rm -f
LOCAL_CFLAGS := -Wall \
+ -std=gnu++14 \
-g -Os \
-flto \
-fPIC \
- -DRIL_SHLIB \
- -DATCI_PARSE \
- -DKEEP_ALIVE \
- -DECALL_SUPPORT
+ -fpermissive \
+$(warning ################# C2K support: $(RAT_CONFIG_C2K_SUPPORT))
+ifeq ($(strip $(RAT_CONFIG_C2K_SUPPORT)), yes)
+ LOCAL_CFLAGS += -DC2K_SUPPORT
+endif
-$(warning ################# lynq network demo ROOT: $(ROOT),includedir:$(includedir))
+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
+
+$(warning ################# RITA ROOT: $(ROOT),includedir:$(includedir))
LOCAL_PATH = .
LOCAL_C_INCLUDES = \
-I. \
- -I$(LOCAL_PATH)/include/ \
+ -I$(LOCAL_PATH)/include \
+ -I$(ROOT)$(includedir)/vendor-ril \
-I$(ROOT)$(includedir)/logger \
-I$(ROOT)$(includedir)/liblog \
- -I$(ROOT)$(includedir)/vendor-ril \
- -I$(ROOT)$(includedir)/include \
-
LOCAL_LIBS := \
-L. \
-ldl \
+ -lpthread \
+ -lbinder \
+ -lutils \
+ -lcutils \
-llog \
- -lbinder \
- -lpthread \
-llynq-log \
- -lutils \
- -lcutils \
-SOURCES = $(wildcard *.cpp wildcard *.h src/*.cpp)
+SOURCES = $(wildcard *.c wildcard *.h src/*.cpp)
EXECUTABLE = liblynq-sim.so
OBJECTS=$(SOURCES:.c=.o)
-all: $(EXECUTABLE)
+
+.PHONY: build clean install pack_rootfs
+
+all: build
$(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 $<
+ $(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
build: $(EXECUTABLE)
$(warning ########## build $(EXECUTABLE) ##########)
install:
- $(warning ################# lynq network demo EXECUTABLE: $(EXECUTABLE),base:$(base_libdir))
mkdir -p $(ROOT)$(base_libdir)/
install $(EXECUTABLE) $(ROOT)$(base_libdir)/
pack_rootfs:
- $(warning ################# lynq network demo PACK: $(PACK_INITRAMFS_TO),base:$(base_libdir))
mkdir -p $(PACK_INITRAMFS_TO)$(base_libdir)/
cp -af $(EXECUTABLE) $(PACK_INITRAMFS_TO)$(base_libdir)/
$(CROSS)strip $(PACK_INITRAMFS_TO)$(base_libdir)/$(EXECUTABLE)
@@ -68,5 +91,3 @@
.PHONY: clean
clean:
$(RM) $(OBJECTS) $(EXECUTABLE)
-
-
diff --git a/src/lynq/lib/liblynq-sim/include/lynq_sim.h b/src/lynq/lib/liblynq-sim/include/lynq_sim.h
index 9b9593f..846a1ec 100755
--- a/src/lynq/lib/liblynq-sim/include/lynq_sim.h
+++ b/src/lynq/lib/liblynq-sim/include/lynq_sim.h
@@ -5,80 +5,51 @@
# Version: V1.0
# LastChange: 2020-07-29
# History:
-# If you need to use any API under lynq_sim, you must first call the init_sim() function to initialize these functions.
+# If you need to use any API under lynq_sim, you must first call the lynq_sim_init() function to initialize these functions.
=============================================================================*/
#ifndef __LYNQ_SIM__
#define __LYNQ_SIM__
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <arpa/inet.h>
-#include <string.h>
-#include <unistd.h>
-#include <binder/Parcel.h>
-#include <log/log.h>
-#include <cutils/jstring.h>
-#include <pthread.h>
-#define MAX_BUF 20
-#define MAX_NUM 80
#ifdef __cplusplus
-
-#define RIL_REQUEST_GET_SIM_STATUS 1
-#define RIL_REQUEST_GET_IMSI 11
-#define RIL_REQUEST_QUERY_ICCID 2026
-#define RIL_REQUEST_SET_FACILITY_LOCK 43
-#define RIL_REQUEST_QUERY_FACILITY_LOCK 42
-#define RIL_REQUEST_ENTER_SIM_PIN 2
-#define RIL_REQUEST_ENTER_SIM_PUK 3
-#define RIL_REQUEST_CHANGE_SIM_PIN 6
-#define RIL_REQUEST_OEM_HOOK_RAW 59
-
-
extern "C" {
#endif
-
-#define MAX_LEN 1024*8
-
-typedef struct{
- int uToken;
- int request;
- int paramLen;
- char param[MAX_LEN];
-}lynq_client_t;
-
-typedef struct
-{
- char *MCCMCN;
- char *buf;
- char *MCN;
-}FindOperator;
-
-
-
-
-
-
int lynq_get_sim_status(int *card_status);
int lynq_get_imsi(char buf[]);
-
-/*add by lei*/
int lynq_sim_init(int utoken);
int lynq_sim_deinit(void);
-int lynq_enable_pin(char *pin);
-int lynq_disable_pin(char *pin);
-int lynq_query_operator(char buf[]);
+int lynq_enable_pin(char pin[]);
+int lynq_disable_pin(char pin[]);
int lynq_get_iccid(char buf[]);
int lynq_query_pin_lock(char *pin,int buf[]);
int lynq_verify_pin(char *pin);
int lynq_change_pin(char *old_pin, char *new_pin);
int lynq_unlock_pin(char *puk, char *pin);
int lynq_query_phone_number(char buf[]);
-/*add by lei*/
+int lynq_switch_card(int slot);
+int lynq_screen(int num);
+int lynq_get_imei(char buf[]);
+
+/**
+ * @brief Request SIM I/O operation.
+ * This is similar to the TS 27.007 "restricted SIM" operation
+ * where it assumes all of the EF selection will be done by the callee.
+ * @param list type: [IN] list[0]:one of the commands listed for TS 27.007 +CRSM.(command)
+ * type: [IN] list[1]:EF id(fileid)
+ * type: [IN] list[2]:offset(p1)
+ * type: [IN] list[3]:offset(p2)
+ * type: [IN] list[4]:response len,sometimes needn't care(p3)
+ * @param path type: [IN] "pathid" from TS 27.007 +CRSM command.
+ type: [IN] Path is in hex asciii format eg "7f205f70"
+ type: [IN] Path must always be provided.
+ * @param data type: [IN] May be NULL
+ * @param pin2 type: [IN] May be NULL
+ * @param aidPtr type: [IN] AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value.
+ * @param sw type: [OUT]
+ * @param simResponse type: [OUT] response
+ * @return int
+ */
+int lynq_req_sim_io(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse);
+
#ifdef __cplusplus
diff --git a/src/lynq/lib/liblynq-sim/include/operator.h b/src/lynq/lib/liblynq-sim/include/operator.h
deleted file mode 100755
index 8001868..0000000
--- a/src/lynq/lib/liblynq-sim/include/operator.h
+++ /dev/null
@@ -1,32 +0,0 @@
-
-/*=============================================================================
-** FileName: command.h
-** Desc: about operator
-** Author: lei
-** Version: V1.0
-** LastChange: 2021-02-26
-** History:
-=============================================================================*/
-
-{"45400", "CSL", "HK" },
-{"45401", "NEW WORLD", "HK" },
-{"45402", "CSL", "HK" },
-{"45404", "Orange", "HK" },
-{"45406", "SMC", "HK" },
-{"45410", "NEW WORLD", "HK" },
-{"45412", "PEOPLES", "HK" },
-{"45416", "SUNDAY", "HK" },
-{"45418", "HK TELECOM", "HK" },
-{"46000", "CHINA MOBILE", "CN" },
-{"46001", "CHN-CUGSM", "CN" },
-{"46002", "CHINA MOBILE", "CN" },
-{"46003", "CHINA TELECOM", "CN" },
-{"46601", "Far EasTone", "TW" },
-{"46606", "TUNTEX", "TW" },
-{"46668", "ACeS", "TW" },
-{"46688", "KGT", "TW" },
-{"46692", "Chunghwa", "TW" },
-{"46693", "MobiTai", "TW" },
-{"46697", "TWN GSM", "TW" },
-{"46699", "TransAsia", "TW" },
-{(char *)NULL, (char *)NULL, (char *)NULL},
\ No newline at end of file
diff --git a/src/lynq/lib/liblynq-sim/src/lynq_sim.cpp b/src/lynq/lib/liblynq-sim/src/lynq_sim.cpp
index 1a1f38e..1c9e500 100755
--- a/src/lynq/lib/liblynq-sim/src/lynq_sim.cpp
+++ b/src/lynq/lib/liblynq-sim/src/lynq_sim.cpp
@@ -6,22 +6,49 @@
# LastChange: 2021-12-29
# History:
=============================================================================*/
-#include <dlfcn.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
#include <string.h>
-#include <stdint.h>
#include <unistd.h>
-#include <fcntl.h>
+#include <binder/Parcel.h>
+#include <log/log.h>
+#include <cutils/jstring.h>
+#include <pthread.h>
#include "lynq_sim.h"
-
-#include <errno.h>
-
-
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#define MAX_BUF 20
+#define MAX_NUM 80
+#define RIL_REQUEST_GET_SIM_STATUS 1
+#define RIL_REQUEST_GET_IMSI 11
+#define RIL_REQUEST_QUERY_ICCID 2026
+#define RIL_REQUEST_SET_FACILITY_LOCK 43
+#define RIL_REQUEST_QUERY_FACILITY_LOCK 42
+#define RIL_REQUEST_ENTER_SIM_PIN 2
+#define RIL_REQUEST_ENTER_SIM_PUK 3
+#define RIL_REQUEST_CHANGE_SIM_PIN 6
+#define RIL_REQUEST_OEM_HOOK_RAW 59
+#define RIL_REQUEST_SCREEN_STATE 61
+#define RIL_REQUEST_SIM_IO 28
+#define LYNQ_REQUEST_SET_DEFAULT_SIM_ALL 8008
+#define MAX_LEN 1024*8
#define MAX_NUM 10
-#define USER_LOG_TAG "LYNQ_SIM"
-
+#define LOG_TAG "LYNQ_SIM"
+#define FLAG_TESS 0
using ::android::Parcel;
#define DEST_PORT 8088
#define DSET_IP_ADDRESS "127.0.0.1"
+
+typedef struct{
+ int uToken;
+ int request;
+ int paramLen;
+ char param[MAX_LEN];
+}lynq_client_t;
+
lynq_client_t client_t;
/* socket文件描述符 */
int len_addr_serv;
@@ -32,35 +59,35 @@
int request = -1;
int slot_id = -1;
int error1 = -1;
+/**
+ * @brief mark call initialization state
+ * 0: deinit state
+ * 1: init state
+ */
+int g_lynq_sim_init_flag = 0;
-FindOperator findOperator[] = {
-#include "include/operator.h"
-};
-
-static FindOperator*find_ope_command (char *name,FindOperator *Class){
- if(name == NULL || Class == NULL){
- return ((FindOperator *)NULL);
- }
- register int i;
- for (i = 0; Class[i].MCCMCN; i++)
- if (strncmp (name, Class[i].MCCMCN, 5) == 0)
- return (&Class[i]);
- return ((FindOperator *)NULL);
-}
+/**
+ * @brief lynq_req_sim_io need to send request
+ */
+char data_buf[32] = {0};
+char pin2_buf[32] = {0};
+char aidPtr_buf[32] = {0};
int lynq_sim_init(int utoken){
- if(utoken < 0){
- printf("init err.");
+ if(g_lynq_sim_init_flag == 1)
+ {
+ RLOGD("lynq_sim_init failed");
return -1;
}
- // LYLOGSET(LOG_INFO);
- // LYLOGEINIT(USER_LOG_TAG);
+ g_lynq_sim_init_flag = 1;
+ if(utoken < 0){
+ return -1;
+ }
Global_uToken = utoken;
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
if (-1 == sock_fd)
{
- printf("socket open err.");
- return -1;
+ return sock_fd;
}
/* 设置address */
memset(&addr_serv, 0, sizeof(addr_serv));
@@ -73,6 +100,12 @@
}
int lynq_sim_deinit(void){
+ if(g_lynq_sim_init_flag == 0)
+ {
+ RLOGD("lynq_sim_deinit failed");
+ return -1;
+ }
+ g_lynq_sim_init_flag = 0;
close(sock_fd);
return 0;
}
@@ -80,21 +113,12 @@
static char * lynqStrdupReadString(Parcel &p) {
size_t stringlen;
const char16_t *s16;
+
s16 = p.readString16Inplace(&stringlen);
return strndup16to8(s16, stringlen);
}
-static void delete_char(char str[],char target){
- int i,j;
- for(i=j=0;str[i]!='\0';i++){
- if(str[i]!=target){
- str[j++]=str[i];
- }
- }
- str[j]='\0';
-}
-
-/*If you need to use any API under lynq_sim, you mustfirst call the init_sim() function to initialize these functions.*/
+/*If you need to use any API under lynq_sim, you mustfirst call the lynq_sim_init() function to initialize these functions.*/
int lynq_get_sim_status(int *card_status)
{
int ret = -1;
@@ -111,21 +135,19 @@
char res_data[MAX_LEN] = {0};
int len1 = sizeof(client_t1.param);
memset(client_t1.param, 0, sizeof(char)*MAX_LEN);
- printf("client_t1 %d\n", sizeof(client_t1));
send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
if(send_num < 0)
{
- perror("sendto error:");
- return ret;
+ RLOGD("sendto error:");
+ return send_num;
}
//get data msg
recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
if(recv_num < 0 || recv_num == 0)
{
- perror("recvfrom step2 fail:");
- return ret;
+ RLOGD("recvfrom step2 fail:");
+ return recv_num;
}
- printf("=====>resp data len<=====:%d,,,%d\n",recv_num,MAX_LEN);
Parcel p;;
p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
p.setDataPosition(0);
@@ -139,7 +161,7 @@
}
return error1;
}
-/*AT> AT+CIMI AT< IMSI*/
+
int lynq_get_imsi(char buf[])
{
int ret = -1;
@@ -158,17 +180,16 @@
send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
if(send_num < 0)
{
- perror("sendto error:");
- return ret;
+ RLOGD("sendto error:");
+ return send_num;
}
//get data msg
recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
if(recv_num < 0 || recv_num == 0)
{
- perror("recvfrom step2 fail:");
- return -1;
+ RLOGD("recvfrom step2 fail:");
+ return recv_num;
}
- printf("=====>resp data len<=====:%d,,,%d\n",recv_num,MAX_LEN);
Parcel p;
p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
p.setDataPosition(0);
@@ -182,7 +203,6 @@
char * test = lynqStrdupReadString(p);
memcpy(buf, test, strlen(test));
}
- printf("---->test<----resp_type=%d,request=%d,slot_id=%d,error=%d\n",resp_type,request,slot_id,error1);
}
return error1;
}
@@ -205,17 +225,16 @@
send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
if(send_num < 0)
{
- perror("sendto error:");
- return ret;
+ RLOGD("sendto error:");
+ return send_num;
}
//get data msg
recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
if(recv_num < 0 || recv_num == 0)
{
- perror("recvfrom step2 fail:");
- return -1;
+ RLOGD("recvfrom step2 fail:");
+ return recv_num;
}
- printf("=====>resp data len<=====:%d,,,%d\n",recv_num,MAX_LEN);
Parcel p;
p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
p.setDataPosition(0);
@@ -229,7 +248,6 @@
char * test = lynqStrdupReadString(p);
memcpy(buf, test, strlen(test));
}
- printf("---->test<----resp_type=%d,request=%d,slot_id=%d,error=%d\n",resp_type,request,slot_id,error1);
}
return error1;
}
@@ -238,6 +256,8 @@
int ret = -1;
if(pin == NULL)
return ret;
+ if(!strlen(pin))
+ return ret;
int send_num = 0;
int recv_num = 0;
char res_data[MAX_LEN] = {0};
@@ -248,18 +268,17 @@
send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
if(send_num < 0)
{
- perror("sendto error:");
- return ret;
+ RLOGD("sendto error:");
+ return send_num;
}
//get data msg
recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
if(recv_num < 0 || recv_num == 0)
{
- perror("recvfrom step2 fail:");
- return -1;
+ RLOGD("recvfrom step2 fail:");
+ return recv_num;
}
- printf("=====>resp data len<=====:%d,,,%d\n",recv_num,MAX_LEN);
Parcel p;
p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
p.setDataPosition(0);
@@ -271,7 +290,6 @@
p.readInt32(&error1);
}
return error1;
-
}
int lynq_disable_pin(char *pin){
@@ -288,17 +306,16 @@
send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
if(send_num < 0)
{
- perror("sendto error:");
- return ret;
+ RLOGD("sendto error:");
+ return send_num;
}
//get data msg
recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
if(recv_num < 0 || recv_num == 0)
{
- perror("recvfrom step2 fail:");
- return -1;
+ RLOGD("recvfrom step2 fail:");
+ return recv_num;
}
- printf("=====>resp data len<=====:%d,,,%d\n",recv_num,MAX_LEN);
Parcel p;
p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
p.setDataPosition(0);
@@ -327,17 +344,16 @@
send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
if(send_num < 0)
{
- perror("sendto error:");
- return ret;
+ RLOGD("sendto error:");
+ return send_num;
}
//get data msg
recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
if(recv_num < 0 || recv_num == 0)
{
- perror("recvfrom step2 fail:");
- return -1;
+ RLOGD("recvfrom step2 fail:");
+ return recv_num;
}
- printf("=====>resp data len<=====:%d,,,%d\n",recv_num,MAX_LEN);
Parcel p;
p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
p.setDataPosition(0);
@@ -349,12 +365,14 @@
p.readInt32(&slot_id);
p.readInt32(&error1);
p.readInt32(&num);
- int *test = (int *)calloc(1, sizeof(int)*num);
- for(int i =0; i <num; i++){
- p.readInt32(&test[i]);
- buf[i] = test[i];
+ if(num > 0){
+ int *test = (int *)calloc(1, sizeof(int)*num);
+ for(int i =0; i <num; i++){
+ p.readInt32(&test[i]);
+ buf[i] = test[i];
+ }
+ free(test);
}
- free(test);
}
return error1;
}
@@ -374,17 +392,16 @@
send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
if(send_num < 0)
{
- perror("sendto error:");
- return ret;
+ RLOGD("sendto error:");
+ return send_num;
}
//get data msg
recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
if(recv_num < 0 || recv_num == 0)
{
- perror("recvfrom step2 fail:");
- return -1;
+ RLOGD("recvfrom step2 fail:");
+ return recv_num;
}
- printf("=====>resp data len<=====:%d,,,%d\n",recv_num,MAX_LEN);
Parcel p;
p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
p.setDataPosition(0);
@@ -402,6 +419,10 @@
int ret = -1;
if(old_pin == NULL || new_pin == NULL)
return ret;
+ if(!strlen(new_pin))
+ return ret;
+ if(!strlen(old_pin))
+ return ret;
int send_num = 0;
int recv_num = 0;
char res_data[MAX_LEN] = {0};
@@ -413,17 +434,16 @@
send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
if(send_num < 0)
{
- perror("sendto error:");
- return ret;
+ RLOGD("sendto error:");
+ return send_num;
}
//get data msg
recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
if(recv_num < 0 || recv_num == 0)
{
- perror("recvfrom step2 fail:");
- return -1;
+ RLOGD("recvfrom step2 fail:");
+ return recv_num;
}
- printf("=====>resp data len<=====:%d,,,%d\n",recv_num,MAX_LEN);
Parcel p;
p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
p.setDataPosition(0);
@@ -452,17 +472,16 @@
send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
if(send_num < 0)
{
- perror("sendto error:");
- return ret;
+ RLOGD("sendto error:");
+ return send_num;
}
//get data msg
recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
if(recv_num < 0 || recv_num == 0)
{
- perror("recvfrom step2 fail:");
- return -1;
+ RLOGD("recvfrom step2 fail:");
+ return recv_num;
}
- printf("=====>resp data len<=====:%d,,,%d\n",recv_num,MAX_LEN);
Parcel p;
p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
p.setDataPosition(0);
@@ -476,9 +495,21 @@
return error1;
}
+static void delete_char(char str[],char target){
+ if(str == NULL){
+ return;
+ }
+ int i,j;
+ for(i=j=0;str[i]!='\0';i++){
+ if(str[i]!=target){
+ str[j++]=str[i];
+ }
+ }
+ str[j]='\0';
+}
+
static int parse_param(char *cmd, char **argv, char buf[]){
if(cmd == NULL || argv == NULL || buf == NULL){
- printf("input error");
return 0;
}
if(strstr(cmd,"ERROR")){
@@ -505,13 +536,6 @@
buf[lengh] = '\0';
delete_char(buf, '"');
}
- else{
- const char *warning = "9001";
- int len = strlen(warning);
- memcpy(buf, warning, len);
- buf[len] = '\0';
- }
-
}
return 0;
}
@@ -531,17 +555,16 @@
send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
if(send_num < 0)
{
- perror("sendto error:");
+ RLOGD("sendto error:");
return ret;
}
//get data msg
recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
if(recv_num < 0 || recv_num == 0)
{
- perror("recvfrom step2 fail:");
- return -1;
+ RLOGD("recvfrom step2 fail:");
+ return recv_num;
}
- printf("=====>resp data len<=====:%d,,,%d\n",recv_num,MAX_LEN);
Parcel p;
p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
p.setDataPosition(0);
@@ -556,7 +579,6 @@
p.readInt32(&error1);
p.readInt32(&num);
if(num == -1){
- memcpy(buf, "-1", 2);
}else{
p.read(test, num);
parse_param(test, argv, buf);
@@ -565,6 +587,216 @@
return error1;
}
+int lynq_get_imei(char buf[]){
+ int ret = -1;
+ if(buf == NULL)
+ return ret;
+ int send_num = 0;
+ int recv_num = 0;
+ int len = 0;
+ char res_data[MAX_LEN] = {0};
+ client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
+ client_t.paramLen = 1;
+ client_t.uToken = Global_uToken;
+ sprintf(client_t.param, "%s\n", "AT+CGSN");
+ send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+ if(send_num < 0)
+ {
+ RLOGD("sendto error:");
+ return ret;
+ }
+ //get data msg
+ recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+ if(recv_num < 0 || recv_num == 0)
+ {
+ RLOGD("recvfrom step2 fail:");
+ return recv_num;
+ }
+ Parcel p;
+ p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+ p.setDataPosition(0);
+ int num = -1;
+ if(p.dataAvail() > 0)
+ {
+ char test[30] = {0};
+ char *argv[5] = {0};
+ p.readInt32(&resp_type);
+ p.readInt32(&request);
+ p.readInt32(&slot_id);
+ p.readInt32(&error1);
+ p.readInt32(&num);
+ if(num == -1){
+ }else{
+ p.read(buf, num);
+ }
+ }
+ return error1;
+}
+
+static int judge(int slot){
+ switch(slot){
+ case 0:
+ return -1;
+ case 1:
+ return -1;
+ }
+ return 0;
+}
+
+int lynq_switch_card(int slot){
+ int ret = -1;
+ if(!judge(slot))
+ return ret;
+ int send_num = 0;
+ char res_data[MAX_LEN] = {0};
+ int len = 0;
+ client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
+ client_t.paramLen = 1;
+ client_t.uToken = Global_uToken;
+ sprintf(client_t.param, "%d\n", slot);
+ send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+ if(send_num < 0)
+ {
+ RLOGD("sendto error:");
+ return send_num;
+ }
+ return 0;
+}
+
+int lynq_screen(int num){
+ int ret = -1;
+ if(!judge(num))
+ return ret;
+ int send_num = 0;
+ char res_data[MAX_LEN] = {0};
+ int len = 0;
+ client_t.request = RIL_REQUEST_SCREEN_STATE;
+ client_t.paramLen = 1;
+ client_t.uToken = Global_uToken;
+ sprintf(client_t.param, "%d\n", num);
+ send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+ if(send_num < 0)
+ {
+ RLOGD("sendto error:");
+ return send_num;
+ }
+ return 0;
+}
+
+/**
+ * @brief Check whether the input is valid for lynq_req_sim_io api
+ * @param list type: [IN] list[0]:one of the commands listed for TS 27.007 +CRSM.(command)
+ * type: [IN] list[1]:EF id(fileid)
+ * type: [IN] list[2]:offset(p1)
+ * type: [IN] list[3]:offset(p2)
+ * type: [IN] list[4]:response len,sometimes needn't care(p3)
+ * @param path type: [IN] "pathid" from TS 27.007 +CRSM command.
+ type: [IN] Path is in hex asciii format eg "7f205f70"
+ type: [IN] Path must always be provided.
+ * @param data type: [IN] May be NULL
+ * @param pin2 type: [IN] May be NULL
+ * @param aidPtr type: [IN] AID value, See ETSI 102.221 8.1 and 101.220 4, NULL if no value.
+ * @param sw type: [OUT]
+ * @param simResponse type: [OUT] response
+ * @return int
+ */
+static int judge_illegal(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
+{
+ if(list == NULL)
+ {
+ return -1;
+ }
+ if(path == NULL)
+ {
+ return -1;
+ }
+ if(sw == NULL){
+ return -1;
+ }
+ if(simResponse == NULL){
+ return -1;
+ }
+ if(data == NULL)
+ {
+ memcpy(data_buf, "null", 4);
+ }
+ else
+ {
+ bzero(data_buf,32);
+ memcpy(data_buf, data, strlen(data));
+ }
+ if(pin2 == NULL)
+ {
+ memcpy(pin2_buf, "null", 4);
+ }
+ else
+ {
+ bzero(pin2_buf,32);
+ memcpy(pin2_buf, data, strlen(data));
+ }
+ if(aidPtr == NULL)
+ {
+ memcpy(aidPtr_buf, "null", 4);
+ }
+ else
+ {
+ bzero(aidPtr_buf,32);
+ memcpy(aidPtr_buf, data, strlen(data));
+ }
+ return 0;
+}
+
+int lynq_req_sim_io(int list[5], char *path, char *data, char *pin2, char *aidPtr, int sw[2], char *simResponse)
+{
+ int ret = -1;
+ if(judge_illegal(list, path, data, pin2, aidPtr, sw, simResponse))
+ {
+ return ret;
+ }
+ int send_num = 0;
+ int recv_num = 0;
+ char res_data[MAX_LEN] = {0};
+ int len = 0;
+ client_t.request = RIL_REQUEST_SIM_IO;
+ client_t.paramLen = 9;
+ client_t.uToken = Global_uToken;
+ sprintf(client_t.param, "%d %d %s %d %d %d %s %s %s\n", list[0], list[1], path, list[2], list[3], list[4], data_buf, pin2_buf, aidPtr_buf);
+ send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+ if(send_num < 0)
+ {
+ RLOGD("sendto error:");
+ return send_num;
+ }
+ recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+ if(recv_num < 0 || recv_num == 0)
+ {
+ RLOGD("recvfrom step2 fail:");
+ return recv_num;
+ }
+ Parcel p;
+ p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+ p.setDataPosition(0);
+ int num = -1;
+ if(p.dataAvail() > 0)
+ {
+ char test[30] = {0};
+ char *argv[5] = {0};
+ p.readInt32(&resp_type);
+ p.readInt32(&request);
+ p.readInt32(&slot_id);
+ p.readInt32(&error1);
+ if(!error1)
+ {
+ p.readInt32(&sw[0]);
+ p.readInt32(&sw[1]);
+ char * test = lynqStrdupReadString(p);
+ memcpy(simResponse, test, strlen(test));
+ }
+
+ }
+ return error1;
+}
+#if FLAG_TESS
int lynq_query_operator(char buf[]){
int32_t token = -1;
if(buf == NULL)
@@ -595,8 +827,19 @@
return token;
}
}
+FindOperator findOperator[] = {
+#include "operator.h"
+};
+static FindOperator*find_ope_command (char *name,FindOperator *Class){
+ if(name == NULL || Class == NULL){
+ return ((FindOperator *)NULL);
+ }
+ register int i;
+ for (i = 0; Class[i].MCCMCN; i++)
+ if (strncmp (name, Class[i].MCCMCN, 5) == 0)
+ return (&Class[i]);
+ return ((FindOperator *)NULL);
+}
-
-
-
+#endif
diff --git a/src/lynq/packages/apps/lynq-low-power/src/main.cpp b/src/lynq/packages/apps/lynq-low-power/src/main.cpp
new file mode 100755
index 0000000..c2822aa
--- /dev/null
+++ b/src/lynq/packages/apps/lynq-low-power/src/main.cpp
@@ -0,0 +1,55 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <include/lynq_sim.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*Quick accept array*/
+void * thread_test(void * arg)
+{
+ FILE *fp;
+ char buf[1024*3] = {0};
+ sprintf(buf, "echo 11 | emdlogger_ctrl 2>&1");
+ fp=popen(buf, "r");
+ if(!fp){
+ perror("popen:");
+ }
+ while(fgets(buf, 4072, fp) != NULL){}
+ pclose(fp);
+ return 0;
+}
+
+int main(void){
+ lynq_sim_init(2022);
+ pthread_t thid = -1;
+ int ret = pthread_create(&thid, NULL, thread_test, NULL);
+ if(ret != 0){
+ printf("pthread_create error!!!");
+ return ret;
+ }
+ system("mdlogctl stop");
+ system("echo mem > /sys/power/autosleep");
+ system("echo 0 > /dev/wmtWifi");
+ system("echo 7 9 0 > /proc/driver/wmt_dbg");
+ /*Notify the modem to disable some URC reporting */
+ ret = lynq_screen(0);
+ printf("ret %d\n", ret);
+ /*Notify the modem to disable some URC reporting */
+ system("disown -a");
+ if(thid == -1)
+ {
+ return -1;
+ }
+ ret = pthread_join(thid,NULL);
+ if(ret != 0){
+ printf("pthread_join error!!!");
+ return ret;
+ }
+ return 0;
+}
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/src/lynq/packages/apps/lynq-low-power/src/makefile b/src/lynq/packages/apps/lynq-low-power/src/makefile
new file mode 100755
index 0000000..44a4021
--- /dev/null
+++ b/src/lynq/packages/apps/lynq-low-power/src/makefile
@@ -0,0 +1,85 @@
+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 \
+ -DLIB_GNSS_HAL_DIR='"$(libdir)"'
+
+LOCAL_C_INCLUDES+=$(DNS_FLAGS)
+
+LOCAL_LIBS := \
+ -L. \
+ -ldl \
+ -lstdc++ \
+ -llog \
+ -lcutils \
+ -lutils \
+ -lbinder \
+ -llynq-log \
+ -lpthread \
+ -llynq-sim \
+
+LOCAL_SRC_FILES_CPP = $(wildcard *.cpp gpio/*.cpp ril/*.cpp)
+LOCAL_SRC_FILES_C = $(wildcard *.c gps/*.c)
+EXECUTABLE = lynq-low-power
+
+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)