[Feature][T800][task-view-2029][RIL] support switch SIM slot function
and APIs
Only Configure:No
Affected branch:ZK-first-oem-release
Affected module:RIL
Is it affected on:only mtk
Self-test:Yes
Doc Update: No
Change-Id: I618679f0d13a09cd3dba022254184db7e0d8aa14
diff --git a/LYNQ_PUBLIC/IC_meta/mtk/2735/liblynq-sim/liblynq-sim.bb b/LYNQ_PUBLIC/IC_meta/mtk/2735/liblynq-sim/liblynq-sim.bb
index fad21ae..0077bfa 100755
--- a/LYNQ_PUBLIC/IC_meta/mtk/2735/liblynq-sim/liblynq-sim.bb
+++ b/LYNQ_PUBLIC/IC_meta/mtk/2735/liblynq-sim/liblynq-sim.bb
@@ -1,9 +1,9 @@
inherit externalsrc package
-DESCRIPTION = "liblynq-uci.so demo"
+DESCRIPTION = "liblynq-sim.so"
LICENSE = "CLOSED"
LIC_FILES_CHKSUM = "file://LICENSE;md5=e1696b147d49d491bcb4da1a57173fff"
-DEPENDS += "platform-libs platform-libs-common libpal liblynq-log libvendor-ril"
+DEPENDS += "platform-libs platform-libs-common libpal liblynq-log libvendor-ril lynq-ril-service"
inherit workonsrc
WORKONSRC = "${TOPDIR}/../LYNQ_PUBLIC/common_src/lib/liblynq-sim/"
diff --git a/LYNQ_PUBLIC/IC_meta/mtk/2735/lynq-ril-service/lynq-ril-service.bb b/LYNQ_PUBLIC/IC_meta/mtk/2735/lynq-ril-service/lynq-ril-service.bb
index fafc153..f4d0133 100755
--- a/LYNQ_PUBLIC/IC_meta/mtk/2735/lynq-ril-service/lynq-ril-service.bb
+++ b/LYNQ_PUBLIC/IC_meta/mtk/2735/lynq-ril-service/lynq-ril-service.bb
@@ -44,7 +44,8 @@
install -d ${D}${systemd_unitdir}/system/
install -m 0644 ${B}/lynq_ril_service.service ${D}${systemd_unitdir}/system
fi
-# install -d ${D}${includedir}
+ install -d ${D}${includedir}/lynq-ril
+ install ${S}/lynq_interface.h ${D}${includedir}/lynq-ril
# install ${S}/atci/ATCI.h ${D}${includedir}
# cp -R ${S}/demoscript ${D}${bindir}/
if test "${TARGET_PLATFORM}" = "mt2731"; then
diff --git a/LYNQ_PUBLIC/IC_src/mtk/telephonyware/3.0/atcid/atci/src/platform/atcid_mipc.c b/LYNQ_PUBLIC/IC_src/mtk/telephonyware/3.0/atcid/atci/src/platform/atcid_mipc.c
index 24db98c..9de6e50 100755
--- a/LYNQ_PUBLIC/IC_src/mtk/telephonyware/3.0/atcid/atci/src/platform/atcid_mipc.c
+++ b/LYNQ_PUBLIC/IC_src/mtk/telephonyware/3.0/atcid/atci/src/platform/atcid_mipc.c
@@ -165,7 +165,7 @@
char *atcicmd_req_ptr, *atcmd_res_ptr, *atci_res;
uint16_t atcmd_req_len, atcmd_res_len;
- char simIDProperty[MTK_PROPERTY_VALUE_MAX];
+ char simIDProperty[MTK_PROPERTY_VALUE_MAX] = {0};
int simID = 0;
int char_sub = 0x1a;
diff --git a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/commands.h b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/commands.h
index 115e16d..44cf5ce 100755
--- a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/commands.h
+++ b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/commands.h
@@ -251,14 +251,14 @@
#ifdef MODE_DSDS
{"SET_DEFAULT_SIM_ALL",set_default_sim_all, "set default sim_all", -1},
- {"GET_DEFAULT_SIM_ALL",get_default_sim_all, "get default sim_all", -1},
+ {"GET_DEFAULT_SIM_ALL",get_default_sim_all, "get default sim_all", LYNQ_REQUEST_GET_DEFAULT_SIM_ALL},
{"SET_DEFAULT_SIM_VOICE",set_default_sim_voice, "set default sim_voice", -1},
{"GET_DEFAULT_SIM_VOICE",get_default_sim_voice, "get default sim_voice", -1},
{"SET_DEFAULT_SIM_DATA",set_default_sim_data, "set default sim_data", -1},
{"GET_DEFAULT_SIM_DATA",get_default_sim_data, "get default sim_data", -1},
{"SET_DEFAULT_SIM_SMS",set_default_sim_sms, "set default sim_sms", -1},
{"GET_DEFAULT_SIM_SMS",get_default_sim_sms, "get default sim_sms", -1},
- {"SET_DEFAULT_SIM_ALL_EXCEPT_DATA",set_default_sim_all_except_data, "set default sim_all", -1},
+ {"SET_DEFAULT_SIM_ALL_EXCEPT_DATA",set_default_sim_all_except_data, "set default sim_all", LYNQ_REQUEST_SET_DEFAULT_SIM_ALL_EXCEPT_DATA},
{"GET_DEFAULT_SIM_ALL_EXCEPT_DATA",get_default_sim_all_except_data, "get default sim_all", -1},
#endif /*MODE_DSSS*/
{"GET_MAIN_SIM_CARD",get_main_sim_card, "get main sim card", -1},
diff --git a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/common.cpp b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/common.cpp
index b87b051..a77505a 100755
--- a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/common.cpp
+++ b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/common.cpp
@@ -39,6 +39,7 @@
#include "cc.h"
#include "include/lynq_systime.h"
#include <include/lynq_uci.h>
+#include "lynq_interface.h"
#ifdef LED_SUPPORT
#include "led.h"
#endif
@@ -422,6 +423,19 @@
Radio_capability_switch_util::sendRadioCapabilityRequest(slot);
}
}
+ //#ifdef LYNQ_DSDS_MODE
+ else
+ {
+ RLOGD("[%s][%d]Already in required sim%d",__FUNCTION__,__LINE__,slot);
+ usleep(500*1000);
+ android::Parcel allow_data_p;
+ allow_data_p.writeInt32 (1);
+ allow_data_p.writeInt32 (LYNQ_URC_ALLOW_DATA);
+ allow_data_p.writeInt32 (slot);
+ allow_data_p.writeInt32 (0);
+ android::LYNQ_RIL_urcBroadcast(allow_data_p,LYNQ_URC_ALLOW_DATA);
+ }
+ //#endif
pthread_mutex_unlock(&s_DataMutex);
}
diff --git a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/common.h b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/common.h
index a7f2a6b..3872b91 100755
--- a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/common.h
+++ b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/common.h
@@ -54,8 +54,8 @@
#define DEBUG 0
-#define FUNCTION_CALLED(time,msg) printf("%s: %s %s called\n",(time), __func__ ,(msg));
-#define FUNCTION_RETURN(time,msg) printf("%s: %s %s returns\n",(time), __func__ ,(msg));
+#define FUNCTION_CALLED(time,msg) RLOGD("%s: %s %s called\n",(time), __func__ ,(msg));
+#define FUNCTION_RETURN(time,msg) RLOGD("%s: %s %s returns\n",(time), __func__ ,(msg));
#define EM_MODE_SUPPORT 1
#ifdef ATCI_PARSE
@@ -91,25 +91,6 @@
**The range of error values unique to LYNQ is 8000 to 10000.
**The sim card state is error.
*/
-typedef enum{
- LYNQ_E_CARDSTATE_ERROR=8000,
- /* The voice service state is out of service*/
- LYNQ_E_STATE_OUT_OF_SERVICE=8001,
- /* The voice service state is EMERGENCY_ONLY*/
- LYNQ_E_STATE_EMERGENCY_ONLY=8002,
- /* The radio power is power off*/
- LYNQ_E_STATE_POWER_OFF=8003,
- LYNQ_E_TIME_OUT=8004,
- /*create or open sms DB fail */
- LYNQ_E_SMS_DB_FAIL=8005,
- /*Failed to execute sql statement*/
- LYNQ_E_SMS_SQL_FAIL = 8006,
- LYNQ_E_SMS_NOT_FIND = 8007,
- /* The logic conflict*/
- LYNQ_E_CONFLICT=9000,
- /*Null anomaly*/
- LYNQ_E_NULL_ANONALY=9001
-}LYNQ_E;
/*Warren add for t800 RIL Service 2021/12/10 start*/
typedef struct{
@@ -273,6 +254,7 @@
void registerForNetworkInfo(netwokInfoNotify cb);
void unregisterATcmd();
int emResultNotify(const char *str);
+ int lynq_emResultNotify(Parcel &p);
void ATCIRequest(int request, char* reqString, void* t,int argc, char**argv);
void startWakupLoop(void);
/*Warren add for FAW platform 2021/9/27 start*/
diff --git a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/lynq_interface.h b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/lynq_interface.h
index 401b9bd..f8cdf47 100755
--- a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/lynq_interface.h
+++ b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/lynq_interface.h
@@ -13,6 +13,7 @@
#define LYNQ_URC_MODIFY_APNDB (LYNQ_URC_VENDOR_BASE+4)
#define LYNQ_URC_RESET_APNDB (LYNQ_URC_VENDOR_BASE+5)
+#define LYNQ_URC_ALLOW_DATA (LYNQ_URC_VENDOR_BASE + 10)
#define LYNQ_REQUEST_WRITE_SMS_TO_MEMORY (LYNQ_REQUEST_VENDOR_BASE +4)
#define LYNQ_REQUEST_READ_SMS_FROM_MEMORY (LYNQ_REQUEST_VENDOR_BASE + 5)
@@ -39,6 +40,8 @@
#define LYNQ_REQUEST_GET_RTP_PARAM (LYNQ_REQUEST_VENDOR_BASE + 25)
#define LYNQ_REQUEST_SET_CALL_RTP_SSRC (LYNQ_REQUEST_VENDOR_BASE + 26)
#define LYNQ_REQUEST_GET_CALL_RTP_SSRC (LYNQ_REQUEST_VENDOR_BASE + 27)
+#define LYNQ_REQUEST_GET_DEFAULT_SIM_ALL (LYNQ_REQUEST_VENDOR_BASE + 28)
+#define LYNQ_REQUEST_SET_DEFAULT_SIM_ALL_EXCEPT_DATA (LYNQ_REQUEST_VENDOR_BASE + 29)
#ifdef ECALL_SUPPORT
#define RIL_UNSOL_ECALL_T2_TIMER_OUT 9000
@@ -49,6 +52,44 @@
#define RIL_UNSOL_ECALL_AUTO_ANS_TIMER_OUT 9005
#define RIL_UNSOL_ECALL_AUTO_ANS_IMS_TIMER_OUT 9006
#endif
+//Warren add for plantform 2024_04_11 start
+/*
+**The range of error values unique to LYNQ is 7000 to 10000.
+**The sim card state is error.
+*/
+typedef enum{
+ /*base abnormal*/
+ LYNQ_E_PARAMETER_ANONALY=7000,
+ LYNQ_E_SEND_REQUEST_FAIL=7001,
+ LYNQ_E_GET_HEAD_ERROR=7002,
+ LYNQ_E_INNER_ERROR=7100,
+ LYNQ_E_MALLOC_ERROR=7101,
+ /**/
+ LYNQ_E_CARDSTATE_ERROR=8000,
+ /* The voice service state is out of service*/
+ LYNQ_E_STATE_OUT_OF_SERVICE=8001,
+ /* The voice service state is EMERGENCY_ONLY*/
+ LYNQ_E_STATE_EMERGENCY_ONLY=8002,
+ /* The radio power is power off*/
+ LYNQ_E_STATE_POWER_OFF=8003,
+ LYNQ_E_TIME_OUT=8004,
+ /*create or open sms DB fail */
+ LYNQ_E_SMS_DB_FAIL=8005,
+ /*Failed to execute sql statement*/
+ LYNQ_E_SMS_SQL_FAIL = 8006,
+ LYNQ_E_SMS_NOT_FIND = 8007,
+ /* The logic conflict*/
+ LYNQ_E_CONFLICT=9000,
+ /*Null anomaly*/
+ LYNQ_E_NULL_ANONALY=9001,
+ /*Invalid id anomaly*/
+ LYNQ_E_INVALID_ID_ANONALY=9002,
+#ifdef ECALL_SUPPORT
+ LYNQ_E_ECALL_BEING_RUNNING =9003,
+ LYNQ_E_ECALL_MSD_LENGTH_ERROR =9004,
+ LYNQ_E_ECALL_DAILING_NO_ANSWER =9005,
+#endif
+}LYNQ_E;
typedef struct{
int request;
diff --git a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/ril.cpp b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/ril.cpp
index 90a842a..a81dd7c 100755
--- a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/ril.cpp
+++ b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/ril.cpp
@@ -137,6 +137,8 @@
int enable_bt_resp = 0;
int wakeup_token = -1;
struct sockaddr_in client_addr;
+struct sockaddr_in lynq_client_addr;
+
#define ANDROID_WAKE_LOCK_NAME "radio-interface"
@@ -4517,6 +4519,15 @@
sleep(WAIT_TIME_FOR_SIM_SWITCH);
setupDataCall(0, NULL, (RIL_SOCKET_ID)0, NULL);
}
+ if(utils::is_support_dsds() && get_default_sim_data() == socket_id)
+ {
+ Parcel allow_data_p;
+ allow_data_p.writeInt32 (1);
+ allow_data_p.writeInt32 (LYNQ_URC_ALLOW_DATA);
+ allow_data_p.writeInt32 (socket_id);
+ allow_data_p.writeInt32 (e);
+ LYNQ_RIL_urcBroadcast(allow_data_p,LYNQ_URC_ALLOW_DATA);
+ }
break;
}
#ifdef KEEP_ALIVE
@@ -5293,6 +5304,8 @@
case LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY: return "LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY";
case LYNQ_REQUEST_LIST_SMS_FROM_MEMORY: return "LYNQ_REQUEST_LIST_SMS_FROM_MEMORY";
case LYNQ_REQUEST_SET_DEFAULT_SIM_ALL:return "SET_DEFAULT_SIM_ALL";
+ case LYNQ_REQUEST_GET_DEFAULT_SIM_ALL:return "GET_DEFAULT_SIM_ALL";
+ case LYNQ_REQUEST_SET_DEFAULT_SIM_ALL_EXCEPT_DATA:return "SET_DEFAULT_SIM_ALL_EXCEPT_DATA";
case LYNQ_REQUEST_CHANGE_SCREEN_STATE:return "LYNQ_REQUEST_CHANGE_SCREEN_STATE";/*jb.qi add for two sim sleep 2022/9/19*/
case LYNQ_REQUEST_CHANGE_RADIO:return "LYNQ_REQUEST_CHANGE_RADIO";/*lei add for factory test of sleep 2022/9/19*/
case LYNQ_REQUEST_SET_VOICE_AUDIO_MODE:return "LYNQ_REQUEST_SET_VOICE_AUDIO_MODE";
@@ -5574,6 +5587,8 @@
case LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY: return "LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY";
case LYNQ_REQUEST_LIST_SMS_FROM_MEMORY: return "LYNQ_REQUEST_LIST_SMS_FROM_MEMORY";
case LYNQ_REQUEST_SET_DEFAULT_SIM_ALL:return "SET_DEFAULT_SIM_ALL";
+ case LYNQ_REQUEST_GET_DEFAULT_SIM_ALL:return "GET_DEFAULT_SIM_ALL";
+ case LYNQ_REQUEST_SET_DEFAULT_SIM_ALL_EXCEPT_DATA:return "SET_DEFAULT_SIM_ALL_EXCEPT_DATA";
case LYNQ_REQUEST_CHANGE_SCREEN_STATE:return "LYNQ_REQUEST_CHANGE_SCREEN_STATE";/*jb.qi add for two sim sleep 2022/9/19*/
case LYNQ_REQUEST_CHANGE_RADIO:return "LYNQ_REQUEST_CHANGE_RADIO";/*lei add for factory test of sleep 2022/9/19*/
case RIL_UNSOL_TELEPHONY_RESTART:return "RIL_UNSOL_TELEPHONY_RESTART";/*xy.he add for t800 ril service 2023/10/23*/
@@ -6111,6 +6126,8 @@
RLOGD("LYNQ_RIL_RecSocket start\n");
char *argv[MAX_ARGS];
int argc = 0;
+ int ril_slot_status = 0;
+ int ril_slot = 0;
int ep_fd = 0;
int en_fd = 0;
struct epoll_event lynq_ev;
@@ -6187,6 +6204,9 @@
while(recvfrom(server_socket_fd, buffer, LYNQ_SOCKET_BUFFER,0,(struct sockaddr*)&lynqClient_addr, &client_addr_length) != -1)//add while by hq for bug 760 2023/02/09
{
client_tmp = (lynq_client_t*)buffer;
+ lynq_client_addr = lynqClient_addr;
+ ril_slot_status = (int)(buffer+(1024*8+sizeof(int)*3))[0] - '0';
+ ril_slot = (int)(buffer+(1024*8+sizeof(int)*3)+1)[0] - '0';
RLOGD("[LYNQ socketId] utoken=%d,request=%d,len=%d,param=%s",client_tmp->uToken,client_tmp->request,client_tmp->paramLen,client_tmp->param);
//char test[36] = {};
//sprintf(test,"test okay len = %d",client_tmp->paramLen);
@@ -6218,10 +6238,17 @@
int32_t request;
request = command->request;
RIL_SOCKET_ID id = RIL_SOCKET_1;
- if(utils::is_support_dsds()) {
- id = (RIL_SOCKET_ID)get_default_sim_all_except_data();
- } else if(utils::is_suppport_dsss()) {
- id = (RIL_SOCKET_ID)Phone_utils::get_enable_sim_for_dsss();
+ if((ril_slot_status == 1) && ((ril_slot == 0) | (ril_slot == 1)))
+ {
+ id = (RIL_SOCKET_ID)ril_slot;
+ }
+ else
+ {
+ if(utils::is_support_dsds()) {
+ id = (RIL_SOCKET_ID)get_default_sim_all_except_data();
+ } else if(utils::is_suppport_dsss()) {
+ id = (RIL_SOCKET_ID)Phone_utils::get_enable_sim_for_dsss();
+ }
}
if(request == -1)
{
@@ -7502,6 +7529,19 @@
return len_s;
}
+int lynq_emResultNotify(Parcel &p)
+{
+
+ RLOGD("emResultNotify parcel");
+ int dataSize = p.dataSize();
+ const uint8_t* data = p.data();
+ int len_s = sendto(server_socket_fd,data,dataSize,0,(struct sockaddr *)&lynq_client_addr,sizeof(lynq_client_addr));
+ //sendto(server_socket_fd,"stopemdone",strlen("stopemdone"),0,(struct sockaddr *)&client_addr,sizeof(client_addr));
+ RLOGD("len_s = %d,errno = %d",len_s,errno);
+ return len_s;
+}
+
+
void processUnsolicited (Parcel &p, int type)
{
int32_t response = -1;
diff --git a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/rtp/call_rtp_inner.h b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/rtp/call_rtp_inner.h
index 0a1ebd0..a92c350 100755
--- a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/rtp/call_rtp_inner.h
+++ b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/rtp/call_rtp_inner.h
@@ -24,7 +24,6 @@
#define RESULT_OK (0)
#define RESULT_ERROR (-1)
-#define LYNQ_E_PARAMETER_ANONALY 7000
typedef enum{
Rtp_Ssrc_random = 0,
diff --git a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/sim.cpp b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/sim.cpp
index f1bba40..10fb3c5 100755
--- a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/sim.cpp
+++ b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/sim.cpp
@@ -42,6 +42,8 @@
#include "sim.h"
#include "common.h"
#include "Radio_capability_switch_util.h"
+#include "lynq_interface.h"
+
#undef LOG_TAG
#define LOG_TAG "DEMO_SIM"
@@ -216,7 +218,18 @@
str = "default SIM(except data): " + std::to_string(get_default_sim_all_except_data()) + "\n";
str = str + "default data: " + std::to_string(get_default_sim_data()) + "\n";
str = str + "main capability SIM: " + std::to_string(Radio_capability_switch_util::get_main_capability_phone_id()) + "\n";
- android::emResultNotify(str.c_str());
+ RLOGD(str.c_str());
+ android::Parcel p;
+ p.writeInt32(1);//response_type
+ p.writeInt32(pRI->uToken);//token
+ p.writeInt32(LYNQ_REQUEST_GET_DEFAULT_SIM_ALL);//request_id
+ p.writeInt32(slot_id);//slot_id
+ p.writeInt32(0);//error_code
+ p.writeInt32((get_default_sim_data()) + (get_default_sim_all_except_data()*2));//data
+ p.setDataPosition(0);
+ android::lynq_emResultNotify(p);
+ //android::emResultNotify(str.c_str());//LYNQ_DEL_LIU.HONG_20241126
+
free(pRI);
return 0;
}
@@ -326,16 +339,27 @@
//SET_DEFAULT_SIM_ALL_EXCEPT_DATA
int set_default_sim_all_except_data(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI){
+ android::Parcel p;
+ p.writeInt32(1);//res_type
+ p.writeInt32(pRI->uToken);//token
+ p.writeInt32(LYNQ_REQUEST_SET_DEFAULT_SIM_ALL_EXCEPT_DATA);//request_id
+ p.writeInt32(get_default_sim_data());
if((argc != 2) || (!is_valid(atoi(argv[1]))))
{
free(pRI);
RLOGD("the paremeters numbers isn't right , so return");
- android::emResultNotify("Set failed.\n");
+ p.writeInt32(1);//err_code
+ p.setDataPosition(0);
+ android::lynq_emResultNotify(p);
+ //android::emResultNotify("Set failed.\n"); //LYNQ_DEL_LIU.HONG_20241126
return -1;
}
set_default_sim_all_except_data(atoi(argv[1]));
- android::emResultNotify("Set successful.\n");
+ p.writeInt32(0);//err_code when failed
+ p.setDataPosition(0);
+ android::lynq_emResultNotify(p);
+ //android::emResultNotify("Set successful.\n"); //LYNQ_DEL_LIU.HONG_20241126
free(pRI);
return 0;
}
diff --git a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/sms/lynqSmsManager/lynq_sms_manager.cpp b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/sms/lynqSmsManager/lynq_sms_manager.cpp
index 0d926df..14bd941 100755
--- a/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/sms/lynqSmsManager/lynq_sms_manager.cpp
+++ b/LYNQ_PUBLIC/common_src/framework/lynq-ril-service/src/sms/lynqSmsManager/lynq_sms_manager.cpp
@@ -6,6 +6,7 @@
#include <stdlib.h>
#include <string.h>
#include "common.h"
+#include "lynq_interface.h"
sms_manager * g_smsManagement;
int sms_indexs[LYNQ_MAX_SMS_LIST]={0};
int next_index = 0;
diff --git a/LYNQ_PUBLIC/common_src/lib/liblynq-sim/include/lynq_sim.h b/LYNQ_PUBLIC/common_src/lib/liblynq-sim/include/lynq_sim.h
index c2d7793..a3860f5 100755
--- a/LYNQ_PUBLIC/common_src/lib/liblynq-sim/include/lynq_sim.h
+++ b/LYNQ_PUBLIC/common_src/lib/liblynq-sim/include/lynq_sim.h
@@ -84,7 +84,38 @@
*
*/
int lynq_factory_radio_state(int num);
+/**
+ * @brief set default sim card
+ * @param slot: type [IN] <slot> sim card slot
+ * @return int
+ * 0:success
+ * other:fail
+ */
+int lynq_set_default_sim(const int slot);
+/**
+ * @brief get default sim card
+ * @param bitslot: sim card infomation
+ * 00£¨0£©all in sim0
+ * 01£¨1£©others sim0£¬data in sim1
+ * 10£¨2£©others sim1£¬data in sim0
+ * 11£¨3£©all in sim1
+ * @return int
+ * 0:success
+ * other:fail
+ */
+
+int lynq_get_default_sim_all(int *bit_slot);
+
+/**
+ * @brief set sim card except_data
+ * @param slot: type [IN] <slot> sim card slot
+ * @return int
+ * 0:success
+ * other:fail
+ */
+
+int lynq_set_default_sim_except_data(const int slot);
#ifdef __cplusplus
}
diff --git a/LYNQ_PUBLIC/common_src/lib/liblynq-sim/makefile b/LYNQ_PUBLIC/common_src/lib/liblynq-sim/makefile
index f34e6b0..25758ec 100755
--- a/LYNQ_PUBLIC/common_src/lib/liblynq-sim/makefile
+++ b/LYNQ_PUBLIC/common_src/lib/liblynq-sim/makefile
@@ -45,6 +45,7 @@
-I$(ROOT)$(includedir)/vendor-ril \
-I$(ROOT)$(includedir)/logger \
-I$(ROOT)$(includedir)/liblog \
+ -I$(ROOT)$(includedir)/lynq-ril \
LOCAL_LIBS := \
diff --git a/LYNQ_PUBLIC/common_src/lib/liblynq-sim/src/lynq_sim.cpp b/LYNQ_PUBLIC/common_src/lib/liblynq-sim/src/lynq_sim.cpp
index c780859..f61d61e 100755
--- a/LYNQ_PUBLIC/common_src/lib/liblynq-sim/src/lynq_sim.cpp
+++ b/LYNQ_PUBLIC/common_src/lib/liblynq-sim/src/lynq_sim.cpp
@@ -24,6 +24,10 @@
#include <sys/stat.h>
#include <fcntl.h>
#include "lynq_sim.h"
+#include "liblog/lynq_deflog.h"
+#include "lynq_sim_urc.h"
+
+using ::android::Parcel;
#define MAX_BUF 20
#define MAX_NUM 80
#define LYNQ_REQUEST_SET_DEFAULT_SIM_ALL 8008
@@ -31,11 +35,17 @@
#define LYNQ_REQUEST_CHANGE_RADIO 8015
#define MAX_LEN 1024*8
#define MAX_NUM 10
-#define LOG_TAG "LYNQ_SIM"
+#define USER_LOG_TAG "LYNQ_SIM"
#define FLAG_TESS 0
-using ::android::Parcel;
#define DEST_PORT 8088
#define DSET_IP_ADDRESS "127.0.0.1"
+#define SIM_ALLOW_DATA_TIMEOUT 60*1000
+#define RESULT_OK (0)
+#define RESULT_ERROR (-1)
+static pthread_mutex_t s_sim_allow_data_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t s_sim_allow_data_cond = PTHREAD_COND_INITIALIZER;
+static int s_sim_allow_data_value = -1;
+
typedef struct{
int uToken;
@@ -49,6 +59,7 @@
struct sockaddr_in addr_serv;
static int sock_fd = 0;
int Global_uToken = 0;
+static int default_cnt = 20;
static pthread_mutex_t g_lynq_sim_sendto_mutex;
/**
* @brief mark call initialization state
@@ -79,42 +90,32 @@
int error;
}lynq_resp_t;
-#define RESULT_OK (0)
-#define RESULT_ERROR (-1)
+int waitAllowDataSignal(int mtime)
+{
+ int ret = 0;
+ int sec = 0;
+ int usec = 0;
+ struct timeval now;
+ struct timespec timeout;
+ gettimeofday(&now,NULL);
+ sec = mtime/1000;
+ usec = mtime%1000;
+ timeout.tv_sec = now.tv_sec+sec;
+ timeout.tv_nsec = now.tv_usec*1000+usec*1000000;
+ pthread_mutex_lock(&s_sim_allow_data_mutex);
+ ret = pthread_cond_timedwait(&s_sim_allow_data_cond,&s_sim_allow_data_mutex,&timeout);
+ pthread_mutex_unlock(&s_sim_allow_data_mutex);
+ return ret;
+}
-typedef enum{
- /*base abnormal*/
- LYNQ_E_PARAMETER_ANONALY=7000,
- LYNQ_E_SEND_REQUEST_FAIL=7001,
- LYNQ_E_GET_HEAD_ERROR=7002,
- LYNQ_E_INNER_ERROR=7100,
- LYNQ_E_MALLOC_ERROR=7101,
- /**/
- LYNQ_E_CARDSTATE_ERROR=8000,
- /* The voice service state is out of service*/
- LYNQ_E_STATE_OUT_OF_SERVICE=8001,
- /* The voice service state is EMERGENCY_ONLY*/
- LYNQ_E_STATE_EMERGENCY_ONLY=8002,
- /* The radio power is power off*/
- LYNQ_E_STATE_POWER_OFF=8003,
- LYNQ_E_TIME_OUT=8004,
- /*create or open sms DB fail */
- LYNQ_E_SMS_DB_FAIL=8005,
- /*Failed to execute sql statement*/
- LYNQ_E_SMS_SQL_FAIL = 8006,
- LYNQ_E_SMS_NOT_FIND = 8007,
- /* The logic conflict*/
- LYNQ_E_CONFLICT=9000,
- /*Null anomaly*/
- LYNQ_E_NULL_ANONALY=9001,
- /*Invalid id anomaly*/
- LYNQ_E_INVALID_ID_ANONALY=9002,
-#ifdef ECALL_SUPPORT
- LYNQ_E_ECALL_BEING_RUNNING =9003,
- LYNQ_E_ECALL_MSD_LENGTH_ERROR =9004,
- LYNQ_E_ECALL_DAILING_NO_ANSWER =9005,
-#endif
-}LYNQ_E;
+void sendAllowDataSignal(int value)
+{
+ pthread_mutex_lock(&s_sim_allow_data_mutex);
+ s_sim_allow_data_value = value;
+ pthread_cond_signal(&s_sim_allow_data_cond);
+ pthread_mutex_unlock(&s_sim_allow_data_mutex);
+ return;
+}
/**@brief print solicied response msg's head information
* @param head [IN]: head information
@@ -144,15 +145,18 @@
return RESULT_ERROR;
}
}
-
-int lynq_send_common_request(Parcel* p, int request_id, int argc, int cnt, const char* format,...)
+int get_utoken()
+{
+ return (Global_uToken++)%10000;/*0-10000*/
+}
+int lynq_send_common_request(Parcel* p, int request_id, int argc, int cnt, int sim_count, const char* format,...)
{
lynq_client_t client;
int ret;
int send_num;
int recv_num;
char res_data[MAX_LEN] = {0};
- client.uToken = Global_uToken;
+ client.uToken = get_utoken();
if(request_id == RIL_REQUEST_SCREEN_STATE)
{
client.request = LYNQ_REQUEST_CHANGE_SCREEN_STATE;
@@ -185,14 +189,28 @@
}
lynq_resp_t head;
head.request = -1;
- for(int i = 0; i < cnt;)
+ for(int i = 0; i < cnt; i++)
{
+ head.resp_type = -1;
+ head.token = -1;
+ head.request = -1;
+ head.slot_id = -1;
+ head.error = -1;
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)
{
- RLOGD("recv request fail, recv num is %d", recv_num);
- pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
- return recv_num;
+ if (errno == EAGAIN || errno == EWOULDBLOCK)
+ {
+ RLOGD("recv from timeout");
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ return LYNQ_E_TIME_OUT;
+ }
+ else
+ {
+ RLOGD("recv request fail, recv num is %d", recv_num);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ return recv_num;
+ }
}
p->setData((uint8_t *)res_data,sizeof(char)*recv_num);
p->setDataPosition(0);
@@ -200,12 +218,30 @@
if(ret!=0)
{
RLOGD("%s %d get head error %d",__FUNCTION__,client.uToken,ret);
+
+ if (head.token != client.uToken)
+ {
+ RLOGD("head.token is %d != client.uToken is %d", head.token, client.uToken);
+ ret = RESULT_ERROR;
+ continue;
+ }
+
pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
return ret;
}
+ if (head.token != client.uToken)
+ {
+ RLOGD("head.token is %d != client.uToken is %d", head.token, client.uToken);
+ ret = RESULT_ERROR;
+ continue;
+ }
if(request_id == head.request)
{
- i++;
+ sim_count--;
+ if(sim_count <= 0)
+ break;
+ else
+ continue;
}
}
pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
@@ -249,17 +285,21 @@
timeOut.tv_usec = 0;
if (setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
{
- RLOGD("time out setting failed\n");
+ RLOGD("time out setting failed\n");
return -1;
}
- /* 设置address */
- memset(&addr_serv, 0, sizeof(addr_serv));
- addr_serv.sin_family = AF_INET;
- addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
- addr_serv.sin_port = htons(DEST_PORT);
- len_addr_serv = sizeof(addr_serv);
- /*test*/
+ memset(&addr_serv, 0, sizeof(addr_serv));
+ addr_serv.sin_family = AF_INET;
+ addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
+ addr_serv.sin_port = htons(DEST_PORT);
+ len_addr_serv = sizeof(addr_serv);
+ ret = lynq_start_all_urc_socket_thread();
+ if(ret != RESULT_OK)
+ {
+ LYERRLOG("init socket urc fail!!!");
+ return LYNQ_E_INNER_ERROR;
+ }
RLOGE("%s end suc", __func__);
return 0;
}
@@ -273,6 +313,7 @@
RLOGD("lynq_sim_deinit failed");
return -1;
}
+ lynq_close_all_urc_socket_thread();
g_lynq_sim_init_flag = 0;
close(sock_fd);
@@ -296,7 +337,7 @@
return -1;
}
Parcel p;
- int res = lynq_send_common_request(&p,RIL_REQUEST_GET_SIM_STATUS,0,1,"");
+ int res = lynq_send_common_request(&p,RIL_REQUEST_GET_SIM_STATUS,0,default_cnt,1,"");
if(res != 0)
{
RLOGD("function %s execute error", __FUNCTION__);
@@ -313,7 +354,7 @@
return -1;
}
Parcel p;
- int res = lynq_send_common_request(&p,RIL_REQUEST_GET_IMSI,0,1,"");
+ int res = lynq_send_common_request(&p,RIL_REQUEST_GET_IMSI,0,default_cnt,1,"");
if(res != 0)
{
RLOGD("function %s execute error", __FUNCTION__);
@@ -334,7 +375,7 @@
return -1;
}
Parcel p;
- int res = lynq_send_common_request(&p,RIL_REQUEST_QUERY_ICCID,0,1,"");
+ int res = lynq_send_common_request(&p,RIL_REQUEST_QUERY_ICCID,0,default_cnt,1,"");
if(res != 0)
{
RLOGD("function %s execute error", __FUNCTION__);
@@ -352,7 +393,7 @@
return -1;
}
Parcel p;
- int res = lynq_send_common_request(&p,RIL_REQUEST_SET_FACILITY_LOCK,4,1,"%s %s %s %s\n", "SC", pin, "11", "1");
+ int res = lynq_send_common_request(&p,RIL_REQUEST_SET_FACILITY_LOCK,4,default_cnt,1,"%s %s %s %s\n", "SC", pin, "11", "1");
if(res != 0)
{
RLOGD("function %s execute error", __FUNCTION__);
@@ -368,7 +409,7 @@
return -1;
}
Parcel p;
- int res = lynq_send_common_request(&p,RIL_REQUEST_OEM_HOOK_RAW,1,1,"%s%d", "AT+ESIMPOWER=", mode);
+ int res = lynq_send_common_request(&p,RIL_REQUEST_OEM_HOOK_RAW,1,default_cnt,1,"%s%d", "AT+ESIMPOWER=", mode);
if(res != 0)
{
RLOGD("function %s execute error", __FUNCTION__);
@@ -383,7 +424,7 @@
return -1;
}
Parcel p;
- int res = lynq_send_common_request(&p,RIL_REQUEST_SET_FACILITY_LOCK,4,1,"%s %s %s %s\n", "SC", pin, "11", "0");
+ int res = lynq_send_common_request(&p,RIL_REQUEST_SET_FACILITY_LOCK,4,default_cnt,1,"%s %s %s %s\n", "SC", pin, "11", "0");
if(res != 0)
{
RLOGD("function %s execute error", __FUNCTION__);
@@ -398,7 +439,7 @@
return -1;
}
Parcel p;
- int res = lynq_send_common_request(&p,RIL_REQUEST_QUERY_FACILITY_LOCK,3,1,"%s %s %s\n", "SC", pin, "11");
+ int res = lynq_send_common_request(&p,RIL_REQUEST_QUERY_FACILITY_LOCK,3,default_cnt,1,"%s %s %s\n", "SC", pin, "11");
if(res != 0)
{
RLOGD("function %s execute error", __FUNCTION__);
@@ -424,7 +465,7 @@
return -1;
}
Parcel p;
- int res = lynq_send_common_request(&p,RIL_REQUEST_ENTER_SIM_PIN,1,1,"%s\n", pin);
+ int res = lynq_send_common_request(&p,RIL_REQUEST_ENTER_SIM_PIN,1,default_cnt,1,"%s\n", pin);
if(res != 0)
{
RLOGD("function %s execute error", __FUNCTION__);
@@ -446,7 +487,7 @@
if(!strlen(old_pin))
return res;
Parcel p;
- res = lynq_send_common_request(&p,RIL_REQUEST_CHANGE_SIM_PIN,2,1,"%s %s\n", old_pin, new_pin);
+ res = lynq_send_common_request(&p,RIL_REQUEST_CHANGE_SIM_PIN,2,default_cnt,1,"%s %s\n", old_pin, new_pin);
if(res != 0)
{
RLOGD("function %s execute error", __FUNCTION__);
@@ -463,7 +504,7 @@
if(puk == NULL || pin == NULL)
return -1;
Parcel p;
- int res = lynq_send_common_request(&p,RIL_REQUEST_ENTER_SIM_PUK,2,1,"%s %s\n", puk, pin);
+ int res = lynq_send_common_request(&p,RIL_REQUEST_ENTER_SIM_PUK,2,default_cnt,1,"%s %s\n", puk, pin);
if(res != 0)
{
RLOGD("function %s execute error", __FUNCTION__);
@@ -540,7 +581,7 @@
return -1;
}
Parcel p;
- int res = lynq_send_common_request(&p,RIL_REQUEST_OEM_HOOK_RAW,1,1,"%s\n", "AT+CNUM");
+ int res = lynq_send_common_request(&p,RIL_REQUEST_OEM_HOOK_RAW,1,default_cnt,1,"%s\n", "AT+CNUM");
if(res != 0)
{
RLOGD("function %s execute error", __FUNCTION__);
@@ -566,7 +607,7 @@
return -1;
}
Parcel p;
- int res = lynq_send_common_request(&p,RIL_REQUEST_DEVICE_IDENTITY,0,1,"");
+ int res = lynq_send_common_request(&p,RIL_REQUEST_DEVICE_IDENTITY,0,default_cnt,1,"");
if(res != 0)
{
RLOGD("function %s execute error", __FUNCTION__);
@@ -587,7 +628,7 @@
return -1;
}
Parcel p;
- int res = lynq_send_common_request(&p,RIL_REQUEST_DEVICE_IDENTITY,0,1,"");
+ int res = lynq_send_common_request(&p,RIL_REQUEST_DEVICE_IDENTITY,0,default_cnt,1,"");
if(res != 0)
{
RLOGD("function %s execute error", __FUNCTION__);
@@ -639,6 +680,105 @@
return 0;
}
+int lynq_set_default_sim(const int slot)
+{
+ if(g_lynq_sim_init_flag == 0)
+ {
+ RLOGE("can`t init SIM module");
+ return -1;
+ }
+ if(!judge(slot))
+ {
+ RLOGD("is not 0 or 1");
+ return -1;
+ }
+ int send_num = 0;
+ lynq_client_t client_t;
+ 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);
+ pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
+ send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+ if(send_num < 0)
+ {
+ RLOGD("function %s sendto error:", __FUNCTION__);
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ return send_num;
+ }
+
+ if(waitAllowDataSignal(SIM_ALLOW_DATA_TIMEOUT) == ETIMEDOUT)
+ {
+ LYERRLOG("timeout:wait allow data fail!!!");
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ return LYNQ_E_TIME_OUT;
+ }
+ pthread_mutex_unlock(&g_lynq_sim_sendto_mutex);
+ LYERRLOG("sim allow data value %d",s_sim_allow_data_value);
+ return s_sim_allow_data_value;
+}
+
+
+int lynq_set_default_sim_except_data(const int slot)
+{
+ RLOGD("Enter %s",__FUNCTION__);
+
+ if(g_lynq_sim_init_flag == 0)
+ {
+ return -1;
+ }
+
+ RLOGD("Slot is %d",slot);
+
+ if(!judge(slot))
+ {
+ RLOGD("is not 0 or 1");
+ return -1;
+ }
+
+ int send_num = 0;
+ Parcel p;
+ RLOGD("send LYNQ_REQUEST_SET_DEFAULT_SIM_ALL_EXCEPT_DATA");
+ int res = lynq_send_common_request(&p,LYNQ_REQUEST_SET_DEFAULT_SIM_ALL_EXCEPT_DATA,1,default_cnt,1,"%d",slot);
+ if(res != 0)
+ {
+ RLOGD("function %s execute error", __FUNCTION__);
+ return res;
+ }
+
+ return 0;
+}
+
+
+
+int lynq_get_default_sim_all(int *bit_slot)
+{
+ RLOGD("Enter %s",__FUNCTION__);
+
+ int sim_except_data = 0;
+ int sim_data = 0;
+
+ if(g_lynq_sim_init_flag == 0)
+ {
+ return -1;
+ }
+
+ int send_num = 0;
+ Parcel p;
+
+ RLOGD("send LYNQ_REQUEST_GET_DEFAULT_SIM_ALL");
+ int res = lynq_send_common_request(&p,LYNQ_REQUEST_GET_DEFAULT_SIM_ALL,0,default_cnt,1,"");
+ if(res != 0)
+ {
+ RLOGD("function %s execute error", __FUNCTION__);
+ return res;
+ }
+
+ p.readInt32(bit_slot);
+ return 0;
+}
+
+
int lynq_switch_card(int slot){
if(g_lynq_sim_init_flag == 0)
{
@@ -650,7 +790,7 @@
lynq_client_t client_t;
client_t.request = LYNQ_REQUEST_SET_DEFAULT_SIM_ALL;
client_t.paramLen = 1;
- client_t.uToken = Global_uToken;
+ client_t.uToken = get_utoken();
sprintf(client_t.param, "%d\n", slot);
pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv); //because ril of id = -1
@@ -675,7 +815,7 @@
if(!judge(num))
return -1;
Parcel p;
- int res = lynq_send_common_request(&p,RIL_REQUEST_SCREEN_STATE,1,2,"%d\n",num);
+ int res = lynq_send_common_request(&p,RIL_REQUEST_SCREEN_STATE,1,default_cnt,2,"%d\n",num);
if(res != 0)
{
RLOGD("function %s execute error", __FUNCTION__);
@@ -697,7 +837,7 @@
if(!judge(num))
return -1;
Parcel p;
- int res = lynq_send_common_request(&p,RIL_REQUEST_RADIO_POWER,1,2,"%d\n",num);
+ int res = lynq_send_common_request(&p,RIL_REQUEST_RADIO_POWER,1,default_cnt,2,"%d\n",num);
if(res != 0)
{
RLOGD("function %s execute error", __FUNCTION__);
@@ -780,7 +920,7 @@
return -1;
}
Parcel p;
- int res = lynq_send_common_request(&p,RIL_REQUEST_SIM_IO,9,1,"%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);
+ int res = lynq_send_common_request(&p,RIL_REQUEST_SIM_IO,9,default_cnt,1,"%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);
if(res != 0)
{
RLOGD("function %s execute error", __FUNCTION__);
@@ -822,7 +962,7 @@
lynq_client_t client_t;
client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
client_t.paramLen = 1;
- client_t.uToken = Global_uToken;
+ client_t.uToken = get_utoken();
sprintf(client_t.param, "%s\n", "AT+LRSTMD");
pthread_mutex_lock(&g_lynq_sim_sendto_mutex);
send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);//because response not by ril callback
@@ -914,3 +1054,28 @@
return 0;
}
+void urc_msg_process(Parcel *p)
+{
+ int resp_type;
+ int urcid;
+ int slot_id;
+ int error_code;
+
+ int size=p->dataSize();
+ p->readInt32(&resp_type);
+ p->readInt32(&urcid);
+ p->readInt32(&slot_id);
+ LYINFLOG("%s urc id = %d, slot_id = %d, size is %d",__func__, urcid,slot_id,size);
+ switch (urcid)
+ {
+ case LYNQ_URC_ALLOW_DATA://new sms received
+ {
+ LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d",resp_type,urcid,slot_id);
+ p->readInt32(&error_code);
+ sendAllowDataSignal(error_code);
+ break;
+ }
+ default:
+ break;
+ }
+}
diff --git a/LYNQ_PUBLIC/common_src/lib/liblynq-sim/src/lynq_sim_urc.cpp b/LYNQ_PUBLIC/common_src/lib/liblynq-sim/src/lynq_sim_urc.cpp
new file mode 100755
index 0000000..daee1d3
--- /dev/null
+++ b/LYNQ_PUBLIC/common_src/lib/liblynq-sim/src/lynq_sim_urc.cpp
@@ -0,0 +1,173 @@
+#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>
+#include <list>
+#include <vendor-ril/telephony/ril.h>
+#include <vendor-ril/telephony/mtk_ril_sp.h>
+#include "liblog/lynq_deflog.h"
+#include "lynq_sim_urc.h"
+
+int module_len_urc_addr_serv;
+struct sockaddr_in module_urc_addr_serv;
+static int module_urc_sock_fd = -1;
+int module_urc_status = 1;
+pthread_t module_urc_tid = -1;
+
+static pthread_mutex_t s_ProcessUrcMsgBlockMutex = PTHREAD_MUTEX_INITIALIZER;
+#define BLOCK_PROCESS_URC_MSG_INIT() pthread_mutex_init(&s_ProcessUrcMsgBlockMutex,NULL)
+#define BLOCK_PROCESS_URC_MSG_LOCK() pthread_mutex_lock(&s_ProcessUrcMsgBlockMutex)
+#define BLOCK_PROCESS_URC_MSG_UNLOCK() pthread_mutex_unlock(&s_ProcessUrcMsgBlockMutex)
+
+bool is_support_urc(int urc_id)
+{
+ switch(urc_id)
+ {
+ case LYNQ_URC_ALLOW_DATA:
+ return true;
+ default:
+ return false;
+ }
+}
+
+void *thread_urc_recv(void *p)
+{
+ Parcel *urc_p =NULL;
+ char urc_data[LYNQ_REC_BUF];
+ int res = 0;
+ lynq_head_t* phead;
+ LYINFLOG("urc recv thread is running");
+ while(module_urc_status)
+ {
+ bzero(urc_data,LYNQ_REC_BUF);
+ res = recvfrom(module_urc_sock_fd,urc_data,sizeof(urc_data),0,(struct sockaddr *)&module_urc_addr_serv,(socklen_t*)&module_len_urc_addr_serv);
+ if(res<sizeof(int32_t)*2)
+ {
+ LYERRLOG("thread_urc_recv step2 fail: res is %d",res);
+ continue;
+ }
+
+ phead=(lynq_head_t*) urc_data;
+ if(is_support_urc(phead->urcid)==false)
+ {
+ continue;
+ }
+ urc_p = new Parcel();
+ if(urc_p == NULL)
+ {
+ LYERRLOG("new parcel failure!!!");
+ continue;
+ }
+ urc_p->setData((uint8_t *)urc_data,res); // p.setData((uint8_t *) buffer, buflen);
+ urc_p->setDataPosition(0);
+ if(urc_p->dataAvail()>0)
+ {
+ urc_msg_process(urc_p);
+ }
+ else
+ {
+ delete urc_p;
+ urc_p = NULL;
+ }
+ }
+ LYINFLOG("urc recv thread ended");
+ return NULL;
+}
+
+void lynq_close_urc_rev_thread()
+{
+ int ret;
+
+ BLOCK_PROCESS_URC_MSG_LOCK(); //just cancel urc process tid when recv from
+ module_urc_status = 0;
+ if(module_urc_tid!=-1)
+ {
+ ret = pthread_cancel(module_urc_tid);
+ LYINFLOG("pthread cancel urc rev ret = %d",ret);
+ }
+ BLOCK_PROCESS_URC_MSG_UNLOCK();
+ if(module_urc_tid != -1)
+ {
+ ret = pthread_join(module_urc_tid,NULL);
+ LYINFLOG("pthread join urc tid ret = %d",ret);
+ module_urc_tid =-1;
+ }
+}
+
+void lynq_close_urc_socket()
+{
+ if (module_urc_sock_fd >= 0)
+ {
+ close(module_urc_sock_fd);
+ module_urc_sock_fd =-1;
+ }
+}
+
+int lynq_setup_urc_socket()
+{
+ int on = 1;
+ int ret = 0;
+ module_len_urc_addr_serv = sizeof(sockaddr_in);
+ module_urc_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
+ if (module_urc_sock_fd <0){
+ LYERRLOG("urc socket error");
+ return RESULT_ERROR;
+ }
+ module_urc_addr_serv.sin_family = AF_INET;
+ module_urc_addr_serv.sin_port = htons(LYNQ_URC_SERVICE_PORT);
+ module_urc_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_URC_ADDRESS);
+ /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
+ ret = setsockopt(module_urc_sock_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
+ if(ret <0)
+ {
+ LYERRLOG("urc socket set error");
+ close(module_urc_sock_fd);
+ module_urc_sock_fd =-1;
+ return RESULT_ERROR;
+ }
+ ret = bind(module_urc_sock_fd ,(struct sockaddr*)&module_urc_addr_serv, sizeof(module_urc_addr_serv));
+ if(ret <0)
+ {
+ LYERRLOG("urc socket bind error");
+ close(module_urc_sock_fd);
+ module_urc_sock_fd =-1;
+ return RESULT_ERROR;
+ }
+ return RESULT_OK;
+}
+
+int lynq_start_all_urc_socket_thread()
+{
+ int ret= lynq_setup_urc_socket();
+ if(ret!=RESULT_OK)
+ {
+ LYERRLOG("call lynq_setup_urc_socket fail");
+ return RESULT_ERROR;
+ }
+
+ module_urc_status = 1;
+ ret = pthread_create(&module_urc_tid,NULL,thread_urc_recv,NULL);
+ if(ret <0)
+ {
+ LYERRLOG("urc recv pthread create error");
+ module_urc_status = 0;
+ lynq_close_urc_socket();
+ return RESULT_ERROR;
+ }
+ LYINFLOG("urc start success");
+ return RESULT_OK;
+}
+
+void lynq_close_all_urc_socket_thread()
+{
+ lynq_close_urc_rev_thread();
+ lynq_close_urc_socket();
+ LYERRLOG("close all urc socket thread!!!");
+}
+
diff --git a/LYNQ_PUBLIC/common_src/lib/liblynq-sim/src/lynq_sim_urc.h b/LYNQ_PUBLIC/common_src/lib/liblynq-sim/src/lynq_sim_urc.h
new file mode 100755
index 0000000..5173311
--- /dev/null
+++ b/LYNQ_PUBLIC/common_src/lib/liblynq-sim/src/lynq_sim_urc.h
@@ -0,0 +1,23 @@
+#include "lynq_interface.h"
+using ::android::Parcel;
+
+#define LYNQ_ADDRESS "127.0.0.1"
+#define LYNQ_URC_SERVICE_PORT 8086
+#ifdef GSW_RIL_CFG
+#define LYNQ_URC_ADDRESS "127.255.255.255" /*hong.liu change broadcast addr on 2024.2.18*/
+#else
+#define LYNQ_URC_ADDRESS "0.0.0.0"
+#endif
+#define LYNQ_REC_BUF 8192
+
+#define RESULT_OK (0)
+#define RESULT_ERROR (-1)
+
+typedef struct{
+ int resp_type;
+ int urcid;
+}lynq_head_t;
+
+void urc_msg_process(Parcel *p);
+int lynq_start_all_urc_socket_thread();
+void lynq_close_all_urc_socket_thread();
diff --git a/meta-sdk/meta/meta-lynqSDK-T800/recipes-customer/sim-demo/files/sim-demo.cpp b/meta-sdk/meta/meta-lynqSDK-T800/recipes-customer/sim-demo/files/sim-demo.cpp
index 87b21a6..729d7a8 100755
--- a/meta-sdk/meta/meta-lynqSDK-T800/recipes-customer/sim-demo/files/sim-demo.cpp
+++ b/meta-sdk/meta/meta-lynqSDK-T800/recipes-customer/sim-demo/files/sim-demo.cpp
@@ -30,6 +30,9 @@
int (*lynq_sim_power)(int mode);
int (*lynq_reset_modem)(void);
int (*lynq_screen)(int num);
+int (*lynq_set_default_sim)(const int slot);
+int (*lynq_set_default_sim_except_data)(const int slot);
+int (*lynq_get_default_sim_all)(int *bit_slot);
int flag_init = 0;
@@ -41,15 +44,15 @@
st_api_test_case api_testcases[] =
{
- {0, "lynq_sim_init"},
- {1, "lynq_enable_pin"},
- {2, "lynq_disable_pin"},
- {4, "lynq_get_iccid"},
- {5, "lynq_query_pin_lock"},
- {6, "lynq_verify_pin"},
- {7, "lynq_change_pin"},
- {8, "lynq_unlock_pin"},
- {9, "lynq_query_phone_number"},
+ {0, "lynq_sim_init"},
+ {1, "lynq_enable_pin"},
+ {2, "lynq_disable_pin"},
+ {4, "lynq_get_iccid"},
+ {5, "lynq_query_pin_lock"},
+ {6, "lynq_verify_pin"},
+ {7, "lynq_change_pin"},
+ {8, "lynq_unlock_pin"},
+ {9, "lynq_query_phone_number"},
{10, "lynq_get_imsi"},
{11, "lynq_get_sim_status"},
{12, "lynq_sim_deinit"},
@@ -61,6 +64,9 @@
{18, "lynq_sim_power"},
{19, "lynq_reset_modem"},
{20, "lynq_screen"},
+ {21, "lynq_set_default_sim"},
+ {22, "lynq_set_default_sim_except_data"},
+ {23, "lynq_get_default_sim_all"},
{-1, NULL}
};
@@ -589,6 +595,66 @@
}
break;
}
+ case 21:
+ {
+ lynq_set_default_sim = (int (*)(int))dlsym(dlHandle_sim,"lynq_set_default_sim");
+ if(NULL != lynq_set_default_sim)
+ {
+ int slot;
+ printf("input slot\n");
+ scanf("%d", &slot);
+ res = lynq_set_default_sim(slot);
+ if(res == 0)
+ {
+ printf("lynq_set_default_sim success\n");
+ }
+ else
+ {
+ printf("lynq_set_default_sim error\n");
+ }
+ }
+ break;
+ }
+ case 22:
+ {
+ lynq_set_default_sim_except_data = (int (*)(int))dlsym(dlHandle_sim,"lynq_set_default_sim_except_data");
+ if(NULL != lynq_set_default_sim_except_data)
+ {
+ int slot;
+ printf("input slot\n");
+ scanf("%d", &slot);
+ res = lynq_set_default_sim_except_data(slot);
+ if(res == 0)
+ {
+ printf("lynq_set_default_sim_except_data success\n");
+ }
+ else
+ {
+ printf("lynq_set_default_sim_except_data error\n");
+ }
+ }
+ break;
+ }
+ case 23:
+ {
+ lynq_get_default_sim_all = (int (*)(int *bit_slot))dlsym(dlHandle_sim,"lynq_get_default_sim_all");
+ if(NULL != lynq_get_default_sim_all)
+ {
+ int bit_slot;
+ res = lynq_get_default_sim_all(&bit_slot);
+ if(res == 0)
+ {
+ printf("BIT0:other service slot;BIT1:data call slot\n");
+ printf("BIT0=%d\n",(bit_slot&(1<<0))? 1 : 0);
+ printf("BIT1=%d\n",(bit_slot&(1<<1))? 1 : 0);
+ }
+ else
+ {
+ printf("lynq_get_default_sim_all error\n");
+ }
+ }
+ break;
+ }
case -1:
{
flag = 1; /* exit */