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