blob: 37e5c414a2513a9f4cb988e62222d082a1f1939b [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"
lhb07f4e12022-02-17 22:08:54 -080040
lh7b0674a2022-01-10 00:34:35 -080041static pthread_mutex_t s_DataMutex = PTHREAD_MUTEX_INITIALIZER;
42static pthread_cond_t s_DataCond = PTHREAD_COND_INITIALIZER;
43
44#undef LOG_TAG
45#define LOG_TAG "DEMO_COMMON"
46
47typedef enum {
48 STATE_IN_SERVICE =0,
49 STATE_OUT_OF_SERVICE =1,
50 STATE_EMERGENCY_ONLY =2,
51 STATE_POWER_OFF =3
52} Service_State;
53
54RfDesenseTxTest* m_RfDesense;
55static RIL_CardStatus_v6* cur_CardS_Status[2] = {NULL, NULL};
56static RIL_RadioCapability radio_capability[2];
57
58static int cur_voice_radio_tech[2] = {RADIO_TECH_UNKNOWN, RADIO_TECH_UNKNOWN};
59
60static int reg_voice_service_state[2] = {0, 0};
61static int reg_data_service_state[2] = {0, 0};
62static int reg_data_radio_tech[2] = {RADIO_TECH_UNKNOWN, RADIO_TECH_UNKNOWN};
63static int reg_voice_radio_tech[2] = {RADIO_TECH_UNKNOWN, RADIO_TECH_UNKNOWN};
64static int preferred_network_type[2] = {Phone_utils::PREFERRED_NETWORK_MODE, Phone_utils::PREFERRED_NETWORK_MODE};
65static int radio_status[2] = {RADIO_STATE_UNAVAILABLE, RADIO_STATE_UNAVAILABLE};
66static std::vector<int> call_state[2];
67
68static int default_sim_all = RIL_SOCKET_1;
69static int default_sim_all_except_data = RIL_SOCKET_1;
70static int default_sim_voice = RIL_SOCKET_1;
71static int default_sim_data = RIL_SOCKET_1;
72static int default_sim_sms = RIL_SOCKET_1;
73static bool isNeedReconnect = false;
74
75static std::int32_t token = 0;
76static std::mutex g_mutex;
77
78static int regCodeToRadioTechnology(int request, int code, int slot);
79
80void update_call_state(void *response, size_t responselen, int slot) {
81 int num = responselen / sizeof(RIL_Call *);
82 if(num == 0) {
83 call_state[slot].clear();
84 RLOGD("[SIM%d]clear call state", slot);
85 } else {
86 call_state[slot].clear();
87 for (int i = 0 ; i < num ; i++) {
88 RIL_Call *p_cur = ((RIL_Call **) response)[i];
89 /* each call info */
90 call_state[slot].push_back(p_cur->state);
91 RLOGD("[SIM%d][id:%d]update_call_state: %d", slot,p_cur->index, p_cur->state);
92 if(p_cur->isMT) {
93 resetMute();
94 }
95 }
96 }
97}
98
99int is_call_state_idle(int slot) {
100 bool is_idle = true;
101 if(!call_state[slot].empty()) {
102 is_idle = false;
103 }
104 RLOGD("[SIM%d]is_call_state_idle: %d", slot, is_idle);
105 return is_idle;
106}
107
108void update_preferred_network_type(int type, int slot) {
109 RLOGD("[SIM%d]update_preferred_network_type: %d", slot, type);
110 preferred_network_type[slot] = type;
111}
112
113int get_preferred_network_type(int slot) {
114 return preferred_network_type[slot];
115}
116
117static int needBlockReq(int request)
118{
119#ifdef ENABLE_BLOCK_FEATURE
120 return 1;
121#endif
122
123 switch (request){
124 case RIL_REQUEST_RADIO_POWER: return 1;
125 case RIL_REQUEST_SET_IMS_ENABLE: return 1;
126 //case RIL_REQUEST_DATA_REGISTRATION_STATE: return 1;
127 default: return 0;
128 }
129 return 0;
130}
131
132static int setupToken(int token, int mode, int block)
133{
134 switch (mode){
135 case INIT:
136 token |= INIT_TOKEN_MARK;
137 break;
138 case UDP:
139 token |= RIL_TOKEN_MARK;
140 break;
141 case ATCI:
142 token |= ATCI_TOKEN_MARK;
143 break;
144 case RSPD:
145 token |= RSP_DISP_TOKEN_MARK;
146 break;
147 case OTHER:
148 token |= OTHER_TOKEN_MARK;
149 break;
150 default:
151 break;
152 }
153
154 if(block)
155 token |= BLOCK_MARK;
156
157 return token;
158}
159
160bool isDataConnectEnable(int slot) {
161 char value[PROPERTY_VALUE_MAX] = {0};
162 utils::getMSimProperty(slot,PROP_DEFAULT_DATA_SIM_STATUS, value);
163 if(atoi(value) == 1) {
164 return true;
165 }
166 return false;
167}
168
169void updataDataConnectState(int slot, bool state) {
170 utils::setMSimProperty(slot,PROP_DEFAULT_DATA_SIM_STATUS, const_cast<char*>(state ? "1":"0"));
171}
172
173std::int32_t GenerateToken(int mode, int request) {
174 g_mutex.lock();
175 if (token +1 == TOKEN_MODE) {
176 token = 1;
177 } else {
178 token++;
179 }
180 std::int32_t t= 0;
181 t = setupToken(token,mode,needBlockReq(request));
182 g_mutex.unlock();
183 return t;
184}
185
186RequestInfo* creatRILInfoAndInit(int request, int mode, RIL_SOCKET_ID soc_id)
187{
188 RequestInfo *pRI = (RequestInfo *)calloc(1, sizeof(RequestInfo));
189 if(pRI ==NULL){
190 RLOGE("%s,memory alloc error!",__func__);
191 return NULL;
192 }
193 android::initRequestInfo(pRI,request,mode, soc_id);
194 return pRI;
195}
196
197void set_default_sim_all_except_data(int slot_id) {
198 RLOGD("set_default_sim_all excpet data: %d", slot_id);
199 default_sim_all_except_data = slot_id;
200 set_default_sim_voice(slot_id);
201 set_default_sim_sms(slot_id);
202}
203
204int get_default_sim_all_except_data() {
205 return default_sim_all_except_data;
206}
207
208void set_default_sim_all(int slot_id){
209 RLOGD("set_default_sim_all: %d", slot_id);
210 default_sim_all = slot_id;
211 set_default_sim_all_except_data(slot_id);
212 set_default_sim_data(slot_id);
213}
214
215int get_default_sim_all(){
216 return default_sim_all;
217}
218
219void set_default_sim_voice(int slot_id){
220 RLOGD("set_default_sim_voice: %d", slot_id);
221 default_sim_voice = slot_id;
222}
223
224int get_default_sim_voice(){
225 return default_sim_voice;
226}
227
228void set_default_sim_data(int slot) {
229 RLOGD("set_default_sim_data: %d", slot);
230 pthread_mutex_lock(&s_DataMutex);
231 if(get_default_sim_data() != slot) {
232 if(isDataConnectEnable(get_default_sim_data())) {
233 isNeedReconnect = true;
234 deactivateDataCall(0,NULL,(RIL_SOCKET_ID)0,NULL);
235 RLOGD("set_default_sim_data, wait deactive data call done");
236 pthread_cond_wait(&s_DataCond, &s_DataMutex);
237 RLOGD("set_default_sim_data, deactive data call done");
238 }
239 RLOGD("set_default_sim_data, set prop");
240 default_sim_data = slot;
241 utils::mtk_property_set(PROP_DEFAULT_DATA_SIM, std::to_string(default_sim_data + 1).c_str());
242 while(!isRadioAvailable(RIL_SOCKET_ID(slot))) {
243 sleep(1);
244 RLOGD("[SIM%d]set_default_sim_data(RIL_REQUEST_SET_RADIO_CAPABILITY): wait radio available", slot);
245 }
246 syncDataSettings(RIL_SOCKET_ID(slot));
247 if(utils::is_support_dsds()) {
248 Radio_capability_switch_util::sendRadioCapabilityRequest(slot);
249 }
250 }
251 pthread_mutex_unlock(&s_DataMutex);
252}
253
254bool isNeedConnect() {
255 return isNeedReconnect;
256}
257
258void resetConnect() {
259 isNeedReconnect = false;
260}
261int get_default_sim_data_for_switch() {
262 return default_sim_data;
263}
264
265int get_default_sim_data(){
266 default_sim_data = utils::mtk_property_get_int32(PROP_DEFAULT_DATA_SIM, 1) -1;
267 return default_sim_data;
268}
269
270void set_default_sim_sms(int slot_id){
271 RLOGD("set_default_sim_sms: %d", slot_id);
272 default_sim_sms = slot_id;
273}
274
275int get_default_sim_sms() {
276 return default_sim_sms;
277}
278
279static int regCodeToServiceState(int request,int code, int slot);
280
281const char * radioStateToString(RIL_RadioState s) {
282 switch (s) {
283 case RADIO_STATE_OFF:
284 return "RADIO_OFF";
285 case RADIO_STATE_UNAVAILABLE:
286 return "RADIO_UNAVAILABLE";
287 case RADIO_STATE_SIM_NOT_READY:
288 return "RADIO_SIM_NOT_READY";
289 case RADIO_STATE_SIM_LOCKED_OR_ABSENT:
290 return "RADIO_SIM_LOCKED_OR_ABSENT";
291 case RADIO_STATE_SIM_READY:
292 return "RADIO_SIM_READY";
293 case RADIO_STATE_RUIM_NOT_READY:
294 return "RADIO_RUIM_NOT_READY";
295 case RADIO_STATE_RUIM_READY:
296 return "RADIO_RUIM_READY";
297 case RADIO_STATE_RUIM_LOCKED_OR_ABSENT:
298 return "RADIO_RUIM_LOCKED_OR_ABSENT";
299 case RADIO_STATE_NV_NOT_READY:
300 return "RADIO_NV_NOT_READY";
301 case RADIO_STATE_NV_READY:
302 return "RADIO_NV_READY";
303 case RADIO_STATE_ON:
304 return "RADIO_ON";
305 default:
306 return "<unknown state>";
307 }
308}
309
310const char *rilSocketIdToString(RIL_SOCKET_ID socket_id) {
311 switch (socket_id) {
312 case RIL_SOCKET_1:
313 return "RIL_SOCKET_1";
314#if (SIM_COUNT >= 2)
315 case RIL_SOCKET_2:
316 return "RIL_SOCKET_2";
317#endif
318#if (SIM_COUNT >= 3)
319 case RIL_SOCKET_3:
320 return "RIL_SOCKET_3";
321#endif
322#if (SIM_COUNT >= 4)
323 case RIL_SOCKET_4:
324 return "RIL_SOCKET_4";
325#endif
326 default:
327 return "not a valid RIL";
328 }
329}
330
331void update_radio_capa(RIL_RadioCapability* cap, int slot) {
332 memset(&radio_capability[slot], 0, sizeof(RIL_RadioCapability));
333 if(cap != NULL) {
334 strcpy(radio_capability[slot].logicalModemUuid,cap->logicalModemUuid);
335 radio_capability[slot].phase = cap->phase;
336 radio_capability[slot].rat = cap->rat;
337 radio_capability[slot].session = cap->session;
338 radio_capability[slot].status = cap->status;
339 radio_capability[slot].version = cap->version;
340 }
341}
342
343RIL_RadioCapability get_radio_capa(int slot) {
344 return radio_capability[slot];
345}
346
347void update_voice_radio_tech(int code, int slot) {
348 cur_voice_radio_tech[slot] = code;
349}
350
351int get_voice_radio_tech(int slot){
352 return cur_voice_radio_tech[slot];
353}
354
355void updateCardStatusV6(RIL_CardStatus_v6 *card_status,int slot)
356{
357 if(cur_CardS_Status[slot] != NULL) {
358 RLOGD("[slot%d]updateCardStatusV6", slot);
359 for(int i = 0; i < cur_CardS_Status[slot]->num_applications; i++) {
360 free(cur_CardS_Status[slot]->applications[i].aid_ptr);
361 cur_CardS_Status[slot]->applications[i].aid_ptr = NULL;
362 free(cur_CardS_Status[slot]->applications[i].app_label_ptr);
363 cur_CardS_Status[slot]->applications[i].app_label_ptr = NULL;
364 }
365 free(cur_CardS_Status[slot]);
366 cur_CardS_Status[slot] = NULL;
367 }
368 cur_CardS_Status[slot] = (RIL_CardStatus_v6 *)calloc(1, sizeof(RIL_CardStatus_v6));
369 memset(cur_CardS_Status[slot], 0, sizeof(RIL_CardStatus_v6));
370 cur_CardS_Status[slot]->card_state = card_status->card_state;
371 cur_CardS_Status[slot]->cdma_subscription_app_index = card_status->cdma_subscription_app_index;
372 cur_CardS_Status[slot]->gsm_umts_subscription_app_index = card_status->gsm_umts_subscription_app_index;
373 cur_CardS_Status[slot]->ims_subscription_app_index = card_status->ims_subscription_app_index;
374 cur_CardS_Status[slot]->num_applications = card_status->num_applications;
375 cur_CardS_Status[slot]->universal_pin_state = card_status->universal_pin_state;
376 RLOGD("[slot%d]updateCardStatusV6 card_state: %d, cdma_index: %d, gsm_index: %d, "
377 "ims_index: %d, num_applications: %d, universal_pin_state: %d",
378 slot,
379 cur_CardS_Status[slot]->card_state,
380 cur_CardS_Status[slot]->cdma_subscription_app_index,
381 cur_CardS_Status[slot]->gsm_umts_subscription_app_index,
382 cur_CardS_Status[slot]->ims_subscription_app_index,
383 cur_CardS_Status[slot]->num_applications,
384 cur_CardS_Status[slot]->universal_pin_state);
385 if(card_status)
386 {
387 for(int i = 0; i < card_status->num_applications; i++) {
388 cur_CardS_Status[slot]->applications[i].app_state = card_status->applications[i].app_state;
389 cur_CardS_Status[slot]->applications[i].app_type = card_status->applications[i].app_type;
390 cur_CardS_Status[slot]->applications[i].perso_substate = card_status->applications[i].perso_substate;
391 cur_CardS_Status[slot]->applications[i].pin1 = card_status->applications[i].pin1;
392 cur_CardS_Status[slot]->applications[i].pin1_replaced = card_status->applications[i].pin1_replaced;
393 cur_CardS_Status[slot]->applications[i].pin2 = card_status->applications[i].pin2;
394 cur_CardS_Status[slot]->applications[i].aid_ptr = strdup(card_status->applications[i].aid_ptr);
395 cur_CardS_Status[slot]->applications[i].app_label_ptr = strdup(card_status->applications[i].app_label_ptr);
396 }
397 } else {
398 RLOGD("[slot%d]updateCardStatusV6: sim card message is null", slot);
399 }
400}
401
402char* getAid(int slot)
403{
404 char* aid = "";
405 int index = -1;
406 if(cur_CardS_Status[slot] != NULL){
407 if(Phone_utils::get_phone_type(slot) == Phone_utils::PHONE_TYPE_CDMA) {
408 index = cur_CardS_Status[slot]->cdma_subscription_app_index;
409 } else {
410 index = cur_CardS_Status[slot]->gsm_umts_subscription_app_index;
411 }
412 if(index >= 0 && index < cur_CardS_Status[slot]->num_applications) {
413 aid = cur_CardS_Status[slot]->applications[index].aid_ptr;
414 }
415 }
416 RLOGD("[slot%d] index: %d, getAid: %s", slot, index, aid);
417 return aid;
418}
419
420void update_reg_voice_service_state(int request, char *code, int slot, int32_t token)
421{
422 if((reg_voice_service_state[slot] != atoi(code)) || ((token&RIL_TOKEN_MARK) == RIL_TOKEN_MARK)) {
423 reg_voice_service_state[slot] = atoi(code);
424 regCodeToServiceState(request, atoi(code), slot);
425 }
426}
427
428void update_reg_voice_radio_tech(int request, int code, int slot, int32_t token) {
429 if((reg_voice_radio_tech[slot] != code) || ((token&RIL_TOKEN_MARK) == RIL_TOKEN_MARK)){
430 reg_voice_radio_tech[slot] = code;
431 regCodeToRadioTechnology(request, code, slot);
432 }
433}
434
435void update_reg_data_service_state(int request, char *code,int slot, int32_t token)
436{
437 if((reg_data_service_state[slot] != atoi(code)) || ((token&RIL_TOKEN_MARK) == RIL_TOKEN_MARK)) {
438 reg_data_service_state[slot] = atoi(code);
439 regCodeToServiceState(request, atoi(code), slot);
440 }
441}
442
443void update_reg_data_radio_tech(int request, int code, int slot, int32_t token){
444 if((reg_data_radio_tech[slot] != code) || ((token&RIL_TOKEN_MARK) == RIL_TOKEN_MARK)) {
445 reg_data_radio_tech[slot] = code;
446 regCodeToRadioTechnology(request, code, slot);
447 }
448}
449
450void registerRadioOn(RfDesenseTxTest* rf){
451 if(!m_RfDesense) {
452 m_RfDesense = rf;
453 }
454}
455
456void unregisterRadioOn() {
457 if(m_RfDesense) {
458 m_RfDesense == NULL;
459 }
460}
461
462void registerRadioOffOrNotAvailable(RfDesenseTxTest* rf){
463 if(!m_RfDesense) {
464 m_RfDesense = rf;
465 }
466}
467
468void unregisterRadioOffOrNotAvailable() {
469 if(m_RfDesense) {
470 m_RfDesense == NULL;
471 }
472}
473
474void registerOnUnsolOemHookRaw(RfDesenseTxTest* rf){
475 if(!m_RfDesense) {
476 m_RfDesense = rf;
477 }
478}
479
480void unregisterOnUnsolOemHookRaw(){
481 if(m_RfDesense) {
482 m_RfDesense == NULL;
483 }
484}
485
486void register_response_oem_hook_raw(RfDesenseTxTest* rf){
487 if(!m_RfDesense) {
488 m_RfDesense = rf;
489 }
490}
491
492void unregister_response_oem_hook_raw(){
493 if(m_RfDesense) {
494 m_RfDesense == NULL;
495 }
496}
497
498void updateRadioStatus(int newValue ,RIL_SOCKET_ID soc_id)
499{
500 RLOGD("updateRadioStatus oldState: %d, newState: %d", radio_status[soc_id], newValue);
501 bool newOn = (newValue == RADIO_STATE_ON);
502 bool oldOn = (radio_status[soc_id] == RADIO_STATE_ON);
503 bool newAvaiable = (newValue != RADIO_STATE_UNAVAILABLE);
504 bool oldAvaiable = (radio_status[soc_id] != RADIO_STATE_UNAVAILABLE);
505 if (newOn && !oldOn) {
506 RLOGD("RadioStateOn");
507 //printf("[SIM%d] radio on\n",soc_id +1);
508 if(m_RfDesense){
509 m_RfDesense->emRadioStateOn();
510 }
511 }
512
513 if ((!newOn || !newAvaiable) && !((!oldOn || !oldAvaiable))) {
514 RLOGD("RadioStateOfforNotAvailable");
515 //printf("[SIM%d] radio off or not available\n",soc_id +1);
516 if(m_RfDesense){
517 m_RfDesense->emRadioStateOfforNotAvailable();
518 }
519 }
520 if(newValue != radio_status[soc_id]) {
521 radio_status[soc_id] = newValue;
522 }
523}
524
525bool isRadioOn(RIL_SOCKET_ID soc_id)
526{
527 return radio_status[soc_id] == RADIO_STATE_ON;
528}
529
530bool isRadioAvailable(RIL_SOCKET_ID soc_id)
531{
532 return radio_status[soc_id] != RADIO_STATE_UNAVAILABLE;
533}
534
535static int regCodeToServiceState(int request,int code, int slot)
536{
537 RLOGD("[slot%d]regCodeToServiceState %d, request: %s",slot, code, android::requestToString(request));
538 switch (code)
539 {
540 case 0:
541 case 2: // 2 is "searching"
542 case 3: // 3 is "registration denied"
543 case 4: // 4 is "unknown" no vaild in current baseband
544 case 10:// same as 0, but indicates that emergency call is possible.
545 case 12:// same as 2, but indicates that emergency call is possible.
546 case 13:// same as 3, but indicates that emergency call is possible.
547 case 14:// same as 4, but indicates that emergency call is possible.
548 {
549 if(request == RIL_REQUEST_VOICE_REGISTRATION_STATE) {
550 printf("[QUERY][VOICE REG_STATUS][SIM%d] The current service state is OUT OF SERVICE\n", slot);
551 } else {
552 printf("[QUERY][DATA REG_STATUS][SIM%d] The current service state is OUT OF SERVICE\n", slot);
553 }
554 return STATE_OUT_OF_SERVICE;
555 }
556
557 case 1:
558 case 5:
559 {
560 if(request == RIL_REQUEST_VOICE_REGISTRATION_STATE) {
561 printf("[QUERY][VOICE REG_STATUS][SIM%d] The current service state is IN SERVICE\n", slot);
562 } else {
563 printf("[QUERY][DATA REG_STATUS][SIM%d] The current service state is IN SERVICE\n", slot);
564 }
565 return STATE_IN_SERVICE;
566 }
567
568 default:
569 {
570 if(request == RIL_REQUEST_VOICE_REGISTRATION_STATE) {
571 printf("[QUERY][VOICE REG_STATUS][SIM%d] Unexpected service state %d\n", slot, code);
572 } else {
573 printf("[QUERY][DATA REG_STATUS][SIM%d] Unexpected service state %d\n", slot, code);
574 }
575 RLOGW("[SIM%d]regCodeToServiceState: unexpected service state %d", slot, code);
576 return STATE_OUT_OF_SERVICE;
577 }
578 }
579}
580
581static int regCodeToRadioTechnology(int request, int code, int slot) {
582 RLOGD("[slot%d]regCodeToRadioTechnology %d, request: %s",slot, code, android::requestToString(request));
583 switch(code) {
584 case RADIO_TECH_LTE:
585 {
586 if(request == RIL_REQUEST_VOICE_REGISTRATION_STATE) {
587 printf("[QUERY][VOICE REG_STATUS][SIM%d] The registered radio technology is 4G\n", slot);
588 } else {
589 printf("[QUERY][DATA REG_STATUS][SIM%d] The registered radio technology is 4G\n", slot);
590 }
591 break;
592 }
593 case RADIO_TECH_GSM:
594 case RADIO_TECH_GPRS:
595 case RADIO_TECH_EDGE:
596 case RADIO_TECH_IS95A:
597 case RADIO_TECH_IS95B:
598 case RADIO_TECH_1xRTT:
599 {
600 if(request == RIL_REQUEST_VOICE_REGISTRATION_STATE) {
601 printf("[QUERY][VOICE REG_STATUS][SIM%d] The registered radio technology is 2G\n", slot);
602 } else {
603 printf("[QUERY][DATA REG_STATUS][SIM%d] The registered radio technology is 2G\n", slot);
604 }
605 break;
606 }
607 case RADIO_TECH_UMTS:
608 case RADIO_TECH_HSDPA:
609 case RADIO_TECH_HSUPA:
610 case RADIO_TECH_HSPA:
611 case RADIO_TECH_EHRPD:
612 case RADIO_TECH_HSPAP:
613 case RADIO_TECH_TD_SCDMA:
614 case RADIO_TECH_EVDO_0:
615 case RADIO_TECH_EVDO_A:
616 case RADIO_TECH_EVDO_B:
617 {
618 if(request == RIL_REQUEST_VOICE_REGISTRATION_STATE) {
619 printf("[QUERY][VOICE REG_STATUS][SIM%d] The registered radio technology is 3G\n", slot);
620 } else {
621 printf("[QUERY][DATA REG_STATUS][SIM%d] The registered radio technology is 3G\n", slot);
622 }
623 break;
624 }
625#ifdef TELEMATIC_5G_SUPPORT
626 case RADIO_TECH_NR://5G
627 {
628 if(request == RIL_REQUEST_VOICE_REGISTRATION_STATE) {
629 printf("[QUERY][VOICE REG_STATUS][SIM%d] The registered radio technology is 5G\n", slot);
630 } else {
631 printf("[QUERY][DATA REG_STATUS][SIM%d] The registered radio technology is 5G\n", slot);
632 }
633 break;
634 }
635#endif
636 case RADIO_TECH_UNKNOWN:
637 {
638 if(request == RIL_REQUEST_VOICE_REGISTRATION_STATE) {
639 printf("[QUERY][VOICE REG_STATUS][SIM%d] The registered radio technology is unknown\n", slot);
640 } else {
641 printf("[QUERY][DATA REG_STATUS][SIM%d] The registered radio technology is unknown\n", slot);
642 }
643 break;
644 }
645 default:
646 {
647 if(request == RIL_REQUEST_VOICE_REGISTRATION_STATE) {
648 printf("[QUERY][VOICE REG_STATUS][SIM%d] %d is unexpected value\n",slot, code);
649 } else {
650 printf("[QUERY][DATA REG_STATUS][SIM%d] %d is unexpected value\n",slot, code);
651 }
652 }
653 }
654 return 0;
655}
656
657int get_reg_data_radio_tech(int slot) {
658 return reg_data_radio_tech[slot];
659}
660
661int get_reg_voice_radio_tech(int slot) {
662 return reg_voice_radio_tech[slot];
663}
664
665#ifdef ECALL_SUPPORT
666void ConvertMsd(const char *msdChar, unsigned char *msd) {
667 unsigned int n, x;
668
669 for (n = 0; n < MSD_MAX_LENGTH; n++) {
670 if (sscanf(&msdChar[n<<1], "%2x", &x) == 1) {
671 msd[n] = x;
672 } else {
673 RLOGE("invalid MSD characters");
674 break;
675 }
676 }
677}
678#endif /*ECALL_SUPPORT*/
679
680bool isFinalResponseErrorEx(char* str) {
681 AtLine atline(str, NULL);
682 return (atline.isFinalResponseErrorEx(0) == 1 ? true : false);
683}
684
685int get_atci_sim(){
686 return utils::mtk_property_get_int32(ATCI_SIM, 0);
687}
688
689static char *findNextChar(char *p, char c, int length)
690{
691 char *ptr = p;
692 int i = 0;
693 while (i++ < length)
694 {
695 if (*ptr++ == c)
696 return ptr;
697 }
698 return NULL;
699}
700
701static int getGMTval(char *pdata)
702{
703 char *ptr;
704 ptr = findNextChar(pdata, '+', strlen(pdata));
705 if (ptr == NULL)
706 {
707 ptr = findNextChar(pdata, '-', strlen(pdata));
708 if (ptr == NULL)
709 {
710 return 0;
711 }
712 }
713 return atoi(ptr);
714}
715
716static void adjustGMT2LocalTime(struct tm *src, int dGMTval)
717{
718 time_t t1, t2;
719 struct tm * ptm;
720 char buf[255];
721 int dShiftSec;
722
723 dShiftSec = dGMTval * 15 * 60;
724 t1 = mktime(src);
725 t2 = (time_t)(t1 + dShiftSec);
726 ptm = gmtime(&t2);
727
728 memcpy(src, ptm, sizeof(struct tm));
729}
730
731void updateSystemTime(const void *data, int datalen)
732{
733 char strTime[32];
734 struct tm tm;
735 time_t t;
736 int dGMTval;
737
738 if (data == NULL || datalen <= 0)
739 return;
740
741 memset(strTime, 0, sizeof(strTime));
742 strcat(strTime, "20");
743 strcat(strTime, (const char *)data);
744
745 dGMTval = getGMTval(strTime);
746 memset(&tm, 0, sizeof(struct tm));
747 strptime(strTime, "%Y/%m/%d,%H:%M:%S", &tm);
748
749 adjustGMT2LocalTime(&tm, dGMTval);
750
751 t = mktime(&tm);
752 stime(&t);
753
754 return;
755}
756void notifyDataSignal() {
757 RLOGE("notifyDataSignal()");
758 pthread_mutex_lock(&s_DataMutex);
759 pthread_cond_broadcast(&s_DataCond);
760 pthread_mutex_unlock(&s_DataMutex);
761}
762
763bool mtkItTest(const char* data) {
764 std::string str("");
765 str.append(data);
766 RLOGD("%s, data: %s", __FUNCTION__, str.c_str());
767 std::vector<std::string> all;
768 RequestInfo* pRI = NULL;
769 utils::tokenize(str, ',', all);
770 if(all[0] != std::string("TEST")) {
771 return false;
772 }
773 android::Parcel p;
774 size_t pos = p.dataPosition();
775 for(int i = 1 ; i < all.size(); i++) {
776 std::string str = all[i];
777 RLOGD("%s, all[%d]: %s", __FUNCTION__, i, str.c_str());
778 std::vector<std::string> items;
779 utils::tokenize(str, '=', items);
780 if(items.size() == 2) {
781 if(items[0] == std::string("INT")) {
782 int para = std::stoi(items[1]);
783 p.writeInt32(para);
784 } else if(items[0] == std::string("STR")) {
785 writeStringToParcel(p, items[1].c_str());
786 } else if(items[0] == std::string("REQ")) {
787 int request = std::stoi(items[1]);
lhb07f4e12022-02-17 22:08:54 -0800788
789 // For loop, free before reassign to avoid memory leak
790 if (pRI != NULL) {
791 free(pRI);
792 }
lh7b0674a2022-01-10 00:34:35 -0800793 pRI = creatRILInfoAndInit(request, UDP, (RIL_SOCKET_ID) ((0)));
794 }
795 } else {
796 RLOGD("%s, too many \"=\"");
797 }
798 }
lhb07f4e12022-02-17 22:08:54 -0800799
lh7b0674a2022-01-10 00:34:35 -0800800 if(pRI && pRI->pCI) {
801 p.setDataPosition(pos);
802 pRI->pCI->dispatchFunction(p, pRI);
lh7b0674a2022-01-10 00:34:35 -0800803 }
lhb07f4e12022-02-17 22:08:54 -0800804
805 // Free to avoid memory leak
806 if(pRI != NULL) {
807 free(pRI);
808 pRI = NULL;
809 }
810
lh7b0674a2022-01-10 00:34:35 -0800811 return true;
812}
813int lynqSocketSendto(int fd,struct sockaddr *dest_addr,int addr_len,char msg[])
814{
815 int ret = 0;
816 ret = sendto(fd,msg,strlen(msg),0,dest_addr,addr_len);
817 if(ret>0)
818 {
819 RLOGD("[lynqSocketSendto] send msg success!!!");
820 return 0;
821 }
822 else
823 {
824 RLOGD("[lynqSocketSendto] send msg fail!!!");
825 return -1;
826 }
827}