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