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