blob: 149c8426ec7d590e9f003192430f08a659f521ce [file] [log] [blame]
lhb07f4e12022-02-17 22:08:54 -08001// SPDX-License-Identifier: MediaTekProprietary
2/*
lh7b0674a2022-01-10 00:34:35 -08003 * Copyright (C) 2006 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17#include <string.h>
18#include <stddef.h>
19#include <stdlib.h>
20#include <stdio.h>
21#include <stdbool.h>
22#include<fcntl.h>
23#include<sys/stat.h>
24#include<sys/types.h>
25#include<unistd.h>
26#include <assert.h>
27#include <log/log.h>
28#include <vendor-ril/telephony/ril.h>
29#include <string>
30#include <mutex>
31#include <vector>
32#include <cutils/properties.h>
33
34#include "Radio_capability_switch_util.h"
35#include "common.h"
36#include "Phone_utils.h"
37#include "utils.h"
38#include "data.h"
39#include "cc.h"
ritafebcbfa2022-04-28 16:30:25 +080040#include "include/lynq_systime.h"
41#include <include/lynq_uci.h>
lhee0d3b32024-04-25 03:54:48 -070042#include "lynq_interface.h"
q.huang036b6cf2023-01-10 14:29:20 +080043#ifdef LED_SUPPORT
44#include "led.h"
45#endif
46#include "lynq_shm.h"
lh7b0674a2022-01-10 00:34:35 -080047static pthread_mutex_t s_DataMutex = PTHREAD_MUTEX_INITIALIZER;
48static pthread_cond_t s_DataCond = PTHREAD_COND_INITIALIZER;
49
50#undef LOG_TAG
51#define LOG_TAG "DEMO_COMMON"
52
llaaca09b2022-03-14 16:14:28 +080053#define UNKOWN_VALUE (-1)
54
55/*Warren add for FAW 2021/11/1 start*/
56extern int ttyGS3_fd = -1;
57/*Warren add for FAW 2021/11/1 end*/
58
59
lh7b0674a2022-01-10 00:34:35 -080060typedef enum {
61 STATE_IN_SERVICE =0,
62 STATE_OUT_OF_SERVICE =1,
63 STATE_EMERGENCY_ONLY =2,
64 STATE_POWER_OFF =3
65} Service_State;
66
67RfDesenseTxTest* m_RfDesense;
68static RIL_CardStatus_v6* cur_CardS_Status[2] = {NULL, NULL};
69static RIL_RadioCapability radio_capability[2];
70
71static int cur_voice_radio_tech[2] = {RADIO_TECH_UNKNOWN, RADIO_TECH_UNKNOWN};
72
73static int reg_voice_service_state[2] = {0, 0};
74static int reg_data_service_state[2] = {0, 0};
75static int reg_data_radio_tech[2] = {RADIO_TECH_UNKNOWN, RADIO_TECH_UNKNOWN};
76static int reg_voice_radio_tech[2] = {RADIO_TECH_UNKNOWN, RADIO_TECH_UNKNOWN};
77static int preferred_network_type[2] = {Phone_utils::PREFERRED_NETWORK_MODE, Phone_utils::PREFERRED_NETWORK_MODE};
78static int radio_status[2] = {RADIO_STATE_UNAVAILABLE, RADIO_STATE_UNAVAILABLE};
79static std::vector<int> call_state[2];
80
81static int default_sim_all = RIL_SOCKET_1;
82static int default_sim_all_except_data = RIL_SOCKET_1;
83static int default_sim_voice = RIL_SOCKET_1;
84static int default_sim_data = RIL_SOCKET_1;
85static int default_sim_sms = RIL_SOCKET_1;
86static bool isNeedReconnect = false;
87
88static std::int32_t token = 0;
89static std::mutex g_mutex;
ll112f8b82023-01-14 11:48:23 +080090
91pthread_mutex_t s_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
92pthread_cond_t s_state_change_cond = PTHREAD_COND_INITIALIZER;
93
llaaca09b2022-03-14 16:14:28 +080094/*Warren add for SZZT 2021/11/14 start*
95** record data registration
96*/
97extern int current_data_reg = -1;
98extern int modemStatus = 0;
you.chene1d75e92024-01-02 14:26:51 +080099int g_lynq_sim_state = -1;
llaaca09b2022-03-14 16:14:28 +0800100
101/*Warren add for SZZT 2021/11/14 end*/
102
q.huang1c03f752023-12-14 14:11:58 +0800103int g_ril_test;
104
llaaca09b2022-03-14 16:14:28 +0800105
106/*hq add for key information output start 2022/03/01*/
107// extern int lynq_output_LINFO_enable =0;
108
109// typedef enum {
110// RADIO_NW_2G = 0,
111// RADIO_NW_3G = 1,
112// RADIO_NW_4G = 2,
113// #ifdef TELEMATIC_5G_SUPPORT
114// RADIO_NW_5G = 3,
115// #endif
116// } RIL_RadioNW;
117
118// const char * cardStateToString(int cardStatus)
119// {
120// switch(cardStatus) {
121// case RIL_CARDSTATE_ABSENT:
122// return "absent";
123// case RIL_CARDSTATE_PRESENT:
124// return "present";
125// case RIL_CARDSTATE_ERROR:
126// return "error";
127// default:
128// return "unknown";
129// }
130// }
131// const char * serviceStateToString(int service_state)
132// {
133// switch(service_state) {
134// case STATE_IN_SERVICE:
135// return "IN SERVICE";
136// case STATE_OUT_OF_SERVICE:
137// return "OUT OF SERVICE";
138// case STATE_POWER_OFF:
139// return "POWER_OFF";
140// case STATE_EMERGENCY_ONLY:
141// return "EMERGENCY_ONLY";
142// case UNKOWN_VALUE:
143// return "unDefined";
144// default:
145// return "unDefined";
146// }
147// }
148// const char * RadioNwToString(int radio_nw)
149// {
150// switch(radio_nw) {
151// case RADIO_NW_2G:
152// return "2G";
153// case RADIO_NW_3G:
154// return "3G";
155// case RADIO_NW_4G:
156// return "4G";
157// #ifdef TELEMATIC_5G_SUPPORT
158// case RADIO_NW_5G:
159// return "5G";
160// #endif
161// case UNKOWN_VALUE:
162// return "unknown";
163// default:
164// return "unknown";
165// }
166// }
167// const char * preferredNetworkTypeToString(int preferred_network_type)
168// {
169// switch(preferred_network_type) {
170// case PREF_NET_TYPE_GSM_WCDMA /*0*/ : return " GSM/WCDMA (WCDMA case PREFerred)";
171// case PREF_NET_TYPE_GSM_ONLY : return " GSM only";
172// case PREF_NET_TYPE_WCDMA : return " WCDMA ";
173// case PREF_NET_TYPE_GSM_WCDMA_AUTO : return " GSM/WCDMA (auto mode, according to PRL)";
174// case PREF_NET_TYPE_CDMA_EVDO_AUTO : return " CDMA and EvDo (auto mode, according to PRL)";
175// case PREF_NET_TYPE_CDMA_ONLY : return " CDMA only";
176// case PREF_NET_TYPE_EVDO_ONLY : return " EvDo only";
177// case PREF_NET_TYPE_GSM_WCDMA_CDMA_EVDO_AUTO : return " GSM/WCDMA, CDMA, and EvDo (auto mode, according to PRL)";
178// case PREF_NET_TYPE_LTE_CDMA_EVDO : return " LTE, CDMA and EvDo";
179// case PREF_NET_TYPE_LTE_GSM_WCDMA : return " LTE, GSM/WCDMA";
180// case PREF_NET_TYPE_LTE_CMDA_EVDO_GSM_WCDMA : return " LTE, CDMA, EvDo, GSM/WCDMA";
181// case PREF_NET_TYPE_LTE_ONLY : return " LTE only";
182// case PREF_NET_TYPE_LTE_WCDMA /*12*/ : return " LTE/WCDMA";
183// case PREF_NET_TYPE_LTE_GSM /*30*/ : return " LTE/GSM";
184// case PREF_NET_TYPE_LTE_TDD_ONLY /*31*/ : return " LTE only";
185// case 13: return "TD-SCDMA only";
186// case 14: return "TD-SCDMA and WCDMA";
187// case 15: return "TD-SCDMA and LTE";
188// case 16: return "TD-SCDMA and GSM";
189// case 17: return "TD-SCDMA,GSM and LTE";
190// case 18: return "TD-SCDMA, GSM/WCDMA";
191// case 19: return "TD-SCDMA, WCDMA and LTE";
192// case 20: return "TD-SCDMA, GSM/WCDMA and LTE";
193// case 21: return "TD-SCDMA,EvDo,CDMA,GSM/WCDMA";
194// case 22: return "TD-SCDMA/LTE/GSM/WCDMA, CDMA, and EvDo";
195// //case 30: return "LTE/GSM";
196// //case 31: return "LTE TDD Only mode";
197// case 32: return "CDMA,GSM(2G Global)";
198// case 33: return "CDMA,EVDO,GSM";
199// case 34: return "LTE,CDMA,EVDO,GSM(4G Global, 4M)";
200// default:
201// return "unDefined";
202// }
203// }
204/*hq add for key information output end*/
lh7b0674a2022-01-10 00:34:35 -0800205
206static int regCodeToRadioTechnology(int request, int code, int slot);
207
llf7bc4182022-11-03 10:21:52 +0800208void lynq_output_info(const char* format,...)
209{
210 if(ttyGS3_fd < 0)
211 {
212 return;
213 }
214 char buf[1024] = {0};
215 int n;
216 va_list args;
217 va_start(args, format);
218 vsnprintf(buf, sizeof(buf), format, args);
219 va_end(args);
220 n=write(ttyGS3_fd, buf, strlen(buf));
221 if(n < 0)
222 {
223 perror("lynq resp write:");
224 }
225 return;
226}
227
lh7b0674a2022-01-10 00:34:35 -0800228void update_call_state(void *response, size_t responselen, int slot) {
229 int num = responselen / sizeof(RIL_Call *);
230 if(num == 0) {
231 call_state[slot].clear();
232 RLOGD("[SIM%d]clear call state", slot);
233 } else {
234 call_state[slot].clear();
235 for (int i = 0 ; i < num ; i++) {
236 RIL_Call *p_cur = ((RIL_Call **) response)[i];
237 /* each call info */
238 call_state[slot].push_back(p_cur->state);
q.huang1e9cdc92022-05-11 19:01:41 +0800239 RLOGD("[SIM%d][id:%d]update_call_state: %d", slot,p_cur->index, p_cur->state);
lh7b0674a2022-01-10 00:34:35 -0800240 }
241 }
242}
243
244int is_call_state_idle(int slot) {
245 bool is_idle = true;
246 if(!call_state[slot].empty()) {
247 is_idle = false;
248 }
249 RLOGD("[SIM%d]is_call_state_idle: %d", slot, is_idle);
250 return is_idle;
251}
252
253void update_preferred_network_type(int type, int slot) {
254 RLOGD("[SIM%d]update_preferred_network_type: %d", slot, type);
255 preferred_network_type[slot] = type;
256}
257
258int get_preferred_network_type(int slot) {
259 return preferred_network_type[slot];
260}
261
262static int needBlockReq(int request)
263{
264#ifdef ENABLE_BLOCK_FEATURE
265 return 1;
266#endif
267
268 switch (request){
269 case RIL_REQUEST_RADIO_POWER: return 1;
270 case RIL_REQUEST_SET_IMS_ENABLE: return 1;
271 //case RIL_REQUEST_DATA_REGISTRATION_STATE: return 1;
272 default: return 0;
273 }
274 return 0;
275}
276
277static int setupToken(int token, int mode, int block)
278{
279 switch (mode){
280 case INIT:
281 token |= INIT_TOKEN_MARK;
282 break;
283 case UDP:
284 token |= RIL_TOKEN_MARK;
285 break;
286 case ATCI:
287 token |= ATCI_TOKEN_MARK;
288 break;
289 case RSPD:
290 token |= RSP_DISP_TOKEN_MARK;
291 break;
292 case OTHER:
293 token |= OTHER_TOKEN_MARK;
294 break;
295 default:
296 break;
297 }
298
299 if(block)
300 token |= BLOCK_MARK;
301
302 return token;
303}
304
305bool isDataConnectEnable(int slot) {
306 char value[PROPERTY_VALUE_MAX] = {0};
307 utils::getMSimProperty(slot,PROP_DEFAULT_DATA_SIM_STATUS, value);
308 if(atoi(value) == 1) {
309 return true;
310 }
311 return false;
312}
313
314void updataDataConnectState(int slot, bool state) {
315 utils::setMSimProperty(slot,PROP_DEFAULT_DATA_SIM_STATUS, const_cast<char*>(state ? "1":"0"));
316}
317
318std::int32_t GenerateToken(int mode, int request) {
319 g_mutex.lock();
320 if (token +1 == TOKEN_MODE) {
321 token = 1;
322 } else {
323 token++;
324 }
325 std::int32_t t= 0;
326 t = setupToken(token,mode,needBlockReq(request));
327 g_mutex.unlock();
328 return t;
329}
330
331RequestInfo* creatRILInfoAndInit(int request, int mode, RIL_SOCKET_ID soc_id)
332{
333 RequestInfo *pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo));
334 if(pRI ==NULL){
335 RLOGE("%s,memory alloc error!",__func__);
336 return NULL;
337 }
338 android::initRequestInfo(pRI,request,mode, soc_id);
339 return pRI;
340}
341
342void set_default_sim_all_except_data(int slot_id) {
343 RLOGD("set_default_sim_all excpet data: %d", slot_id);
344 default_sim_all_except_data = slot_id;
345 set_default_sim_voice(slot_id);
346 set_default_sim_sms(slot_id);
347}
348
349int get_default_sim_all_except_data() {
350 return default_sim_all_except_data;
351}
352
353void set_default_sim_all(int slot_id){
354 RLOGD("set_default_sim_all: %d", slot_id);
355 default_sim_all = slot_id;
356 set_default_sim_all_except_data(slot_id);
357 set_default_sim_data(slot_id);
358}
359
360int get_default_sim_all(){
361 return default_sim_all;
362}
363
364void set_default_sim_voice(int slot_id){
365 RLOGD("set_default_sim_voice: %d", slot_id);
366 default_sim_voice = slot_id;
367}
368
ll112f8b82023-01-14 11:48:23 +0800369void lynq_send_result_already(void)
370{
371 RLOGD("send_imei_state_change");
372 pthread_mutex_lock(&s_state_change_mutex);
373 pthread_cond_signal(&s_state_change_cond);
374 pthread_mutex_unlock(&s_state_change_mutex);
375}
376
you.chene1d75e92024-01-02 14:26:51 +0800377int lynq_wait_result_comeback(int mtime)
ll112f8b82023-01-14 11:48:23 +0800378{
379 RLOGD("wait_call_state");
ll80509e12023-02-02 10:57:42 +0800380 int sec = 0;
you.chene1d75e92024-01-02 14:26:51 +0800381 int ms = 0;
ll80509e12023-02-02 10:57:42 +0800382 struct timeval now;
383 struct timespec timeout;
384 gettimeofday(&now,NULL);
385 sec = mtime/1000;
you.chene1d75e92024-01-02 14:26:51 +0800386 ms = mtime%1000;
ll80509e12023-02-02 10:57:42 +0800387 timeout.tv_sec = now.tv_sec+sec;
you.chene1d75e92024-01-02 14:26:51 +0800388 unsigned long long ns;
389 ns = now.tv_usec*1000ull + ms*1000000ull;
390 timeout.tv_sec += ns/1000000000;
391 timeout.tv_nsec = ns % 1000000000;
ll112f8b82023-01-14 11:48:23 +0800392 pthread_mutex_lock(&s_state_change_mutex);
you.chene1d75e92024-01-02 14:26:51 +0800393 int ret = pthread_cond_timedwait(&s_state_change_cond,&s_state_change_mutex,&timeout);
ll112f8b82023-01-14 11:48:23 +0800394 pthread_mutex_unlock(&s_state_change_mutex);
ll80509e12023-02-02 10:57:42 +0800395 RLOGD("wait_call_state end");
you.chene1d75e92024-01-02 14:26:51 +0800396 return ret;
ll112f8b82023-01-14 11:48:23 +0800397}
398
lh7b0674a2022-01-10 00:34:35 -0800399int get_default_sim_voice(){
400 return default_sim_voice;
401}
402
403void set_default_sim_data(int slot) {
404 RLOGD("set_default_sim_data: %d", slot);
405 pthread_mutex_lock(&s_DataMutex);
406 if(get_default_sim_data() != slot) {
407 if(isDataConnectEnable(get_default_sim_data())) {
408 isNeedReconnect = true;
409 deactivateDataCall(0,NULL,(RIL_SOCKET_ID)0,NULL);
410 RLOGD("set_default_sim_data, wait deactive data call done");
411 pthread_cond_wait(&s_DataCond, &s_DataMutex);
412 RLOGD("set_default_sim_data, deactive data call done");
413 }
414 RLOGD("set_default_sim_data, set prop");
415 default_sim_data = slot;
416 utils::mtk_property_set(PROP_DEFAULT_DATA_SIM, std::to_string(default_sim_data + 1).c_str());
417 while(!isRadioAvailable(RIL_SOCKET_ID(slot))) {
418 sleep(1);
419 RLOGD("[SIM%d]set_default_sim_data(RIL_REQUEST_SET_RADIO_CAPABILITY): wait radio available", slot);
420 }
421 syncDataSettings(RIL_SOCKET_ID(slot));
422 if(utils::is_support_dsds()) {
423 Radio_capability_switch_util::sendRadioCapabilityRequest(slot);
424 }
425 }
lhee0d3b32024-04-25 03:54:48 -0700426 else
427 {
xy.he142f84e2024-09-02 10:22:10 +0800428 //xy.he modified for bug-view-162/bug-view-156 @20240902 started
429 RLOGD("[%s][%d]Already in required sim%d",__FUNCTION__,__LINE__,slot);
430 //xy.he modified for bug-view-162/bug-view-156 @20240902 end
lhee0d3b32024-04-25 03:54:48 -0700431 android::Parcel allow_data_p;
432 allow_data_p.writeInt32 (1);
433 allow_data_p.writeInt32 (LYNQ_URC_ALLOW_DATA);
434 allow_data_p.writeInt32 (slot);
xy.he142f84e2024-09-02 10:22:10 +0800435 //xy.he modified for bug-view-162/bug-view-156 @20240902 started
436 allow_data_p.writeInt32 (0);
437 //xy.he modified for bug-view-162/bug-view-156 @20240902 end
lhee0d3b32024-04-25 03:54:48 -0700438 android::LYNQ_RIL_urcBroadcast(allow_data_p,LYNQ_URC_ALLOW_DATA);
439 }
lh7b0674a2022-01-10 00:34:35 -0800440 pthread_mutex_unlock(&s_DataMutex);
441}
442
443bool isNeedConnect() {
444 return isNeedReconnect;
445}
446
447void resetConnect() {
448 isNeedReconnect = false;
449}
450int get_default_sim_data_for_switch() {
451 return default_sim_data;
452}
453
454int get_default_sim_data(){
455 default_sim_data = utils::mtk_property_get_int32(PROP_DEFAULT_DATA_SIM, 1) -1;
456 return default_sim_data;
457}
458
459void set_default_sim_sms(int slot_id){
460 RLOGD("set_default_sim_sms: %d", slot_id);
461 default_sim_sms = slot_id;
462}
463
464int get_default_sim_sms() {
465 return default_sim_sms;
466}
467
468static int regCodeToServiceState(int request,int code, int slot);
469
470const char * radioStateToString(RIL_RadioState s) {
471 switch (s) {
472 case RADIO_STATE_OFF:
473 return "RADIO_OFF";
474 case RADIO_STATE_UNAVAILABLE:
475 return "RADIO_UNAVAILABLE";
476 case RADIO_STATE_SIM_NOT_READY:
477 return "RADIO_SIM_NOT_READY";
478 case RADIO_STATE_SIM_LOCKED_OR_ABSENT:
479 return "RADIO_SIM_LOCKED_OR_ABSENT";
480 case RADIO_STATE_SIM_READY:
481 return "RADIO_SIM_READY";
482 case RADIO_STATE_RUIM_NOT_READY:
483 return "RADIO_RUIM_NOT_READY";
484 case RADIO_STATE_RUIM_READY:
485 return "RADIO_RUIM_READY";
486 case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:
487 return "RADIO_RUIM_LOCKED_OR_ABSENT";
488 case RADIO_STATE_NV_NOT_READY:
489 return "RADIO_NV_NOT_READY";
490 case RADIO_STATE_NV_READY:
491 return "RADIO_NV_READY";
492 case RADIO_STATE_ON:
493 return "RADIO_ON";
494 default:
495 return "<unknown state>";
496 }
497}
498
499const char *rilSocketIdToString(RIL_SOCKET_ID socket_id) {
500 switch (socket_id) {
501 case RIL_SOCKET_1:
502 return "RIL_SOCKET_1";
503#if (SIM_COUNT >= 2)
504 case RIL_SOCKET_2:
505 return "RIL_SOCKET_2";
506#endif
507#if (SIM_COUNT >= 3)
508 case RIL_SOCKET_3:
509 return "RIL_SOCKET_3";
510#endif
511#if (SIM_COUNT >= 4)
512 case RIL_SOCKET_4:
513 return "RIL_SOCKET_4";
514#endif
515 default:
516 return "not a valid RIL";
517 }
518}
519
520void update_radio_capa(RIL_RadioCapability* cap, int slot) {
521 memset(&radio_capability[slot], 0, sizeof(RIL_RadioCapability));
522 if(cap != NULL) {
523 strcpy(radio_capability[slot].logicalModemUuid,cap->logicalModemUuid);
524 radio_capability[slot].phase = cap->phase;
525 radio_capability[slot].rat = cap->rat;
526 radio_capability[slot].session = cap->session;
527 radio_capability[slot].status = cap->status;
528 radio_capability[slot].version = cap->version;
529 }
530}
531
532RIL_RadioCapability get_radio_capa(int slot) {
533 return radio_capability[slot];
534}
535
536void update_voice_radio_tech(int code, int slot) {
537 cur_voice_radio_tech[slot] = code;
538}
539
540int get_voice_radio_tech(int slot){
541 return cur_voice_radio_tech[slot];
542}
543
544void updateCardStatusV6(RIL_CardStatus_v6 *card_status,int slot)
545{
546 if(cur_CardS_Status[slot] != NULL) {
547 RLOGD("[slot%d]updateCardStatusV6", slot);
548 for(int i = 0; i < cur_CardS_Status[slot]->num_applications; i++) {
549 free(cur_CardS_Status[slot]->applications[i].aid_ptr);
550 cur_CardS_Status[slot]->applications[i].aid_ptr = NULL;
551 free(cur_CardS_Status[slot]->applications[i].app_label_ptr);
552 cur_CardS_Status[slot]->applications[i].app_label_ptr = NULL;
553 }
554 free(cur_CardS_Status[slot]);
555 cur_CardS_Status[slot] = NULL;
556 }
557 cur_CardS_Status[slot] = (RIL_CardStatus_v6 *)calloc(1, sizeof(RIL_CardStatus_v6));
558 memset(cur_CardS_Status[slot], 0, sizeof(RIL_CardStatus_v6));
559 cur_CardS_Status[slot]->card_state = card_status->card_state;
560 cur_CardS_Status[slot]->cdma_subscription_app_index = card_status->cdma_subscription_app_index;
561 cur_CardS_Status[slot]->gsm_umts_subscription_app_index = card_status->gsm_umts_subscription_app_index;
562 cur_CardS_Status[slot]->ims_subscription_app_index = card_status->ims_subscription_app_index;
563 cur_CardS_Status[slot]->num_applications = card_status->num_applications;
564 cur_CardS_Status[slot]->universal_pin_state = card_status->universal_pin_state;
565 RLOGD("[slot%d]updateCardStatusV6 card_state: %d, cdma_index: %d, gsm_index: %d, "
566 "ims_index: %d, num_applications: %d, universal_pin_state: %d",
567 slot,
568 cur_CardS_Status[slot]->card_state,
569 cur_CardS_Status[slot]->cdma_subscription_app_index,
570 cur_CardS_Status[slot]->gsm_umts_subscription_app_index,
571 cur_CardS_Status[slot]->ims_subscription_app_index,
572 cur_CardS_Status[slot]->num_applications,
573 cur_CardS_Status[slot]->universal_pin_state);
574 if(card_status)
575 {
576 for(int i = 0; i < card_status->num_applications; i++) {
577 cur_CardS_Status[slot]->applications[i].app_state = card_status->applications[i].app_state;
578 cur_CardS_Status[slot]->applications[i].app_type = card_status->applications[i].app_type;
579 cur_CardS_Status[slot]->applications[i].perso_substate = card_status->applications[i].perso_substate;
580 cur_CardS_Status[slot]->applications[i].pin1 = card_status->applications[i].pin1;
581 cur_CardS_Status[slot]->applications[i].pin1_replaced = card_status->applications[i].pin1_replaced;
582 cur_CardS_Status[slot]->applications[i].pin2 = card_status->applications[i].pin2;
583 cur_CardS_Status[slot]->applications[i].aid_ptr = strdup(card_status->applications[i].aid_ptr);
584 cur_CardS_Status[slot]->applications[i].app_label_ptr = strdup(card_status->applications[i].app_label_ptr);
585 }
586 } else {
587 RLOGD("[slot%d]updateCardStatusV6: sim card message is null", slot);
588 }
you.chene1d75e92024-01-02 14:26:51 +0800589#ifdef LED_SUPPORT
590 mbtk_netled_state_update(GPIO_NETLED_REFLASH_NORMAL);
591#endif
lh7b0674a2022-01-10 00:34:35 -0800592}
593
594char* getAid(int slot)
595{
596 char* aid = "";
597 int index = -1;
598 if(cur_CardS_Status[slot] != NULL){
599 if(Phone_utils::get_phone_type(slot) == Phone_utils::PHONE_TYPE_CDMA) {
600 index = cur_CardS_Status[slot]->cdma_subscription_app_index;
601 } else {
602 index = cur_CardS_Status[slot]->gsm_umts_subscription_app_index;
603 }
604 if(index >= 0 && index < cur_CardS_Status[slot]->num_applications) {
605 aid = cur_CardS_Status[slot]->applications[index].aid_ptr;
606 }
607 }
608 RLOGD("[slot%d] index: %d, getAid: %s", slot, index, aid);
609 return aid;
610}
611
612void update_reg_voice_service_state(int request, char *code, int slot, int32_t token)
613{
614 if((reg_voice_service_state[slot] != atoi(code)) || ((token&RIL_TOKEN_MARK) == RIL_TOKEN_MARK)) {
615 reg_voice_service_state[slot] = atoi(code);
616 regCodeToServiceState(request, atoi(code), slot);
617 }
you.chene1d75e92024-01-02 14:26:51 +0800618#ifdef LED_SUPPORT
619 mbtk_netled_state_update(GPIO_NETLED_REFLASH_NORMAL);
620#endif
lh7b0674a2022-01-10 00:34:35 -0800621}
622
623void update_reg_voice_radio_tech(int request, int code, int slot, int32_t token) {
624 if((reg_voice_radio_tech[slot] != code) || ((token&RIL_TOKEN_MARK) == RIL_TOKEN_MARK)){
625 reg_voice_radio_tech[slot] = code;
626 regCodeToRadioTechnology(request, code, slot);
627 }
628}
629
630void update_reg_data_service_state(int request, char *code,int slot, int32_t token)
631{
632 if((reg_data_service_state[slot] != atoi(code)) || ((token&RIL_TOKEN_MARK) == RIL_TOKEN_MARK)) {
633 reg_data_service_state[slot] = atoi(code);
634 regCodeToServiceState(request, atoi(code), slot);
llaaca09b2022-03-14 16:14:28 +0800635 /*Warren change for SZZT 2021//11/14 start*/
636 int status = regCodeToServiceState(request, atoi(code), slot);
637 current_data_reg = status;
638 /*Warren change for SZZT 2021//11/14 end*/
lh7b0674a2022-01-10 00:34:35 -0800639 }
you.chene1d75e92024-01-02 14:26:51 +0800640#ifdef LED_SUPPORT
641 mbtk_netled_state_update(GPIO_NETLED_REFLASH_NORMAL);
642#endif
lh7b0674a2022-01-10 00:34:35 -0800643}
644
645void update_reg_data_radio_tech(int request, int code, int slot, int32_t token){
646 if((reg_data_radio_tech[slot] != code) || ((token&RIL_TOKEN_MARK) == RIL_TOKEN_MARK)) {
647 reg_data_radio_tech[slot] = code;
648 regCodeToRadioTechnology(request, code, slot);
649 }
650}
651
652void registerRadioOn(RfDesenseTxTest* rf){
653 if(!m_RfDesense) {
654 m_RfDesense = rf;
655 }
656}
657
658void unregisterRadioOn() {
659 if(m_RfDesense) {
660 m_RfDesense == NULL;
661 }
662}
663
664void registerRadioOffOrNotAvailable(RfDesenseTxTest* rf){
665 if(!m_RfDesense) {
666 m_RfDesense = rf;
667 }
668}
669
670void unregisterRadioOffOrNotAvailable() {
671 if(m_RfDesense) {
672 m_RfDesense == NULL;
673 }
674}
675
676void registerOnUnsolOemHookRaw(RfDesenseTxTest* rf){
677 if(!m_RfDesense) {
678 m_RfDesense = rf;
679 }
680}
681
682void unregisterOnUnsolOemHookRaw(){
683 if(m_RfDesense) {
684 m_RfDesense == NULL;
685 }
686}
687
688void register_response_oem_hook_raw(RfDesenseTxTest* rf){
689 if(!m_RfDesense) {
690 m_RfDesense = rf;
691 }
692}
693
694void unregister_response_oem_hook_raw(){
695 if(m_RfDesense) {
696 m_RfDesense == NULL;
697 }
698}
699
700void updateRadioStatus(int newValue ,RIL_SOCKET_ID soc_id)
701{
702 RLOGD("updateRadioStatus oldState: %d, newState: %d", radio_status[soc_id], newValue);
703 bool newOn = (newValue == RADIO_STATE_ON);
704 bool oldOn = (radio_status[soc_id] == RADIO_STATE_ON);
705 bool newAvaiable = (newValue != RADIO_STATE_UNAVAILABLE);
706 bool oldAvaiable = (radio_status[soc_id] != RADIO_STATE_UNAVAILABLE);
707 if (newOn && !oldOn) {
708 RLOGD("RadioStateOn");
709 //printf("[SIM%d] radio on\n",soc_id +1);
710 if(m_RfDesense){
711 m_RfDesense->emRadioStateOn();
712 }
713 }
714
715 if ((!newOn || !newAvaiable) && !((!oldOn || !oldAvaiable))) {
716 RLOGD("RadioStateOfforNotAvailable");
717 //printf("[SIM%d] radio off or not available\n",soc_id +1);
718 if(m_RfDesense){
719 m_RfDesense->emRadioStateOfforNotAvailable();
720 }
721 }
722 if(newValue != radio_status[soc_id]) {
723 radio_status[soc_id] = newValue;
724 }
725}
726
727bool isRadioOn(RIL_SOCKET_ID soc_id)
728{
729 return radio_status[soc_id] == RADIO_STATE_ON;
730}
731
732bool isRadioAvailable(RIL_SOCKET_ID soc_id)
733{
734 return radio_status[soc_id] != RADIO_STATE_UNAVAILABLE;
735}
736
737static int regCodeToServiceState(int request,int code, int slot)
738{
739 RLOGD("[slot%d]regCodeToServiceState %d, request: %s",slot, code, android::requestToString(request));
740 switch (code)
741 {
742 case 0:
743 case 2: // 2 is "searching"
744 case 3: // 3 is "registration denied"
745 case 4: // 4 is "unknown" no vaild in current baseband
746 case 10:// same as 0, but indicates that emergency call is possible.
747 case 12:// same as 2, but indicates that emergency call is possible.
748 case 13:// same as 3, but indicates that emergency call is possible.
749 case 14:// same as 4, but indicates that emergency call is possible.
750 {
751 if(request == RIL_REQUEST_VOICE_REGISTRATION_STATE) {
752 printf("[QUERY][VOICE REG_STATUS][SIM%d] The current service state is OUT OF SERVICE\n", slot);
753 } else {
754 printf("[QUERY][DATA REG_STATUS][SIM%d] The current service state is OUT OF SERVICE\n", slot);
755 }
756 return STATE_OUT_OF_SERVICE;
757 }
758
759 case 1:
760 case 5:
761 {
762 if(request == RIL_REQUEST_VOICE_REGISTRATION_STATE) {
763 printf("[QUERY][VOICE REG_STATUS][SIM%d] The current service state is IN SERVICE\n", slot);
764 } else {
765 printf("[QUERY][DATA REG_STATUS][SIM%d] The current service state is IN SERVICE\n", slot);
766 }
767 return STATE_IN_SERVICE;
768 }
769
770 default:
771 {
772 if(request == RIL_REQUEST_VOICE_REGISTRATION_STATE) {
773 printf("[QUERY][VOICE REG_STATUS][SIM%d] Unexpected service state %d\n", slot, code);
774 } else {
775 printf("[QUERY][DATA REG_STATUS][SIM%d] Unexpected service state %d\n", slot, code);
776 }
777 RLOGW("[SIM%d]regCodeToServiceState: unexpected service state %d", slot, code);
778 return STATE_OUT_OF_SERVICE;
779 }
780 }
781}
782
783static int regCodeToRadioTechnology(int request, int code, int slot) {
784 RLOGD("[slot%d]regCodeToRadioTechnology %d, request: %s",slot, code, android::requestToString(request));
785 switch(code) {
786 case RADIO_TECH_LTE:
787 {
788 if(request == RIL_REQUEST_VOICE_REGISTRATION_STATE) {
789 printf("[QUERY][VOICE REG_STATUS][SIM%d] The registered radio technology is 4G\n", slot);
790 } else {
791 printf("[QUERY][DATA REG_STATUS][SIM%d] The registered radio technology is 4G\n", slot);
792 }
793 break;
794 }
795 case RADIO_TECH_GSM:
796 case RADIO_TECH_GPRS:
797 case RADIO_TECH_EDGE:
798 case RADIO_TECH_IS95A:
799 case RADIO_TECH_IS95B:
800 case RADIO_TECH_1xRTT:
801 {
802 if(request == RIL_REQUEST_VOICE_REGISTRATION_STATE) {
803 printf("[QUERY][VOICE REG_STATUS][SIM%d] The registered radio technology is 2G\n", slot);
804 } else {
805 printf("[QUERY][DATA REG_STATUS][SIM%d] The registered radio technology is 2G\n", slot);
806 }
807 break;
808 }
809 case RADIO_TECH_UMTS:
810 case RADIO_TECH_HSDPA:
811 case RADIO_TECH_HSUPA:
812 case RADIO_TECH_HSPA:
813 case RADIO_TECH_EHRPD:
814 case RADIO_TECH_HSPAP:
815 case RADIO_TECH_TD_SCDMA:
816 case RADIO_TECH_EVDO_0:
817 case RADIO_TECH_EVDO_A:
818 case RADIO_TECH_EVDO_B:
819 {
820 if(request == RIL_REQUEST_VOICE_REGISTRATION_STATE) {
821 printf("[QUERY][VOICE REG_STATUS][SIM%d] The registered radio technology is 3G\n", slot);
822 } else {
823 printf("[QUERY][DATA REG_STATUS][SIM%d] The registered radio technology is 3G\n", slot);
824 }
825 break;
826 }
827#ifdef TELEMATIC_5G_SUPPORT
828 case RADIO_TECH_NR://5G
829 {
830 if(request == RIL_REQUEST_VOICE_REGISTRATION_STATE) {
831 printf("[QUERY][VOICE REG_STATUS][SIM%d] The registered radio technology is 5G\n", slot);
832 } else {
833 printf("[QUERY][DATA REG_STATUS][SIM%d] The registered radio technology is 5G\n", slot);
834 }
835 break;
836 }
837#endif
838 case RADIO_TECH_UNKNOWN:
839 {
840 if(request == RIL_REQUEST_VOICE_REGISTRATION_STATE) {
841 printf("[QUERY][VOICE REG_STATUS][SIM%d] The registered radio technology is unknown\n", slot);
842 } else {
843 printf("[QUERY][DATA REG_STATUS][SIM%d] The registered radio technology is unknown\n", slot);
844 }
845 break;
846 }
847 default:
848 {
849 if(request == RIL_REQUEST_VOICE_REGISTRATION_STATE) {
850 printf("[QUERY][VOICE REG_STATUS][SIM%d] %d is unexpected value\n",slot, code);
851 } else {
852 printf("[QUERY][DATA REG_STATUS][SIM%d] %d is unexpected value\n",slot, code);
853 }
854 }
855 }
856 return 0;
857}
858
859int get_reg_data_radio_tech(int slot) {
860 return reg_data_radio_tech[slot];
861}
862
863int get_reg_voice_radio_tech(int slot) {
864 return reg_voice_radio_tech[slot];
865}
866
867#ifdef ECALL_SUPPORT
868void ConvertMsd(const char *msdChar, unsigned char *msd) {
869 unsigned int n, x;
870
871 for (n = 0; n < MSD_MAX_LENGTH; n++) {
872 if (sscanf(&msdChar[n<<1], "%2x", &x) == 1) {
873 msd[n] = x;
874 } else {
875 RLOGE("invalid MSD characters");
876 break;
877 }
878 }
879}
880#endif /*ECALL_SUPPORT*/
881
882bool isFinalResponseErrorEx(char* str) {
883 AtLine atline(str, NULL);
884 return (atline.isFinalResponseErrorEx(0) == 1 ? true : false);
885}
886
887int get_atci_sim(){
888 return utils::mtk_property_get_int32(ATCI_SIM, 0);
889}
890
891static char *findNextChar(char *p, char c, int length)
892{
893 char *ptr = p;
894 int i = 0;
895 while (i++ < length)
896 {
897 if (*ptr++ == c)
898 return ptr;
899 }
900 return NULL;
901}
902
903static int getGMTval(char *pdata)
904{
905 char *ptr;
906 ptr = findNextChar(pdata, '+', strlen(pdata));
907 if (ptr == NULL)
908 {
909 ptr = findNextChar(pdata, '-', strlen(pdata));
910 if (ptr == NULL)
911 {
912 return 0;
913 }
914 }
915 return atoi(ptr);
916}
917
918static void adjustGMT2LocalTime(struct tm *src, int dGMTval)
919{
920 time_t t1, t2;
921 struct tm * ptm;
922 char buf[255];
923 int dShiftSec;
924
925 dShiftSec = dGMTval * 15 * 60;
926 t1 = mktime(src);
rita217de532022-05-31 17:15:48 +0800927
lh7b0674a2022-01-10 00:34:35 -0800928 t2 = (time_t)(t1 + dShiftSec);
929 ptm = gmtime(&t2);
930
931 memcpy(src, ptm, sizeof(struct tm));
932}
933
934void updateSystemTime(const void *data, int datalen)
935{
936 char strTime[32];
937 struct tm tm;
938 time_t t;
939 int dGMTval;
ritafebcbfa2022-04-28 16:30:25 +0800940 char modem_sync_enable[24] = "";
lh7b0674a2022-01-10 00:34:35 -0800941
942 if (data == NULL || datalen <= 0)
943 return;
944
945 memset(strTime, 0, sizeof(strTime));
946 strcat(strTime, "20");
947 strcat(strTime, (const char *)data);
948
949 dGMTval = getGMTval(strTime);
950 memset(&tm, 0, sizeof(struct tm));
951 strptime(strTime, "%Y/%m/%d,%H:%M:%S", &tm);
952
rita217de532022-05-31 17:15:48 +0800953 //adjustGMT2LocalTime(&tm, dGMTval);
lh7b0674a2022-01-10 00:34:35 -0800954
955 t = mktime(&tm);
ritafebcbfa2022-04-28 16:30:25 +0800956
957 lynq_get_value("lynq_uci", "lynq_sync_time", "lynq_modem_sync_time_enable" , modem_sync_enable);
958 if(!atoi(modem_sync_enable))
959 return ;
960
lh7b0674a2022-01-10 00:34:35 -0800961 stime(&t);
you.chena97b5ed2024-02-21 20:33:57 +0800962 system("hwclock -w --utc -f /dev/rtc0");
lh7b0674a2022-01-10 00:34:35 -0800963 return;
964}
965void notifyDataSignal() {
966 RLOGE("notifyDataSignal()");
967 pthread_mutex_lock(&s_DataMutex);
968 pthread_cond_broadcast(&s_DataCond);
969 pthread_mutex_unlock(&s_DataMutex);
970}
971
972bool mtkItTest(const char* data) {
973 std::string str("");
974 str.append(data);
975 RLOGD("%s, data: %s", __FUNCTION__, str.c_str());
976 std::vector<std::string> all;
977 RequestInfo* pRI = NULL;
978 utils::tokenize(str, ',', all);
979 if(all[0] != std::string("TEST")) {
980 return false;
981 }
982 android::Parcel p;
983 size_t pos = p.dataPosition();
984 for(int i = 1 ; i < all.size(); i++) {
985 std::string str = all[i];
986 RLOGD("%s, all[%d]: %s", __FUNCTION__, i, str.c_str());
987 std::vector<std::string> items;
988 utils::tokenize(str, '=', items);
989 if(items.size() == 2) {
990 if(items[0] == std::string("INT")) {
991 int para = std::stoi(items[1]);
992 p.writeInt32(para);
993 } else if(items[0] == std::string("STR")) {
994 writeStringToParcel(p, items[1].c_str());
995 } else if(items[0] == std::string("REQ")) {
996 int request = std::stoi(items[1]);
lhb07f4e12022-02-17 22:08:54 -0800997
998 // For loop, free before reassign to avoid memory leak
999 if (pRI != NULL) {
1000 free(pRI);
1001 }
lh7b0674a2022-01-10 00:34:35 -08001002 pRI = creatRILInfoAndInit(request, UDP, (RIL_SOCKET_ID) ((0)));
1003 }
1004 } else {
1005 RLOGD("%s, too many \"=\"");
1006 }
1007 }
lhb07f4e12022-02-17 22:08:54 -08001008
lh7b0674a2022-01-10 00:34:35 -08001009 if(pRI && pRI->pCI) {
1010 p.setDataPosition(pos);
1011 pRI->pCI->dispatchFunction(p, pRI);
lh7b0674a2022-01-10 00:34:35 -08001012 }
lhb07f4e12022-02-17 22:08:54 -08001013
1014 // Free to avoid memory leak
1015 if(pRI != NULL) {
1016 free(pRI);
1017 pRI = NULL;
1018 }
1019
lh7b0674a2022-01-10 00:34:35 -08001020 return true;
1021}
1022int lynqSocketSendto(int fd,struct sockaddr *dest_addr,int addr_len,char msg[])
1023{
1024 int ret = 0;
1025 ret = sendto(fd,msg,strlen(msg),0,dest_addr,addr_len);
1026 if(ret>0)
1027 {
1028 RLOGD("[lynqSocketSendto] send msg success!!!");
1029 return 0;
1030 }
1031 else
1032 {
1033 RLOGD("[lynqSocketSendto] send msg fail!!!");
1034 return -1;
1035 }
llaaca09b2022-03-14 16:14:28 +08001036}
q.huang4e08e4d2022-12-28 10:58:48 +08001037
q.huang036b6cf2023-01-10 14:29:20 +08001038void lynq_exit()
1039{
1040 ril_deinit_mem();
q.huangde375eb2023-02-17 09:42:35 +08001041#ifdef LED_SUPPORT
q.huang036b6cf2023-01-10 14:29:20 +08001042 mbtk_netled_deinit();
q.huangde375eb2023-02-17 09:42:35 +08001043#endif
q.huang036b6cf2023-01-10 14:29:20 +08001044}
1045
q.huang4e08e4d2022-12-28 10:58:48 +08001046#ifdef LED_SUPPORT
1047bool ril_get_if_insert_simcard()
1048{
1049 int slot_id=get_default_sim_voice();
1050
1051 if(slot_id==0 || slot_id ==1)
1052 {
1053 if(cur_CardS_Status[slot_id]!=NULL)
1054 {
1055 return cur_CardS_Status[slot_id]->card_state == RIL_CARDSTATE_PRESENT;
1056 }
1057
1058 }
1059 return false;
1060}
1061
1062bool ril_get_if_3gpp_reg_success()
1063{
1064 int slot_id=get_default_sim_voice();
1065
1066 if(slot_id==0 || slot_id ==1)
1067 {
1068 return reg_voice_service_state[slot_id] ==1;
1069 }
1070 return false;
1071}
you.chene1d75e92024-01-02 14:26:51 +08001072
1073bool ril_get_if_3gpp_data_reg_success()
1074{
1075 int slot_id=get_default_sim_data();
1076
1077 if(slot_id==0 || slot_id ==1)
1078 {
1079 return reg_data_service_state[slot_id] ==1;
1080 }
1081 return false;
1082}
1083
q.huang4e08e4d2022-12-28 10:58:48 +08001084#endif
llaaca09b2022-03-14 16:14:28 +08001085/*hq add for key info output 2022/03/01 begin*/
1086// void lynq_output_LINFO_all()
1087// {
1088// int slot,startSlot=0,slotNum=SIM_COUNT;
1089
1090// if(default_sim_voice==default_sim_data && default_sim_voice==default_sim_sms){
1091// startSlot=default_sim_voice;
1092// slotNum=1;
1093// }
1094
1095// lynq_output_info("+LINFO: Report switch when key information changed is set: %d\n",lynq_output_LINFO_enable);
1096// lynq_output_info("+LINFO: Default voice SIM card is set : [SIM%d]\n", default_sim_voice+1);
1097// lynq_output_info("+LINFO: Default data SIM card is set : [SIM%d]\n", default_sim_data+1);
1098// lynq_output_info("+LINFO: Default sms SIM card is set : [SIM%d]\n", default_sim_sms+1);
1099
1100// for(slot=startSlot;slot<startSlot+slotNum;slot++){
1101// lynq_output_info("+LINFO: [SIM%d] Card State is %s\n",slot+1,cardStateToString((cur_CardS_Status[slot]!=NULL ? cur_CardS_Status[slot]->card_state:UNKOWN_VALUE)));
1102// lynq_output_info("+LINFO: [SIM%d] Preferred network_type: is %s\n", slot+1, preferredNetworkTypeToString(preferred_network_type[slot]));
1103// lynq_output_info("+LINFO: [SIM%d] Voice Registration State is %s\n",slot+1,serviceStateToString(regCodeToServiceState(reg_voice_service_state[slot])));
1104// lynq_output_info("+LINFO: [SIM%d] Voice Radio Access Network is %s\n",slot+1,RadioNwToString(regCodeToRadioTechnology(reg_voice_radio_tech[slot])));
1105// lynq_output_info("+LINFO: [SIM%d] Data Registration State is %s\n",slot+1,serviceStateToString(regCodeToServiceState(reg_data_service_state[slot])));
1106// lynq_output_info("+LINFO: [SIM%d] Data Radio Access Network is %s\n",slot+1,RadioNwToString(regCodeToRadioTechnology(reg_data_radio_tech[slot])));
1107// }
1108// return;
1109// }
1110// void lynq_output_LINFO(const char* format,...)
1111// {
1112// char buf[1024] = {0};
1113// int n;
1114// char ebuf[1024] = {0};
1115
1116// if(lynq_output_LINFO_enable)
1117// {
1118// va_list args;
1119// va_start(args, format);
1120// vsnprintf(buf, sizeof(buf), format, args);
1121// va_end(args);
1122
1123// printf("hq %s",buf);
1124// n=snprintf(ebuf,sizeof(ebuf),"+LINFO: %s", buf);
1125
1126// n=write(ttyGS3_fd, ebuf, strlen(ebuf));
1127// if(n < 0)
1128// {
1129// perror("lynq resp write:");
1130// }
1131// }
1132// return;
1133// }
1134// void lynq_output_info(const char* format,...)
1135// {
1136// char buf[1024] = {0};
1137// int n;
1138
1139// va_list args;
1140// va_start(args, format);
1141// vsnprintf(buf, sizeof(buf), format, args);
1142// va_end(args);
1143
1144// n=write(ttyGS3_fd, buf, strlen(buf));
1145// if(n < 0)
1146// {
1147// perror("lynq resp write:");
1148// }
1149
1150// return;
1151// }
1152/*hq add for key info output 2022/03/01 end*/