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