blob: 7d33b31dd7ed25cf0748962362151a9881b3f067 [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
rjw7e50cd32022-01-18 18:30:37 +080023using ::android::Parcel;
24
q.huang52921662022-10-20 15:25:45 +080025static int s_module_wait_urc_id;
26static int s_module_urc_slot_id;
27static signalStrength_t s_network_urc_solSigStren;
rjw7e50cd32022-01-18 18:30:37 +080028
q.huang52921662022-10-20 15:25:45 +080029/**g_module_init_flag
rjw22947c22022-03-15 09:21:29 +080030* @brief mark network initialization state
31* 0:deinit status
32* 1:init state
33*/
q.huang52921662022-10-20 15:25:45 +080034int g_module_init_flag = 0;
rjw7e50cd32022-01-18 18:30:37 +080035
36int lynq_network_init(int utoken){
q.huang52921662022-10-20 15:25:45 +080037 if(g_module_init_flag != MODULE_CLOSED)
rjw22947c22022-03-15 09:21:29 +080038 {
q.huang52921662022-10-20 15:25:45 +080039 LYERRLOG("module state is %d",g_module_init_flag);
40 return LYNQ_E_CONFLICT;
rjw22947c22022-03-15 09:21:29 +080041 }
q.huang52921662022-10-20 15:25:45 +080042
43 if(utoken <0){
44 LYERRLOG("utoken is less than 0",utoken);
45 return LYNQ_E_PARAMETER_ANONALY;
rjw7e50cd32022-01-18 18:30:37 +080046 }
q.huang52921662022-10-20 15:25:45 +080047
48 g_module_init_flag = MODULE_SWITCHING;
49
50 g_module_Global_uToken = utoken;
rjw7e50cd32022-01-18 18:30:37 +080051 LYLOGSET(LOG_INFO);
52 LYLOGEINIT(USER_LOG_TAG);
q.huang52921662022-10-20 15:25:45 +080053
q.huang8240f682022-10-20 14:36:14 +080054 client.uToken = network_Global_uToken;
55 network_Global_uToken=(network_Global_uToken+1)%10000;/*0-10000*/
56 client.request = request_id;
57 client.paramLen = argc;
58 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
59 if(argc!=0)
60 {
61 va_list args;
62 va_start(args, format);
63 vsnprintf(client.param, LYNQ_REQUEST_PARAM_BUF, format, args);
64 va_end(args);
65 }
66 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
67 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
68 if(g_inner_test==0)
69 {
70 send_num = sendto(network_sock_fd,&client,sizeof(client),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
71 }
72 else
73 {
74 send_num = 1;
75 g_inner_test = 0;
76 }
77 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
78
79 if(send_num <= 0)
80 {
81 LYERRLOG("send request fail, send num is %d", send_num);
82 return -1;
83 }
84 ret = waitResponse(p, client.uToken,time_out);
85
86 return ret;
87}
88
89
90int wait_signal_changes()
91{
92 int ret = 0;
93 pthread_mutex_lock(&signal_state_change_mutex);
94 ret = pthread_cond_wait(&signal_state_change_cond,&signal_state_change_mutex);
95 pthread_mutex_unlock(&signal_state_change_mutex);
96 return 0;
97}
98
99void send_signal_changes()
100{
101 pthread_mutex_lock(&signal_state_change_mutex);
102 pthread_cond_signal(&signal_state_change_cond);
103 pthread_mutex_unlock(&signal_state_change_mutex);
104 return;
105}
106
107/**@ a thread just for recv\buffer solicited msg's response and notice waiting thread
108* @param p [IN]: no meaning
109* @return
110* always null
111*/
112void *thread_rc_recv(void *p)
113{
114 Parcel* rc_p;
115 std::list<Parcel*>::iterator iter;
116 int resp_type = -1;
117 char rc_data[LYNQ_REC_BUF];
118 int rc_len;
119 int null_cnt=0;
120 int wakeup_token;
121
122 LYINFLOG("rc thread is running");
123 while(network_rc_status)
124 {
125 bzero(rc_data,LYNQ_REC_BUF);
126 while(true)
127 {
128 rc_len = recvfrom(network_sock_fd,rc_data,sizeof(rc_data),0,(struct sockaddr *)&network_addr_serv,(socklen_t *)&network_len_addr_serv);
129 if(rc_len<sizeof(int32_t)*2)
130 {
131 LYERRLOG("%s recv len %d less %d",__func__, rc_len,sizeof(int)*2);
132 continue;
133 }
134 rc_p= new Parcel;
135 if(rc_p==NULL)
136 {
137 null_cnt++;
138 LYERRLOG("%s rc_p is NULL, cnt is %d",__func__, null_cnt);
139 if(null_cnt>20)
140 {
141 goto rc_recv_end;
142 }
143 continue;
144 }
145 else
146 {
147 null_cnt=0;
148 }
149
150 rc_p->setData((uint8_t *)rc_data,rc_len); // p.setData((uint8_t *) buffer, buflen);
151 rc_p->setDataPosition(0);
152 if(rc_p->dataAvail()>0)
153 {
154 rc_p->readInt32(&resp_type);
155 rc_p->readInt32(&wakeup_token);
156 BLOCK_RC_MSG_LOCK();
157 g_recv_parcel_list.push_back(rc_p);
158 LYINFLOG("%s wakeup token is %d, list size is %d!",__func__,wakeup_token,g_recv_parcel_list.size());
159 if(g_recv_parcel_list.size()>20) //max 20
160 {
161 iter=g_recv_parcel_list.begin();
162 (*iter)->setDataPosition(0);
163 (*iter)->readInt32(&resp_type);
164 (*iter)->readInt32(&wakeup_token);
165 delete (*(g_recv_parcel_list.begin()));
166 LYERRLOG("%s wakeup token %d is deleted!",__func__,wakeup_token);
167 g_recv_parcel_list.erase(iter);
168 }
169 BLOCK_WAKEUP_RECV_MSG();
170 BLOCK_RC_MSG_UNLOCK();
171 break;
172 }
173 else
174 {
175 LYERRLOG("%s rc_p data Avail %d not greater than 0",__func__, rc_p->dataAvail());
176 delete rc_p;
177 }
178 }
179 }
180
181rc_recv_end:
182 return NULL;
183}
184
185void *thread_urc_recv(void *p)
186{
187 Parcel *urc_p =NULL;
188 char urc_data[LYNQ_REC_BUF];
189 int resp_type = -1;
190 int urc_id = -1;
191 int res = 0;
192 int none = 0;
193 int NR_sum = 0;
194 int urc_LTE_signalstrength = 0;
195 int urc_WCDMA_signalstrength = 0;
196 LYINFLOG("urc thread is running");
197 while(network_urc_status)
198 {
199 bzero(urc_data,LYNQ_REC_BUF);
200 res = recvfrom(network_urc_sock_fd,urc_data,sizeof(urc_data),0,(struct sockaddr *)&network_urc_addr_serv,(socklen_t*)&network_len_urc_addr_serv);
201 if(res<=0)
202 {
203 LYERRLOG("thread_urc_recv step2 fail:");
204 break;
205 }
206 urc_p = new Parcel();
207 if(urc_p == NULL)
208 {
209 LYERRLOG("new parcel failure!!!");
210 break;
211 }
212 urc_p->setData((uint8_t *)urc_data,res); // p.setData((uint8_t *) buffer, buflen);
213 urc_p->setDataPosition(0);
214 if(urc_p->dataAvail()>0)
215 {
216 urc_p->readInt32(&resp_type);
217 urc_p->readInt32(&urc_id);
218 urc_p->readInt32(&network_urc_slot_id);
219 switch(urc_id)
220 {
221 case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED:
222 {
223 set_state_buffer_valid(NETWORK_STATE_BUFFER_TYPE_VOICE_REG,false);
224 network_wait_urc_id = urc_id;
225 LYINFLOG("slot_id = %d",network_urc_slot_id);
226 send_signal_changes();
227 break;
228 }
229 case RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED:
230 {
231 set_state_buffer_valid(NETWORK_STATE_BUFFER_TYPE_DATA_REG,false);
232 network_wait_urc_id = urc_id;
233 LYINFLOG("slot_id = %d",network_urc_slot_id);
234 send_signal_changes();
235 break;
236 }
237 case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED:
238 {
239 set_state_buffer_valid(NETWORK_STATE_BUFFER_TYPE_IMS_REG,false);
240 network_wait_urc_id = urc_id;
241 LYINFLOG("slot_id = %d",network_urc_slot_id);
242 send_signal_changes();
243 break;
244 }
245 case RIL_UNSOL_SIGNAL_STRENGTH:
246 {
247 urc_p->readInt32(&network_urc_solSigStren.rssi);
248 if((network_urc_solSigStren.rssi!=99)&&(network_urc_solSigStren.rssi!=0))
249 {
250 network_urc_solSigStren.gw_sig_valid = 1;
251 }else{
252 network_urc_solSigStren.gw_sig_valid = 0;
253 }
254 if(network_urc_solSigStren.gw_sig_valid == 1)
255 {
256 LYINFLOG("urc_GSM_signalstrength:%d",network_urc_solSigStren.rssi);
257 }
258 urc_p->readInt32(&none);
259 urc_p->readInt32(&none);
260 urc_p->readInt32(&none);
261 urc_p->readInt32(&none);
262 urc_p->readInt32(&none);
263 urc_p->readInt32(&none);
264 urc_p->readInt32(&none);
265 urc_p->readInt32(&urc_LTE_signalstrength);
266 // p.readInt32(&solSigStren->signalStrength.LTE_SignalStrength.signalStrength);
267 urc_p->readInt32(&network_urc_solSigStren.rsrp);
268 urc_p->readInt32(&network_urc_solSigStren.rsrq);
269 urc_p->readInt32(&network_urc_solSigStren.rssnr);
270 if((urc_LTE_signalstrength!=99)&&(urc_LTE_signalstrength!=0))
271 {
272 network_urc_solSigStren.lte_sig_valid = 1;
273 }else{
274 network_urc_solSigStren.lte_sig_valid = 0;
275 }
276 if(network_urc_solSigStren.lte_sig_valid == 1)
277 {
278 LYINFLOG("urc_LTE_signalstrength:%d",urc_LTE_signalstrength);
279 }
280 urc_p->readInt32(&none);
281 urc_p->readInt32(&none);
282 urc_p->readInt32(&none);
283 urc_p->readInt32(&none);
284 urc_p->readInt32(&none);
285 urc_p->readInt32(&urc_WCDMA_signalstrength);
286 urc_p->readInt32(&none);
287 urc_p->readInt32(&network_urc_solSigStren.rscp);
288 urc_p->readInt32(&network_urc_solSigStren.ecno);
289 if((urc_WCDMA_signalstrength!=99)&&(urc_WCDMA_signalstrength!=0))
290 {
291 network_urc_solSigStren.wcdma_sig_valid = 1;
292 }else{
293 network_urc_solSigStren.wcdma_sig_valid = 0;
294 }
295 if(network_urc_solSigStren.wcdma_sig_valid == 1)
296 {
297 LYINFLOG("urc_WCDMA_signalstrength:%d",urc_WCDMA_signalstrength);
298 }
299 urc_p->readInt32(&network_urc_solSigStren.ssRsrp);
300 urc_p->readInt32(&network_urc_solSigStren.ssRsrq);
301 urc_p->readInt32(&network_urc_solSigStren.ssSinr);
302 urc_p->readInt32(&network_urc_solSigStren.csiRsrp);
303 urc_p->readInt32(&network_urc_solSigStren.csiRsrq);
304 urc_p->readInt32(&network_urc_solSigStren.csiSinr);
305 NR_sum = (network_urc_solSigStren.ssRsrp) + (network_urc_solSigStren.ssRsrq) + (network_urc_solSigStren.ssSinr) + (network_urc_solSigStren.csiRsrp)+\
306 (network_urc_solSigStren.csiRsrq) + (network_urc_solSigStren.csiSinr);
307 if(NR_sum != 0)
308 {
309 network_urc_solSigStren.nr_sig_valid = 1;
310 }else{
311 network_urc_solSigStren.nr_sig_valid = 0;
312 }
313 if(network_urc_solSigStren.nr_sig_valid == 1)
314 {
315 LYINFLOG("[NR signal]ssRsrp is %d , ssRsrq is %d , ssSinr is %d , csiRsrp is %d , csiRsrq is %d , csiSinr is %d",\
316 network_urc_solSigStren.ssRsrp,network_urc_solSigStren.ssRsrq,network_urc_solSigStren.ssSinr, \
317 network_urc_solSigStren.csiRsrp,network_urc_solSigStren.csiRsrq,network_urc_solSigStren.csiSinr);
318 }
319 network_wait_urc_id = urc_id;
320 send_signal_changes();
321 break;
322 }
323 }
324 }
325 delete urc_p;
326 urc_p = NULL;
327 }
328 return NULL;
329}
330
331int lynq_server_socket_start()
332{
333// struct timeval timeOut;
334 network_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
335 if(-1 == network_sock_fd)
336 {
337 LYERRLOG("socket open error");
338 return -1;
339 }
340# if 0
341 timeOut.tv_sec = 5;
342 timeOut.tv_usec = 0;
343 if (setsockopt(network_sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
344 {
345 LYERRLOG("time out setting failed\n");
346 return -1;
347 }
348#endif
349
350 LYINFLOG("network_sock_fd = %d",network_sock_fd);
rjw7e50cd32022-01-18 18:30:37 +0800351
q.huang47d4dfe2022-08-17 17:52:29 +0800352 init_network_timer_all();
353
q.huang52921662022-10-20 15:25:45 +0800354 ret = lynq_urc_socket_start();
355 if(ret != 0)
356 {
357 LYERRLOG("init socket urc fail!!!");
358 g_module_init_flag = MODULE_CLOSED;
359 return LYNQ_E_INNER_ERROR;
360 }
361
rjw7e50cd32022-01-18 18:30:37 +0800362 ret = lynq_server_socket_start();
363 if(ret !=0)
364 {
365 LYERRLOG("init socket client fail!!!");
q.huang52921662022-10-20 15:25:45 +0800366 lynq_close_urc_thread();
367 g_module_init_flag = MODULE_CLOSED;
368 return LYNQ_E_INNER_ERROR;
rjw7e50cd32022-01-18 18:30:37 +0800369 }
q.huang52921662022-10-20 15:25:45 +0800370 g_module_init_flag = MODULE_RUNNING;
q.huang7de1d662022-09-13 14:19:24 +0800371
q.huang52921662022-10-20 15:25:45 +0800372 return RESULT_OK;
373}
374
375int lynq_network_deinit(void){
376
377 if (g_module_init_flag != MODULE_RUNNING)
378 {
379 LYERRLOG("module state is %d",g_module_init_flag);
380 return LYNQ_E_CONFLICT;
381 }
382 g_module_init_flag = MODULE_SWITCHING;
383
384 lynq_close_urc_thread();
385 lynq_close_rc_thread();
386 deinit_network_timer_all();
387
388 g_module_init_flag = MODULE_CLOSED;
389 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800390}
391
392int strUpper(char * str)
393{
394 int i=0;
395 while(1)
396 {
397 if(str[i]=='\0')
398 {
399 break;
400 }
401 if(str[i]>='a'&&str[i]<='z')
402 {
403 str[i]=str[i]-32;
404 }
405 i++;
406 }
q.huang52921662022-10-20 15:25:45 +0800407 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800408}
409
q.huang7de1d662022-09-13 14:19:24 +0800410int copyCellInfoList(Parcel* &p,uint64_t *cellinfo,int *tac,int *earfcn)
rjw7e50cd32022-01-18 18:30:37 +0800411{
412 int32_t v=0;
413 int64_t v6=0;
414 if(NULL == cellinfo)
415 {
416 LYERRLOG("*cellinfo error");
q.huang52921662022-10-20 15:25:45 +0800417 return LYNQ_E_PARAMETER_ANONALY;
rjw7e50cd32022-01-18 18:30:37 +0800418 }
419
420 int nothing = 0;
rjw62a60152022-06-09 17:43:01 +0800421 int tmp_uint64 = 0;
q.huang7de1d662022-09-13 14:19:24 +0800422 p->readInt32(&v);
rjw7e50cd32022-01-18 18:30:37 +0800423 RIL_CellInfoType cellinfoType = RIL_CellInfoType(v);
q.huang7de1d662022-09-13 14:19:24 +0800424 p->readInt32(&nothing);
rjw7e50cd32022-01-18 18:30:37 +0800425 // cellinfo->cellinfo.cellInfoType = RIL_CellInfoType(v);
q.huang7de1d662022-09-13 14:19:24 +0800426 // p->readInt32(&cellinfo->cellinfo.registered);
427 p->readInt32(&v);
rjw7e50cd32022-01-18 18:30:37 +0800428 // cellinfo->cellinfo.timeStampType = RIL_TimeStampType(v);
q.huang7de1d662022-09-13 14:19:24 +0800429 p->readInt64(&v6);
rjw7e50cd32022-01-18 18:30:37 +0800430 // cellinfo->cellinfo.timeStamp = v6;
431 switch(cellinfoType) {
432 case RIL_CELL_INFO_TYPE_GSM: {
q.huang7de1d662022-09-13 14:19:24 +0800433 p->readInt32(&nothing);
434 p->readInt32(&nothing);
435 p->readInt32(&nothing);
436 p->readInt32(&tmp_uint64);
437 p->readInt32(&nothing);
438 p->readInt32(&nothing);
439 p->readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800440 *cellinfo = (uint64_t)tmp_uint64;
rjw61974852022-05-17 16:30:32 +0800441 tac = &nothing;
rjwa8011682022-05-31 17:31:28 +0800442 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800443 break;
444 }
445 case RIL_CELL_INFO_TYPE_WCDMA: {
q.huang7de1d662022-09-13 14:19:24 +0800446 p->readInt32(&nothing);
447 p->readInt32(&nothing);
448 p->readInt32(&nothing);
449 p->readInt32(&tmp_uint64);
450 p->readInt32(&nothing);
451 p->readInt32(&nothing);
452 p->readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800453 *cellinfo = (uint64_t)tmp_uint64;
rjw4200a082022-05-17 17:58:35 +0800454 tac = &nothing;
rjwa8011682022-05-31 17:31:28 +0800455 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800456 break;
457 }
458 case RIL_CELL_INFO_TYPE_CDMA: {
q.huang7de1d662022-09-13 14:19:24 +0800459 p->readInt32(&nothing);
460 p->readInt32(&nothing);
461 p->readInt32(&nothing);
462 p->readInt32(&nothing);
463 p->readInt32(&nothing);
464 p->readInt32(&nothing);
465 p->readInt32(&nothing);
466 p->readInt32(&nothing);
467 p->readInt32(&nothing);
468 p->readInt32(&nothing);
rjw7e50cd32022-01-18 18:30:37 +0800469 cellinfo = 0;
rjw61974852022-05-17 16:30:32 +0800470 tac = &nothing;
rjwa8011682022-05-31 17:31:28 +0800471 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800472 break;
473 }
474 case RIL_CELL_INFO_TYPE_LTE: {
q.huang7de1d662022-09-13 14:19:24 +0800475 p->readInt32(&nothing);
476 p->readInt32(&nothing);
477 p->readInt32(&tmp_uint64);
478 p->readInt32(&nothing);
479 p->readInt32(tac);
480 p->readInt32(earfcn);
481 p->readInt32(&nothing);
482 p->readInt32(&nothing);
483 p->readInt32(&nothing);
484 p->readInt32(&nothing);
485 p->readInt32(&nothing);
486 p->readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800487 *cellinfo = (uint64_t)tmp_uint64;
rjw7e50cd32022-01-18 18:30:37 +0800488 break;
489 }
490 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
q.huang7de1d662022-09-13 14:19:24 +0800491 p->readInt32(&nothing);
492 p->readInt32(&nothing);
493 p->readInt32(&nothing);
494 p->readInt32(&tmp_uint64);
495 p->readInt32(&nothing);
496 p->readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800497 *cellinfo = (uint64_t)tmp_uint64;
rjwa8011682022-05-31 17:31:28 +0800498 tac = &nothing;
499 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800500 break;
501 }
502 case RIL_CELL_INFO_TYPE_NR: {
q.huang7de1d662022-09-13 14:19:24 +0800503 p->readInt32(&nothing);
504 p->readInt32(&nothing);
505 p->readUint64(cellinfo);
506 p->readInt32(&nothing);
507 p->readInt32(tac);
508 p->readInt32(earfcn);
509 p->readInt32(&nothing);
510 p->readInt32(&nothing);
511 p->readInt32(&nothing);
512 p->readInt32(&nothing);
513 p->readInt32(&nothing);
514 p->readInt32(&nothing);
rjw7e50cd32022-01-18 18:30:37 +0800515 break;
516 }
517 }
rjw62a60152022-06-09 17:43:01 +0800518 LYINFLOG("CID in fUNC :%llu",*cellinfo);
rjwa8011682022-05-31 17:31:28 +0800519 LYINFLOG("tac in fUNC :%d",*tac);
520 LYINFLOG("earfcn in fUNC :%d",*earfcn);
q.huang52921662022-10-20 15:25:45 +0800521 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800522}
523
q.huang7de1d662022-09-13 14:19:24 +0800524static char * lynqStrdupReadString(Parcel* &p) {
rjw7e50cd32022-01-18 18:30:37 +0800525 size_t stringlen;
526 const char16_t *s16;
527
q.huang7de1d662022-09-13 14:19:24 +0800528 s16 = p->readString16Inplace(&stringlen);
rjw7e50cd32022-01-18 18:30:37 +0800529 return strndup16to8(s16, stringlen);
530}
531
532int lynq_query_operater(char *OperatorFN,char *OperatorSH,char *MccMnc)
533{
q.huang52921662022-10-20 15:25:45 +0800534 if(g_module_init_flag != MODULE_RUNNING)
535 {
536 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
537 return LYNQ_E_CONFLICT;
538 }
539
rjw7e50cd32022-01-18 18:30:37 +0800540 if(NULL == OperatorFN||NULL == OperatorSH|| NULL == MccMnc)
rjw7e50cd32022-01-18 18:30:37 +0800541 {
q.huang7de1d662022-09-13 14:19:24 +0800542 LYERRLOG("%s some parameter OperatorFN OperatorSH MccMnc %s %s %s is NULL",__func__,OperatorFN,OperatorSH,MccMnc);
q.huang52921662022-10-20 15:25:45 +0800543 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800544 }
q.huang52921662022-10-20 15:25:45 +0800545
q.huang7de1d662022-09-13 14:19:24 +0800546 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +0800547 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OPERATOR,0,"");
548
549 if(ret!=RESULT_OK)
rjw46769c92022-07-04 21:17:25 +0800550 {
q.huang52921662022-10-20 15:25:45 +0800551 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
552 return ret;
553 }
554
555 int num ;
556 char *resp[LYNQ_RESP_STRING_MAX_NUM];
q.huang7de1d662022-09-13 14:19:24 +0800557
q.huang52921662022-10-20 15:25:45 +0800558 p->readInt32(&num);
559 if(num == 0 || num > LYNQ_RESP_STRING_MAX_NUM)
560 {
561 LYERRLOG("no paramters or num %d too great",num);
562 delete p;
563 return LYNQ_E_INNER_ERROR;
564 }else{
565 int i;
566 for(i = 0; i<num;i++)
rjw7e50cd32022-01-18 18:30:37 +0800567 {
q.huang52921662022-10-20 15:25:45 +0800568 resp[i] = lynqStrdupReadString(p);
rjw7e50cd32022-01-18 18:30:37 +0800569 }
q.huang52921662022-10-20 15:25:45 +0800570 if(NULL != resp[0])
571 {
572 strcpy(OperatorFN,resp[0]);
573 }
574 if(NULL != resp[1])
575 {
576 strcpy(OperatorSH,resp[1]);
577 }
578 if(NULL != resp[2])
579 {
580 strcpy(MccMnc,resp[2]);
581 }
582 for(i = 0; i<num;i++)
583 {
584 if(resp[i]!=NULL)
585 {
586 free(resp[i]);
587 }
588 }
rjw7e50cd32022-01-18 18:30:37 +0800589 }
q.huang7de1d662022-09-13 14:19:24 +0800590
q.huang52921662022-10-20 15:25:45 +0800591 LYINFLOG("%s suc",__func__);
592 delete p;
593 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800594}
595
596int lynq_query_network_selection_mode(int *netselMode)
597{
q.huang52921662022-10-20 15:25:45 +0800598 if(g_module_init_flag != MODULE_RUNNING)
599 {
600 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
601 return LYNQ_E_CONFLICT;
602 }
603
rjw7e50cd32022-01-18 18:30:37 +0800604 if(NULL == netselMode)
rjw7e50cd32022-01-18 18:30:37 +0800605 {
q.huang7de1d662022-09-13 14:19:24 +0800606 LYERRLOG("%s parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800607 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800608 }
q.huang52921662022-10-20 15:25:45 +0800609
610 Parcel* p=NULL;
611 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE,0,"");
612
613 if(ret!=RESULT_OK)
rjw46769c92022-07-04 21:17:25 +0800614 {
q.huang52921662022-10-20 15:25:45 +0800615 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
616 return ret;
617 }
618
619 int readnum;
620 p->readInt32(&readnum);
621 p->readInt32(netselMode);
q.huang7de1d662022-09-13 14:19:24 +0800622
q.huang52921662022-10-20 15:25:45 +0800623 LYINFLOG("%s suc",__func__);
624 delete p;
625 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800626}
627
628int lynq_set_network_selection_mode(const char *mode,const char* mccmnc)
629{
q.huang52921662022-10-20 15:25:45 +0800630 if(g_module_init_flag != MODULE_RUNNING)
631 {
632 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
633 return LYNQ_E_CONFLICT;
634 }
635
q.huang7de1d662022-09-13 14:19:24 +0800636 if(NULL == mode || (strlen(mode) == 0))
rjw78d04502022-02-24 13:37:11 +0800637 {
q.huang7de1d662022-09-13 14:19:24 +0800638 LYERRLOG("%s parameter mod %s is error",__func__,mode);
q.huang52921662022-10-20 15:25:45 +0800639 return LYNQ_E_PARAMETER_ANONALY;
rjw78d04502022-02-24 13:37:11 +0800640 }
q.huang7de1d662022-09-13 14:19:24 +0800641
642 if(!strcmp(mode,"Manual"))
643 {
644 if(mccmnc == NULL || strlen(mccmnc) == 0)
645 {
646 LYERRLOG("%s parameter mccmnc %s is error",__func__,mccmnc);
q.huang52921662022-10-20 15:25:45 +0800647 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800648 }
649 }
650
q.huang7de1d662022-09-13 14:19:24 +0800651 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +0800652 int ret;
q.huang7de1d662022-09-13 14:19:24 +0800653
rjw7e50cd32022-01-18 18:30:37 +0800654 if(!strcmp(mode,"Auto"))
655 {
q.huang52921662022-10-20 15:25:45 +0800656 ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC,0,"");
q.huang7de1d662022-09-13 14:19:24 +0800657 }
658 else if(!strcmp(mode,"Manual"))
659 {
q.huang52921662022-10-20 15:25:45 +0800660 ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL,1,"%s",mccmnc);
q.huang7de1d662022-09-13 14:19:24 +0800661 }
662 else
663 {
q.huang52921662022-10-20 15:25:45 +0800664 LYERRLOG("%s parameter mode %s is errir",__func__,mode);
665 return LYNQ_E_PARAMETER_ANONALY;
rjw7e50cd32022-01-18 18:30:37 +0800666 }
667
q.huang52921662022-10-20 15:25:45 +0800668 if(ret!=RESULT_OK)
669 {
670 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
671 return ret;
672 }
673
674 LYINFLOG("%s set mode %s mccmnc %s suc",__func__,mode,mccmnc);
675 delete p;
676 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800677}
678
679int lynq_query_available_network(char *OperatorFN,char *OperatorSH,char *MccMnc,char * NetStatus)
680{
q.huang52921662022-10-20 15:25:45 +0800681 if(g_module_init_flag != MODULE_RUNNING)
682 {
683 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
684 return LYNQ_E_CONFLICT;
685 }
rjw7e50cd32022-01-18 18:30:37 +0800686 if(NULL == OperatorFN||NULL == OperatorSH||NULL == MccMnc||NULL == NetStatus)
rjw7e50cd32022-01-18 18:30:37 +0800687 {
q.huang7de1d662022-09-13 14:19:24 +0800688 LYERRLOG("%s there is parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800689 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800690 }
q.huang52921662022-10-20 15:25:45 +0800691
q.huang7de1d662022-09-13 14:19:24 +0800692 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +0800693 int ret=lynq_send_common_request(p,600,RIL_REQUEST_QUERY_AVAILABLE_NETWORKS,0,"");
rjw7e50cd32022-01-18 18:30:37 +0800694
q.huang52921662022-10-20 15:25:45 +0800695 if(ret!=RESULT_OK)
rjw46769c92022-07-04 21:17:25 +0800696 {
q.huang52921662022-10-20 15:25:45 +0800697 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
698 return ret;
699 }
q.huang7de1d662022-09-13 14:19:24 +0800700
q.huang52921662022-10-20 15:25:45 +0800701 int num =p->readInt32();
702 char *resp[LYNQ_RESP_STRING_MAX_NUM];
703 if(num == 0 || num > LYNQ_RESP_STRING_MAX_NUM)
704 {
705 LYERRLOG("no paramters or num %d too great",num);
706 delete p;
707 return LYNQ_E_INNER_ERROR;
708 }else{
709 int i;
710 for(i = 0; i<num;i++)
711 {
712 resp[i] = lynqStrdupReadString(p);
713 }
714 if(NULL != resp[0])
715 {
716 strcpy(OperatorFN,resp[0]);
717 }
718 if(NULL != resp[1])
719 {
720 strcpy(OperatorSH,resp[1]);
721 }
722 if(NULL != resp[2])
723 {
724 strcpy(MccMnc,resp[2]);
725 }
726 if(NULL != resp[3])
727 {
rjw776c85f2022-10-21 15:09:21 +0800728 strcpy(NetStatus,resp[3]);
q.huang52921662022-10-20 15:25:45 +0800729 }
730 for(i = 0; i<num;i++)
731 {
732 if(resp[i]!=NULL)
733 {
734 free(resp[i]);
735 }
736 }
737 }
738 delete p;
739 LYINFLOG("%s suc",__func__);
740 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800741}
742
rjw4544e132022-04-01 15:00:26 +0800743int 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 +0800744{
q.huang52921662022-10-20 15:25:45 +0800745 if(g_module_init_flag != MODULE_RUNNING)
746 {
747 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
748 return LYNQ_E_CONFLICT;
749 }
750
rjwd98d5872022-04-09 13:50:58 +0800751 if(NULL == type || NULL ==regState ||NULL ==imsRegState ||NULL ==LAC ||NULL ==CID ||NULL ==netType ||NULL ==radioTechFam || NULL == netRejected)
q.huang7de1d662022-09-13 14:19:24 +0800752 {
753 LYERRLOG("%s there is parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800754 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800755 }
rjw7e50cd32022-01-18 18:30:37 +0800756 if(strlen(type)>LYNQ_TYPE_BUF)
757 {
758 LYERRLOG("[%s]the parameter is inavaliable !",__FUNCTION__);
q.huang52921662022-10-20 15:25:45 +0800759 return LYNQ_E_PARAMETER_ANONALY;
760 }
q.huang7de1d662022-09-13 14:19:24 +0800761
762 int request;
763 char str[LYNQ_TYPE_BUF];
rjw7e50cd32022-01-18 18:30:37 +0800764 memcpy(str,type,strlen(type)+1);
765 strUpper(str);
766 if(!strcmp(str,"VOICE"))
767 {
q.huangd3804bd2022-10-20 14:36:14 +0800768 if(get_state_from_buf(NETWORK_STATE_BUFFER_TYPE_VOICE_REG,3,regState,netType,netRejected,0)==0)
q.huang47d4dfe2022-08-17 17:52:29 +0800769 {
q.huangd3804bd2022-10-20 14:36:14 +0800770 return RESULT_OK;
q.huang47d4dfe2022-08-17 17:52:29 +0800771 }
q.huang7de1d662022-09-13 14:19:24 +0800772 request = RIL_REQUEST_VOICE_REGISTRATION_STATE;
rjw7e50cd32022-01-18 18:30:37 +0800773 }else if(!strcmp(str,"DATA")){
q.huangd3804bd2022-10-20 14:36:14 +0800774 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 +0800775 {
q.huangd3804bd2022-10-20 14:36:14 +0800776 return RESULT_OK;
q.huang47d4dfe2022-08-17 17:52:29 +0800777 }
q.huang7de1d662022-09-13 14:19:24 +0800778 request = RIL_REQUEST_DATA_REGISTRATION_STATE;
rjw7e50cd32022-01-18 18:30:37 +0800779 }else if(!strcmp(str,"IMS")){
q.huangd3804bd2022-10-20 14:36:14 +0800780 if(get_state_from_buf(NETWORK_STATE_BUFFER_TYPE_IMS_REG,2,imsRegState,radioTechFam,0)==0)
q.huang47d4dfe2022-08-17 17:52:29 +0800781 {
q.huangd3804bd2022-10-20 14:36:14 +0800782 return RESULT_OK;
q.huang47d4dfe2022-08-17 17:52:29 +0800783 }
q.huang7de1d662022-09-13 14:19:24 +0800784 request = RIL_REQUEST_IMS_REGISTRATION_STATE;
rjw7e50cd32022-01-18 18:30:37 +0800785 }else{
786 LYERRLOG("request error");
q.huang52921662022-10-20 15:25:45 +0800787 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800788 }
rjw7e50cd32022-01-18 18:30:37 +0800789
q.huang52921662022-10-20 15:25:45 +0800790 Parcel* p=NULL;
791 int ret=lynq_send_common_request(p,g_wait_time,request,0,"");
792
793 if(ret!=RESULT_OK)
rjw7e50cd32022-01-18 18:30:37 +0800794 {
q.huang52921662022-10-20 15:25:45 +0800795 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
796 return ret;
797 }
798
799 int num,i;
800 char *resp[LYNQ_RESP_STRING_MAX_NUM];
801 if(!strcmp(str,"VOICE"))
802 {
803 p->readInt32(&num);
804 if(num == 15)
rjw7e50cd32022-01-18 18:30:37 +0800805 {
q.huang8240f682022-10-20 14:36:14 +0800806 p->readInt32(&num);
807 if(num == 15)
808 {
809 *regState = atoi(lynqStrdupReadString(p));
810 lynqStrdupReadString(p);
811 lynqStrdupReadString(p);
812 *netType = atoi(lynqStrdupReadString(p));
813 lynqStrdupReadString(p);
814 lynqStrdupReadString(p);
815 lynqStrdupReadString(p);
816 lynqStrdupReadString(p);
817 lynqStrdupReadString(p);
818 lynqStrdupReadString(p);
819 lynqStrdupReadString(p);
820 lynqStrdupReadString(p);
821 lynqStrdupReadString(p);
822 lynqStrdupReadString(p);
823 *netRejected = atoi(lynqStrdupReadString(p));
824 set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_VOICE_REG,3,*regState,*netType,*netRejected,0);
825 }
826 else
q.huang52921662022-10-20 15:25:45 +0800827 {
828 resp[i]=lynqStrdupReadString(p);
829 }
q.huang8240f682022-10-20 14:36:14 +0800830 }
831 else if(!strcmp(str,"DATA")){
832 p->readInt32(&num);
833 if(num == 11)
834 {
835 char *resp[LYNQ_RESP_BUF];
836 *regState = atoi(lynqStrdupReadString(p));
837 resp[0] = lynqStrdupReadString(p);
838 strcpy(LAC,resp[0]);
839
840 resp[1] = lynqStrdupReadString(p);
841 strcpy(CID,resp[1]);
842 *netType = atoi(lynqStrdupReadString(p));
843 set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_DATA_REG,2,*regState,*netType,2,LAC,CID);
844 }
845 else
q.huang52921662022-10-20 15:25:45 +0800846 {
847 if(resp[i]!=NULL)
848 {
849 free(resp[i]);
850 }
851 }
852 set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_VOICE_REG,3,*regState,*netType,*netRejected,0);
rjw7e50cd32022-01-18 18:30:37 +0800853 }
q.huang52921662022-10-20 15:25:45 +0800854 else
q.huang7de1d662022-09-13 14:19:24 +0800855 {
q.huang52921662022-10-20 15:25:45 +0800856 LYERRLOG("%s type %s num %d error",__func__,str,num);
q.huang7de1d662022-09-13 14:19:24 +0800857 delete p;
q.huang52921662022-10-20 15:25:45 +0800858 return LYNQ_E_INNER_ERROR;
859 }
rjw7e50cd32022-01-18 18:30:37 +0800860 }
q.huang52921662022-10-20 15:25:45 +0800861 else if(!strcmp(str,"DATA")){
862 p->readInt32(&num);
863 if(num == 11)
864 {
865 for(i=0;i<4;i++)
866 {
q.huang8240f682022-10-20 14:36:14 +0800867 p->readInt32(imsRegState);
868 p->readInt32(radioTechFam);
869 set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_IMS_REG,2,*imsRegState,*radioTechFam,0);
870 }
871 else
q.huang52921662022-10-20 15:25:45 +0800872 {
873 if(resp[i]!=NULL)
874 {
875 free(resp[i]);
876 }
877 }
878 set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_DATA_REG,2,*regState,*netType,2,LAC,CID);
879 }
880 else
881 {
882 LYERRLOG("%s type %s num %d error",__func__,str,num);
883 delete p;
884 return LYNQ_E_INNER_ERROR;
885 }
q.huang7de1d662022-09-13 14:19:24 +0800886
q.huang52921662022-10-20 15:25:45 +0800887 }
888 else // "IMS"
889 {
890 p->readInt32(&num);
891 if(num == 2)
892 {
893 p->readInt32(imsRegState);
894 p->readInt32(radioTechFam);
895 set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_IMS_REG,2,*imsRegState,*radioTechFam,0);
896 }
897 else
898 {
899 LYERRLOG("%s type %s num %d error",__func__,str,num);
900 delete p;
901 return LYNQ_E_INNER_ERROR;
902 }
903 }
904 LYINFLOG("%s suc",__func__);
905 delete p;
906 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800907}
908
909int lynq_query_prefferred_networktype(int *preNetType)
q.huang7de1d662022-09-13 14:19:24 +0800910{
q.huang52921662022-10-20 15:25:45 +0800911 if(g_module_init_flag != MODULE_RUNNING)
912 {
913 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
914 return LYNQ_E_CONFLICT;
915 }
q.huang7de1d662022-09-13 14:19:24 +0800916 if(NULL == preNetType)
rjw7e50cd32022-01-18 18:30:37 +0800917 {
q.huang7de1d662022-09-13 14:19:24 +0800918 LYERRLOG("%s there is parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800919 return LYNQ_E_PARAMETER_ANONALY;
920 }
rjw7e50cd32022-01-18 18:30:37 +0800921
q.huang52921662022-10-20 15:25:45 +0800922 Parcel* p=NULL;
923 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE,0,"");
924
925 if(ret!=RESULT_OK)
926 {
927 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
928 return ret;
929 }
930
931 int num;
932 p->readInt32(&num);
933 p->readInt32(preNetType);
934
935 LYINFLOG("%s suc",__func__);
936 delete p;
937 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800938}
939
940int lynq_set_prefferred_networktype(const int preffertype)
941{
q.huang52921662022-10-20 15:25:45 +0800942 if(g_module_init_flag != MODULE_RUNNING)
943 {
944 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
945 return LYNQ_E_CONFLICT;
946 }
rjw7e50cd32022-01-18 18:30:37 +0800947 if(preffertype < 0||preffertype >33)
rjw7e50cd32022-01-18 18:30:37 +0800948 {
q.huang7de1d662022-09-13 14:19:24 +0800949 LYERRLOG("%s parameter %d error",__func__,preffertype);
q.huang52921662022-10-20 15:25:45 +0800950 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800951 }
q.huang52921662022-10-20 15:25:45 +0800952
q.huang7de1d662022-09-13 14:19:24 +0800953 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +0800954 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE,1,"%d",preffertype);
955
956 if(ret!=RESULT_OK)
rjw7e50cd32022-01-18 18:30:37 +0800957 {
q.huang52921662022-10-20 15:25:45 +0800958 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
959 return ret;
960 }
961
962 LYINFLOG("%s set %d suc",__func__,preffertype);
963 delete p;
964 return RESULT_OK;
965
rjw7e50cd32022-01-18 18:30:37 +0800966}
967
rjw62a60152022-06-09 17:43:01 +0800968int 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 +0800969{
q.huang52921662022-10-20 15:25:45 +0800970 if(g_module_init_flag != MODULE_RUNNING)
971 {
972 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
973 return LYNQ_E_CONFLICT;
974 }
rjw7e50cd32022-01-18 18:30:37 +0800975 if(NULL == realNum)
rjw7e50cd32022-01-18 18:30:37 +0800976 {
q.huang7de1d662022-09-13 14:19:24 +0800977 LYERRLOG("%s there is parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800978 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800979 }
980
q.huang52921662022-10-20 15:25:45 +0800981 Parcel* p=NULL;
982 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_GET_CELL_INFO_LIST,0,"");
983
984 if(ret!=RESULT_OK)
rjw46769c92022-07-04 21:17:25 +0800985 {
q.huang52921662022-10-20 15:25:45 +0800986 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
987 return ret;
988 }
989
990 int num;
q.huang7de1d662022-09-13 14:19:24 +0800991
q.huang52921662022-10-20 15:25:45 +0800992 p->readInt32(&num);
993 LYINFLOG("cell info num:%d",num);
994 *realNum = num;
995 for(int i = 0;i<num;i++)
996 {
997 copyCellInfoList(p,&cellinfo[i],&tac[i],&earfcn[i]);
rjw7e50cd32022-01-18 18:30:37 +0800998 }
q.huang52921662022-10-20 15:25:45 +0800999
1000 LYINFLOG("%s suc",__func__);
1001 delete p;
1002 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +08001003}
1004
1005int lynq_set_unsol_cell_info_listrate(const int rate)
1006{
q.huang52921662022-10-20 15:25:45 +08001007 if(g_module_init_flag != MODULE_RUNNING)
rjw7e50cd32022-01-18 18:30:37 +08001008 {
q.huang52921662022-10-20 15:25:45 +08001009 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1010 return LYNQ_E_CONFLICT;
rjw7e50cd32022-01-18 18:30:37 +08001011 }
q.huang52921662022-10-20 15:25:45 +08001012 Parcel* p=NULL;
1013 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 +08001014
q.huang52921662022-10-20 15:25:45 +08001015 if(ret!=RESULT_OK)
1016 {
1017 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
1018 return ret;
1019 }
1020
1021 LYINFLOG("%s set %d suc",__func__,rate);
1022 delete p;
1023 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +08001024}
1025
1026int lynq_set_band_mode(const int bandmode)
1027{
q.huang52921662022-10-20 15:25:45 +08001028 if(g_module_init_flag != MODULE_RUNNING)
rjw7e50cd32022-01-18 18:30:37 +08001029 {
q.huang52921662022-10-20 15:25:45 +08001030 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1031 return LYNQ_E_CONFLICT;
rjw7e50cd32022-01-18 18:30:37 +08001032 }
q.huang52921662022-10-20 15:25:45 +08001033 Parcel* p=NULL;
1034 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SET_BAND_MODE,1,"%d",bandmode);
rjw7e50cd32022-01-18 18:30:37 +08001035
q.huang52921662022-10-20 15:25:45 +08001036 if(ret!=RESULT_OK)
1037 {
1038 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
1039 return ret;
1040 }
1041
1042 LYINFLOG("%s set %d suc",__func__,bandmode);
1043 delete p;
1044 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +08001045}
1046
1047int lynq_query_available_bandmode(int availBanMode[])
1048{
q.huang52921662022-10-20 15:25:45 +08001049 if(g_module_init_flag != MODULE_RUNNING)
1050 {
1051 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1052 return LYNQ_E_CONFLICT;
1053 }
rjw7e50cd32022-01-18 18:30:37 +08001054 if(NULL == availBanMode)
rjw7e50cd32022-01-18 18:30:37 +08001055 {
q.huang7de1d662022-09-13 14:19:24 +08001056 LYERRLOG("%s parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +08001057 return LYNQ_E_PARAMETER_ANONALY;
rjw7e50cd32022-01-18 18:30:37 +08001058 }
1059
q.huang7de1d662022-09-13 14:19:24 +08001060 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +08001061 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE,0,"");
1062 if(ret!=RESULT_OK)
rjw7e50cd32022-01-18 18:30:37 +08001063 {
q.huang52921662022-10-20 15:25:45 +08001064 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
1065 return ret;
1066 }
q.huang7de1d662022-09-13 14:19:24 +08001067
q.huang52921662022-10-20 15:25:45 +08001068 int num = 0;
1069 int res = 0;
1070 int i;
1071
1072 p->readInt32(&num);
1073 LYINFLOG("num = %d",num);
1074 availBanMode[0] = num;
1075 for(i=1 ;i<=num;i++)
1076 {
1077 p->readInt32(&res);
1078 availBanMode[i]=res;
1079 }
1080
1081 LYINFLOG("%s suc",__func__);
1082 delete p;
1083 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +08001084}
1085
1086int lynq_radio_on(const int data)
q.huang52921662022-10-20 15:25:45 +08001087{
1088 if(g_module_init_flag != MODULE_RUNNING)
1089 {
1090 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1091 return LYNQ_E_CONFLICT;
1092 }
q.huang7de1d662022-09-13 14:19:24 +08001093 if (data < 0 || data > 1)
rjw7e50cd32022-01-18 18:30:37 +08001094 {
q.huang7de1d662022-09-13 14:19:24 +08001095 LYERRLOG("%s parameter %d error",__func__,data);
q.huang52921662022-10-20 15:25:45 +08001096 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +08001097 }
1098
q.huang52921662022-10-20 15:25:45 +08001099 Parcel* p=NULL;
1100 int ret=lynq_send_common_request(p,65,RIL_REQUEST_RADIO_POWER,1,"%d",data);
rjw7e50cd32022-01-18 18:30:37 +08001101
q.huang52921662022-10-20 15:25:45 +08001102 if(ret!=RESULT_OK)
1103 {
1104 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
1105 return ret;
1106 }
1107
1108 LYINFLOG("%s set %d suc",__func__,data);
1109 delete p;
1110 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +08001111}
1112
q.huang7de1d662022-09-13 14:19:24 +08001113const char * lynq_get_raw_data(Parcel* &p, int* data_len)
q.huang16dcb0f2022-09-07 09:17:37 +08001114{
rjw776c85f2022-10-21 15:09:21 +08001115 int32_t len;
q.huang16dcb0f2022-09-07 09:17:37 +08001116 int status;
1117 char *data;
1118
1119 *data_len=0;
rjw776c85f2022-10-21 15:09:21 +08001120
q.huang7de1d662022-09-13 14:19:24 +08001121 status = p->readInt32(&len);
rjw776c85f2022-10-21 15:09:21 +08001122
q.huang16dcb0f2022-09-07 09:17:37 +08001123 if (status != 0) {
1124 LYERRLOG("%s status is %d",__func__,status);
1125 return NULL;
rjw776c85f2022-10-21 15:09:21 +08001126 }
1127
1128 // The java code writes -1 for null arrays
q.huang16dcb0f2022-09-07 09:17:37 +08001129 if (((int)len) == -1 || ((int)len) == 0)
1130 {
1131 LYERRLOG("%s len is %d",__func__,len);
1132 return NULL;
1133 }
1134 LYINFLOG("%s len is %d",__func__,len);
rjw776c85f2022-10-21 15:09:21 +08001135
q.huang7de1d662022-09-13 14:19:24 +08001136 data = (char*) p->readInplace(len);
q.huang16dcb0f2022-09-07 09:17:37 +08001137 *data_len=len;
rjw776c85f2022-10-21 15:09:21 +08001138
q.huang16dcb0f2022-09-07 09:17:37 +08001139 return data;
1140}
1141
1142int lynq_query_radio_state(int *radio_state)
1143{
q.huang52921662022-10-20 15:25:45 +08001144 if(g_module_init_flag != MODULE_RUNNING)
1145 {
1146 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1147 return LYNQ_E_CONFLICT;
1148 }
q.huang16dcb0f2022-09-07 09:17:37 +08001149 if(NULL == radio_state)
1150 {
1151 LYERRLOG("%s radio state is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +08001152 return LYNQ_E_PARAMETER_ANONALY;
q.huang16dcb0f2022-09-07 09:17:37 +08001153 }
1154
q.huang7de1d662022-09-13 14:19:24 +08001155 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +08001156 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"%s","AT+CFUN");
1157 if(ret!=RESULT_OK)
q.huang16dcb0f2022-09-07 09:17:37 +08001158 {
q.huang52921662022-10-20 15:25:45 +08001159 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
1160 return ret;
1161 }
q.huang7de1d662022-09-13 14:19:24 +08001162
q.huang52921662022-10-20 15:25:45 +08001163 int bfind=false;
1164 const char* data;
1165 int data_len;
1166 char* data_str;
1167 char* start;
1168 int length;
1169 int i;
1170 int num_start;
1171 data = lynq_get_raw_data(p,&data_len);
1172 if(data==NULL || data_len == 0)
1173 {
1174 LYERRLOG("%s lynq_get_raw_data NULL or data_len is 0",__func__);
q.huang7de1d662022-09-13 14:19:24 +08001175 delete p;
q.huang52921662022-10-20 15:25:45 +08001176 return LYNQ_E_INNER_ERROR;
q.huang16dcb0f2022-09-07 09:17:37 +08001177 }
q.huang52921662022-10-20 15:25:45 +08001178 data_str = (char*) calloc(1,data_len+1);
1179 if (NULL == data_str)
1180 {
1181 LYERRLOG("%s alloc mem error, data_len is %d",__func__,data_len+1);
1182 delete p;
1183 return LYNQ_E_MALLOC_ERROR;
1184 }
1185 memmove(data_str, data, data_len);
1186 data_str[data_len]='\0';
1187 LYINFLOG("%s return string is %s",__func__,data_str);
1188 start = strstr(data_str,"CFUN");
1189 if(start!=NULL)
1190 {
1191 start=start+4;
1192 length=strlen(start);
1193 for(i=0; i<length;i++)
1194 {
1195 if((!bfind) && (start[i] >= '0') && (start[i] <= '9'))
1196 {
1197 bfind=true;
1198 num_start=i;
1199 }
1200 else if(bfind && ((start[i] < '0') || (start[i] > '9')))
1201 {
1202 start[i]='\0';
1203 break;
1204 }
1205 }
1206 if(bfind)
1207 {
1208 (*radio_state) = atoi(start+num_start);
1209 LYINFLOG("%s, radio state is %s %d",__func__,start+num_start,*radio_state);
1210 free(data_str);
1211 delete p;
1212 return RESULT_OK;
1213 }
1214 }
1215 LYERRLOG("%s return string %s no cfun or no digit",__func__,data_str);
1216 free(data_str);
1217 delete p;
1218 return LYNQ_E_INNER_ERROR;
q.huang16dcb0f2022-09-07 09:17:37 +08001219}
1220
rjw7e50cd32022-01-18 18:30:37 +08001221int lynq_query_radio_tech(int* radioTech)
1222{
q.huang52921662022-10-20 15:25:45 +08001223 if(g_module_init_flag != MODULE_RUNNING)
1224 {
1225 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1226 return LYNQ_E_CONFLICT;
1227 }
rjw7e50cd32022-01-18 18:30:37 +08001228 if(NULL == radioTech)
rjw7e50cd32022-01-18 18:30:37 +08001229 {
q.huang7de1d662022-09-13 14:19:24 +08001230 LYERRLOG("%s radio tech is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +08001231 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +08001232 }
rjw7e50cd32022-01-18 18:30:37 +08001233
q.huang7de1d662022-09-13 14:19:24 +08001234 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +08001235 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_VOICE_RADIO_TECH,0,"");
1236
1237 if(ret!=RESULT_OK)
rjw46769c92022-07-04 21:17:25 +08001238 {
q.huang52921662022-10-20 15:25:45 +08001239 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
1240 return ret;
1241 }
q.huang7de1d662022-09-13 14:19:24 +08001242
q.huang52921662022-10-20 15:25:45 +08001243 int num;
1244 p->readInt32(&num);
1245 p->readInt32(radioTech);
q.huang7de1d662022-09-13 14:19:24 +08001246
q.huang52921662022-10-20 15:25:45 +08001247 LYINFLOG("%s suc",__func__);
1248 delete p;
1249 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +08001250}
1251
1252int lynq_solicited_signal_strength(signalStrength_t *solSigStren)
1253{
q.huang52921662022-10-20 15:25:45 +08001254 if(g_module_init_flag != MODULE_RUNNING)
1255 {
1256 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1257 return LYNQ_E_CONFLICT;
1258 }
rjw7e50cd32022-01-18 18:30:37 +08001259 if(NULL == solSigStren)
rjw7e50cd32022-01-18 18:30:37 +08001260 {
q.huang7de1d662022-09-13 14:19:24 +08001261 LYERRLOG("%s parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +08001262 return LYNQ_E_PARAMETER_ANONALY;
rjw7e50cd32022-01-18 18:30:37 +08001263 }
1264
q.huang7de1d662022-09-13 14:19:24 +08001265 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +08001266 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SIGNAL_STRENGTH,0,"");
1267 if(ret!=RESULT_OK)
rjw46769c92022-07-04 21:17:25 +08001268 {
q.huang52921662022-10-20 15:25:45 +08001269 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
1270 return ret;
1271 }
1272
1273 int sum = 0;
1274 int LTE_signalstrength = 0;
1275 int WCDMA_signalstrength = 0;
1276 int none = 0;
rjw7e50cd32022-01-18 18:30:37 +08001277
q.huang52921662022-10-20 15:25:45 +08001278 p->readInt32(&solSigStren->rssi);
1279 if((solSigStren->rssi!=99)&&(solSigStren->rssi!=0))
1280 {
1281 solSigStren->gw_sig_valid = 1;
1282 }else{
1283 solSigStren->gw_sig_valid = 0;
rjw7e50cd32022-01-18 18:30:37 +08001284 }
q.huang7de1d662022-09-13 14:19:24 +08001285
q.huang52921662022-10-20 15:25:45 +08001286 p->readInt32(&none);
1287 p->readInt32(&none);
1288 p->readInt32(&none);
1289 p->readInt32(&none);
1290 p->readInt32(&none);
1291 p->readInt32(&none);
1292 p->readInt32(&none);
1293 p->readInt32(&LTE_signalstrength);
1294 // p->readInt32(&solSigStren->signalStrength.LTE_SignalStrength.signalStrength);
1295 p->readInt32(&solSigStren->rsrp);
1296 p->readInt32(&solSigStren->rsrq);
1297 p->readInt32(&solSigStren->rssnr);
1298 LYINFLOG("LTE_signalstrength:%d",LTE_signalstrength);
1299 if((LTE_signalstrength!=99)&&(LTE_signalstrength!=0))
1300 {
1301 solSigStren->lte_sig_valid = 1;
1302 }else{
1303 solSigStren->lte_sig_valid = 0;
1304 }
q.huang7de1d662022-09-13 14:19:24 +08001305
q.huang52921662022-10-20 15:25:45 +08001306 p->readInt32(&none);
1307 p->readInt32(&none);
1308 p->readInt32(&none);
1309 p->readInt32(&none);
1310 p->readInt32(&none);
1311 p->readInt32(&WCDMA_signalstrength);
1312 p->readInt32(&none);
1313 p->readInt32(&solSigStren->rscp);
1314 p->readInt32(&solSigStren->ecno);
1315 LYINFLOG("WCDMA_signalstrength:%d",WCDMA_signalstrength);
1316 if((WCDMA_signalstrength!=99)&&(WCDMA_signalstrength!=0))
1317 {
1318 solSigStren->wcdma_sig_valid = 1;
1319 }else{
1320 solSigStren->wcdma_sig_valid = 0;
1321 }
1322 /*bug fix*/
1323 p->readInt32(&solSigStren->ssRsrp);
1324 p->readInt32(&solSigStren->ssRsrq);
1325 p->readInt32(&solSigStren->ssSinr);
1326 p->readInt32(&solSigStren->csiRsrp);
1327 p->readInt32(&solSigStren->csiRsrq);
1328 p->readInt32(&solSigStren->csiSinr);
1329 sum = (solSigStren->ssRsrp) + (solSigStren->ssRsrq) + (solSigStren->ssSinr) + (solSigStren->csiRsrp)+\
1330 (solSigStren->csiRsrq) + (solSigStren->csiSinr);
1331 if(sum != 0)
1332 {
1333 solSigStren->nr_sig_valid = 1;
1334 }else{
1335 LYERRLOG("None of NR signal info");
1336 }
1337
1338 LYINFLOG("%s suc",__func__);
1339 delete p;
1340 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +08001341}
rjwbc8a05f2022-03-02 15:23:11 +08001342
rjw4a5a78d2022-03-10 11:04:24 +08001343int lynq_set_ims(const int ims_mode)
1344{
q.huang52921662022-10-20 15:25:45 +08001345 if(g_module_init_flag != MODULE_RUNNING)
q.huang7de1d662022-09-13 14:19:24 +08001346 {
q.huang52921662022-10-20 15:25:45 +08001347 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1348 return LYNQ_E_CONFLICT;
q.huang7de1d662022-09-13 14:19:24 +08001349 }
rjw4a5a78d2022-03-10 11:04:24 +08001350 if (ims_mode < 0 || ims_mode > 1)
1351 {
q.huang7de1d662022-09-13 14:19:24 +08001352 LYERRLOG("%s parameter %d error",__func__,ims_mode);
q.huang52921662022-10-20 15:25:45 +08001353 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +08001354 }
rjw4a5a78d2022-03-10 11:04:24 +08001355
q.huang52921662022-10-20 15:25:45 +08001356 Parcel* p=NULL;
1357 int ret = lynq_send_common_request(p,65,RIL_REQUEST_SET_IMS_ENABLE,1,"%d",ims_mode);
1358 if(ret!=RESULT_OK)
1359 {
1360 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
1361 return ret;
1362 }
1363
1364 LYINFLOG("%s set %d suc",__func__,ims_mode);
1365 delete p;
1366 return RESULT_OK;
rjw4a5a78d2022-03-10 11:04:24 +08001367}
1368
q.huang52921662022-10-20 15:25:45 +08001369/*Used to get urc info*/
1370int lynq_get_urc_info(const int handle,signalStrength_t *solSigStren,int *slot_id)
1371{
1372 if(g_module_init_flag != MODULE_RUNNING)
1373 {
1374 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1375 return LYNQ_E_CONFLICT;
1376 }
1377 LYDBGLOG("start get urc info");
1378 if(handle != RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED &&handle != RIL_UNSOL_SIGNAL_STRENGTH)
1379 {
1380 LYINFLOG("invalid handle!!!");
1381 return LYNQ_E_PARAMETER_ANONALY;
1382 }
1383 if((handle ==RIL_UNSOL_SIGNAL_STRENGTH && NULL == solSigStren) ||
1384 (handle ==RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED && NULL == slot_id))
1385 {
1386 LYINFLOG("incoming solSigStren or slot_id is NULL!!!");
1387 return LYNQ_E_PARAMETER_ANONALY;
1388 }
1389 switch(handle)
1390 {
1391 case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: //1002
1392 {
1393 LYDBGLOG("get state update to VOICE");
1394 *slot_id = s_module_urc_slot_id;
1395 LYINFLOG("slot_id = %d",s_module_urc_slot_id);
1396 break;
1397 }
1398 case RIL_UNSOL_SIGNAL_STRENGTH: //1009
1399 {
1400 LYDBGLOG("get state update to signal info");
1401 solSigStren->gw_sig_valid = s_network_urc_solSigStren.gw_sig_valid;
1402 solSigStren->rssi = s_network_urc_solSigStren.rssi;
1403 solSigStren->wcdma_sig_valid = s_network_urc_solSigStren.wcdma_sig_valid;
1404 solSigStren->rscp = s_network_urc_solSigStren.rscp;
1405 solSigStren->ecno = s_network_urc_solSigStren.ecno;
1406 solSigStren->lte_sig_valid = s_network_urc_solSigStren.lte_sig_valid;
1407 solSigStren->rsrp = s_network_urc_solSigStren.rsrp;
1408 solSigStren->rsrq = s_network_urc_solSigStren.rsrq;
1409 solSigStren->rssnr = s_network_urc_solSigStren.rssnr;
1410 solSigStren->nr_sig_valid = s_network_urc_solSigStren.nr_sig_valid;
1411 solSigStren->ssRsrp = s_network_urc_solSigStren.ssRsrp;
1412 solSigStren->ssRsrq = s_network_urc_solSigStren.ssRsrq;
1413 solSigStren->ssSinr = s_network_urc_solSigStren.ssSinr;
1414 solSigStren->csiRsrp = s_network_urc_solSigStren.csiRsrp;
1415 solSigStren->csiRsrq = s_network_urc_solSigStren.csiRsrq;
1416 solSigStren->csiSinr = s_network_urc_solSigStren.csiSinr;
1417 break;
1418 }
1419 }
1420 return RESULT_OK;
1421}
1422
1423static pthread_mutex_t urc_signal_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
1424static pthread_cond_t urc_signal_state_change_cond = PTHREAD_COND_INITIALIZER;
1425
1426int wait_urc_signal_changes()
1427{
1428 pthread_mutex_lock(&urc_signal_state_change_mutex);
1429 pthread_cond_wait(&urc_signal_state_change_cond,&urc_signal_state_change_mutex);
1430 pthread_mutex_unlock(&urc_signal_state_change_mutex);
1431 return RESULT_OK;
1432}
1433
1434void send_urc_signal_changes()
1435{
1436 pthread_mutex_lock(&urc_signal_state_change_mutex);
1437 pthread_cond_signal(&urc_signal_state_change_cond);
1438 pthread_mutex_unlock(&urc_signal_state_change_mutex);
1439 return;
1440}
1441
1442void urc_msg_process(Parcel *p)
1443{
1444 int resp_type;
1445 int none = 0;
1446 int NR_sum = 0;
1447 int urc_LTE_signalstrength = 0;
1448 int urc_WCDMA_signalstrength = 0;
1449
1450 p->readInt32(&resp_type);
1451 p->readInt32(&s_module_wait_urc_id);
1452 p->readInt32(&s_module_urc_slot_id);
1453 LYINFLOG("urc id = %d, slot_id = %d",s_module_wait_urc_id,s_module_urc_slot_id);
1454 switch(s_module_wait_urc_id)
1455 {
1456 case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED:
1457 {
1458 set_state_buffer_valid(NETWORK_STATE_BUFFER_TYPE_VOICE_REG,false);
1459 send_urc_signal_changes();
1460 break;
1461 }
1462 case RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED:
1463 {
1464 set_state_buffer_valid(NETWORK_STATE_BUFFER_TYPE_DATA_REG,false);
1465 send_urc_signal_changes();
1466 break;
1467 }
1468 case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED:
1469 {
1470 set_state_buffer_valid(NETWORK_STATE_BUFFER_TYPE_IMS_REG,false);
1471 send_urc_signal_changes();
1472 break;
1473 }
1474 case RIL_UNSOL_SIGNAL_STRENGTH:
1475 {
1476 p->readInt32(&s_network_urc_solSigStren.rssi);
1477 if((s_network_urc_solSigStren.rssi!=99)&&(s_network_urc_solSigStren.rssi!=0))
1478 {
1479 s_network_urc_solSigStren.gw_sig_valid = 1;
1480 }else{
1481 s_network_urc_solSigStren.gw_sig_valid = 0;
1482 }
1483 if(s_network_urc_solSigStren.gw_sig_valid == 1)
1484 {
1485 LYINFLOG("urc_GSM_signalstrength:%d",s_network_urc_solSigStren.rssi);
1486 }
1487 p->readInt32(&none);
1488 p->readInt32(&none);
1489 p->readInt32(&none);
1490 p->readInt32(&none);
1491 p->readInt32(&none);
1492 p->readInt32(&none);
1493 p->readInt32(&none);
1494 p->readInt32(&urc_LTE_signalstrength);
1495 // p.readInt32(&solSigStren->signalStrength.LTE_SignalStrength.signalStrength);
1496 p->readInt32(&s_network_urc_solSigStren.rsrp);
1497 p->readInt32(&s_network_urc_solSigStren.rsrq);
1498 p->readInt32(&s_network_urc_solSigStren.rssnr);
1499 if((urc_LTE_signalstrength!=99)&&(urc_LTE_signalstrength!=0))
1500 {
1501 s_network_urc_solSigStren.lte_sig_valid = 1;
1502 }else{
1503 s_network_urc_solSigStren.lte_sig_valid = 0;
1504 }
1505 if(s_network_urc_solSigStren.lte_sig_valid == 1)
1506 {
1507 LYINFLOG("urc_LTE_signalstrength:%d",urc_LTE_signalstrength);
1508 }
1509 p->readInt32(&none);
1510 p->readInt32(&none);
1511 p->readInt32(&none);
1512 p->readInt32(&none);
1513 p->readInt32(&none);
1514 p->readInt32(&urc_WCDMA_signalstrength);
1515 p->readInt32(&none);
1516 p->readInt32(&s_network_urc_solSigStren.rscp);
1517 p->readInt32(&s_network_urc_solSigStren.ecno);
1518 if((urc_WCDMA_signalstrength!=99)&&(urc_WCDMA_signalstrength!=0))
1519 {
1520 s_network_urc_solSigStren.wcdma_sig_valid = 1;
1521 }else{
1522 s_network_urc_solSigStren.wcdma_sig_valid = 0;
1523 }
1524 if(s_network_urc_solSigStren.wcdma_sig_valid == 1)
1525 {
1526 LYINFLOG("urc_WCDMA_signalstrength:%d",urc_WCDMA_signalstrength);
1527 }
1528 p->readInt32(&s_network_urc_solSigStren.ssRsrp);
1529 p->readInt32(&s_network_urc_solSigStren.ssRsrq);
1530 p->readInt32(&s_network_urc_solSigStren.ssSinr);
1531 p->readInt32(&s_network_urc_solSigStren.csiRsrp);
1532 p->readInt32(&s_network_urc_solSigStren.csiRsrq);
1533 p->readInt32(&s_network_urc_solSigStren.csiSinr);
1534 NR_sum = (s_network_urc_solSigStren.ssRsrp) + (s_network_urc_solSigStren.ssRsrq) + (s_network_urc_solSigStren.ssSinr) + (s_network_urc_solSigStren.csiRsrp)+\
1535 (s_network_urc_solSigStren.csiRsrq) + (s_network_urc_solSigStren.csiSinr);
1536 if(NR_sum != 0)
1537 {
1538 s_network_urc_solSigStren.nr_sig_valid = 1;
1539 }else{
1540 s_network_urc_solSigStren.nr_sig_valid = 0;
1541 }
1542 if(s_network_urc_solSigStren.nr_sig_valid == 1)
1543 {
1544 LYINFLOG("[NR signal]ssRsrp is %d , ssRsrq is %d , ssSinr is %d , csiRsrp is %d , csiRsrq is %d , csiSinr is %d",\
1545 s_network_urc_solSigStren.ssRsrp,s_network_urc_solSigStren.ssRsrq,s_network_urc_solSigStren.ssSinr, \
1546 s_network_urc_solSigStren.csiRsrp,s_network_urc_solSigStren.csiRsrq,s_network_urc_solSigStren.csiSinr);
1547 }
1548 send_urc_signal_changes();
1549 break;
1550 }
1551 }
1552}
rjw4a5a78d2022-03-10 11:04:24 +08001553
rjwbc8a05f2022-03-02 15:23:11 +08001554/*Used to wait for an update signal*/
1555int lynq_wait_signalchanges(int *handle)
1556{
1557 LYDBGLOG("start wait signalchanges info");
1558 if(NULL == handle)
1559 {
1560 LYERRLOG("illegal input");
q.huang52921662022-10-20 15:25:45 +08001561 return LYNQ_E_PARAMETER_ANONALY;
rjwbc8a05f2022-03-02 15:23:11 +08001562 }
q.huang52921662022-10-20 15:25:45 +08001563 wait_urc_signal_changes();
rjwbc8a05f2022-03-02 15:23:11 +08001564 LYDBGLOG("get signalchanges");
q.huang52921662022-10-20 15:25:45 +08001565 *handle = s_module_wait_urc_id;
1566 return RESULT_OK;
rjw4200a082022-05-17 17:58:35 +08001567}
lh3a26dd52022-07-01 04:44:57 -07001568
q.huang52921662022-10-20 15:25:45 +08001569#ifdef MODEM_GEN97
lh3a26dd52022-07-01 04:44:57 -07001570/**@brief parse at response,return error code,and the response
1571* @param response [IN] <response>:original at response,This parameter must be a character array.
1572
1573* @param value [OUT] <value>: Used to receive the parsed value, if multiple values are separated by ";".
1574* field:
1575* eg:
1576* "+cnum: 123456\n+cnum: 456"
1577* value:12345;456;
1578* @param value_len [IN] <value_len>: The value length.
1579
1580* @return:AT error code
1581*/
1582static int parse_at_result(char response[],char value[],int value_len)
1583{
1584 if(response == NULL || value == NULL)
1585 {
1586 LYERRLOG("parameter invalid");
q.huang52921662022-10-20 15:25:45 +08001587 return LYNQ_E_PARAMETER_ANONALY;
lh3a26dd52022-07-01 04:44:57 -07001588 }
1589 if(strstr(response,"ERROR"))
1590 {
1591 int i;
1592 for(i = 0;i < strlen(response);i++)
1593 {
1594 if(response[i]==':')
1595 {
1596 break;
1597 }
1598 }
1599 if(i < strlen(response))
1600 {
1601 LYINFLOG("parse_result:%d\n",atoi(response+i+1));
1602 return atoi(response+i+1);
1603 }
1604 else
1605 {
1606 LYINFLOG("%s parse_result:fail,this response invalid\n",response);
1607 return 100; //unknown
1608 }
1609 }
1610 else if(strstr(response,"OK"))
1611 {
1612 /** parse the at response value
1613 * eg:
1614 * --> at+cnum
1615 * <-- +CNUM:"1243452"
1616 * need parse the "1243452" to <value>
1617 *@ To-Do
1618 */
1619 int count;
1620 int resp_addr[32] = {0};
1621 char temp_buf[1024] = {0};
1622 char *dest;
1623 dest = NULL;
1624 count = 0;
1625 int res_len = strlen(response);
1626 LYINFLOG("res_len:%d",res_len);
1627 for(int i = 0; i < res_len; i++)
1628 {
1629 if(response[i]==':')
1630 {
1631 resp_addr[count] = i;
1632 count++;
1633 }
1634 if(response[i] == '\n')
1635 {
1636 response[i] = '\0';
1637 }
1638 }
1639 LYINFLOG("count:%d",count);
1640 if(count > 0)
1641 {
1642 for(int i = 0; i < count; i++)
1643 {
1644 if((strlen(temp_buf) + strlen(response+resp_addr[i]+2)) >= 1023)
1645 {
1646 LYINFLOG("2 will be out of range\n");
1647 break;
1648 }
1649 if(strlen(temp_buf) >= 1023)
1650 {
1651 LYINFLOG("1 will be out of range\n");
1652 break;
1653 }
1654 strcat(temp_buf,response+resp_addr[i]+2);
1655
1656 if(strlen(temp_buf) >= 1023)
1657 {
1658 LYINFLOG("1 will be out of range\n");
1659 break;
1660 }
1661 strcat(temp_buf,";");
1662 printf("parse_result[%d]:%s,strcated:%s\n",i,response+resp_addr[i]+2,temp_buf);
1663 }
1664 LYINFLOG("parse_result:%s\n",temp_buf);
1665 if(strlen(temp_buf) > value_len)
1666 {
1667 printf("result length over value:%ld,%d\n",strlen(temp_buf),value_len);
1668 memcpy(value,temp_buf,value_len);
1669 }
1670 else
1671 {
1672 memcpy(value,temp_buf,strlen(temp_buf));
1673 }
1674 }
q.huang52921662022-10-20 15:25:45 +08001675 return RESULT_OK;
lh3a26dd52022-07-01 04:44:57 -07001676 }
1677 else
1678 {
1679 LYINFLOG("%s this response invalid\n",response);
q.huang52921662022-10-20 15:25:45 +08001680 return LYNQ_E_INNER_ERROR;
lh3a26dd52022-07-01 04:44:57 -07001681 }
1682}
lh3a26dd52022-07-01 04:44:57 -07001683
1684int lynq_oos_recover_timer_interval(int mode, char interval[LY_RECOVER_TIMER_INTERVAL],char result[LY_RECOVER_TIMER_INTERVAL])
1685{
q.huang52921662022-10-20 15:25:45 +08001686 if(g_module_init_flag != MODULE_RUNNING)
1687 {
1688 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1689 return LYNQ_E_CONFLICT;
1690 }
1691
q.huang7de1d662022-09-13 14:19:24 +08001692 if((mode < 0) || (mode >1) || (mode == 0 && NULL == interval) || (NULL == result))
lh3a26dd52022-07-01 04:44:57 -07001693 {
q.huang7de1d662022-09-13 14:19:24 +08001694 LYERRLOG("%s mode %d interval %s result %s error",__func__,mode,interval,result);
q.huang52921662022-10-20 15:25:45 +08001695 return LYNQ_E_PARAMETER_ANONALY;
lh3a26dd52022-07-01 04:44:57 -07001696 }
1697
q.huang7de1d662022-09-13 14:19:24 +08001698 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +08001699 int ret;
q.huang7de1d662022-09-13 14:19:24 +08001700
lh3a26dd52022-07-01 04:44:57 -07001701 if(mode == 0)
1702 {
q.huang52921662022-10-20 15:25:45 +08001703 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 -07001704 }
q.huang7de1d662022-09-13 14:19:24 +08001705 else
lh3a26dd52022-07-01 04:44:57 -07001706 {
q.huang52921662022-10-20 15:25:45 +08001707 ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"AT+ERSCFG?");
lh3a26dd52022-07-01 04:44:57 -07001708 }
q.huang7de1d662022-09-13 14:19:24 +08001709
q.huang52921662022-10-20 15:25:45 +08001710 if(ret!=RESULT_OK)
lh3a26dd52022-07-01 04:44:57 -07001711 {
q.huang52921662022-10-20 15:25:45 +08001712 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
1713 return ret;
1714 }
q.huang7de1d662022-09-13 14:19:24 +08001715
q.huang52921662022-10-20 15:25:45 +08001716 int recv_len;
1717 char res_data[LY_RECOVER_TIMER_INTERVAL] = {0};
1718 char response_interval[LY_RECOVER_TIMER_INTERVAL*2] = {0};
q.huang7de1d662022-09-13 14:19:24 +08001719
q.huang52921662022-10-20 15:25:45 +08001720 LYINFLOG("get recover timer interval");
1721 p->readInt32(&recv_len);
1722 if(recv_len == -1)
1723 {
1724 LYINFLOG("no responset");
q.huang7de1d662022-09-13 14:19:24 +08001725 delete p;
q.huang52921662022-10-20 15:25:45 +08001726 return LYNQ_E_INNER_ERROR;
lh3a26dd52022-07-01 04:44:57 -07001727 }
q.huang52921662022-10-20 15:25:45 +08001728 else
1729 {
1730 LYINFLOG("recv_len:%d",recv_len);
1731 p->read(response_interval,recv_len);
1732 }
1733 LYINFLOG("response_interval:%s",response_interval);
1734 ret = parse_at_result(response_interval,res_data,LY_RECOVER_TIMER_INTERVAL);
1735 if(mode == 1)
1736 {
1737 if(strlen(res_data) <= LY_RECOVER_TIMER_INTERVAL)
1738 {
1739 memcpy(result,res_data,strlen(res_data));
1740 }
1741 }
1742 LYERRLOG("%s ret:%d",__func__,ret);
1743 delete p;
1744 return ret;
lh3a26dd52022-07-01 04:44:57 -07001745}
1746
1747int lynq_oos_deep_sleep_recover_timer_interval(int recovery_threshold,int fullband_timer,int sniffer_timer,int inactive_mode)
1748{
q.huang52921662022-10-20 15:25:45 +08001749 if(g_module_init_flag != MODULE_RUNNING)
1750 {
1751 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1752 return LYNQ_E_CONFLICT;
1753 }
1754 if(((recovery_threshold < 2) || (recovery_threshold > 10)) || ((fullband_timer < 90) || (fullband_timer > 360)) ||
lh3a26dd52022-07-01 04:44:57 -07001755 ((sniffer_timer < 10) || (sniffer_timer > 60)) || ((inactive_mode < 0) || (inactive_mode > 1)))
1756 {
q.huang52921662022-10-20 15:25:45 +08001757 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);
1758 return LYNQ_E_PARAMETER_ANONALY;
lh3a26dd52022-07-01 04:44:57 -07001759 }
1760
q.huang7de1d662022-09-13 14:19:24 +08001761 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +08001762 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 +08001763
q.huang52921662022-10-20 15:25:45 +08001764 if(ret!=RESULT_OK)
lh3a26dd52022-07-01 04:44:57 -07001765 {
q.huang52921662022-10-20 15:25:45 +08001766 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
1767 return ret;
1768 }
1769
1770 int recv_len;
1771 char res_data[LY_RECOVER_TIMER_INTERVAL] = {0};
1772 char response_interval[LY_RECOVER_TIMER_INTERVAL*2] = {0};
1773
1774 p->readInt32(&recv_len);
1775 if(recv_len == -1)
1776 {
1777 LYINFLOG("no responset");
q.huang7de1d662022-09-13 14:19:24 +08001778 delete p;
q.huang52921662022-10-20 15:25:45 +08001779 return LYNQ_E_INNER_ERROR;
lh3a26dd52022-07-01 04:44:57 -07001780 }
q.huang52921662022-10-20 15:25:45 +08001781 else
1782 {
1783 LYINFLOG("recv_len:%d",recv_len);
1784 p->read(response_interval,recv_len);
1785 }
1786 LYINFLOG("response_interval:%s",response_interval);
1787 ret = parse_at_result(response_interval,res_data,LY_RECOVER_TIMER_INTERVAL);
1788 LYERRLOG("%s ret:%d",__func__,ret);
1789 delete p;
1790 return ret;
1791
lh3a26dd52022-07-01 04:44:57 -07001792}
1793#endif
1794