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