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