blob: 45d769d17a27b17d53a86c0ced086568f69ee091 [file] [log] [blame]
rjw7e50cd32022-01-18 18:30:37 +08001#include <stdio.h>
2#include <sys/types.h>
3#include <sys/socket.h>
4#include <arpa/inet.h>
5#include <string.h>
6#include <unistd.h>
7#include <binder/Parcel.h>
8#include <log/log.h>
9#include <cutils/jstring.h>
10#include <pthread.h>
11#include <vendor-ril/telephony/ril.h>
rjw4a5a78d2022-03-10 11:04:24 +080012#include <vendor-ril/telephony/mtk_ril_sp.h>
rjw7e50cd32022-01-18 18:30:37 +080013#include "liblog/lynq_deflog.h"
q.huang52921662022-10-20 15:25:45 +080014#include "lynq_network.h"
15#include "lynq_module_common.h"
16#include "lynq_module_socket.h"
17#include "lynq_module_state_buffer.h"
18
19#define LYNQ_RESP_STRING_MAX_NUM 128
rjw7e50cd32022-01-18 18:30:37 +080020#define LYNQ_TYPE_BUF 10
21#define USER_LOG_TAG "LYNQ_NETWORK"
22
q.huang8fb88c42023-04-26 17:02:02 +080023/*in CR AUTO00210807 MTK confirm set network selection mode max time is 14min 30s, first set 5 min 10s*/
24#define WAIT_TIME_LENGTH_FOR_SET_NETWORK_SELECTION_MODE (310)
25
rjw7e50cd32022-01-18 18:30:37 +080026using ::android::Parcel;
27
q.huang52921662022-10-20 15:25:45 +080028static int s_module_wait_urc_id;
29static int s_module_urc_slot_id;
30static signalStrength_t s_network_urc_solSigStren;
rjw7e50cd32022-01-18 18:30:37 +080031
q.huang52921662022-10-20 15:25:45 +080032/**g_module_init_flag
rjw22947c22022-03-15 09:21:29 +080033* @brief mark network initialization state
34* 0:deinit status
35* 1:init state
36*/
q.huang52921662022-10-20 15:25:45 +080037int g_module_init_flag = 0;
rjw7e50cd32022-01-18 18:30:37 +080038
39int lynq_network_init(int utoken){
q.huang52921662022-10-20 15:25:45 +080040 if(g_module_init_flag != MODULE_CLOSED)
rjw22947c22022-03-15 09:21:29 +080041 {
q.huang52921662022-10-20 15:25:45 +080042 LYERRLOG("module state is %d",g_module_init_flag);
43 return LYNQ_E_CONFLICT;
rjw22947c22022-03-15 09:21:29 +080044 }
q.huang52921662022-10-20 15:25:45 +080045
46 if(utoken <0){
47 LYERRLOG("utoken is less than 0",utoken);
48 return LYNQ_E_PARAMETER_ANONALY;
rjw7e50cd32022-01-18 18:30:37 +080049 }
q.huang52921662022-10-20 15:25:45 +080050
51 g_module_init_flag = MODULE_SWITCHING;
52
53 g_module_Global_uToken = utoken;
rjw7e50cd32022-01-18 18:30:37 +080054 LYLOGSET(LOG_INFO);
55 LYLOGEINIT(USER_LOG_TAG);
q.huang52921662022-10-20 15:25:45 +080056
q.huang693ff3b2022-10-20 15:25:45 +080057 int ret;
rjw7e50cd32022-01-18 18:30:37 +080058
q.huang47d4dfe2022-08-17 17:52:29 +080059 init_network_timer_all();
q.huang036b6cf2023-01-10 14:29:20 +080060
61 ret = lynq_start_all_urc_socket_thread();
q.huang52921662022-10-20 15:25:45 +080062 if(ret != 0)
63 {
64 LYERRLOG("init socket urc fail!!!");
65 g_module_init_flag = MODULE_CLOSED;
66 return LYNQ_E_INNER_ERROR;
67 }
68
q.huang036b6cf2023-01-10 14:29:20 +080069 ret = lynq_start_all_rc_socket_thread();
rjw7e50cd32022-01-18 18:30:37 +080070 if(ret !=0)
71 {
72 LYERRLOG("init socket client fail!!!");
q.huang036b6cf2023-01-10 14:29:20 +080073 lynq_close_all_urc_socket_thread();
q.huang52921662022-10-20 15:25:45 +080074 g_module_init_flag = MODULE_CLOSED;
75 return LYNQ_E_INNER_ERROR;
rjw7e50cd32022-01-18 18:30:37 +080076 }
q.huang52921662022-10-20 15:25:45 +080077 g_module_init_flag = MODULE_RUNNING;
q.huang7de1d662022-09-13 14:19:24 +080078
q.huang52921662022-10-20 15:25:45 +080079 return RESULT_OK;
80}
81
82int lynq_network_deinit(void){
83
84 if (g_module_init_flag != MODULE_RUNNING)
85 {
86 LYERRLOG("module state is %d",g_module_init_flag);
87 return LYNQ_E_CONFLICT;
88 }
89 g_module_init_flag = MODULE_SWITCHING;
90
q.huang036b6cf2023-01-10 14:29:20 +080091 lynq_close_all_urc_socket_thread();
92 lynq_close_all_rc_socket_thread();
q.huang52921662022-10-20 15:25:45 +080093 deinit_network_timer_all();
94
95 g_module_init_flag = MODULE_CLOSED;
96 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +080097}
98
99int strUpper(char * str)
100{
101 int i=0;
102 while(1)
103 {
104 if(str[i]=='\0')
105 {
106 break;
107 }
108 if(str[i]>='a'&&str[i]<='z')
109 {
110 str[i]=str[i]-32;
111 }
112 i++;
113 }
q.huang52921662022-10-20 15:25:45 +0800114 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800115}
116
q.huang7de1d662022-09-13 14:19:24 +0800117int copyCellInfoList(Parcel* &p,uint64_t *cellinfo,int *tac,int *earfcn)
rjw7e50cd32022-01-18 18:30:37 +0800118{
119 int32_t v=0;
120 int64_t v6=0;
121 if(NULL == cellinfo)
122 {
123 LYERRLOG("*cellinfo error");
q.huang52921662022-10-20 15:25:45 +0800124 return LYNQ_E_PARAMETER_ANONALY;
rjw7e50cd32022-01-18 18:30:37 +0800125 }
126
127 int nothing = 0;
rjw62a60152022-06-09 17:43:01 +0800128 int tmp_uint64 = 0;
q.huang7de1d662022-09-13 14:19:24 +0800129 p->readInt32(&v);
rjw7e50cd32022-01-18 18:30:37 +0800130 RIL_CellInfoType cellinfoType = RIL_CellInfoType(v);
q.huang7de1d662022-09-13 14:19:24 +0800131 p->readInt32(&nothing);
rjw7e50cd32022-01-18 18:30:37 +0800132 // cellinfo->cellinfo.cellInfoType = RIL_CellInfoType(v);
q.huang7de1d662022-09-13 14:19:24 +0800133 // p->readInt32(&cellinfo->cellinfo.registered);
134 p->readInt32(&v);
rjw7e50cd32022-01-18 18:30:37 +0800135 // cellinfo->cellinfo.timeStampType = RIL_TimeStampType(v);
q.huang7de1d662022-09-13 14:19:24 +0800136 p->readInt64(&v6);
rjw7e50cd32022-01-18 18:30:37 +0800137 // cellinfo->cellinfo.timeStamp = v6;
138 switch(cellinfoType) {
139 case RIL_CELL_INFO_TYPE_GSM: {
q.huang7de1d662022-09-13 14:19:24 +0800140 p->readInt32(&nothing);
141 p->readInt32(&nothing);
142 p->readInt32(&nothing);
143 p->readInt32(&tmp_uint64);
144 p->readInt32(&nothing);
145 p->readInt32(&nothing);
146 p->readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800147 *cellinfo = (uint64_t)tmp_uint64;
rjw61974852022-05-17 16:30:32 +0800148 tac = &nothing;
rjwa8011682022-05-31 17:31:28 +0800149 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800150 break;
151 }
152 case RIL_CELL_INFO_TYPE_WCDMA: {
q.huang7de1d662022-09-13 14:19:24 +0800153 p->readInt32(&nothing);
154 p->readInt32(&nothing);
155 p->readInt32(&nothing);
156 p->readInt32(&tmp_uint64);
157 p->readInt32(&nothing);
158 p->readInt32(&nothing);
159 p->readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800160 *cellinfo = (uint64_t)tmp_uint64;
rjw4200a082022-05-17 17:58:35 +0800161 tac = &nothing;
rjwa8011682022-05-31 17:31:28 +0800162 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800163 break;
164 }
165 case RIL_CELL_INFO_TYPE_CDMA: {
q.huang7de1d662022-09-13 14:19:24 +0800166 p->readInt32(&nothing);
167 p->readInt32(&nothing);
168 p->readInt32(&nothing);
169 p->readInt32(&nothing);
170 p->readInt32(&nothing);
171 p->readInt32(&nothing);
172 p->readInt32(&nothing);
173 p->readInt32(&nothing);
174 p->readInt32(&nothing);
175 p->readInt32(&nothing);
rjw7e50cd32022-01-18 18:30:37 +0800176 cellinfo = 0;
rjw61974852022-05-17 16:30:32 +0800177 tac = &nothing;
rjwa8011682022-05-31 17:31:28 +0800178 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800179 break;
180 }
181 case RIL_CELL_INFO_TYPE_LTE: {
q.huang7de1d662022-09-13 14:19:24 +0800182 p->readInt32(&nothing);
183 p->readInt32(&nothing);
184 p->readInt32(&tmp_uint64);
185 p->readInt32(&nothing);
186 p->readInt32(tac);
187 p->readInt32(earfcn);
188 p->readInt32(&nothing);
189 p->readInt32(&nothing);
190 p->readInt32(&nothing);
191 p->readInt32(&nothing);
192 p->readInt32(&nothing);
193 p->readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800194 *cellinfo = (uint64_t)tmp_uint64;
rjw7e50cd32022-01-18 18:30:37 +0800195 break;
196 }
197 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
q.huang7de1d662022-09-13 14:19:24 +0800198 p->readInt32(&nothing);
199 p->readInt32(&nothing);
200 p->readInt32(&nothing);
201 p->readInt32(&tmp_uint64);
202 p->readInt32(&nothing);
203 p->readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800204 *cellinfo = (uint64_t)tmp_uint64;
rjwa8011682022-05-31 17:31:28 +0800205 tac = &nothing;
206 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800207 break;
208 }
209 case RIL_CELL_INFO_TYPE_NR: {
q.huang7de1d662022-09-13 14:19:24 +0800210 p->readInt32(&nothing);
211 p->readInt32(&nothing);
212 p->readUint64(cellinfo);
213 p->readInt32(&nothing);
214 p->readInt32(tac);
215 p->readInt32(earfcn);
216 p->readInt32(&nothing);
217 p->readInt32(&nothing);
218 p->readInt32(&nothing);
219 p->readInt32(&nothing);
220 p->readInt32(&nothing);
221 p->readInt32(&nothing);
rjw7e50cd32022-01-18 18:30:37 +0800222 break;
223 }
224 }
rjw62a60152022-06-09 17:43:01 +0800225 LYINFLOG("CID in fUNC :%llu",*cellinfo);
rjwa8011682022-05-31 17:31:28 +0800226 LYINFLOG("tac in fUNC :%d",*tac);
227 LYINFLOG("earfcn in fUNC :%d",*earfcn);
q.huang52921662022-10-20 15:25:45 +0800228 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800229}
230
q.huang7de1d662022-09-13 14:19:24 +0800231static char * lynqStrdupReadString(Parcel* &p) {
rjw7e50cd32022-01-18 18:30:37 +0800232 size_t stringlen;
233 const char16_t *s16;
234
q.huang7de1d662022-09-13 14:19:24 +0800235 s16 = p->readString16Inplace(&stringlen);
rjw7e50cd32022-01-18 18:30:37 +0800236 return strndup16to8(s16, stringlen);
237}
238
239int lynq_query_operater(char *OperatorFN,char *OperatorSH,char *MccMnc)
240{
q.huang52921662022-10-20 15:25:45 +0800241 if(g_module_init_flag != MODULE_RUNNING)
242 {
243 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
244 return LYNQ_E_CONFLICT;
245 }
246
rjw7e50cd32022-01-18 18:30:37 +0800247 if(NULL == OperatorFN||NULL == OperatorSH|| NULL == MccMnc)
rjw7e50cd32022-01-18 18:30:37 +0800248 {
q.huang7de1d662022-09-13 14:19:24 +0800249 LYERRLOG("%s some parameter OperatorFN OperatorSH MccMnc %s %s %s is NULL",__func__,OperatorFN,OperatorSH,MccMnc);
q.huang52921662022-10-20 15:25:45 +0800250 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800251 }
q.huang52921662022-10-20 15:25:45 +0800252
q.huang7de1d662022-09-13 14:19:24 +0800253 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +0800254 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OPERATOR,0,"");
255
256 if(ret!=RESULT_OK)
rjw46769c92022-07-04 21:17:25 +0800257 {
q.huang52921662022-10-20 15:25:45 +0800258 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
259 return ret;
260 }
261
262 int num ;
263 char *resp[LYNQ_RESP_STRING_MAX_NUM];
q.huang7de1d662022-09-13 14:19:24 +0800264
q.huang52921662022-10-20 15:25:45 +0800265 p->readInt32(&num);
266 if(num == 0 || num > LYNQ_RESP_STRING_MAX_NUM)
267 {
268 LYERRLOG("no paramters or num %d too great",num);
269 delete p;
270 return LYNQ_E_INNER_ERROR;
271 }else{
272 int i;
273 for(i = 0; i<num;i++)
rjw7e50cd32022-01-18 18:30:37 +0800274 {
q.huang52921662022-10-20 15:25:45 +0800275 resp[i] = lynqStrdupReadString(p);
rjw7e50cd32022-01-18 18:30:37 +0800276 }
q.huang52921662022-10-20 15:25:45 +0800277 if(NULL != resp[0])
278 {
279 strcpy(OperatorFN,resp[0]);
280 }
281 if(NULL != resp[1])
282 {
283 strcpy(OperatorSH,resp[1]);
284 }
285 if(NULL != resp[2])
286 {
287 strcpy(MccMnc,resp[2]);
288 }
289 for(i = 0; i<num;i++)
290 {
291 if(resp[i]!=NULL)
292 {
293 free(resp[i]);
294 }
295 }
rjw7e50cd32022-01-18 18:30:37 +0800296 }
q.huang7de1d662022-09-13 14:19:24 +0800297
q.huang52921662022-10-20 15:25:45 +0800298 LYINFLOG("%s suc",__func__);
299 delete p;
300 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800301}
302
303int lynq_query_network_selection_mode(int *netselMode)
304{
q.huang52921662022-10-20 15:25:45 +0800305 if(g_module_init_flag != MODULE_RUNNING)
306 {
307 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
308 return LYNQ_E_CONFLICT;
309 }
310
rjw7e50cd32022-01-18 18:30:37 +0800311 if(NULL == netselMode)
rjw7e50cd32022-01-18 18:30:37 +0800312 {
q.huang7de1d662022-09-13 14:19:24 +0800313 LYERRLOG("%s parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800314 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800315 }
q.huang52921662022-10-20 15:25:45 +0800316
317 Parcel* p=NULL;
318 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE,0,"");
319
320 if(ret!=RESULT_OK)
rjw46769c92022-07-04 21:17:25 +0800321 {
q.huang52921662022-10-20 15:25:45 +0800322 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
323 return ret;
324 }
325
326 int readnum;
327 p->readInt32(&readnum);
328 p->readInt32(netselMode);
q.huang7de1d662022-09-13 14:19:24 +0800329
q.huang52921662022-10-20 15:25:45 +0800330 LYINFLOG("%s suc",__func__);
331 delete p;
332 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800333}
334
335int lynq_set_network_selection_mode(const char *mode,const char* mccmnc)
336{
q.huang52921662022-10-20 15:25:45 +0800337 if(g_module_init_flag != MODULE_RUNNING)
338 {
339 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
340 return LYNQ_E_CONFLICT;
341 }
342
q.huang7de1d662022-09-13 14:19:24 +0800343 if(NULL == mode || (strlen(mode) == 0))
rjw78d04502022-02-24 13:37:11 +0800344 {
q.huang7de1d662022-09-13 14:19:24 +0800345 LYERRLOG("%s parameter mod %s is error",__func__,mode);
q.huang52921662022-10-20 15:25:45 +0800346 return LYNQ_E_PARAMETER_ANONALY;
rjw78d04502022-02-24 13:37:11 +0800347 }
q.huang7de1d662022-09-13 14:19:24 +0800348
349 if(!strcmp(mode,"Manual"))
350 {
351 if(mccmnc == NULL || strlen(mccmnc) == 0)
352 {
353 LYERRLOG("%s parameter mccmnc %s is error",__func__,mccmnc);
q.huang52921662022-10-20 15:25:45 +0800354 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800355 }
356 }
357
q.huang7de1d662022-09-13 14:19:24 +0800358 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +0800359 int ret;
q.huang7de1d662022-09-13 14:19:24 +0800360
rjw7e50cd32022-01-18 18:30:37 +0800361 if(!strcmp(mode,"Auto"))
362 {
q.huang8fb88c42023-04-26 17:02:02 +0800363 ret=lynq_send_common_request(p,WAIT_TIME_LENGTH_FOR_SET_NETWORK_SELECTION_MODE,RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC,0,"");
q.huang7de1d662022-09-13 14:19:24 +0800364 }
365 else if(!strcmp(mode,"Manual"))
366 {
q.huang8fb88c42023-04-26 17:02:02 +0800367 ret=lynq_send_common_request(p,WAIT_TIME_LENGTH_FOR_SET_NETWORK_SELECTION_MODE,RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL,1,"%s",mccmnc);
q.huang7de1d662022-09-13 14:19:24 +0800368 }
369 else
370 {
q.huang52921662022-10-20 15:25:45 +0800371 LYERRLOG("%s parameter mode %s is errir",__func__,mode);
372 return LYNQ_E_PARAMETER_ANONALY;
rjw7e50cd32022-01-18 18:30:37 +0800373 }
374
q.huang52921662022-10-20 15:25:45 +0800375 if(ret!=RESULT_OK)
376 {
377 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
378 return ret;
379 }
380
381 LYINFLOG("%s set mode %s mccmnc %s suc",__func__,mode,mccmnc);
382 delete p;
383 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800384}
385
386int lynq_query_available_network(char *OperatorFN,char *OperatorSH,char *MccMnc,char * NetStatus)
387{
q.huang52921662022-10-20 15:25:45 +0800388 if(g_module_init_flag != MODULE_RUNNING)
389 {
390 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
391 return LYNQ_E_CONFLICT;
392 }
rjw7e50cd32022-01-18 18:30:37 +0800393 if(NULL == OperatorFN||NULL == OperatorSH||NULL == MccMnc||NULL == NetStatus)
rjw7e50cd32022-01-18 18:30:37 +0800394 {
q.huang7de1d662022-09-13 14:19:24 +0800395 LYERRLOG("%s there is parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800396 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800397 }
q.huang52921662022-10-20 15:25:45 +0800398
q.huang7de1d662022-09-13 14:19:24 +0800399 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +0800400 int ret=lynq_send_common_request(p,600,RIL_REQUEST_QUERY_AVAILABLE_NETWORKS,0,"");
rjw7e50cd32022-01-18 18:30:37 +0800401
q.huang52921662022-10-20 15:25:45 +0800402 if(ret!=RESULT_OK)
rjw46769c92022-07-04 21:17:25 +0800403 {
q.huang52921662022-10-20 15:25:45 +0800404 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
405 return ret;
406 }
q.huang7de1d662022-09-13 14:19:24 +0800407
q.huang52921662022-10-20 15:25:45 +0800408 int num =p->readInt32();
409 char *resp[LYNQ_RESP_STRING_MAX_NUM];
410 if(num == 0 || num > LYNQ_RESP_STRING_MAX_NUM)
411 {
412 LYERRLOG("no paramters or num %d too great",num);
413 delete p;
414 return LYNQ_E_INNER_ERROR;
415 }else{
416 int i;
417 for(i = 0; i<num;i++)
418 {
419 resp[i] = lynqStrdupReadString(p);
420 }
421 if(NULL != resp[0])
422 {
423 strcpy(OperatorFN,resp[0]);
424 }
425 if(NULL != resp[1])
426 {
427 strcpy(OperatorSH,resp[1]);
428 }
429 if(NULL != resp[2])
430 {
431 strcpy(MccMnc,resp[2]);
432 }
433 if(NULL != resp[3])
434 {
rjwfe7c8a42022-10-21 15:09:21 +0800435 strcpy(NetStatus,resp[3]);
q.huang52921662022-10-20 15:25:45 +0800436 }
437 for(i = 0; i<num;i++)
438 {
439 if(resp[i]!=NULL)
440 {
441 free(resp[i]);
442 }
443 }
444 }
445 delete p;
446 LYINFLOG("%s suc",__func__);
447 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800448}
449
rjw4544e132022-04-01 15:00:26 +0800450int lynq_query_registration_state(const char *type,int* regState,int* imsRegState,char * LAC,char * CID,int *netType,int *radioTechFam,int *netRejected)
rjw7e50cd32022-01-18 18:30:37 +0800451{
q.huang52921662022-10-20 15:25:45 +0800452 if(g_module_init_flag != MODULE_RUNNING)
453 {
454 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
455 return LYNQ_E_CONFLICT;
456 }
457
rjwd98d5872022-04-09 13:50:58 +0800458 if(NULL == type || NULL ==regState ||NULL ==imsRegState ||NULL ==LAC ||NULL ==CID ||NULL ==netType ||NULL ==radioTechFam || NULL == netRejected)
q.huang7de1d662022-09-13 14:19:24 +0800459 {
460 LYERRLOG("%s there is parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800461 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800462 }
rjw7e50cd32022-01-18 18:30:37 +0800463 if(strlen(type)>LYNQ_TYPE_BUF)
464 {
465 LYERRLOG("[%s]the parameter is inavaliable !",__FUNCTION__);
q.huang52921662022-10-20 15:25:45 +0800466 return LYNQ_E_PARAMETER_ANONALY;
467 }
q.huang7de1d662022-09-13 14:19:24 +0800468
469 int request;
470 char str[LYNQ_TYPE_BUF];
rjw7e50cd32022-01-18 18:30:37 +0800471 memcpy(str,type,strlen(type)+1);
472 strUpper(str);
473 if(!strcmp(str,"VOICE"))
474 {
q.huangd3804bd2022-10-20 14:36:14 +0800475 if(get_state_from_buf(NETWORK_STATE_BUFFER_TYPE_VOICE_REG,3,regState,netType,netRejected,0)==0)
q.huang47d4dfe2022-08-17 17:52:29 +0800476 {
q.huangd3804bd2022-10-20 14:36:14 +0800477 return RESULT_OK;
q.huang47d4dfe2022-08-17 17:52:29 +0800478 }
q.huang7de1d662022-09-13 14:19:24 +0800479 request = RIL_REQUEST_VOICE_REGISTRATION_STATE;
rjw7e50cd32022-01-18 18:30:37 +0800480 }else if(!strcmp(str,"DATA")){
q.huangd3804bd2022-10-20 14:36:14 +0800481 if(get_state_from_buf(NETWORK_STATE_BUFFER_TYPE_DATA_REG,2,regState,netType,2,LAC,CID)==0)
q.huang47d4dfe2022-08-17 17:52:29 +0800482 {
q.huangd3804bd2022-10-20 14:36:14 +0800483 return RESULT_OK;
q.huang47d4dfe2022-08-17 17:52:29 +0800484 }
q.huang7de1d662022-09-13 14:19:24 +0800485 request = RIL_REQUEST_DATA_REGISTRATION_STATE;
rjw7e50cd32022-01-18 18:30:37 +0800486 }else if(!strcmp(str,"IMS")){
q.huangd3804bd2022-10-20 14:36:14 +0800487 if(get_state_from_buf(NETWORK_STATE_BUFFER_TYPE_IMS_REG,2,imsRegState,radioTechFam,0)==0)
q.huang47d4dfe2022-08-17 17:52:29 +0800488 {
q.huangd3804bd2022-10-20 14:36:14 +0800489 return RESULT_OK;
q.huang47d4dfe2022-08-17 17:52:29 +0800490 }
q.huang7de1d662022-09-13 14:19:24 +0800491 request = RIL_REQUEST_IMS_REGISTRATION_STATE;
rjw7e50cd32022-01-18 18:30:37 +0800492 }else{
493 LYERRLOG("request error");
q.huang52921662022-10-20 15:25:45 +0800494 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800495 }
rjw7e50cd32022-01-18 18:30:37 +0800496
q.huang52921662022-10-20 15:25:45 +0800497 Parcel* p=NULL;
498 int ret=lynq_send_common_request(p,g_wait_time,request,0,"");
499
500 if(ret!=RESULT_OK)
rjw7e50cd32022-01-18 18:30:37 +0800501 {
q.huang52921662022-10-20 15:25:45 +0800502 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
503 return ret;
504 }
505
506 int num,i;
507 char *resp[LYNQ_RESP_STRING_MAX_NUM];
508 if(!strcmp(str,"VOICE"))
509 {
510 p->readInt32(&num);
511 if(num == 15)
rjw7e50cd32022-01-18 18:30:37 +0800512 {
q.huang693ff3b2022-10-20 15:25:45 +0800513 for(i=0;i<15;i++)
q.huang52921662022-10-20 15:25:45 +0800514 {
515 resp[i]=lynqStrdupReadString(p);
516 }
q.huang693ff3b2022-10-20 15:25:45 +0800517 *regState = atoi(resp[0]);
518 *netType = atoi(resp[3]);
519 *netRejected = atoi(resp[14]);
520 for(i=0;i<15;i++)
q.huang52921662022-10-20 15:25:45 +0800521 {
522 if(resp[i]!=NULL)
523 {
524 free(resp[i]);
525 }
526 }
527 set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_VOICE_REG,3,*regState,*netType,*netRejected,0);
rjw7e50cd32022-01-18 18:30:37 +0800528 }
q.huang52921662022-10-20 15:25:45 +0800529 else
q.huang7de1d662022-09-13 14:19:24 +0800530 {
q.huang52921662022-10-20 15:25:45 +0800531 LYERRLOG("%s type %s num %d error",__func__,str,num);
q.huang7de1d662022-09-13 14:19:24 +0800532 delete p;
q.huang52921662022-10-20 15:25:45 +0800533 return LYNQ_E_INNER_ERROR;
534 }
rjw7e50cd32022-01-18 18:30:37 +0800535 }
q.huang52921662022-10-20 15:25:45 +0800536 else if(!strcmp(str,"DATA")){
537 p->readInt32(&num);
538 if(num == 11)
539 {
540 for(i=0;i<4;i++)
541 {
q.huang693ff3b2022-10-20 15:25:45 +0800542 resp[i]=lynqStrdupReadString(p);
543 }
544 *regState = atoi(resp[0]);
545 strcpy(LAC,resp[1]);
546 strcpy(CID,resp[2]);
547 *netType = atoi(resp[3]);
548 for(i=0;i<4;i++)
q.huang52921662022-10-20 15:25:45 +0800549 {
550 if(resp[i]!=NULL)
551 {
552 free(resp[i]);
553 }
554 }
555 set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_DATA_REG,2,*regState,*netType,2,LAC,CID);
556 }
557 else
558 {
559 LYERRLOG("%s type %s num %d error",__func__,str,num);
560 delete p;
561 return LYNQ_E_INNER_ERROR;
562 }
q.huang7de1d662022-09-13 14:19:24 +0800563
q.huang52921662022-10-20 15:25:45 +0800564 }
565 else // "IMS"
566 {
567 p->readInt32(&num);
568 if(num == 2)
569 {
570 p->readInt32(imsRegState);
571 p->readInt32(radioTechFam);
572 set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_IMS_REG,2,*imsRegState,*radioTechFam,0);
573 }
574 else
575 {
576 LYERRLOG("%s type %s num %d error",__func__,str,num);
577 delete p;
578 return LYNQ_E_INNER_ERROR;
579 }
580 }
581 LYINFLOG("%s suc",__func__);
582 delete p;
583 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800584}
585
586int lynq_query_prefferred_networktype(int *preNetType)
q.huang7de1d662022-09-13 14:19:24 +0800587{
q.huang52921662022-10-20 15:25:45 +0800588 if(g_module_init_flag != MODULE_RUNNING)
589 {
590 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
591 return LYNQ_E_CONFLICT;
592 }
q.huang7de1d662022-09-13 14:19:24 +0800593 if(NULL == preNetType)
rjw7e50cd32022-01-18 18:30:37 +0800594 {
q.huang7de1d662022-09-13 14:19:24 +0800595 LYERRLOG("%s there is parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800596 return LYNQ_E_PARAMETER_ANONALY;
597 }
rjw7e50cd32022-01-18 18:30:37 +0800598
q.huang52921662022-10-20 15:25:45 +0800599 Parcel* p=NULL;
600 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE,0,"");
601
602 if(ret!=RESULT_OK)
603 {
604 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
605 return ret;
606 }
607
608 int num;
609 p->readInt32(&num);
610 p->readInt32(preNetType);
611
612 LYINFLOG("%s suc",__func__);
613 delete p;
614 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800615}
616
617int lynq_set_prefferred_networktype(const int preffertype)
618{
q.huang52921662022-10-20 15:25:45 +0800619 if(g_module_init_flag != MODULE_RUNNING)
620 {
621 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
622 return LYNQ_E_CONFLICT;
623 }
rjw7e50cd32022-01-18 18:30:37 +0800624 if(preffertype < 0||preffertype >33)
rjw7e50cd32022-01-18 18:30:37 +0800625 {
q.huang7de1d662022-09-13 14:19:24 +0800626 LYERRLOG("%s parameter %d error",__func__,preffertype);
q.huang52921662022-10-20 15:25:45 +0800627 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800628 }
q.huang52921662022-10-20 15:25:45 +0800629
q.huang7de1d662022-09-13 14:19:24 +0800630 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +0800631 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE,1,"%d",preffertype);
632
633 if(ret!=RESULT_OK)
rjw7e50cd32022-01-18 18:30:37 +0800634 {
q.huang52921662022-10-20 15:25:45 +0800635 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
636 return ret;
637 }
638
639 LYINFLOG("%s set %d suc",__func__,preffertype);
640 delete p;
641 return RESULT_OK;
642
rjw7e50cd32022-01-18 18:30:37 +0800643}
644
rjw62a60152022-06-09 17:43:01 +0800645int lynq_query_cell_info(uint64_t cellinfo[CELLINFO_MAX_NUM],int tac[CELLINFO_MAX_NUM],int earfcn[CELLINFO_MAX_NUM],int * realNum)
rjw7e50cd32022-01-18 18:30:37 +0800646{
q.huang52921662022-10-20 15:25:45 +0800647 if(g_module_init_flag != MODULE_RUNNING)
648 {
649 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
650 return LYNQ_E_CONFLICT;
651 }
rjw7e50cd32022-01-18 18:30:37 +0800652 if(NULL == realNum)
rjw7e50cd32022-01-18 18:30:37 +0800653 {
q.huang7de1d662022-09-13 14:19:24 +0800654 LYERRLOG("%s there is parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800655 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800656 }
657
q.huang52921662022-10-20 15:25:45 +0800658 Parcel* p=NULL;
659 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_GET_CELL_INFO_LIST,0,"");
660
661 if(ret!=RESULT_OK)
rjw46769c92022-07-04 21:17:25 +0800662 {
q.huang52921662022-10-20 15:25:45 +0800663 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
664 return ret;
665 }
666
667 int num;
q.huang7de1d662022-09-13 14:19:24 +0800668
q.huang52921662022-10-20 15:25:45 +0800669 p->readInt32(&num);
670 LYINFLOG("cell info num:%d",num);
671 *realNum = num;
672 for(int i = 0;i<num;i++)
673 {
674 copyCellInfoList(p,&cellinfo[i],&tac[i],&earfcn[i]);
rjw7e50cd32022-01-18 18:30:37 +0800675 }
q.huang52921662022-10-20 15:25:45 +0800676
677 LYINFLOG("%s suc",__func__);
678 delete p;
679 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800680}
681
682int lynq_set_unsol_cell_info_listrate(const int rate)
683{
q.huang52921662022-10-20 15:25:45 +0800684 if(g_module_init_flag != MODULE_RUNNING)
rjw7e50cd32022-01-18 18:30:37 +0800685 {
q.huang52921662022-10-20 15:25:45 +0800686 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
687 return LYNQ_E_CONFLICT;
rjw7e50cd32022-01-18 18:30:37 +0800688 }
q.huang52921662022-10-20 15:25:45 +0800689 Parcel* p=NULL;
690 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE,1,"%d",rate);
rjw7e50cd32022-01-18 18:30:37 +0800691
q.huang52921662022-10-20 15:25:45 +0800692 if(ret!=RESULT_OK)
693 {
694 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
695 return ret;
696 }
697
698 LYINFLOG("%s set %d suc",__func__,rate);
699 delete p;
700 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800701}
702
703int lynq_set_band_mode(const int bandmode)
704{
q.huang52921662022-10-20 15:25:45 +0800705 if(g_module_init_flag != MODULE_RUNNING)
rjw7e50cd32022-01-18 18:30:37 +0800706 {
q.huang52921662022-10-20 15:25:45 +0800707 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
708 return LYNQ_E_CONFLICT;
rjw7e50cd32022-01-18 18:30:37 +0800709 }
q.huang52921662022-10-20 15:25:45 +0800710 Parcel* p=NULL;
711 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SET_BAND_MODE,1,"%d",bandmode);
rjw7e50cd32022-01-18 18:30:37 +0800712
q.huang52921662022-10-20 15:25:45 +0800713 if(ret!=RESULT_OK)
714 {
715 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
716 return ret;
717 }
718
719 LYINFLOG("%s set %d suc",__func__,bandmode);
720 delete p;
721 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800722}
723
724int lynq_query_available_bandmode(int availBanMode[])
725{
q.huang52921662022-10-20 15:25:45 +0800726 if(g_module_init_flag != MODULE_RUNNING)
727 {
728 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
729 return LYNQ_E_CONFLICT;
730 }
rjw7e50cd32022-01-18 18:30:37 +0800731 if(NULL == availBanMode)
rjw7e50cd32022-01-18 18:30:37 +0800732 {
q.huang7de1d662022-09-13 14:19:24 +0800733 LYERRLOG("%s parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800734 return LYNQ_E_PARAMETER_ANONALY;
rjw7e50cd32022-01-18 18:30:37 +0800735 }
736
q.huang7de1d662022-09-13 14:19:24 +0800737 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +0800738 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE,0,"");
739 if(ret!=RESULT_OK)
rjw7e50cd32022-01-18 18:30:37 +0800740 {
q.huang52921662022-10-20 15:25:45 +0800741 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
742 return ret;
743 }
q.huang7de1d662022-09-13 14:19:24 +0800744
q.huang52921662022-10-20 15:25:45 +0800745 int num = 0;
746 int res = 0;
747 int i;
748
749 p->readInt32(&num);
750 LYINFLOG("num = %d",num);
751 availBanMode[0] = num;
752 for(i=1 ;i<=num;i++)
753 {
754 p->readInt32(&res);
755 availBanMode[i]=res;
756 }
757
758 LYINFLOG("%s suc",__func__);
759 delete p;
760 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800761}
762
q.huang36833592023-04-04 16:46:26 +0800763int lynq_radio_on(const lynq_network_radio_on_type type)
q.huang52921662022-10-20 15:25:45 +0800764{
765 if(g_module_init_flag != MODULE_RUNNING)
766 {
767 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
768 return LYNQ_E_CONFLICT;
769 }
q.huang36833592023-04-04 16:46:26 +0800770 if (type != NETWORK_RADIO_ON_TYPE_CFUN_0 && type != NETWORK_RADIO_ON_TYPE_NORMAL_MODE && type!=NETWORK_RADIO_ON_TYPE_FLIGHT_MODE)
rjw7e50cd32022-01-18 18:30:37 +0800771 {
q.huang36833592023-04-04 16:46:26 +0800772 LYERRLOG("%s parameter %d error",__func__,type);
q.huang52921662022-10-20 15:25:45 +0800773 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800774 }
775
q.huang52921662022-10-20 15:25:45 +0800776 Parcel* p=NULL;
q.huang36833592023-04-04 16:46:26 +0800777 int ret;
778
779 if(type==NETWORK_RADIO_ON_TYPE_CFUN_0)
780 {
781 ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"%s","AT+CFUN=0");
782 }
783 else
784 {
785 ret=lynq_send_common_request(p,65,RIL_REQUEST_RADIO_POWER,1,"%d",(type==NETWORK_RADIO_ON_TYPE_NORMAL_MODE));
786 }
rjw7e50cd32022-01-18 18:30:37 +0800787
q.huang52921662022-10-20 15:25:45 +0800788 if(ret!=RESULT_OK)
789 {
790 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
791 return ret;
792 }
793
q.huang36833592023-04-04 16:46:26 +0800794 LYINFLOG("%s set %d suc",__func__,type);
q.huang52921662022-10-20 15:25:45 +0800795 delete p;
796 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800797}
798
q.huang7de1d662022-09-13 14:19:24 +0800799const char * lynq_get_raw_data(Parcel* &p, int* data_len)
q.huang16dcb0f2022-09-07 09:17:37 +0800800{
rjw776c85f2022-10-21 15:09:21 +0800801 int32_t len;
q.huang16dcb0f2022-09-07 09:17:37 +0800802 int status;
803 char *data;
804
805 *data_len=0;
rjw776c85f2022-10-21 15:09:21 +0800806
q.huang7de1d662022-09-13 14:19:24 +0800807 status = p->readInt32(&len);
rjw776c85f2022-10-21 15:09:21 +0800808
q.huang16dcb0f2022-09-07 09:17:37 +0800809 if (status != 0) {
810 LYERRLOG("%s status is %d",__func__,status);
811 return NULL;
rjw776c85f2022-10-21 15:09:21 +0800812 }
813
814 // The java code writes -1 for null arrays
q.huang16dcb0f2022-09-07 09:17:37 +0800815 if (((int)len) == -1 || ((int)len) == 0)
816 {
817 LYERRLOG("%s len is %d",__func__,len);
818 return NULL;
819 }
820 LYINFLOG("%s len is %d",__func__,len);
rjw776c85f2022-10-21 15:09:21 +0800821
q.huang7de1d662022-09-13 14:19:24 +0800822 data = (char*) p->readInplace(len);
q.huang16dcb0f2022-09-07 09:17:37 +0800823 *data_len=len;
rjw776c85f2022-10-21 15:09:21 +0800824
q.huang16dcb0f2022-09-07 09:17:37 +0800825 return data;
826}
827
828int lynq_query_radio_state(int *radio_state)
829{
q.huang52921662022-10-20 15:25:45 +0800830 if(g_module_init_flag != MODULE_RUNNING)
831 {
832 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
833 return LYNQ_E_CONFLICT;
834 }
q.huang16dcb0f2022-09-07 09:17:37 +0800835 if(NULL == radio_state)
836 {
837 LYERRLOG("%s radio state is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800838 return LYNQ_E_PARAMETER_ANONALY;
q.huang16dcb0f2022-09-07 09:17:37 +0800839 }
840
q.huang7de1d662022-09-13 14:19:24 +0800841 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +0800842 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"%s","AT+CFUN");
843 if(ret!=RESULT_OK)
q.huang16dcb0f2022-09-07 09:17:37 +0800844 {
q.huang52921662022-10-20 15:25:45 +0800845 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
846 return ret;
847 }
q.huang7de1d662022-09-13 14:19:24 +0800848
q.huang52921662022-10-20 15:25:45 +0800849 int bfind=false;
850 const char* data;
851 int data_len;
852 char* data_str;
853 char* start;
854 int length;
855 int i;
856 int num_start;
857 data = lynq_get_raw_data(p,&data_len);
858 if(data==NULL || data_len == 0)
859 {
860 LYERRLOG("%s lynq_get_raw_data NULL or data_len is 0",__func__);
q.huang7de1d662022-09-13 14:19:24 +0800861 delete p;
q.huang52921662022-10-20 15:25:45 +0800862 return LYNQ_E_INNER_ERROR;
q.huang16dcb0f2022-09-07 09:17:37 +0800863 }
q.huang52921662022-10-20 15:25:45 +0800864 data_str = (char*) calloc(1,data_len+1);
865 if (NULL == data_str)
866 {
867 LYERRLOG("%s alloc mem error, data_len is %d",__func__,data_len+1);
868 delete p;
869 return LYNQ_E_MALLOC_ERROR;
870 }
871 memmove(data_str, data, data_len);
872 data_str[data_len]='\0';
873 LYINFLOG("%s return string is %s",__func__,data_str);
874 start = strstr(data_str,"CFUN");
875 if(start!=NULL)
876 {
877 start=start+4;
878 length=strlen(start);
879 for(i=0; i<length;i++)
880 {
881 if((!bfind) && (start[i] >= '0') && (start[i] <= '9'))
882 {
883 bfind=true;
884 num_start=i;
885 }
886 else if(bfind && ((start[i] < '0') || (start[i] > '9')))
887 {
888 start[i]='\0';
889 break;
890 }
891 }
892 if(bfind)
893 {
894 (*radio_state) = atoi(start+num_start);
895 LYINFLOG("%s, radio state is %s %d",__func__,start+num_start,*radio_state);
896 free(data_str);
897 delete p;
898 return RESULT_OK;
899 }
900 }
901 LYERRLOG("%s return string %s no cfun or no digit",__func__,data_str);
902 free(data_str);
903 delete p;
904 return LYNQ_E_INNER_ERROR;
q.huang16dcb0f2022-09-07 09:17:37 +0800905}
906
rjw7e50cd32022-01-18 18:30:37 +0800907int lynq_query_radio_tech(int* radioTech)
908{
q.huang52921662022-10-20 15:25:45 +0800909 if(g_module_init_flag != MODULE_RUNNING)
910 {
911 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
912 return LYNQ_E_CONFLICT;
913 }
rjw7e50cd32022-01-18 18:30:37 +0800914 if(NULL == radioTech)
rjw7e50cd32022-01-18 18:30:37 +0800915 {
q.huang7de1d662022-09-13 14:19:24 +0800916 LYERRLOG("%s radio tech is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800917 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800918 }
rjw7e50cd32022-01-18 18:30:37 +0800919
q.huang7de1d662022-09-13 14:19:24 +0800920 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +0800921 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_VOICE_RADIO_TECH,0,"");
922
923 if(ret!=RESULT_OK)
rjw46769c92022-07-04 21:17:25 +0800924 {
q.huang52921662022-10-20 15:25:45 +0800925 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
926 return ret;
927 }
q.huang7de1d662022-09-13 14:19:24 +0800928
q.huang52921662022-10-20 15:25:45 +0800929 int num;
930 p->readInt32(&num);
931 p->readInt32(radioTech);
q.huang7de1d662022-09-13 14:19:24 +0800932
q.huang52921662022-10-20 15:25:45 +0800933 LYINFLOG("%s suc",__func__);
934 delete p;
935 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800936}
937
938int lynq_solicited_signal_strength(signalStrength_t *solSigStren)
939{
q.huang52921662022-10-20 15:25:45 +0800940 if(g_module_init_flag != MODULE_RUNNING)
941 {
942 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
943 return LYNQ_E_CONFLICT;
944 }
rjw7e50cd32022-01-18 18:30:37 +0800945 if(NULL == solSigStren)
rjw7e50cd32022-01-18 18:30:37 +0800946 {
q.huang7de1d662022-09-13 14:19:24 +0800947 LYERRLOG("%s parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800948 return LYNQ_E_PARAMETER_ANONALY;
rjw7e50cd32022-01-18 18:30:37 +0800949 }
950
q.huang7de1d662022-09-13 14:19:24 +0800951 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +0800952 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SIGNAL_STRENGTH,0,"");
953 if(ret!=RESULT_OK)
rjw46769c92022-07-04 21:17:25 +0800954 {
q.huang52921662022-10-20 15:25:45 +0800955 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
956 return ret;
957 }
958
959 int sum = 0;
960 int LTE_signalstrength = 0;
961 int WCDMA_signalstrength = 0;
962 int none = 0;
rjw7e50cd32022-01-18 18:30:37 +0800963
q.huang52921662022-10-20 15:25:45 +0800964 p->readInt32(&solSigStren->rssi);
965 if((solSigStren->rssi!=99)&&(solSigStren->rssi!=0))
966 {
967 solSigStren->gw_sig_valid = 1;
968 }else{
969 solSigStren->gw_sig_valid = 0;
rjw7e50cd32022-01-18 18:30:37 +0800970 }
q.huang7de1d662022-09-13 14:19:24 +0800971
q.huang52921662022-10-20 15:25:45 +0800972 p->readInt32(&none);
973 p->readInt32(&none);
974 p->readInt32(&none);
975 p->readInt32(&none);
976 p->readInt32(&none);
977 p->readInt32(&none);
978 p->readInt32(&none);
979 p->readInt32(&LTE_signalstrength);
980 // p->readInt32(&solSigStren->signalStrength.LTE_SignalStrength.signalStrength);
981 p->readInt32(&solSigStren->rsrp);
982 p->readInt32(&solSigStren->rsrq);
983 p->readInt32(&solSigStren->rssnr);
984 LYINFLOG("LTE_signalstrength:%d",LTE_signalstrength);
985 if((LTE_signalstrength!=99)&&(LTE_signalstrength!=0))
986 {
987 solSigStren->lte_sig_valid = 1;
988 }else{
989 solSigStren->lte_sig_valid = 0;
990 }
q.huang7de1d662022-09-13 14:19:24 +0800991
q.huang52921662022-10-20 15:25:45 +0800992 p->readInt32(&none);
993 p->readInt32(&none);
994 p->readInt32(&none);
995 p->readInt32(&none);
996 p->readInt32(&none);
997 p->readInt32(&WCDMA_signalstrength);
998 p->readInt32(&none);
999 p->readInt32(&solSigStren->rscp);
1000 p->readInt32(&solSigStren->ecno);
1001 LYINFLOG("WCDMA_signalstrength:%d",WCDMA_signalstrength);
1002 if((WCDMA_signalstrength!=99)&&(WCDMA_signalstrength!=0))
1003 {
1004 solSigStren->wcdma_sig_valid = 1;
1005 }else{
1006 solSigStren->wcdma_sig_valid = 0;
1007 }
1008 /*bug fix*/
1009 p->readInt32(&solSigStren->ssRsrp);
1010 p->readInt32(&solSigStren->ssRsrq);
1011 p->readInt32(&solSigStren->ssSinr);
1012 p->readInt32(&solSigStren->csiRsrp);
1013 p->readInt32(&solSigStren->csiRsrq);
1014 p->readInt32(&solSigStren->csiSinr);
1015 sum = (solSigStren->ssRsrp) + (solSigStren->ssRsrq) + (solSigStren->ssSinr) + (solSigStren->csiRsrp)+\
1016 (solSigStren->csiRsrq) + (solSigStren->csiSinr);
1017 if(sum != 0)
1018 {
1019 solSigStren->nr_sig_valid = 1;
1020 }else{
1021 LYERRLOG("None of NR signal info");
1022 }
1023
1024 LYINFLOG("%s suc",__func__);
1025 delete p;
1026 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +08001027}
rjwbc8a05f2022-03-02 15:23:11 +08001028
rjw4a5a78d2022-03-10 11:04:24 +08001029int lynq_set_ims(const int ims_mode)
1030{
q.huang52921662022-10-20 15:25:45 +08001031 if(g_module_init_flag != MODULE_RUNNING)
q.huang7de1d662022-09-13 14:19:24 +08001032 {
q.huang52921662022-10-20 15:25:45 +08001033 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1034 return LYNQ_E_CONFLICT;
q.huang7de1d662022-09-13 14:19:24 +08001035 }
rjw4a5a78d2022-03-10 11:04:24 +08001036 if (ims_mode < 0 || ims_mode > 1)
1037 {
q.huang7de1d662022-09-13 14:19:24 +08001038 LYERRLOG("%s parameter %d error",__func__,ims_mode);
q.huang52921662022-10-20 15:25:45 +08001039 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +08001040 }
rjw4a5a78d2022-03-10 11:04:24 +08001041
q.huang52921662022-10-20 15:25:45 +08001042 Parcel* p=NULL;
1043 int ret = lynq_send_common_request(p,65,RIL_REQUEST_SET_IMS_ENABLE,1,"%d",ims_mode);
1044 if(ret!=RESULT_OK)
1045 {
1046 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
1047 return ret;
1048 }
1049
1050 LYINFLOG("%s set %d suc",__func__,ims_mode);
1051 delete p;
1052 return RESULT_OK;
rjw4a5a78d2022-03-10 11:04:24 +08001053}
1054
q.huang52921662022-10-20 15:25:45 +08001055/*Used to get urc info*/
1056int lynq_get_urc_info(const int handle,signalStrength_t *solSigStren,int *slot_id)
1057{
1058 if(g_module_init_flag != MODULE_RUNNING)
1059 {
1060 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1061 return LYNQ_E_CONFLICT;
1062 }
1063 LYDBGLOG("start get urc info");
1064 if(handle != RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED &&handle != RIL_UNSOL_SIGNAL_STRENGTH)
1065 {
1066 LYINFLOG("invalid handle!!!");
1067 return LYNQ_E_PARAMETER_ANONALY;
1068 }
1069 if((handle ==RIL_UNSOL_SIGNAL_STRENGTH && NULL == solSigStren) ||
1070 (handle ==RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED && NULL == slot_id))
1071 {
1072 LYINFLOG("incoming solSigStren or slot_id is NULL!!!");
1073 return LYNQ_E_PARAMETER_ANONALY;
1074 }
1075 switch(handle)
1076 {
1077 case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: //1002
1078 {
1079 LYDBGLOG("get state update to VOICE");
1080 *slot_id = s_module_urc_slot_id;
1081 LYINFLOG("slot_id = %d",s_module_urc_slot_id);
1082 break;
1083 }
1084 case RIL_UNSOL_SIGNAL_STRENGTH: //1009
1085 {
1086 LYDBGLOG("get state update to signal info");
1087 solSigStren->gw_sig_valid = s_network_urc_solSigStren.gw_sig_valid;
1088 solSigStren->rssi = s_network_urc_solSigStren.rssi;
1089 solSigStren->wcdma_sig_valid = s_network_urc_solSigStren.wcdma_sig_valid;
1090 solSigStren->rscp = s_network_urc_solSigStren.rscp;
1091 solSigStren->ecno = s_network_urc_solSigStren.ecno;
1092 solSigStren->lte_sig_valid = s_network_urc_solSigStren.lte_sig_valid;
1093 solSigStren->rsrp = s_network_urc_solSigStren.rsrp;
1094 solSigStren->rsrq = s_network_urc_solSigStren.rsrq;
1095 solSigStren->rssnr = s_network_urc_solSigStren.rssnr;
1096 solSigStren->nr_sig_valid = s_network_urc_solSigStren.nr_sig_valid;
1097 solSigStren->ssRsrp = s_network_urc_solSigStren.ssRsrp;
1098 solSigStren->ssRsrq = s_network_urc_solSigStren.ssRsrq;
1099 solSigStren->ssSinr = s_network_urc_solSigStren.ssSinr;
1100 solSigStren->csiRsrp = s_network_urc_solSigStren.csiRsrp;
1101 solSigStren->csiRsrq = s_network_urc_solSigStren.csiRsrq;
1102 solSigStren->csiSinr = s_network_urc_solSigStren.csiSinr;
1103 break;
1104 }
1105 }
1106 return RESULT_OK;
1107}
1108
1109static pthread_mutex_t urc_signal_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
1110static pthread_cond_t urc_signal_state_change_cond = PTHREAD_COND_INITIALIZER;
1111
1112int wait_urc_signal_changes()
1113{
1114 pthread_mutex_lock(&urc_signal_state_change_mutex);
1115 pthread_cond_wait(&urc_signal_state_change_cond,&urc_signal_state_change_mutex);
1116 pthread_mutex_unlock(&urc_signal_state_change_mutex);
1117 return RESULT_OK;
1118}
1119
1120void send_urc_signal_changes()
1121{
1122 pthread_mutex_lock(&urc_signal_state_change_mutex);
1123 pthread_cond_signal(&urc_signal_state_change_cond);
1124 pthread_mutex_unlock(&urc_signal_state_change_mutex);
1125 return;
1126}
1127
q.huang036b6cf2023-01-10 14:29:20 +08001128bool is_support_urc(int urc_id)
1129{
1130 switch(urc_id)
1131 {
1132 case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED:
1133 case RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED:
1134 case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED:
1135 case RIL_UNSOL_SIGNAL_STRENGTH:
1136 return true;
1137 default:
1138 return false;
1139 }
1140}
1141
q.huang52921662022-10-20 15:25:45 +08001142void urc_msg_process(Parcel *p)
1143{
1144 int resp_type;
1145 int none = 0;
1146 int NR_sum = 0;
1147 int urc_LTE_signalstrength = 0;
1148 int urc_WCDMA_signalstrength = 0;
1149
q.huang036b6cf2023-01-10 14:29:20 +08001150 int size=p->dataSize();
q.huang52921662022-10-20 15:25:45 +08001151 p->readInt32(&resp_type);
1152 p->readInt32(&s_module_wait_urc_id);
1153 p->readInt32(&s_module_urc_slot_id);
q.huang036b6cf2023-01-10 14:29:20 +08001154 LYINFLOG("%s urc id = %d, slot_id = %d, size is %d, msg is %s",__func__, s_module_wait_urc_id,s_module_urc_slot_id,size,requestToString(s_module_wait_urc_id));
q.huang52921662022-10-20 15:25:45 +08001155 switch(s_module_wait_urc_id)
1156 {
1157 case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED:
1158 {
1159 set_state_buffer_valid(NETWORK_STATE_BUFFER_TYPE_VOICE_REG,false);
1160 send_urc_signal_changes();
1161 break;
1162 }
1163 case RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED:
1164 {
1165 set_state_buffer_valid(NETWORK_STATE_BUFFER_TYPE_DATA_REG,false);
1166 send_urc_signal_changes();
1167 break;
1168 }
1169 case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED:
1170 {
1171 set_state_buffer_valid(NETWORK_STATE_BUFFER_TYPE_IMS_REG,false);
1172 send_urc_signal_changes();
1173 break;
1174 }
1175 case RIL_UNSOL_SIGNAL_STRENGTH:
1176 {
1177 p->readInt32(&s_network_urc_solSigStren.rssi);
1178 if((s_network_urc_solSigStren.rssi!=99)&&(s_network_urc_solSigStren.rssi!=0))
1179 {
1180 s_network_urc_solSigStren.gw_sig_valid = 1;
1181 }else{
1182 s_network_urc_solSigStren.gw_sig_valid = 0;
1183 }
1184 if(s_network_urc_solSigStren.gw_sig_valid == 1)
1185 {
1186 LYINFLOG("urc_GSM_signalstrength:%d",s_network_urc_solSigStren.rssi);
1187 }
1188 p->readInt32(&none);
1189 p->readInt32(&none);
1190 p->readInt32(&none);
1191 p->readInt32(&none);
1192 p->readInt32(&none);
1193 p->readInt32(&none);
1194 p->readInt32(&none);
1195 p->readInt32(&urc_LTE_signalstrength);
1196 // p.readInt32(&solSigStren->signalStrength.LTE_SignalStrength.signalStrength);
1197 p->readInt32(&s_network_urc_solSigStren.rsrp);
1198 p->readInt32(&s_network_urc_solSigStren.rsrq);
1199 p->readInt32(&s_network_urc_solSigStren.rssnr);
1200 if((urc_LTE_signalstrength!=99)&&(urc_LTE_signalstrength!=0))
1201 {
1202 s_network_urc_solSigStren.lte_sig_valid = 1;
1203 }else{
1204 s_network_urc_solSigStren.lte_sig_valid = 0;
1205 }
1206 if(s_network_urc_solSigStren.lte_sig_valid == 1)
1207 {
1208 LYINFLOG("urc_LTE_signalstrength:%d",urc_LTE_signalstrength);
1209 }
1210 p->readInt32(&none);
1211 p->readInt32(&none);
1212 p->readInt32(&none);
1213 p->readInt32(&none);
1214 p->readInt32(&none);
1215 p->readInt32(&urc_WCDMA_signalstrength);
1216 p->readInt32(&none);
1217 p->readInt32(&s_network_urc_solSigStren.rscp);
1218 p->readInt32(&s_network_urc_solSigStren.ecno);
1219 if((urc_WCDMA_signalstrength!=99)&&(urc_WCDMA_signalstrength!=0))
1220 {
1221 s_network_urc_solSigStren.wcdma_sig_valid = 1;
1222 }else{
1223 s_network_urc_solSigStren.wcdma_sig_valid = 0;
1224 }
1225 if(s_network_urc_solSigStren.wcdma_sig_valid == 1)
1226 {
1227 LYINFLOG("urc_WCDMA_signalstrength:%d",urc_WCDMA_signalstrength);
1228 }
1229 p->readInt32(&s_network_urc_solSigStren.ssRsrp);
1230 p->readInt32(&s_network_urc_solSigStren.ssRsrq);
1231 p->readInt32(&s_network_urc_solSigStren.ssSinr);
1232 p->readInt32(&s_network_urc_solSigStren.csiRsrp);
1233 p->readInt32(&s_network_urc_solSigStren.csiRsrq);
1234 p->readInt32(&s_network_urc_solSigStren.csiSinr);
1235 NR_sum = (s_network_urc_solSigStren.ssRsrp) + (s_network_urc_solSigStren.ssRsrq) + (s_network_urc_solSigStren.ssSinr) + (s_network_urc_solSigStren.csiRsrp)+\
1236 (s_network_urc_solSigStren.csiRsrq) + (s_network_urc_solSigStren.csiSinr);
1237 if(NR_sum != 0)
1238 {
1239 s_network_urc_solSigStren.nr_sig_valid = 1;
1240 }else{
1241 s_network_urc_solSigStren.nr_sig_valid = 0;
1242 }
1243 if(s_network_urc_solSigStren.nr_sig_valid == 1)
1244 {
1245 LYINFLOG("[NR signal]ssRsrp is %d , ssRsrq is %d , ssSinr is %d , csiRsrp is %d , csiRsrq is %d , csiSinr is %d",\
1246 s_network_urc_solSigStren.ssRsrp,s_network_urc_solSigStren.ssRsrq,s_network_urc_solSigStren.ssSinr, \
1247 s_network_urc_solSigStren.csiRsrp,s_network_urc_solSigStren.csiRsrq,s_network_urc_solSigStren.csiSinr);
1248 }
1249 send_urc_signal_changes();
1250 break;
1251 }
1252 }
1253}
rjw4a5a78d2022-03-10 11:04:24 +08001254
rjwbc8a05f2022-03-02 15:23:11 +08001255/*Used to wait for an update signal*/
1256int lynq_wait_signalchanges(int *handle)
1257{
1258 LYDBGLOG("start wait signalchanges info");
1259 if(NULL == handle)
1260 {
1261 LYERRLOG("illegal input");
q.huang52921662022-10-20 15:25:45 +08001262 return LYNQ_E_PARAMETER_ANONALY;
rjwbc8a05f2022-03-02 15:23:11 +08001263 }
q.huang52921662022-10-20 15:25:45 +08001264 wait_urc_signal_changes();
rjwbc8a05f2022-03-02 15:23:11 +08001265 LYDBGLOG("get signalchanges");
q.huang52921662022-10-20 15:25:45 +08001266 *handle = s_module_wait_urc_id;
1267 return RESULT_OK;
rjw4200a082022-05-17 17:58:35 +08001268}
lh3a26dd52022-07-01 04:44:57 -07001269
q.huang52921662022-10-20 15:25:45 +08001270#ifdef MODEM_GEN97
lh3a26dd52022-07-01 04:44:57 -07001271/**@brief parse at response,return error code,and the response
1272* @param response [IN] <response>:original at response,This parameter must be a character array.
1273
1274* @param value [OUT] <value>: Used to receive the parsed value, if multiple values are separated by ";".
1275* field:
1276* eg:
1277* "+cnum: 123456\n+cnum: 456"
1278* value:12345;456;
1279* @param value_len [IN] <value_len>: The value length.
1280
1281* @return:AT error code
1282*/
1283static int parse_at_result(char response[],char value[],int value_len)
1284{
1285 if(response == NULL || value == NULL)
1286 {
1287 LYERRLOG("parameter invalid");
q.huang52921662022-10-20 15:25:45 +08001288 return LYNQ_E_PARAMETER_ANONALY;
lh3a26dd52022-07-01 04:44:57 -07001289 }
1290 if(strstr(response,"ERROR"))
1291 {
1292 int i;
1293 for(i = 0;i < strlen(response);i++)
1294 {
1295 if(response[i]==':')
1296 {
1297 break;
1298 }
1299 }
1300 if(i < strlen(response))
1301 {
1302 LYINFLOG("parse_result:%d\n",atoi(response+i+1));
1303 return atoi(response+i+1);
1304 }
1305 else
1306 {
1307 LYINFLOG("%s parse_result:fail,this response invalid\n",response);
1308 return 100; //unknown
1309 }
1310 }
1311 else if(strstr(response,"OK"))
1312 {
1313 /** parse the at response value
1314 * eg:
1315 * --> at+cnum
1316 * <-- +CNUM:"1243452"
1317 * need parse the "1243452" to <value>
1318 *@ To-Do
1319 */
1320 int count;
1321 int resp_addr[32] = {0};
1322 char temp_buf[1024] = {0};
1323 char *dest;
1324 dest = NULL;
1325 count = 0;
1326 int res_len = strlen(response);
1327 LYINFLOG("res_len:%d",res_len);
1328 for(int i = 0; i < res_len; i++)
1329 {
1330 if(response[i]==':')
1331 {
1332 resp_addr[count] = i;
1333 count++;
1334 }
1335 if(response[i] == '\n')
1336 {
1337 response[i] = '\0';
1338 }
1339 }
1340 LYINFLOG("count:%d",count);
1341 if(count > 0)
1342 {
1343 for(int i = 0; i < count; i++)
1344 {
1345 if((strlen(temp_buf) + strlen(response+resp_addr[i]+2)) >= 1023)
1346 {
1347 LYINFLOG("2 will be out of range\n");
1348 break;
1349 }
1350 if(strlen(temp_buf) >= 1023)
1351 {
1352 LYINFLOG("1 will be out of range\n");
1353 break;
1354 }
1355 strcat(temp_buf,response+resp_addr[i]+2);
1356
1357 if(strlen(temp_buf) >= 1023)
1358 {
1359 LYINFLOG("1 will be out of range\n");
1360 break;
1361 }
1362 strcat(temp_buf,";");
1363 printf("parse_result[%d]:%s,strcated:%s\n",i,response+resp_addr[i]+2,temp_buf);
1364 }
1365 LYINFLOG("parse_result:%s\n",temp_buf);
1366 if(strlen(temp_buf) > value_len)
1367 {
1368 printf("result length over value:%ld,%d\n",strlen(temp_buf),value_len);
1369 memcpy(value,temp_buf,value_len);
1370 }
1371 else
1372 {
1373 memcpy(value,temp_buf,strlen(temp_buf));
1374 }
1375 }
q.huang52921662022-10-20 15:25:45 +08001376 return RESULT_OK;
lh3a26dd52022-07-01 04:44:57 -07001377 }
1378 else
1379 {
1380 LYINFLOG("%s this response invalid\n",response);
q.huang52921662022-10-20 15:25:45 +08001381 return LYNQ_E_INNER_ERROR;
lh3a26dd52022-07-01 04:44:57 -07001382 }
1383}
lh3a26dd52022-07-01 04:44:57 -07001384
1385int lynq_oos_recover_timer_interval(int mode, char interval[LY_RECOVER_TIMER_INTERVAL],char result[LY_RECOVER_TIMER_INTERVAL])
1386{
q.huang52921662022-10-20 15:25:45 +08001387 if(g_module_init_flag != MODULE_RUNNING)
1388 {
1389 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1390 return LYNQ_E_CONFLICT;
1391 }
1392
q.huang7de1d662022-09-13 14:19:24 +08001393 if((mode < 0) || (mode >1) || (mode == 0 && NULL == interval) || (NULL == result))
lh3a26dd52022-07-01 04:44:57 -07001394 {
q.huang7de1d662022-09-13 14:19:24 +08001395 LYERRLOG("%s mode %d interval %s result %s error",__func__,mode,interval,result);
q.huang52921662022-10-20 15:25:45 +08001396 return LYNQ_E_PARAMETER_ANONALY;
lh3a26dd52022-07-01 04:44:57 -07001397 }
1398
q.huang7de1d662022-09-13 14:19:24 +08001399 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +08001400 int ret;
q.huang7de1d662022-09-13 14:19:24 +08001401
lh3a26dd52022-07-01 04:44:57 -07001402 if(mode == 0)
1403 {
q.huang52921662022-10-20 15:25:45 +08001404 ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"AT+ERSCFG=%s",interval);
lh3a26dd52022-07-01 04:44:57 -07001405 }
q.huang7de1d662022-09-13 14:19:24 +08001406 else
lh3a26dd52022-07-01 04:44:57 -07001407 {
q.huang52921662022-10-20 15:25:45 +08001408 ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"AT+ERSCFG?");
lh3a26dd52022-07-01 04:44:57 -07001409 }
q.huang7de1d662022-09-13 14:19:24 +08001410
q.huang52921662022-10-20 15:25:45 +08001411 if(ret!=RESULT_OK)
lh3a26dd52022-07-01 04:44:57 -07001412 {
q.huang52921662022-10-20 15:25:45 +08001413 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
1414 return ret;
1415 }
q.huang7de1d662022-09-13 14:19:24 +08001416
q.huang52921662022-10-20 15:25:45 +08001417 int recv_len;
1418 char res_data[LY_RECOVER_TIMER_INTERVAL] = {0};
1419 char response_interval[LY_RECOVER_TIMER_INTERVAL*2] = {0};
q.huang7de1d662022-09-13 14:19:24 +08001420
q.huang52921662022-10-20 15:25:45 +08001421 LYINFLOG("get recover timer interval");
1422 p->readInt32(&recv_len);
1423 if(recv_len == -1)
1424 {
1425 LYINFLOG("no responset");
q.huang7de1d662022-09-13 14:19:24 +08001426 delete p;
q.huang52921662022-10-20 15:25:45 +08001427 return LYNQ_E_INNER_ERROR;
lh3a26dd52022-07-01 04:44:57 -07001428 }
q.huang52921662022-10-20 15:25:45 +08001429 else
1430 {
1431 LYINFLOG("recv_len:%d",recv_len);
1432 p->read(response_interval,recv_len);
1433 }
1434 LYINFLOG("response_interval:%s",response_interval);
1435 ret = parse_at_result(response_interval,res_data,LY_RECOVER_TIMER_INTERVAL);
1436 if(mode == 1)
1437 {
1438 if(strlen(res_data) <= LY_RECOVER_TIMER_INTERVAL)
1439 {
1440 memcpy(result,res_data,strlen(res_data));
1441 }
1442 }
1443 LYERRLOG("%s ret:%d",__func__,ret);
1444 delete p;
1445 return ret;
lh3a26dd52022-07-01 04:44:57 -07001446}
1447
1448int lynq_oos_deep_sleep_recover_timer_interval(int recovery_threshold,int fullband_timer,int sniffer_timer,int inactive_mode)
1449{
q.huang52921662022-10-20 15:25:45 +08001450 if(g_module_init_flag != MODULE_RUNNING)
1451 {
1452 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1453 return LYNQ_E_CONFLICT;
1454 }
1455 if(((recovery_threshold < 2) || (recovery_threshold > 10)) || ((fullband_timer < 90) || (fullband_timer > 360)) ||
lh3a26dd52022-07-01 04:44:57 -07001456 ((sniffer_timer < 10) || (sniffer_timer > 60)) || ((inactive_mode < 0) || (inactive_mode > 1)))
1457 {
q.huang52921662022-10-20 15:25:45 +08001458 LYERRLOG("%s paramter recovery_threshold %d fullband_timer %d sniffer_timer %d inactive_mode %d error!",__func__,recovery_threshold,fullband_timer,sniffer_timer,inactive_mode);
1459 return LYNQ_E_PARAMETER_ANONALY;
lh3a26dd52022-07-01 04:44:57 -07001460 }
1461
q.huang7de1d662022-09-13 14:19:24 +08001462 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +08001463 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"AT+ESRVREC=%d,%d,%d,%d",recovery_threshold,fullband_timer,sniffer_timer,inactive_mode);
q.huang7de1d662022-09-13 14:19:24 +08001464
q.huang52921662022-10-20 15:25:45 +08001465 if(ret!=RESULT_OK)
lh3a26dd52022-07-01 04:44:57 -07001466 {
q.huang52921662022-10-20 15:25:45 +08001467 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
1468 return ret;
1469 }
1470
1471 int recv_len;
1472 char res_data[LY_RECOVER_TIMER_INTERVAL] = {0};
1473 char response_interval[LY_RECOVER_TIMER_INTERVAL*2] = {0};
1474
1475 p->readInt32(&recv_len);
1476 if(recv_len == -1)
1477 {
1478 LYINFLOG("no responset");
q.huang7de1d662022-09-13 14:19:24 +08001479 delete p;
q.huang52921662022-10-20 15:25:45 +08001480 return LYNQ_E_INNER_ERROR;
lh3a26dd52022-07-01 04:44:57 -07001481 }
q.huang52921662022-10-20 15:25:45 +08001482 else
1483 {
1484 LYINFLOG("recv_len:%d",recv_len);
1485 p->read(response_interval,recv_len);
1486 }
1487 LYINFLOG("response_interval:%s",response_interval);
1488 ret = parse_at_result(response_interval,res_data,LY_RECOVER_TIMER_INTERVAL);
1489 LYERRLOG("%s ret:%d",__func__,ret);
1490 delete p;
1491 return ret;
1492
lh3a26dd52022-07-01 04:44:57 -07001493}
1494#endif
1495