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