blob: 8e84df14914c36756c67fca38d36091a00c66284 [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>
q.huang7de1d662022-09-13 14:19:24 +080011#include <list>
rjw7e50cd32022-01-18 18:30:37 +080012#include <vendor-ril/telephony/ril.h>
rjw4a5a78d2022-03-10 11:04:24 +080013#include <vendor-ril/telephony/mtk_ril_sp.h>
rjw7e50cd32022-01-18 18:30:37 +080014
15#include "lynq_network.h"
16#include "liblog/lynq_deflog.h"
q.huang47d4dfe2022-08-17 17:52:29 +080017#include "lynq_network_state_buffer.h"
rjw7e50cd32022-01-18 18:30:37 +080018#define LYNQ_SERVICE_PORT 8088
19#define LYNQ_URC_SERVICE_PORT 8086
20#define LYNQ_URC_ADDRESS "0.0.0.0"
21#define LYNQ_ADDRESS "127.0.0.1"
22#define LYNQ_REQUEST_PARAM_BUF 8192
23#define LYNQ_REC_BUF 8192
24#define LYNQ_RESP_BUF 128
25#define LYNQ_TYPE_BUF 10
26#define USER_LOG_TAG "LYNQ_NETWORK"
27
28
29using ::android::Parcel;
30
31
32typedef struct{
33 int uToken;
34 int request;
35 int paramLen;
36 char param[LYNQ_REQUEST_PARAM_BUF];
37}lynq_client_t;
38
39typedef struct{
40 int resp_type;
q.huang7de1d662022-09-13 14:19:24 +080041 int token;
rjw7e50cd32022-01-18 18:30:37 +080042 int request;
43 int slot_id;
44 int error;
45}lynq_resp_t;
46
47lynq_client_t client_t;
48lynq_resp_t response;
rjwbc8a05f2022-03-02 15:23:11 +080049
50int network_len_addr_serv;
51int network_len_urc_addr_serv;
52struct sockaddr_in network_addr_serv;
53struct sockaddr_in network_urc_addr_serv;
54static int network_sock_fd = 0;
55int network_urc_sock_fd = 0;
56int network_Global_uToken = 0;
57int network_slot_id = -1;
58int network_urc_slot_id = -1;
59int network_urc_status = 1;
60int network_wait_urc_id = 0;
61signalStrength_t network_urc_solSigStren;
rjw22947c22022-03-15 09:21:29 +080062/**g_lynq_network_init_flag
63* @brief mark network initialization state
64* 0:deinit status
65* 1:init state
66*/
67static int g_lynq_network_init_flag = 0;
rjw7e50cd32022-01-18 18:30:37 +080068
rjwbc8a05f2022-03-02 15:23:11 +080069static pthread_mutex_t signal_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
70static pthread_cond_t signal_state_change_cond = PTHREAD_COND_INITIALIZER;
rjw7e50cd32022-01-18 18:30:37 +080071
rjw9c301f82022-05-25 09:10:33 +080072/**g_lynq_network_sendto_mutex
73* @brief mark network send request mutex
74*/
75static pthread_mutex_t g_lynq_network_sendto_mutex;
76
q.huang7de1d662022-09-13 14:19:24 +080077
78/*hq add for set waiting time 2022/09/13 begin*/
79int network_rc_status = 1;
80static pthread_mutex_t s_RecvMsgBlockMutex = PTHREAD_MUTEX_INITIALIZER;
81static pthread_cond_t s_WaitRecvMsgCond = PTHREAD_COND_INITIALIZER;
82#define BLOCK_RC_MSG_LOCK() pthread_mutex_lock(&s_RecvMsgBlockMutex)
83#define BLOCK_RC_MSG_UNLOCK() pthread_mutex_unlock(&s_RecvMsgBlockMutex)
84#define BLOCK_WAIT_RECV_MSG_TIME_OUT(a) pthread_cond_timedwait(&s_WaitRecvMsgCond, &s_RecvMsgBlockMutex,(a))
85#define BLOCK_WAKEUP_RECV_MSG() pthread_cond_broadcast(&s_WaitRecvMsgCond)
86std::list<Parcel*> g_recv_parcel_list;
87const int waitResponse(int token,int time_out);
88int g_inner_test=0;
89/*hq add for set waiting time 2022/09/13 end*/
90
91
rjw9c301f82022-05-25 09:10:33 +080092//static pthread_mutex_t g_lynq_network_recv_mutex;
93
rjw7e50cd32022-01-18 18:30:37 +080094typedef enum{
95 LYNQ_E_CARDSTATE_ERROR=8000,
96 /* The voice service state is out of service*/
97 LYNQ_E_STATE_OUT_OF_SERVICE=8001,
98 /* The voice service state is EMERGENCY_ONLY*/
99 LYNQ_E_STATE_EMERGENCY_ONLY=8002,
100 /* The radio power is power off*/
101 LYNQ_E_STATE_POWER_OFF=8003,
102 LYNQ_E_TIME_OUT=8004,
103 /*create or open sms DB fail */
104 LYNQ_E_SMS_DB_FAIL=8005,
105 /*Failed to execute sql statement*/
106 LYNQ_E_SMS_SQL_FAIL = 8006,
107 LYNQ_E_SMS_NOT_FIND = 8007,
108 /* The logic conflict*/
109 LYNQ_E_CONFLICT=9000,
110 /*Null anomaly*/
111 LYNQ_E_NULL_ANONALY=9001
112}LYNQ_E;
113
lh3a26dd52022-07-01 04:44:57 -0700114
115/**@brief get response and write msg to parcel
116* @param p [IN] <p>: the parcel
117*
118* @param time_out [IN] <time_out>: timeout.
119* < 0:use defult timeout(5s)
120* >=0:use this timeout
121* @return
122* 0:success
123* other:failure
124*/
125int get_response(Parcel &p,int time_out)
126{
rjwa59bf312022-07-05 11:50:31 +0800127 int len = 0;
128 char recvline[LYNQ_REC_BUF];
lh3a26dd52022-07-01 04:44:57 -0700129 bzero(recvline,LYNQ_REC_BUF);
130 LYINFLOG("get response");
131 /* receive data from server */
132 struct timeval timeOut;
rjwa59bf312022-07-05 11:50:31 +0800133 timeOut.tv_sec = 30; //defualt 5s
lh3a26dd52022-07-01 04:44:57 -0700134 timeOut.tv_usec = 0;
135 if(time_out >= 0)
136 {
137 LYINFLOG("use time out %d",time_out);
138 timeOut.tv_sec = time_out; //just set second
139 }
140 if(setsockopt(network_sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
141 {
142 LYERRLOG("time out setting failed");
143 return -1;
144 }
145 len = recvfrom(network_sock_fd,recvline,sizeof(recvline),0,(struct sockaddr *)&network_addr_serv,(socklen_t *)&network_len_addr_serv);
146 if(len == -1 && errno == EAGAIN)
147 {
148 LYERRLOG("read error,maybe timeout: %s",strerror(errno));
149 return LYNQ_E_TIME_OUT;
rjwa59bf312022-07-05 11:50:31 +0800150 }
lh3a26dd52022-07-01 04:44:57 -0700151 if (recvline != NULL)
152 {
rjwa59bf312022-07-05 11:50:31 +0800153 p.setData((uint8_t *)recvline,len); // p.setData((uint8_t *) buffer, buflen);
154 p.setDataPosition(0);
155 }
156 return 0;
157}
q.huang7de1d662022-09-13 14:19:24 +0800158
159const int waitResponse(Parcel*& p, int token,int time_out)
160{
161 int waitToken = token;
162 int wakeup_token=-1;
163 int resp_type;
164 struct timeval now;
165 struct timespec timeout;
166 int ret;
167 std::list<Parcel*>::iterator iter;
168 int cnt=0;
169
170 gettimeofday(&now,NULL);
171 timeout.tv_sec = now.tv_sec+time_out; //timeout is 1min
172 timeout.tv_nsec = now.tv_usec*1000;
173
174 LYINFLOG("%s wait token is %d",__func__,waitToken);
175
176 BLOCK_RC_MSG_LOCK();
177 while(true) {
178 cnt++;
179 for(iter=g_recv_parcel_list.begin();iter!=g_recv_parcel_list.end();++iter)
180 {
181 (*iter)->setDataPosition(0);
182 (*iter)->readInt32(&resp_type);
183 (*iter)->readInt32(&wakeup_token);
184 if(wakeup_token==waitToken)
185 {
186 LYINFLOG("%s get waitToken",__func__);
187 p=(*iter);
188 p->setDataPosition(0);
189 g_recv_parcel_list.erase(iter);
190 goto waitResponse_end;
191 }
192 }
193 LYINFLOG("%s no wait Token in msg list, list size is %d",__func__,g_recv_parcel_list.size());
194 ret=BLOCK_WAIT_RECV_MSG_TIME_OUT(&timeout);
195 if(ret!=0)
196 {
197 LYERRLOG("%s no expected token after %d second",__func__,time_out);
198 break;
199 }
200 }
201waitResponse_end:
202 LYINFLOG("%s wait token is %d wakeup_token is %d, cnt is %d",__func__,waitToken,wakeup_token,cnt);
203 BLOCK_RC_MSG_UNLOCK();
204 return !(wakeup_token==waitToken);
205}
206
207int JumpHeader(Parcel &p,int *resp_type,int* token,int *request,int *slot_id,int *error)
lh3a26dd52022-07-01 04:44:57 -0700208{
209 LYINFLOG("jump header");
rjwa59bf312022-07-05 11:50:31 +0800210 if(p.dataAvail() > 0)
211 {
212 p.readInt32(resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800213 p.readInt32(token);
rjwa59bf312022-07-05 11:50:31 +0800214 p.readInt32(request);
215 p.readInt32(slot_id);
216 p.readInt32(error);
q.huang7de1d662022-09-13 14:19:24 +0800217 LYINFLOG("resp_type=%d,token=%d,request=%d,slot_id=%d,error_code=%d",*resp_type,*token,*request,*slot_id,*error);
rjwa59bf312022-07-05 11:50:31 +0800218 return 0;
219 }
220 else
221 {
222 return -1;
223 }
lh3a26dd52022-07-01 04:44:57 -0700224}
225
q.huang7de1d662022-09-13 14:19:24 +0800226void PrintHeader(lynq_resp_t& head)
227{
228 LYINFLOG("resp_type=%d,token=%d,request=%d,slot_id=%d,error_code=%d",head.resp_type,head.token,head.request,head.slot_id,head.error);
229}
230
231int GetHeader(Parcel* &p, lynq_resp_t& head)
232{
233 LYINFLOG("get header");
234 if(p->dataAvail() > 0)
235 {
236 p->readInt32(&(head.resp_type));
237 p->readInt32(&(head.token));
238 p->readInt32(&(head.request));
239 p->readInt32(&(head.slot_id));
240 p->readInt32(&(head.error));
241 PrintHeader(head);
242 return 0;
243 }
244 else
245 {
246 return -1;
247 }
248}
249
250int lynq_get_common_request(int request_id, int time_out, Parcel*& p, int argc, const char* format,...)
q.huang16dcb0f2022-09-07 09:17:37 +0800251{
252 lynq_client_t client;
q.huang16dcb0f2022-09-07 09:17:37 +0800253 int ret;
254 int send_num;
255
256 client.uToken = network_Global_uToken;
q.huang7de1d662022-09-13 14:19:24 +0800257 network_Global_uToken=(network_Global_uToken+1)%10000;/*0-10000*/
q.huang16dcb0f2022-09-07 09:17:37 +0800258 client.request = request_id;
259 client.paramLen = argc;
260 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
261 if(argc!=0)
262 {
263 va_list args;
264 va_start(args, format);
265 vsnprintf(client.param, LYNQ_REQUEST_PARAM_BUF, format, args);
266 va_end(args);
267 }
268 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
269 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
q.huang7de1d662022-09-13 14:19:24 +0800270 if(g_inner_test==0)
271 {
272 send_num = sendto(network_sock_fd,&client,sizeof(client),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
273 }
274 else
275 {
276 send_num = 1;
277 g_inner_test = 0;
278 }
279 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
q.huang16dcb0f2022-09-07 09:17:37 +0800280
q.huang7de1d662022-09-13 14:19:24 +0800281 if(send_num <= 0)
q.huang16dcb0f2022-09-07 09:17:37 +0800282 {
283 LYERRLOG("send request fail, send num is %d", send_num);
284 return -1;
285 }
q.huang7de1d662022-09-13 14:19:24 +0800286 ret = waitResponse(p, client.uToken,time_out);
287
q.huang16dcb0f2022-09-07 09:17:37 +0800288 return ret;
289}
290
291
rjwbc8a05f2022-03-02 15:23:11 +0800292int wait_signal_changes()
293{
294 int ret = 0;
295 pthread_mutex_lock(&signal_state_change_mutex);
296 ret = pthread_cond_wait(&signal_state_change_cond,&signal_state_change_mutex);
297 pthread_mutex_unlock(&signal_state_change_mutex);
298 return 0;
299}
300
301void send_signal_changes()
302{
303 pthread_mutex_lock(&signal_state_change_mutex);
304 pthread_cond_signal(&signal_state_change_cond);
305 pthread_mutex_unlock(&signal_state_change_mutex);
306 return;
307}
308
q.huang7de1d662022-09-13 14:19:24 +0800309void *thread_rc_recv(void *p)
310{
311 Parcel* rc_p;
312 std::list<Parcel*>::iterator iter;
313 int resp_type = -1;
314 char rc_data[LYNQ_REC_BUF];
315 int rc_len;
316 int null_cnt=0;
317 int wakeup_token;
318
319 LYINFLOG("rc thread is running");
320 while(network_rc_status)
321 {
322 bzero(rc_data,LYNQ_REC_BUF);
323 while(true)
324 {
325 rc_len = recvfrom(network_sock_fd,rc_data,sizeof(rc_data),0,(struct sockaddr *)&network_addr_serv,(socklen_t *)&network_len_addr_serv);
326 if(rc_len<sizeof(int32_t)*2)
327 {
328 LYERRLOG("%s recv len %d less %d",__func__, rc_len,sizeof(int)*2);
329 continue;
330 }
331 rc_p= new Parcel;
332 if(rc_p==NULL)
333 {
334 null_cnt++;
335 LYERRLOG("%s rc_p is NULL, cnt is %d",__func__, null_cnt);
336 if(null_cnt>20)
337 {
338 goto rc_recv_end;
339 }
340 continue;
341 }
342 else
343 {
344 null_cnt=0;
345 }
346
347 rc_p->setData((uint8_t *)rc_data,rc_len); // p.setData((uint8_t *) buffer, buflen);
348 rc_p->setDataPosition(0);
349 if(rc_p->dataAvail()>0)
350 {
351 rc_p->readInt32(&resp_type);
352 rc_p->readInt32(&wakeup_token);
353 BLOCK_RC_MSG_LOCK();
354 g_recv_parcel_list.push_back(rc_p);
355 LYINFLOG("%s wakeup token is %d, list size is %d!",__func__,wakeup_token,g_recv_parcel_list.size());
356 if(g_recv_parcel_list.size()>20) //max 20
357 {
358 iter=g_recv_parcel_list.begin();
359 (*iter)->setDataPosition(0);
360 (*iter)->readInt32(&resp_type);
361 (*iter)->readInt32(&wakeup_token);
362 delete (*(g_recv_parcel_list.begin()));
363 LYERRLOG("%s wakeup token %d is deleted!",__func__,wakeup_token);
364 g_recv_parcel_list.erase(iter);
365 }
366 BLOCK_WAKEUP_RECV_MSG();
367 BLOCK_RC_MSG_UNLOCK();
368 break;
369 }
370 else
371 {
372 LYERRLOG("%s rc_p data Avail %d not greater than 0",__func__, rc_p->dataAvail());
373 delete rc_p;
374 }
375 }
376 }
377
378rc_recv_end:
379 return NULL;
380}
381
rjw7e50cd32022-01-18 18:30:37 +0800382void *thread_urc_recv(void *p)
383{
384 Parcel *urc_p =NULL;
385 char urc_data[LYNQ_REC_BUF];
rjw7e50cd32022-01-18 18:30:37 +0800386 int resp_type = -1;
387 int urc_id = -1;
388 int res = 0;
389 int none = 0;
390 int NR_sum = 0;
rjw7e50cd32022-01-18 18:30:37 +0800391 int urc_LTE_signalstrength = 0;
392 int urc_WCDMA_signalstrength = 0;
rjw7e50cd32022-01-18 18:30:37 +0800393 LYINFLOG("urc thread is running");
rjwbc8a05f2022-03-02 15:23:11 +0800394 while(network_urc_status)
rjw7e50cd32022-01-18 18:30:37 +0800395 {
396 bzero(urc_data,LYNQ_REC_BUF);
rjwbc8a05f2022-03-02 15:23:11 +0800397 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);
rjw7e50cd32022-01-18 18:30:37 +0800398 if(res<=0)
399 {
400 LYERRLOG("thread_urc_recv step2 fail:");
401 break;
402 }
403 urc_p = new Parcel();
rjw7a8791e2022-09-06 09:07:39 +0800404 if(urc_p == NULL)
405 {
406 LYERRLOG("new parcel failure!!!");
407 break;
408 }
rjw7e50cd32022-01-18 18:30:37 +0800409 urc_p->setData((uint8_t *)urc_data,res); // p.setData((uint8_t *) buffer, buflen);
410 urc_p->setDataPosition(0);
411 if(urc_p->dataAvail()>0)
412 {
413 urc_p->readInt32(&resp_type);
414 urc_p->readInt32(&urc_id);
rjwbc8a05f2022-03-02 15:23:11 +0800415 urc_p->readInt32(&network_urc_slot_id);
rjw7e50cd32022-01-18 18:30:37 +0800416 switch(urc_id)
417 {
q.huang47d4dfe2022-08-17 17:52:29 +0800418 case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED:
rjw7e50cd32022-01-18 18:30:37 +0800419 {
q.huangaf58bc82022-08-19 17:11:21 +0800420 set_register_voice_buffer_valid(false);
rjwbc8a05f2022-03-02 15:23:11 +0800421 network_wait_urc_id = urc_id;
422 LYINFLOG("slot_id = %d",network_urc_slot_id);
423 send_signal_changes();
rjw25d01752022-08-04 09:42:00 +0800424 break;
rjw7e50cd32022-01-18 18:30:37 +0800425 }
q.huang47d4dfe2022-08-17 17:52:29 +0800426 case RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED:
427 {
q.huangaf58bc82022-08-19 17:11:21 +0800428 set_register_data_buffer_valid(false);
q.huang47d4dfe2022-08-17 17:52:29 +0800429 network_wait_urc_id = urc_id;
430 LYINFLOG("slot_id = %d",network_urc_slot_id);
431 send_signal_changes();
432 break;
433 }
434 case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED:
435 {
q.huangaf58bc82022-08-19 17:11:21 +0800436 set_register_ims_buffer_valid(false);
q.huang47d4dfe2022-08-17 17:52:29 +0800437 network_wait_urc_id = urc_id;
438 LYINFLOG("slot_id = %d",network_urc_slot_id);
439 send_signal_changes();
440 break;
441 }
442 case RIL_UNSOL_SIGNAL_STRENGTH:
rjw7e50cd32022-01-18 18:30:37 +0800443 {
rjwbc8a05f2022-03-02 15:23:11 +0800444 urc_p->readInt32(&network_urc_solSigStren.rssi);
445 if((network_urc_solSigStren.rssi!=99)&&(network_urc_solSigStren.rssi!=0))
rjw7e50cd32022-01-18 18:30:37 +0800446 {
rjwbc8a05f2022-03-02 15:23:11 +0800447 network_urc_solSigStren.gw_sig_valid = 1;
rjw7e50cd32022-01-18 18:30:37 +0800448 }else{
rjwbc8a05f2022-03-02 15:23:11 +0800449 network_urc_solSigStren.gw_sig_valid = 0;
rjw7e50cd32022-01-18 18:30:37 +0800450 }
rjwbc8a05f2022-03-02 15:23:11 +0800451 if(network_urc_solSigStren.gw_sig_valid == 1)
rjw78d04502022-02-24 13:37:11 +0800452 {
rjwbc8a05f2022-03-02 15:23:11 +0800453 LYINFLOG("urc_GSM_signalstrength:%d",network_urc_solSigStren.rssi);
rjw78d04502022-02-24 13:37:11 +0800454 }
rjw7e50cd32022-01-18 18:30:37 +0800455 urc_p->readInt32(&none);
456 urc_p->readInt32(&none);
457 urc_p->readInt32(&none);
458 urc_p->readInt32(&none);
459 urc_p->readInt32(&none);
460 urc_p->readInt32(&none);
461 urc_p->readInt32(&none);
462 urc_p->readInt32(&urc_LTE_signalstrength);
463 // p.readInt32(&solSigStren->signalStrength.LTE_SignalStrength.signalStrength);
rjwbc8a05f2022-03-02 15:23:11 +0800464 urc_p->readInt32(&network_urc_solSigStren.rsrp);
465 urc_p->readInt32(&network_urc_solSigStren.rsrq);
466 urc_p->readInt32(&network_urc_solSigStren.rssnr);
rjw7e50cd32022-01-18 18:30:37 +0800467 if((urc_LTE_signalstrength!=99)&&(urc_LTE_signalstrength!=0))
468 {
rjwbc8a05f2022-03-02 15:23:11 +0800469 network_urc_solSigStren.lte_sig_valid = 1;
rjw7e50cd32022-01-18 18:30:37 +0800470 }else{
rjwbc8a05f2022-03-02 15:23:11 +0800471 network_urc_solSigStren.lte_sig_valid = 0;
rjw7e50cd32022-01-18 18:30:37 +0800472 }
rjwbc8a05f2022-03-02 15:23:11 +0800473 if(network_urc_solSigStren.lte_sig_valid == 1)
rjw78d04502022-02-24 13:37:11 +0800474 {
475 LYINFLOG("urc_LTE_signalstrength:%d",urc_LTE_signalstrength);
476 }
rjw7e50cd32022-01-18 18:30:37 +0800477 urc_p->readInt32(&none);
478 urc_p->readInt32(&none);
479 urc_p->readInt32(&none);
480 urc_p->readInt32(&none);
481 urc_p->readInt32(&none);
482 urc_p->readInt32(&urc_WCDMA_signalstrength);
483 urc_p->readInt32(&none);
rjwbc8a05f2022-03-02 15:23:11 +0800484 urc_p->readInt32(&network_urc_solSigStren.rscp);
485 urc_p->readInt32(&network_urc_solSigStren.ecno);
rjw7e50cd32022-01-18 18:30:37 +0800486 if((urc_WCDMA_signalstrength!=99)&&(urc_WCDMA_signalstrength!=0))
487 {
rjwbc8a05f2022-03-02 15:23:11 +0800488 network_urc_solSigStren.wcdma_sig_valid = 1;
rjw7e50cd32022-01-18 18:30:37 +0800489 }else{
rjwbc8a05f2022-03-02 15:23:11 +0800490 network_urc_solSigStren.wcdma_sig_valid = 0;
rjw78d04502022-02-24 13:37:11 +0800491 }
rjwbc8a05f2022-03-02 15:23:11 +0800492 if(network_urc_solSigStren.wcdma_sig_valid == 1)
rjw78d04502022-02-24 13:37:11 +0800493 {
494 LYINFLOG("urc_WCDMA_signalstrength:%d",urc_WCDMA_signalstrength);
rjw7e50cd32022-01-18 18:30:37 +0800495 }
rjwbc8a05f2022-03-02 15:23:11 +0800496 urc_p->readInt32(&network_urc_solSigStren.ssRsrp);
497 urc_p->readInt32(&network_urc_solSigStren.ssRsrq);
498 urc_p->readInt32(&network_urc_solSigStren.ssSinr);
499 urc_p->readInt32(&network_urc_solSigStren.csiRsrp);
500 urc_p->readInt32(&network_urc_solSigStren.csiRsrq);
501 urc_p->readInt32(&network_urc_solSigStren.csiSinr);
502 NR_sum = (network_urc_solSigStren.ssRsrp) + (network_urc_solSigStren.ssRsrq) + (network_urc_solSigStren.ssSinr) + (network_urc_solSigStren.csiRsrp)+\
503 (network_urc_solSigStren.csiRsrq) + (network_urc_solSigStren.csiSinr);
rjw7e50cd32022-01-18 18:30:37 +0800504 if(NR_sum != 0)
505 {
rjwbc8a05f2022-03-02 15:23:11 +0800506 network_urc_solSigStren.nr_sig_valid = 1;
rjw7e50cd32022-01-18 18:30:37 +0800507 }else{
rjwbc8a05f2022-03-02 15:23:11 +0800508 network_urc_solSigStren.nr_sig_valid = 0;
rjw78d04502022-02-24 13:37:11 +0800509 }
rjwbc8a05f2022-03-02 15:23:11 +0800510 if(network_urc_solSigStren.nr_sig_valid == 1)
rjw78d04502022-02-24 13:37:11 +0800511 {
512 LYINFLOG("[NR signal]ssRsrp is %d , ssRsrq is %d , ssSinr is %d , csiRsrp is %d , csiRsrq is %d , csiSinr is %d",\
rjwbc8a05f2022-03-02 15:23:11 +0800513 network_urc_solSigStren.ssRsrp,network_urc_solSigStren.ssRsrq,network_urc_solSigStren.ssSinr, \
514 network_urc_solSigStren.csiRsrp,network_urc_solSigStren.csiRsrq,network_urc_solSigStren.csiSinr);
rjw7e50cd32022-01-18 18:30:37 +0800515 }
rjwbc8a05f2022-03-02 15:23:11 +0800516 network_wait_urc_id = urc_id;
517 send_signal_changes();
rjw25d01752022-08-04 09:42:00 +0800518 break;
rjw7e50cd32022-01-18 18:30:37 +0800519 }
520 }
521 }
rjw7a8791e2022-09-06 09:07:39 +0800522 delete urc_p;
523 urc_p = NULL;
rjw7e50cd32022-01-18 18:30:37 +0800524 }
q.huang47d4dfe2022-08-17 17:52:29 +0800525 return NULL;
rjw7e50cd32022-01-18 18:30:37 +0800526}
527
rjw7e50cd32022-01-18 18:30:37 +0800528int lynq_server_socket_start()
529{
q.huang7de1d662022-09-13 14:19:24 +0800530// struct timeval timeOut;
rjwbc8a05f2022-03-02 15:23:11 +0800531 network_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
532 if(-1 == network_sock_fd)
rjw7e50cd32022-01-18 18:30:37 +0800533 {
534 LYERRLOG("socket open error");
535 return -1;
536 }
q.huang7de1d662022-09-13 14:19:24 +0800537# if 0
lh3a26dd52022-07-01 04:44:57 -0700538 timeOut.tv_sec = 5;
539 timeOut.tv_usec = 0;
540 if (setsockopt(network_sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
541 {
542 LYERRLOG("time out setting failed\n");
543 return -1;
544 }
q.huang7de1d662022-09-13 14:19:24 +0800545#endif
546
rjwbc8a05f2022-03-02 15:23:11 +0800547 LYINFLOG("network_sock_fd = %d",network_sock_fd);
rjw7e50cd32022-01-18 18:30:37 +0800548
rjwbc8a05f2022-03-02 15:23:11 +0800549 memset(&network_addr_serv, 0, sizeof(network_addr_serv));
550 network_addr_serv.sin_family = AF_INET;
551 network_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_ADDRESS);
552 network_addr_serv.sin_port = htons(LYNQ_SERVICE_PORT);
553 network_len_addr_serv = sizeof(network_addr_serv);
lh3a26dd52022-07-01 04:44:57 -0700554
q.huang7de1d662022-09-13 14:19:24 +0800555 BLOCK_RC_MSG_LOCK();
556 std::list<Parcel*>::iterator iter;
557 for(iter=g_recv_parcel_list.begin();iter!=g_recv_parcel_list.end();++iter)
558 {
559 delete (*iter);
560 }
561 g_recv_parcel_list.clear();
562 BLOCK_RC_MSG_UNLOCK();
563
564 pthread_t tid;
565 pthread_attr_t attr;
566 int ret;
567
568 pthread_attr_init(&attr);
569 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
570 ret = pthread_create(&tid,&attr,thread_rc_recv,NULL);
571 if(ret <0)
572 {
573 LYERRLOG("rc pthread create error");
574 return -1;
575 }
576 LYINFLOG("rc start success");
lh3a26dd52022-07-01 04:44:57 -0700577
rjw7e50cd32022-01-18 18:30:37 +0800578 return 0;
579}
580
581int lynq_urc_socket_start()
582{
583 pthread_t tid;
584 pthread_attr_t attr;
585 int on = 1;
rjwbc8a05f2022-03-02 15:23:11 +0800586 network_urc_sock_fd = -1;
rjw7e50cd32022-01-18 18:30:37 +0800587 int ret = 0;
rjwbc8a05f2022-03-02 15:23:11 +0800588 network_len_urc_addr_serv = sizeof(sockaddr_in);
589 network_urc_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
590 if (network_urc_sock_fd <0){
rjw7e50cd32022-01-18 18:30:37 +0800591 LYERRLOG("urc socket error");
592 ret = -1;
593 }
rjwbc8a05f2022-03-02 15:23:11 +0800594 network_urc_addr_serv.sin_family = AF_INET;
595 network_urc_addr_serv.sin_port = htons(LYNQ_URC_SERVICE_PORT);
596 network_urc_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_URC_ADDRESS);
rjw7e50cd32022-01-18 18:30:37 +0800597 /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
rjwbc8a05f2022-03-02 15:23:11 +0800598 ret = setsockopt(network_urc_sock_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
rjw7e50cd32022-01-18 18:30:37 +0800599 if(ret <0)
600 {
601 LYERRLOG("urc socket set error");
602 return -1;
603 }
rjwbc8a05f2022-03-02 15:23:11 +0800604 ret = bind(network_urc_sock_fd ,(struct sockaddr*)&network_urc_addr_serv, sizeof(network_urc_addr_serv));
rjw7e50cd32022-01-18 18:30:37 +0800605 if(ret <0)
606 {
607 LYERRLOG("urc socket bind error");
608 return -1;
609 }
610 pthread_attr_init(&attr);
611 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
rjwbc8a05f2022-03-02 15:23:11 +0800612 ret = pthread_create(&tid,&attr,thread_urc_recv,(void *)network_urc_sock_fd);
rjw7e50cd32022-01-18 18:30:37 +0800613 if(ret <0)
614 {
615 LYERRLOG("urc pthread create error");
616 return -1;
617 }
618 LYINFLOG("urc start success");
q.huang7de1d662022-09-13 14:19:24 +0800619
rjw7e50cd32022-01-18 18:30:37 +0800620 return 0;
621}
622
623int lynq_network_init(int utoken){
rjw22947c22022-03-15 09:21:29 +0800624 if(g_lynq_network_init_flag == 1)
625 {
626 LYERRLOG("init twice is not allowed");
627 return -1;
628 }
629 g_lynq_network_init_flag = 1;
rjw7e50cd32022-01-18 18:30:37 +0800630 if(utoken <0){
631 LYERRLOG("init err");
632 return -1;
633 }
rjwbc8a05f2022-03-02 15:23:11 +0800634 network_urc_status = 1;
q.huang7de1d662022-09-13 14:19:24 +0800635 network_rc_status = 1;
rjwbc8a05f2022-03-02 15:23:11 +0800636 network_Global_uToken = utoken;
rjw7e50cd32022-01-18 18:30:37 +0800637 LYLOGSET(LOG_INFO);
638 LYLOGEINIT(USER_LOG_TAG);
639 int ret = 0;
640
q.huang47d4dfe2022-08-17 17:52:29 +0800641 init_network_timer_all();
642
rjw7e50cd32022-01-18 18:30:37 +0800643 ret = lynq_server_socket_start();
644 if(ret !=0)
645 {
646 LYERRLOG("init socket client fail!!!");
647 return -1;
648 }
649 ret = lynq_urc_socket_start();
650 if(ret != 0)
651 {
652 LYERRLOG("init socket urc fail!!!");
653 return -1;
654 }
q.huang7de1d662022-09-13 14:19:24 +0800655 pthread_mutex_init(&g_lynq_network_sendto_mutex, NULL);
656 pthread_mutex_init(&s_RecvMsgBlockMutex, NULL);
657
rjw7e50cd32022-01-18 18:30:37 +0800658 return 0;
659}
660
661int strUpper(char * str)
662{
663 int i=0;
664 while(1)
665 {
666 if(str[i]=='\0')
667 {
668 break;
669 }
670 if(str[i]>='a'&&str[i]<='z')
671 {
672 str[i]=str[i]-32;
673 }
674 i++;
675 }
676 return 0;
677}
678
q.huang7de1d662022-09-13 14:19:24 +0800679int copyCellInfoList(Parcel* &p,uint64_t *cellinfo,int *tac,int *earfcn)
rjw7e50cd32022-01-18 18:30:37 +0800680{
681 int32_t v=0;
682 int64_t v6=0;
683 if(NULL == cellinfo)
684 {
685 LYERRLOG("*cellinfo error");
686 }
687
688 int nothing = 0;
rjw62a60152022-06-09 17:43:01 +0800689 int tmp_uint64 = 0;
q.huang7de1d662022-09-13 14:19:24 +0800690 p->readInt32(&v);
rjw7e50cd32022-01-18 18:30:37 +0800691 RIL_CellInfoType cellinfoType = RIL_CellInfoType(v);
q.huang7de1d662022-09-13 14:19:24 +0800692 p->readInt32(&nothing);
rjw7e50cd32022-01-18 18:30:37 +0800693 // cellinfo->cellinfo.cellInfoType = RIL_CellInfoType(v);
q.huang7de1d662022-09-13 14:19:24 +0800694 // p->readInt32(&cellinfo->cellinfo.registered);
695 p->readInt32(&v);
rjw7e50cd32022-01-18 18:30:37 +0800696 // cellinfo->cellinfo.timeStampType = RIL_TimeStampType(v);
q.huang7de1d662022-09-13 14:19:24 +0800697 p->readInt64(&v6);
rjw7e50cd32022-01-18 18:30:37 +0800698 // cellinfo->cellinfo.timeStamp = v6;
699 switch(cellinfoType) {
700 case RIL_CELL_INFO_TYPE_GSM: {
q.huang7de1d662022-09-13 14:19:24 +0800701 p->readInt32(&nothing);
702 p->readInt32(&nothing);
703 p->readInt32(&nothing);
704 p->readInt32(&tmp_uint64);
705 p->readInt32(&nothing);
706 p->readInt32(&nothing);
707 p->readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800708 *cellinfo = (uint64_t)tmp_uint64;
rjw61974852022-05-17 16:30:32 +0800709 tac = &nothing;
rjwa8011682022-05-31 17:31:28 +0800710 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800711 break;
712 }
713 case RIL_CELL_INFO_TYPE_WCDMA: {
q.huang7de1d662022-09-13 14:19:24 +0800714 p->readInt32(&nothing);
715 p->readInt32(&nothing);
716 p->readInt32(&nothing);
717 p->readInt32(&tmp_uint64);
718 p->readInt32(&nothing);
719 p->readInt32(&nothing);
720 p->readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800721 *cellinfo = (uint64_t)tmp_uint64;
rjw4200a082022-05-17 17:58:35 +0800722 tac = &nothing;
rjwa8011682022-05-31 17:31:28 +0800723 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800724 break;
725 }
726 case RIL_CELL_INFO_TYPE_CDMA: {
q.huang7de1d662022-09-13 14:19:24 +0800727 p->readInt32(&nothing);
728 p->readInt32(&nothing);
729 p->readInt32(&nothing);
730 p->readInt32(&nothing);
731 p->readInt32(&nothing);
732 p->readInt32(&nothing);
733 p->readInt32(&nothing);
734 p->readInt32(&nothing);
735 p->readInt32(&nothing);
736 p->readInt32(&nothing);
rjw7e50cd32022-01-18 18:30:37 +0800737 cellinfo = 0;
rjw61974852022-05-17 16:30:32 +0800738 tac = &nothing;
rjwa8011682022-05-31 17:31:28 +0800739 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800740 break;
741 }
742 case RIL_CELL_INFO_TYPE_LTE: {
q.huang7de1d662022-09-13 14:19:24 +0800743 p->readInt32(&nothing);
744 p->readInt32(&nothing);
745 p->readInt32(&tmp_uint64);
746 p->readInt32(&nothing);
747 p->readInt32(tac);
748 p->readInt32(earfcn);
749 p->readInt32(&nothing);
750 p->readInt32(&nothing);
751 p->readInt32(&nothing);
752 p->readInt32(&nothing);
753 p->readInt32(&nothing);
754 p->readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800755 *cellinfo = (uint64_t)tmp_uint64;
rjw7e50cd32022-01-18 18:30:37 +0800756 break;
757 }
758 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
q.huang7de1d662022-09-13 14:19:24 +0800759 p->readInt32(&nothing);
760 p->readInt32(&nothing);
761 p->readInt32(&nothing);
762 p->readInt32(&tmp_uint64);
763 p->readInt32(&nothing);
764 p->readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800765 *cellinfo = (uint64_t)tmp_uint64;
rjwa8011682022-05-31 17:31:28 +0800766 tac = &nothing;
767 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800768 break;
769 }
770 case RIL_CELL_INFO_TYPE_NR: {
q.huang7de1d662022-09-13 14:19:24 +0800771 p->readInt32(&nothing);
772 p->readInt32(&nothing);
773 p->readUint64(cellinfo);
774 p->readInt32(&nothing);
775 p->readInt32(tac);
776 p->readInt32(earfcn);
777 p->readInt32(&nothing);
778 p->readInt32(&nothing);
779 p->readInt32(&nothing);
780 p->readInt32(&nothing);
781 p->readInt32(&nothing);
782 p->readInt32(&nothing);
rjw7e50cd32022-01-18 18:30:37 +0800783 break;
784 }
785 }
rjw62a60152022-06-09 17:43:01 +0800786 LYINFLOG("CID in fUNC :%llu",*cellinfo);
rjwa8011682022-05-31 17:31:28 +0800787 LYINFLOG("tac in fUNC :%d",*tac);
788 LYINFLOG("earfcn in fUNC :%d",*earfcn);
rjw7e50cd32022-01-18 18:30:37 +0800789 return 0;
790}
791
792int lynq_network_deinit(void){
rjw22947c22022-03-15 09:21:29 +0800793 if (g_lynq_network_init_flag == 0)
794 {
795 LYERRLOG("deinit twice is not allowed");
796 return -1;
797 }
798 if (network_sock_fd > 0)
799 {
800 close(network_sock_fd);
801 }
802 g_lynq_network_init_flag = 0;
rjwbc8a05f2022-03-02 15:23:11 +0800803 network_urc_status = 0;
q.huang7de1d662022-09-13 14:19:24 +0800804 network_rc_status = 0;
q.huang47d4dfe2022-08-17 17:52:29 +0800805
806 deinit_network_timer_all();
q.huang7de1d662022-09-13 14:19:24 +0800807
808 BLOCK_RC_MSG_LOCK();
809 std::list<Parcel*>::iterator iter;
810 for(iter=g_recv_parcel_list.begin();iter!=g_recv_parcel_list.end();++iter)
811 {
812 delete (*iter);
813 }
814 g_recv_parcel_list.clear();
815 BLOCK_RC_MSG_UNLOCK();
816
rjw7e50cd32022-01-18 18:30:37 +0800817 return 0;
818}
819
q.huang7de1d662022-09-13 14:19:24 +0800820static char * lynqStrdupReadString(Parcel* &p) {
rjw7e50cd32022-01-18 18:30:37 +0800821 size_t stringlen;
822 const char16_t *s16;
823
q.huang7de1d662022-09-13 14:19:24 +0800824 s16 = p->readString16Inplace(&stringlen);
rjw7e50cd32022-01-18 18:30:37 +0800825 return strndup16to8(s16, stringlen);
826}
827
828int lynq_query_operater(char *OperatorFN,char *OperatorSH,char *MccMnc)
829{
830 int ret = -1;
831 if(NULL == OperatorFN||NULL == OperatorSH|| NULL == MccMnc)
rjw7e50cd32022-01-18 18:30:37 +0800832 {
q.huang7de1d662022-09-13 14:19:24 +0800833 LYERRLOG("%s some parameter OperatorFN OperatorSH MccMnc %s %s %s is NULL",__func__,OperatorFN,OperatorSH,MccMnc);
834 return ret;
835 }
836 lynq_resp_t head;
837 Parcel* p=NULL;
838
839 ret=lynq_get_common_request(RIL_REQUEST_OPERATOR,30,p,0,"");
840 if(ret==0)
rjw46769c92022-07-04 21:17:25 +0800841 {
q.huang7de1d662022-09-13 14:19:24 +0800842 if(p==NULL)
rjw7e50cd32022-01-18 18:30:37 +0800843 {
q.huang7de1d662022-09-13 14:19:24 +0800844 LYERRLOG("%s get p error",__func__);
845 return -1;
rjw7e50cd32022-01-18 18:30:37 +0800846 }
q.huang7de1d662022-09-13 14:19:24 +0800847 ret=GetHeader(p,head);
848 if(ret!=0)
849 {
850 LYERRLOG("%s get head error",__func__,ret);
851 delete p;
852 return -1;
853 }
854 if(head.error!=0)
855 {
856 LYERRLOG("%s mdm return head error %d",__func__,head.error);
857 delete p;
858 return head.error;
859 }
860
861 int num ;
862 char *resp[LYNQ_RESP_BUF];
863
864 p->readInt32(&num);
rjw7e50cd32022-01-18 18:30:37 +0800865 if(num == 0)
866 {
867 LYERRLOG("no paramters");
868 }else{
869 for(int i = 0; i<num;i++)
870 {
871 resp[i] = lynqStrdupReadString(p);
872 }
873 if(NULL != resp[0])
874 {
rjw02a50422022-01-25 14:57:53 +0800875 strcpy(OperatorFN,resp[0]);
rjw7e50cd32022-01-18 18:30:37 +0800876 }
877 if(NULL != resp[1])
878 {
rjw02a50422022-01-25 14:57:53 +0800879 strcpy(OperatorSH,resp[1]);
rjw7e50cd32022-01-18 18:30:37 +0800880 }
881 if(NULL != resp[2])
882 {
rjw02a50422022-01-25 14:57:53 +0800883 strcpy(MccMnc,resp[2]);
rjw7e50cd32022-01-18 18:30:37 +0800884 }
885 }
q.huang7de1d662022-09-13 14:19:24 +0800886
887 LYINFLOG("%s suc",__func__);
888 delete p;
889 return 0;
rjw7e50cd32022-01-18 18:30:37 +0800890 }
q.huang7de1d662022-09-13 14:19:24 +0800891
892 LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);
893 return ret;
rjw7e50cd32022-01-18 18:30:37 +0800894}
895
896int lynq_query_network_selection_mode(int *netselMode)
897{
898 int ret = -1;
899 if(NULL == netselMode)
rjw7e50cd32022-01-18 18:30:37 +0800900 {
q.huang7de1d662022-09-13 14:19:24 +0800901 LYERRLOG("%s parameter is NULL",__func__);
902 return ret;
903 }
904 lynq_resp_t head;
905 Parcel* p=NULL;
906
907 ret=lynq_get_common_request(RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE,30,p,0,"");
908 if(ret==0)
rjw46769c92022-07-04 21:17:25 +0800909 {
q.huang7de1d662022-09-13 14:19:24 +0800910 if(p==NULL)
rjw7e50cd32022-01-18 18:30:37 +0800911 {
q.huang7de1d662022-09-13 14:19:24 +0800912 LYERRLOG("%s get p error",__func__);
913 return -1;
rjw7e50cd32022-01-18 18:30:37 +0800914 }
q.huang7de1d662022-09-13 14:19:24 +0800915 ret=GetHeader(p,head);
916 if(ret!=0)
917 {
918 LYERRLOG("%s get head error",__func__,ret);
919 delete p;
920 return -1;
921 }
922 if(head.error!=0)
923 {
924 LYERRLOG("%s mdm return head error %d",__func__,head.error);
925 delete p;
926 return head.error;
927 }
928
929 int readnum;
930 p->readInt32(&readnum);
931 p->readInt32(netselMode);
932
933 LYINFLOG("%s suc",__func__);
934 delete p;
935 return 0;
rjw7e50cd32022-01-18 18:30:37 +0800936 }
q.huang7de1d662022-09-13 14:19:24 +0800937 return ret;
rjw7e50cd32022-01-18 18:30:37 +0800938}
939
940int lynq_set_network_selection_mode(const char *mode,const char* mccmnc)
941{
q.huang7de1d662022-09-13 14:19:24 +0800942 int ret = -1;
943 if(NULL == mode || (strlen(mode) == 0))
rjw78d04502022-02-24 13:37:11 +0800944 {
q.huang7de1d662022-09-13 14:19:24 +0800945 LYERRLOG("%s parameter mod %s is error",__func__,mode);
946 return -1;
rjw78d04502022-02-24 13:37:11 +0800947 }
q.huang7de1d662022-09-13 14:19:24 +0800948
949 if(!strcmp(mode,"Manual"))
950 {
951 if(mccmnc == NULL || strlen(mccmnc) == 0)
952 {
953 LYERRLOG("%s parameter mccmnc %s is error",__func__,mccmnc);
954 return -1;
955 }
956 }
957
958 lynq_resp_t head;
959 Parcel* p=NULL;
960
rjw7e50cd32022-01-18 18:30:37 +0800961 if(!strcmp(mode,"Auto"))
962 {
q.huang7de1d662022-09-13 14:19:24 +0800963 ret=lynq_get_common_request(RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC,30,p,0,"");
964 }
965 else if(!strcmp(mode,"Manual"))
966 {
967 ret=lynq_get_common_request(RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL,30,p,1,"%s",mccmnc);
968 }
969 else
970 {
971 LYERRLOG("%s parameter mode %s is NULL",__func__,mode);
972 return -1;
973 }
974
975
976 if(ret==0)
977 {
978 if(p==NULL)
rjw78d04502022-02-24 13:37:11 +0800979 {
q.huang7de1d662022-09-13 14:19:24 +0800980 LYERRLOG("%s get p error",__func__);
981 return -1;
rjw78d04502022-02-24 13:37:11 +0800982 }
q.huang7de1d662022-09-13 14:19:24 +0800983 ret=GetHeader(p,head);
984 if(ret!=0)
rjw78d04502022-02-24 13:37:11 +0800985 {
q.huang7de1d662022-09-13 14:19:24 +0800986 LYERRLOG("%s get head error %d",__func__,ret);
987 delete p;
988 return -1;
rjw78d04502022-02-24 13:37:11 +0800989 }
q.huang7de1d662022-09-13 14:19:24 +0800990 if(head.error!=0)
991 {
992 LYERRLOG("%s mdm return head error %d",__func__,head.error);
993 delete p;
994 return head.error;
995 }
996 LYINFLOG("%s set mode %s mccmnc %s suc",__func__,mode,mccmnc);
997 delete p;
998 return 0;
rjw7e50cd32022-01-18 18:30:37 +0800999 }
1000
q.huang7de1d662022-09-13 14:19:24 +08001001 LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);
1002 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001003}
1004
1005int lynq_query_available_network(char *OperatorFN,char *OperatorSH,char *MccMnc,char * NetStatus)
1006{
1007 int ret = -1;
1008 if(NULL == OperatorFN||NULL == OperatorSH||NULL == MccMnc||NULL == NetStatus)
rjw7e50cd32022-01-18 18:30:37 +08001009 {
q.huang7de1d662022-09-13 14:19:24 +08001010 LYERRLOG("%s there is parameter is NULL",__func__);
rjw7e50cd32022-01-18 18:30:37 +08001011 return ret;
q.huang7de1d662022-09-13 14:19:24 +08001012 }
1013
1014 lynq_resp_t head;
1015 Parcel* p=NULL;
rjw7e50cd32022-01-18 18:30:37 +08001016
q.huang7de1d662022-09-13 14:19:24 +08001017 ret=lynq_get_common_request(RIL_REQUEST_QUERY_AVAILABLE_NETWORKS,600,p,0,"");
1018 if(ret==0)
rjw46769c92022-07-04 21:17:25 +08001019 {
q.huang7de1d662022-09-13 14:19:24 +08001020 if(p==NULL)
rjw7e50cd32022-01-18 18:30:37 +08001021 {
q.huang7de1d662022-09-13 14:19:24 +08001022 LYERRLOG("%s get p error",__func__);
1023 return -1;
rjw7e50cd32022-01-18 18:30:37 +08001024 }
q.huang7de1d662022-09-13 14:19:24 +08001025 ret=GetHeader(p,head);
1026 if(ret!=0)
1027 {
1028 LYERRLOG("%s get head error %d",__func__,ret);
1029 delete p;
1030 return -1;
1031 }
1032 if(head.error!=0)
1033 {
1034 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1035 delete p;
1036 return head.error;
1037 }
1038
1039 int num =p->readInt32();
1040 char *resp[128];
rjw7e50cd32022-01-18 18:30:37 +08001041 if(num == 0)
1042 {
q.huang7de1d662022-09-13 14:19:24 +08001043 LYERRLOG("%s get num is 0",__func__);
1044 delete p;
1045 return -1;
rjw7e50cd32022-01-18 18:30:37 +08001046 }else{
1047 for(int i = 0; i<num;i++)
1048 {
1049 resp[i] = lynqStrdupReadString(p);
1050 }
1051 if(NULL != resp[0])
1052 {
rjw02a50422022-01-25 14:57:53 +08001053 strcpy(OperatorFN,resp[0]);
rjw7e50cd32022-01-18 18:30:37 +08001054 }
1055 if(NULL != resp[1])
1056 {
rjw02a50422022-01-25 14:57:53 +08001057 strcpy(OperatorSH,resp[1]);
rjw7e50cd32022-01-18 18:30:37 +08001058 }
1059 if(NULL != resp[2])
1060 {
rjw02a50422022-01-25 14:57:53 +08001061 strcpy(MccMnc,resp[2]);
rjw7e50cd32022-01-18 18:30:37 +08001062 }
1063 if(NULL != resp[3])
1064 {
rjw02a50422022-01-25 14:57:53 +08001065 strcpy(NetStatus,resp[2]);
rjw7e50cd32022-01-18 18:30:37 +08001066 }
1067 }
q.huang7de1d662022-09-13 14:19:24 +08001068 delete p;
1069 LYINFLOG("%s suc",__func__);
1070 return 0;
rjw7e50cd32022-01-18 18:30:37 +08001071 }
q.huang7de1d662022-09-13 14:19:24 +08001072
1073 LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);
1074 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001075}
1076
rjw4544e132022-04-01 15:00:26 +08001077int 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 +08001078{
1079 int ret = -1;
rjwd98d5872022-04-09 13:50:58 +08001080 if(NULL == type || NULL ==regState ||NULL ==imsRegState ||NULL ==LAC ||NULL ==CID ||NULL ==netType ||NULL ==radioTechFam || NULL == netRejected)
q.huang7de1d662022-09-13 14:19:24 +08001081 {
1082 LYERRLOG("%s there is parameter is NULL",__func__);
rjw7e50cd32022-01-18 18:30:37 +08001083 return ret;
q.huang7de1d662022-09-13 14:19:24 +08001084 }
rjw7e50cd32022-01-18 18:30:37 +08001085 if(strlen(type)>LYNQ_TYPE_BUF)
1086 {
1087 LYERRLOG("[%s]the parameter is inavaliable !",__FUNCTION__);
q.huang7de1d662022-09-13 14:19:24 +08001088 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001089 }
q.huang7de1d662022-09-13 14:19:24 +08001090
1091 lynq_resp_t head;
1092 Parcel* p=NULL;
1093
1094 int request;
1095 char str[LYNQ_TYPE_BUF];
rjw7e50cd32022-01-18 18:30:37 +08001096 memcpy(str,type,strlen(type)+1);
1097 strUpper(str);
1098 if(!strcmp(str,"VOICE"))
1099 {
q.huang47d4dfe2022-08-17 17:52:29 +08001100 if(lynq_get_registration_state_to_buf_voice(regState,netType,netRejected)==0)
1101 {
1102 return 0;
1103 }
q.huang7de1d662022-09-13 14:19:24 +08001104 request = RIL_REQUEST_VOICE_REGISTRATION_STATE;
rjw7e50cd32022-01-18 18:30:37 +08001105 }else if(!strcmp(str,"DATA")){
q.huang47d4dfe2022-08-17 17:52:29 +08001106 if(lynq_get_registration_state_to_buf_data(regState,LAC,CID,netType)==0)
1107 {
1108 return 0;
1109 }
q.huang7de1d662022-09-13 14:19:24 +08001110 request = RIL_REQUEST_DATA_REGISTRATION_STATE;
rjw7e50cd32022-01-18 18:30:37 +08001111 }else if(!strcmp(str,"IMS")){
q.huang47d4dfe2022-08-17 17:52:29 +08001112 if(lynq_get_registration_state_to_buf_ims(imsRegState,radioTechFam)==0)
1113 {
1114 return 0;
1115 }
q.huang7de1d662022-09-13 14:19:24 +08001116 request = RIL_REQUEST_IMS_REGISTRATION_STATE;
rjw7e50cd32022-01-18 18:30:37 +08001117 }else{
1118 LYERRLOG("request error");
1119 return ret;
q.huang7de1d662022-09-13 14:19:24 +08001120 }
rjw7e50cd32022-01-18 18:30:37 +08001121
q.huang7de1d662022-09-13 14:19:24 +08001122 ret=lynq_get_common_request(request,30,p,0,"");
1123 if(ret==0)
rjw7e50cd32022-01-18 18:30:37 +08001124 {
q.huang7de1d662022-09-13 14:19:24 +08001125 if(p==NULL)
rjw7e50cd32022-01-18 18:30:37 +08001126 {
q.huang7de1d662022-09-13 14:19:24 +08001127 LYERRLOG("%s get p error",__func__);
1128 return -1;
rjw7e50cd32022-01-18 18:30:37 +08001129 }
q.huang7de1d662022-09-13 14:19:24 +08001130 ret=GetHeader(p,head);
1131 if(ret!=0)
1132 {
1133 LYERRLOG("%s get head error %d",__func__,ret);
1134 delete p;
1135 return -1;
1136 }
1137 if(head.error!=0)
1138 {
1139 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1140 delete p;
1141 return head.error;
1142 }
1143 int num;
rjw7e50cd32022-01-18 18:30:37 +08001144 if(!strcmp(str,"VOICE"))
1145 {
q.huang7de1d662022-09-13 14:19:24 +08001146 p->readInt32(&num);
rjw7e50cd32022-01-18 18:30:37 +08001147 if(num == 15)
1148 {
1149 *regState = atoi(lynqStrdupReadString(p));
1150 lynqStrdupReadString(p);
1151 lynqStrdupReadString(p);
1152 *netType = atoi(lynqStrdupReadString(p));
rjw4544e132022-04-01 15:00:26 +08001153 lynqStrdupReadString(p);
1154 lynqStrdupReadString(p);
1155 lynqStrdupReadString(p);
1156 lynqStrdupReadString(p);
1157 lynqStrdupReadString(p);
1158 lynqStrdupReadString(p);
1159 lynqStrdupReadString(p);
1160 lynqStrdupReadString(p);
1161 lynqStrdupReadString(p);
1162 lynqStrdupReadString(p);
q.huang47d4dfe2022-08-17 17:52:29 +08001163 *netRejected = atoi(lynqStrdupReadString(p));
1164 lynq_set_registration_state_to_buf_voice(*regState,*netType,*netRejected);
rjw7e50cd32022-01-18 18:30:37 +08001165 }
q.huang7de1d662022-09-13 14:19:24 +08001166 else
1167 {
1168 LYERRLOG("%s type %s num %d error",__func__,str,num);
1169 delete p;
1170 return -1;
1171 }
1172 }
1173 else if(!strcmp(str,"DATA")){
1174 p->readInt32(&num);
rjw7e50cd32022-01-18 18:30:37 +08001175 if(num == 11)
1176 {
q.huang7de1d662022-09-13 14:19:24 +08001177 char *resp[LYNQ_RESP_BUF];
rjw7e50cd32022-01-18 18:30:37 +08001178 *regState = atoi(lynqStrdupReadString(p));
rjwcdd83ae2022-01-22 14:10:42 +08001179 resp[0] = lynqStrdupReadString(p);
rjw02a50422022-01-25 14:57:53 +08001180 strcpy(LAC,resp[0]);
rjwcdd83ae2022-01-22 14:10:42 +08001181
1182 resp[1] = lynqStrdupReadString(p);
rjw02a50422022-01-25 14:57:53 +08001183 strcpy(CID,resp[1]);
rjw7e50cd32022-01-18 18:30:37 +08001184 *netType = atoi(lynqStrdupReadString(p));
q.huang47d4dfe2022-08-17 17:52:29 +08001185 lynq_set_registration_state_to_buf_data(*regState,LAC,CID,*netType);
rjw7e50cd32022-01-18 18:30:37 +08001186 }
q.huang7de1d662022-09-13 14:19:24 +08001187 else
1188 {
1189 LYERRLOG("%s type %s num %d error",__func__,str,num);
1190 delete p;
1191 return -1;
1192 }
rjw7e50cd32022-01-18 18:30:37 +08001193
q.huang7de1d662022-09-13 14:19:24 +08001194 }
1195 else // "IMS"
1196 {
1197 p->readInt32(&num);
rjw7e50cd32022-01-18 18:30:37 +08001198 if(num == 2)
1199 {
q.huang7de1d662022-09-13 14:19:24 +08001200 p->readInt32(imsRegState);
1201 p->readInt32(radioTechFam);
q.huang47d4dfe2022-08-17 17:52:29 +08001202 lynq_set_registration_state_to_buf_ims(*imsRegState,*radioTechFam);
rjw7e50cd32022-01-18 18:30:37 +08001203 }
q.huang7de1d662022-09-13 14:19:24 +08001204 else
1205 {
1206 LYERRLOG("%s type %s num %d error",__func__,str,num);
1207 delete p;
1208 return -1;
1209 }
rjw7e50cd32022-01-18 18:30:37 +08001210 }
q.huang7de1d662022-09-13 14:19:24 +08001211 LYINFLOG("%s suc",__func__);
1212 delete p;
1213 return 0;
rjw7e50cd32022-01-18 18:30:37 +08001214 }
q.huang7de1d662022-09-13 14:19:24 +08001215
1216 LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);
1217 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001218}
1219
1220int lynq_query_prefferred_networktype(int *preNetType)
q.huang7de1d662022-09-13 14:19:24 +08001221{
rjw7e50cd32022-01-18 18:30:37 +08001222 int ret = -1;
q.huang7de1d662022-09-13 14:19:24 +08001223 if(NULL == preNetType)
rjw7e50cd32022-01-18 18:30:37 +08001224 {
q.huang7de1d662022-09-13 14:19:24 +08001225 LYERRLOG("%s there is parameter is NULL",__func__);
rjw7e50cd32022-01-18 18:30:37 +08001226 return ret;
q.huang7de1d662022-09-13 14:19:24 +08001227 }
1228
1229 lynq_resp_t head;
1230 Parcel* p=NULL;
1231
1232 ret=lynq_get_common_request(RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE,30,p,0,"");
1233 if(ret==0)
1234 {
1235 if(p==NULL)
1236 {
1237 LYERRLOG("%s get p error",__func__);
1238 return -1;
1239 }
1240 ret=GetHeader(p,head);
1241 if(ret!=0)
1242 {
1243 LYERRLOG("%s get head error %d",__func__,ret);
1244 delete p;
1245 return -1;
1246 }
1247 if(head.error!=0)
1248 {
1249 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1250 delete p;
1251 return head.error;
1252 }
1253 int num;
1254 p->readInt32(&num);
1255 p->readInt32(preNetType);
1256 LYINFLOG("%s suc",__func__);
1257 delete p;
1258 return 0;
rjw7e50cd32022-01-18 18:30:37 +08001259 }
1260
q.huang7de1d662022-09-13 14:19:24 +08001261 LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);
1262 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001263}
1264
1265int lynq_set_prefferred_networktype(const int preffertype)
1266{
1267 int ret = -1;
1268 if(preffertype < 0||preffertype >33)
rjw7e50cd32022-01-18 18:30:37 +08001269 {
q.huang7de1d662022-09-13 14:19:24 +08001270 LYERRLOG("%s parameter %d error",__func__,preffertype);
rjw7e50cd32022-01-18 18:30:37 +08001271 return ret;
q.huang7de1d662022-09-13 14:19:24 +08001272 }
1273
1274 lynq_resp_t head;
1275 Parcel* p=NULL;
1276
1277 ret=lynq_get_common_request(RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE,30,p,1,"%d",preffertype);
1278 if(ret==0)
rjw7e50cd32022-01-18 18:30:37 +08001279 {
q.huang7de1d662022-09-13 14:19:24 +08001280 if(p==NULL)
rjw7a8791e2022-09-06 09:07:39 +08001281 {
q.huang7de1d662022-09-13 14:19:24 +08001282 LYERRLOG("%s get p error",__func__);
1283 return -1;
rjw7a8791e2022-09-06 09:07:39 +08001284 }
q.huang7de1d662022-09-13 14:19:24 +08001285 ret=GetHeader(p,head);
1286 if(ret!=0)
1287 {
1288 LYERRLOG("%s get head error %d",__func__,ret);
1289 delete p;
1290 return -1;
1291 }
1292 if(head.error!=0)
1293 {
1294 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1295 delete p;
1296 return head.error;
1297 }
1298 LYINFLOG("%s set %d suc",__func__,preffertype);
1299 delete p;
1300 return 0;
rjw7e50cd32022-01-18 18:30:37 +08001301 }
1302
q.huang7de1d662022-09-13 14:19:24 +08001303 LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);
1304 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001305
1306}
1307
rjw62a60152022-06-09 17:43:01 +08001308int 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 +08001309{
1310 int ret = -1;
1311 if(NULL == realNum)
rjw7e50cd32022-01-18 18:30:37 +08001312 {
q.huang7de1d662022-09-13 14:19:24 +08001313 LYERRLOG("%s there is parameter is NULL",__func__);
rjw7e50cd32022-01-18 18:30:37 +08001314 return ret;
q.huang7de1d662022-09-13 14:19:24 +08001315 }
1316
1317 lynq_resp_t head;
1318 Parcel* p=NULL;
1319
1320 ret=lynq_get_common_request(RIL_REQUEST_GET_CELL_INFO_LIST,30,p,0,"");
1321 if(ret==0)
rjw46769c92022-07-04 21:17:25 +08001322 {
q.huang7de1d662022-09-13 14:19:24 +08001323 if(p==NULL)
rjw7e50cd32022-01-18 18:30:37 +08001324 {
q.huang7de1d662022-09-13 14:19:24 +08001325 LYERRLOG("%s get p error",__func__);
1326 return -1;
rjw7e50cd32022-01-18 18:30:37 +08001327 }
q.huang7de1d662022-09-13 14:19:24 +08001328 ret=GetHeader(p,head);
1329 if(ret!=0)
1330 {
1331 LYERRLOG("%s get head error %d",__func__,ret);
1332 delete p;
1333 return -1;
1334 }
1335 if(head.error!=0)
1336 {
1337 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1338 delete p;
1339 return head.error;
1340 }
1341
1342 int num;
1343
1344 p->readInt32(&num);
rjw7e50cd32022-01-18 18:30:37 +08001345 LYINFLOG("cell info num:%d",num);
1346 *realNum = num;
1347 for(int i = 0;i<num;i++)
1348 {
rjwa8011682022-05-31 17:31:28 +08001349 copyCellInfoList(p,&cellinfo[i],&tac[i],&earfcn[i]);
rjw7e50cd32022-01-18 18:30:37 +08001350 }
q.huang7de1d662022-09-13 14:19:24 +08001351
1352 LYINFLOG("%s suc",__func__);
1353 delete p;
1354 return 0;
rjw7e50cd32022-01-18 18:30:37 +08001355 }
q.huang7de1d662022-09-13 14:19:24 +08001356
1357 LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);
1358 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001359
1360}
1361
1362int lynq_set_unsol_cell_info_listrate(const int rate)
1363{
q.huang7de1d662022-09-13 14:19:24 +08001364 int ret = -1;
1365 lynq_resp_t head;
1366 Parcel* p=NULL;
1367
1368 ret=lynq_get_common_request(RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE,30,p,1,"%d",rate);
1369 if(ret==0)
rjw7e50cd32022-01-18 18:30:37 +08001370 {
q.huang7de1d662022-09-13 14:19:24 +08001371 if(p==NULL)
rjw7a8791e2022-09-06 09:07:39 +08001372 {
q.huang7de1d662022-09-13 14:19:24 +08001373 LYERRLOG("%s get p error",__func__);
1374 return -1;
rjw7a8791e2022-09-06 09:07:39 +08001375 }
q.huang7de1d662022-09-13 14:19:24 +08001376 ret=GetHeader(p,head);
1377 if(ret!=0)
1378 {
1379 LYERRLOG("%s get head error %d",__func__,ret);
1380 delete p;
1381 return -1;
1382 }
1383 if(head.error!=0)
1384 {
1385 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1386 delete p;
1387 return head.error;
1388 }
1389 LYINFLOG("%s set %d suc",__func__,rate);
1390 delete p;
1391 return 0;
rjw7e50cd32022-01-18 18:30:37 +08001392 }
1393
q.huang7de1d662022-09-13 14:19:24 +08001394 LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);
1395 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001396}
1397
1398int lynq_set_band_mode(const int bandmode)
1399{
q.huang7de1d662022-09-13 14:19:24 +08001400 int ret = -1;
1401 lynq_resp_t head;
1402 Parcel* p=NULL;
1403
1404 ret=lynq_get_common_request(RIL_REQUEST_SET_BAND_MODE,30,p,1,"%d",bandmode);
1405 if(ret==0)
rjw7e50cd32022-01-18 18:30:37 +08001406 {
q.huang7de1d662022-09-13 14:19:24 +08001407 if(p==NULL)
rjw7a8791e2022-09-06 09:07:39 +08001408 {
q.huang7de1d662022-09-13 14:19:24 +08001409 LYERRLOG("%s get p error",__func__);
1410 return -1;
rjw7a8791e2022-09-06 09:07:39 +08001411 }
q.huang7de1d662022-09-13 14:19:24 +08001412 ret=GetHeader(p,head);
1413 if(ret!=0)
1414 {
1415 LYERRLOG("%s get head error %d",__func__,ret);
1416 delete p;
1417 return -1;
1418 }
1419 if(head.error!=0)
1420 {
1421 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1422 delete p;
1423 return head.error;
1424 }
1425 LYINFLOG("%s set %d suc",__func__,bandmode);
1426 delete p;
1427 return 0;
rjw7e50cd32022-01-18 18:30:37 +08001428 }
1429
q.huang7de1d662022-09-13 14:19:24 +08001430 LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);
1431 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001432}
1433
1434int lynq_query_available_bandmode(int availBanMode[])
1435{
q.huang7de1d662022-09-13 14:19:24 +08001436 int ret=-1;
1437
rjw7e50cd32022-01-18 18:30:37 +08001438 if(NULL == availBanMode)
rjw7e50cd32022-01-18 18:30:37 +08001439 {
q.huang7de1d662022-09-13 14:19:24 +08001440 LYERRLOG("%s parameter is NULL",__func__);
rjw7e50cd32022-01-18 18:30:37 +08001441 return ret;
1442 }
1443
q.huang7de1d662022-09-13 14:19:24 +08001444 lynq_resp_t head;
1445 Parcel* p=NULL;
1446
1447 ret=lynq_get_common_request(RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE,30,p,0,"");
1448 if(ret==0)
rjw7e50cd32022-01-18 18:30:37 +08001449 {
q.huang7de1d662022-09-13 14:19:24 +08001450 if(p==NULL)
rjw7e50cd32022-01-18 18:30:37 +08001451 {
q.huang7de1d662022-09-13 14:19:24 +08001452 LYERRLOG("%s get p error",__func__);
1453 return -1;
rjw7e50cd32022-01-18 18:30:37 +08001454 }
q.huang7de1d662022-09-13 14:19:24 +08001455 ret=GetHeader(p,head);
1456 if(ret!=0)
1457 {
1458 LYERRLOG("%s get head error",__func__,ret);
1459 delete p;
1460 return -1;
1461 }
1462 if(head.error!=0)
1463 {
1464 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1465 delete p;
1466 return head.error;
1467 }
1468
1469 int num = 0;
1470 int res = 0;
1471 int i;
1472
1473 p->readInt32(&num);
rjw7e50cd32022-01-18 18:30:37 +08001474 LYINFLOG("num = %d",num);
1475 availBanMode[0] = num;
q.huang7de1d662022-09-13 14:19:24 +08001476 for(i=1 ;i<=num;i++)
rjw7e50cd32022-01-18 18:30:37 +08001477 {
q.huang7de1d662022-09-13 14:19:24 +08001478 p->readInt32(&res);
rjw7e50cd32022-01-18 18:30:37 +08001479 availBanMode[i]=res;
1480 }
q.huang7de1d662022-09-13 14:19:24 +08001481
1482 LYINFLOG("%s suc",__func__);
1483 delete p;
1484 return -1;
rjw7e50cd32022-01-18 18:30:37 +08001485 }
1486
q.huang7de1d662022-09-13 14:19:24 +08001487 LYERRLOG("%s send request error %d",__func__,ret);
1488
1489 return ret;
1490
rjw7e50cd32022-01-18 18:30:37 +08001491}
1492
1493int lynq_radio_on(const int data)
q.huang7de1d662022-09-13 14:19:24 +08001494{
rjw7e50cd32022-01-18 18:30:37 +08001495 int ret = -1;
q.huang7de1d662022-09-13 14:19:24 +08001496 if (data < 0 || data > 1)
rjw7e50cd32022-01-18 18:30:37 +08001497 {
q.huang7de1d662022-09-13 14:19:24 +08001498 LYERRLOG("%s parameter %d error",__func__,data);
rjw7e50cd32022-01-18 18:30:37 +08001499 return ret;
q.huang7de1d662022-09-13 14:19:24 +08001500 }
1501
1502 lynq_resp_t head;
1503 Parcel* p=NULL;
1504
1505 ret=lynq_get_common_request(RIL_REQUEST_RADIO_POWER,30,p,1,"%d",data);
1506 if(ret==0)
rjw46769c92022-07-04 21:17:25 +08001507 {
q.huang7de1d662022-09-13 14:19:24 +08001508 if(p==NULL)
rjw7a8791e2022-09-06 09:07:39 +08001509 {
q.huang7de1d662022-09-13 14:19:24 +08001510 LYERRLOG("%s get p error",__func__);
1511 return -1;
rjw7a8791e2022-09-06 09:07:39 +08001512 }
q.huang7de1d662022-09-13 14:19:24 +08001513 ret=GetHeader(p,head);
1514 if(ret!=0)
1515 {
1516 LYERRLOG("%s get head error %d",__func__,ret);
1517 delete p;
1518 return -1;
1519 }
1520 if(head.error!=0)
1521 {
1522 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1523 delete p;
1524 return head.error;
1525 }
1526 LYINFLOG("%s set %d suc",__func__,data);
1527 delete p;
1528 return 0;
rjw7e50cd32022-01-18 18:30:37 +08001529 }
1530
q.huang7de1d662022-09-13 14:19:24 +08001531 LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);
1532 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001533}
1534
q.huang7de1d662022-09-13 14:19:24 +08001535const char * lynq_get_raw_data(Parcel* &p, int* data_len)
q.huang16dcb0f2022-09-07 09:17:37 +08001536{
1537 int32_t len;
1538 int status;
1539 char *data;
1540
1541 *data_len=0;
1542
q.huang7de1d662022-09-13 14:19:24 +08001543 status = p->readInt32(&len);
q.huang16dcb0f2022-09-07 09:17:37 +08001544
1545 if (status != 0) {
1546 LYERRLOG("%s status is %d",__func__,status);
1547 return NULL;
1548 }
1549
1550 // The java code writes -1 for null arrays
1551 if (((int)len) == -1 || ((int)len) == 0)
1552 {
1553 LYERRLOG("%s len is %d",__func__,len);
1554 return NULL;
1555 }
1556 LYINFLOG("%s len is %d",__func__,len);
1557
q.huang7de1d662022-09-13 14:19:24 +08001558 data = (char*) p->readInplace(len);
q.huang16dcb0f2022-09-07 09:17:37 +08001559 *data_len=len;
1560
1561 return data;
1562}
1563
1564int lynq_query_radio_state(int *radio_state)
1565{
q.huang7de1d662022-09-13 14:19:24 +08001566 int ret=-1;
1567
q.huang16dcb0f2022-09-07 09:17:37 +08001568 if(NULL == radio_state)
1569 {
1570 LYERRLOG("%s radio state is NULL",__func__);
q.huang7de1d662022-09-13 14:19:24 +08001571 return ret;
q.huang16dcb0f2022-09-07 09:17:37 +08001572 }
1573
q.huang7de1d662022-09-13 14:19:24 +08001574 lynq_resp_t head;
1575 Parcel* p=NULL;
1576
q.huang16dcb0f2022-09-07 09:17:37 +08001577 ret=lynq_get_common_request(RIL_REQUEST_OEM_HOOK_RAW,5,p,1,"%s","AT+CFUN");
1578 if(ret==0)
1579 {
q.huang7de1d662022-09-13 14:19:24 +08001580 if(p==NULL)
q.huang16dcb0f2022-09-07 09:17:37 +08001581 {
q.huang7de1d662022-09-13 14:19:24 +08001582 LYERRLOG("%s get p error",__func__);
q.huang16dcb0f2022-09-07 09:17:37 +08001583 return -1;
q.huang16dcb0f2022-09-07 09:17:37 +08001584 }
q.huang7de1d662022-09-13 14:19:24 +08001585 ret=GetHeader(p,head);
1586 if(ret!=0)
1587 {
1588 LYERRLOG("%s get head error",__func__,ret);
1589 delete p;
1590 return -1;
1591 }
1592 if(head.error!=0)
1593 {
1594 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1595 delete p;
1596 return head.error;
1597 }
1598
1599 int bfind=false;
1600 const char* data;
1601 int data_len;
1602 char* data_str;
1603 char* start;
1604 int length;
1605 int i;
1606 int num_start;
1607 data = lynq_get_raw_data(p,&data_len);
1608 if(data==NULL || data_len == 0)
1609 {
1610 LYERRLOG("%s lynq_get_raw_data NULL or data_len is 0",__func__);
1611 delete p;
1612 return -1;
1613 }
1614 data_str = (char*) calloc(1,data_len+1);
1615 if (NULL == data_str)
1616 {
1617 LYERRLOG("%s alloc mem error, data_len is %d",__func__,data_len+1);
1618 delete p;
1619 return -1;
1620 }
1621 memmove(data_str, data, data_len);
1622 data_str[data_len]='\0';
1623 LYINFLOG("%s return string is %s",__func__,data_str);
1624 start = strstr(data_str,"CFUN");
1625 if(start!=NULL)
1626 {
1627 start=start+4;
1628 length=strlen(start);
1629 for(i=0; i<length;i++)
1630 {
1631 if((!bfind) && (start[i] >= '0') && (start[i] <= '9'))
1632 {
1633 bfind=true;
1634 num_start=i;
1635 }
1636 else if(bfind && ((start[i] < '0') || (start[i] > '9')))
1637 {
1638 start[i]='\0';
1639 break;
1640 }
1641 }
1642 if(bfind)
1643 {
1644 (*radio_state) = atoi(start+num_start);
1645 LYINFLOG("%s, radio state is %s %d",__func__,start+num_start,*radio_state);
1646 free(data_str);
1647 delete p;
1648 return 0;
1649 }
1650 }
1651 LYERRLOG("%s return string %s no cfun or no digit",__func__,data_str);
1652 free(data_str);
1653 delete p;
1654 return -1;
q.huang16dcb0f2022-09-07 09:17:37 +08001655 }
1656
1657 LYERRLOG("%s send request error %d",__func__,ret);
1658
1659 return ret;
1660}
1661
rjw7e50cd32022-01-18 18:30:37 +08001662int lynq_query_radio_tech(int* radioTech)
1663{
1664 int ret = -1;
1665 if(NULL == radioTech)
rjw7e50cd32022-01-18 18:30:37 +08001666 {
q.huang7de1d662022-09-13 14:19:24 +08001667 LYERRLOG("%s radio tech is NULL",__func__);
1668 return ret;
1669 }
rjw7e50cd32022-01-18 18:30:37 +08001670
q.huang7de1d662022-09-13 14:19:24 +08001671 lynq_resp_t head;
1672 Parcel* p=NULL;
1673
1674 ret=lynq_get_common_request(RIL_REQUEST_VOICE_RADIO_TECH,30,p,0,"");
1675 if(ret==0)
rjw46769c92022-07-04 21:17:25 +08001676 {
q.huang7de1d662022-09-13 14:19:24 +08001677 if(p==NULL)
rjw7e50cd32022-01-18 18:30:37 +08001678 {
q.huang7de1d662022-09-13 14:19:24 +08001679 LYERRLOG("%s get p error",__func__);
1680 return -1;
rjw7e50cd32022-01-18 18:30:37 +08001681 }
q.huang7de1d662022-09-13 14:19:24 +08001682 ret=GetHeader(p,head);
1683 if(ret!=0)
1684 {
1685 LYERRLOG("%s get head error",__func__,ret);
1686 delete p;
1687 return -1;
1688 }
1689 if(head.error!=0)
1690 {
1691 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1692 delete p;
1693 return head.error;
1694 }
1695
1696 int num;
1697 p->readInt32(&num);
1698 p->readInt32(radioTech);
1699
1700 LYINFLOG("%s suc",__func__);
1701 delete p;
1702 return head.error;
rjw7e50cd32022-01-18 18:30:37 +08001703 }
q.huang7de1d662022-09-13 14:19:24 +08001704 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001705}
1706
1707int lynq_solicited_signal_strength(signalStrength_t *solSigStren)
1708{
q.huang7de1d662022-09-13 14:19:24 +08001709 int ret=-1;
1710
rjw7e50cd32022-01-18 18:30:37 +08001711 if(NULL == solSigStren)
rjw7e50cd32022-01-18 18:30:37 +08001712 {
q.huang7de1d662022-09-13 14:19:24 +08001713 LYERRLOG("%s parameter is NULL",__func__);
rjw7e50cd32022-01-18 18:30:37 +08001714 return ret;
1715 }
1716
q.huang7de1d662022-09-13 14:19:24 +08001717 lynq_resp_t head;
1718 Parcel* p=NULL;
1719
1720 ret=lynq_get_common_request(RIL_REQUEST_SIGNAL_STRENGTH,5,p,0,"");
1721 if(ret==0)
rjw46769c92022-07-04 21:17:25 +08001722 {
q.huang7de1d662022-09-13 14:19:24 +08001723 if(p==NULL)
rjw7e50cd32022-01-18 18:30:37 +08001724 {
q.huang7de1d662022-09-13 14:19:24 +08001725 LYERRLOG("%s get p error",__func__);
1726 return -1;
1727 }
1728 ret=GetHeader(p,head);
1729 if(ret!=0)
1730 {
1731 LYERRLOG("%s get head error",__func__,ret);
1732 delete p;
1733 return -1;
1734 }
1735 if(head.error!=0)
1736 {
1737 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1738 delete p;
1739 return head.error;
rjw7e50cd32022-01-18 18:30:37 +08001740 }
1741
q.huang7de1d662022-09-13 14:19:24 +08001742 int sum = 0;
1743 int LTE_signalstrength = 0;
1744 int WCDMA_signalstrength = 0;
1745 int none = 0;
1746
1747 p->readInt32(&solSigStren->rssi);
rjw7e50cd32022-01-18 18:30:37 +08001748 if((solSigStren->rssi!=99)&&(solSigStren->rssi!=0))
1749 {
1750 solSigStren->gw_sig_valid = 1;
1751 }else{
1752 solSigStren->gw_sig_valid = 0;
1753 }
1754
q.huang7de1d662022-09-13 14:19:24 +08001755 p->readInt32(&none);
1756 p->readInt32(&none);
1757 p->readInt32(&none);
1758 p->readInt32(&none);
1759 p->readInt32(&none);
1760 p->readInt32(&none);
1761 p->readInt32(&none);
1762 p->readInt32(&LTE_signalstrength);
1763 // p->readInt32(&solSigStren->signalStrength.LTE_SignalStrength.signalStrength);
1764 p->readInt32(&solSigStren->rsrp);
1765 p->readInt32(&solSigStren->rsrq);
1766 p->readInt32(&solSigStren->rssnr);
rjw7e50cd32022-01-18 18:30:37 +08001767 LYINFLOG("LTE_signalstrength:%d",LTE_signalstrength);
1768 if((LTE_signalstrength!=99)&&(LTE_signalstrength!=0))
1769 {
1770 solSigStren->lte_sig_valid = 1;
1771 }else{
1772 solSigStren->lte_sig_valid = 0;
1773 }
1774
q.huang7de1d662022-09-13 14:19:24 +08001775 p->readInt32(&none);
1776 p->readInt32(&none);
1777 p->readInt32(&none);
1778 p->readInt32(&none);
1779 p->readInt32(&none);
1780 p->readInt32(&WCDMA_signalstrength);
1781 p->readInt32(&none);
1782 p->readInt32(&solSigStren->rscp);
1783 p->readInt32(&solSigStren->ecno);
rjw7e50cd32022-01-18 18:30:37 +08001784 LYINFLOG("WCDMA_signalstrength:%d",WCDMA_signalstrength);
1785 if((WCDMA_signalstrength!=99)&&(WCDMA_signalstrength!=0))
1786 {
rjwcdd83ae2022-01-22 14:10:42 +08001787 solSigStren->wcdma_sig_valid = 1;
rjw7e50cd32022-01-18 18:30:37 +08001788 }else{
rjwcdd83ae2022-01-22 14:10:42 +08001789 solSigStren->wcdma_sig_valid = 0;
rjw7e50cd32022-01-18 18:30:37 +08001790 }
rjwcdd83ae2022-01-22 14:10:42 +08001791 /*bug fix*/
q.huang7de1d662022-09-13 14:19:24 +08001792 p->readInt32(&solSigStren->ssRsrp);
1793 p->readInt32(&solSigStren->ssRsrq);
1794 p->readInt32(&solSigStren->ssSinr);
1795 p->readInt32(&solSigStren->csiRsrp);
1796 p->readInt32(&solSigStren->csiRsrq);
1797 p->readInt32(&solSigStren->csiSinr);
rjw7e50cd32022-01-18 18:30:37 +08001798 sum = (solSigStren->ssRsrp) + (solSigStren->ssRsrq) + (solSigStren->ssSinr) + (solSigStren->csiRsrp)+\
1799 (solSigStren->csiRsrq) + (solSigStren->csiSinr);
1800 if(sum != 0)
1801 {
1802 solSigStren->nr_sig_valid = 1;
1803 }else{
1804 LYERRLOG("None of NR signal info");
q.huang7de1d662022-09-13 14:19:24 +08001805 }
1806
1807 LYINFLOG("%s suc",__func__);
1808 delete p;
1809 return 0;
rjw7e50cd32022-01-18 18:30:37 +08001810 }
q.huang7de1d662022-09-13 14:19:24 +08001811
1812 LYERRLOG("%s send request error %d",__func__,ret);
1813
1814 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001815}
rjwbc8a05f2022-03-02 15:23:11 +08001816
rjw4a5a78d2022-03-10 11:04:24 +08001817int lynq_set_ims(const int ims_mode)
1818{
q.huang7de1d662022-09-13 14:19:24 +08001819 if(ims_mode == -1000)
1820 {
1821 g_inner_test = 1;
1822 return 0;
1823 }
1824
rjw4a5a78d2022-03-10 11:04:24 +08001825 int ret = -1;
1826 if (ims_mode < 0 || ims_mode > 1)
1827 {
q.huang7de1d662022-09-13 14:19:24 +08001828 LYERRLOG("%s parameter %d error",__func__,ims_mode);
rjw4a5a78d2022-03-10 11:04:24 +08001829 return ret;
q.huang7de1d662022-09-13 14:19:24 +08001830 }
1831
1832 lynq_resp_t head;
1833 Parcel* p=NULL;
1834
1835 ret=lynq_get_common_request(RIL_REQUEST_SET_IMS_ENABLE,30,p,1,"%d",ims_mode);
1836 if(ret==0)
rjw4a5a78d2022-03-10 11:04:24 +08001837 {
q.huang7de1d662022-09-13 14:19:24 +08001838 if(p==NULL)
rjw7a8791e2022-09-06 09:07:39 +08001839 {
q.huang7de1d662022-09-13 14:19:24 +08001840 LYERRLOG("%s get p error",__func__);
1841 return -1;
rjw7a8791e2022-09-06 09:07:39 +08001842 }
q.huang7de1d662022-09-13 14:19:24 +08001843 ret=GetHeader(p,head);
1844 if(ret!=0)
1845 {
1846 LYERRLOG("%s get head error %d",__func__,ret);
1847 delete p;
1848 return -1;
1849 }
1850 if(head.error!=0)
1851 {
1852 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1853 delete p;
1854 return head.error;
1855 }
1856 LYINFLOG("%s set %d suc",__func__,ims_mode);
1857 delete p;
1858 return 0;
rjw4a5a78d2022-03-10 11:04:24 +08001859 }
1860
q.huang7de1d662022-09-13 14:19:24 +08001861 LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);
1862 return ret;
rjw4a5a78d2022-03-10 11:04:24 +08001863}
1864
1865
rjwbc8a05f2022-03-02 15:23:11 +08001866/*Used to wait for an update signal*/
1867int lynq_wait_signalchanges(int *handle)
1868{
1869 LYDBGLOG("start wait signalchanges info");
1870 if(NULL == handle)
1871 {
1872 LYERRLOG("illegal input");
1873 return -1;
1874 }
1875 wait_signal_changes();
1876 LYDBGLOG("get signalchanges");
1877 *handle = network_wait_urc_id;
1878 return 0;
1879}
1880/*Used to get urc info*/
1881int lynq_get_urc_info(const int handle,signalStrength_t *solSigStren,int *slot_id)
1882{
1883 LYDBGLOG("start get urc info");
1884 if(handle != 1002&&handle != 1009)
1885 {
1886 LYINFLOG("invalid handle!!!");
1887 return -1;
1888 }
1889 if(NULL == solSigStren && NULL == slot_id)
1890 {
1891 LYINFLOG("incoming solSigStren or slot_id is NULL!!!");
1892 return -1;
1893 }
1894 switch(handle)
1895 {
1896 case 1002: //RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED
1897 {
1898 LYDBGLOG("get state update to VOICE");
1899 *slot_id = network_urc_slot_id;
1900 LYINFLOG("slot_id = %d",network_urc_slot_id);
rjw25d01752022-08-04 09:42:00 +08001901 break;
rjwbc8a05f2022-03-02 15:23:11 +08001902 }
1903 case 1009: //RIL_UNSOL_SIGNAL_STRENGTH
1904 {
1905 LYDBGLOG("get state update to signal info");
1906 solSigStren->gw_sig_valid = network_urc_solSigStren.gw_sig_valid;
1907 solSigStren->rssi = network_urc_solSigStren.rssi;
1908 solSigStren->wcdma_sig_valid = network_urc_solSigStren.wcdma_sig_valid;
1909 solSigStren->rscp = network_urc_solSigStren.rscp;
1910 solSigStren->ecno = network_urc_solSigStren.ecno;
1911 solSigStren->lte_sig_valid = network_urc_solSigStren.lte_sig_valid;
1912 solSigStren->rsrp = network_urc_solSigStren.rsrp;
1913 solSigStren->rsrq = network_urc_solSigStren.rsrq;
1914 solSigStren->rssnr = network_urc_solSigStren.rssnr;
1915 solSigStren->nr_sig_valid = network_urc_solSigStren.nr_sig_valid;
1916 solSigStren->ssRsrp = network_urc_solSigStren.ssRsrp;
1917 solSigStren->ssRsrq = network_urc_solSigStren.ssRsrq;
1918 solSigStren->ssSinr = network_urc_solSigStren.ssSinr;
1919 solSigStren->csiRsrp = network_urc_solSigStren.csiRsrp;
1920 solSigStren->csiRsrq = network_urc_solSigStren.csiRsrq;
1921 solSigStren->csiSinr = network_urc_solSigStren.csiSinr;
rjw25d01752022-08-04 09:42:00 +08001922 break;
rjwbc8a05f2022-03-02 15:23:11 +08001923 }
1924 }
1925 return 0;
rjw4200a082022-05-17 17:58:35 +08001926}
lh3a26dd52022-07-01 04:44:57 -07001927
1928/**@brief parse at response,return error code,and the response
1929* @param response [IN] <response>:original at response,This parameter must be a character array.
1930
1931* @param value [OUT] <value>: Used to receive the parsed value, if multiple values are separated by ";".
1932* field:
1933* eg:
1934* "+cnum: 123456\n+cnum: 456"
1935* value:12345;456;
1936* @param value_len [IN] <value_len>: The value length.
1937
1938* @return:AT error code
1939*/
1940static int parse_at_result(char response[],char value[],int value_len)
1941{
1942 if(response == NULL || value == NULL)
1943 {
1944 LYERRLOG("parameter invalid");
1945 return -1;
1946 }
1947 if(strstr(response,"ERROR"))
1948 {
1949 int i;
1950 for(i = 0;i < strlen(response);i++)
1951 {
1952 if(response[i]==':')
1953 {
1954 break;
1955 }
1956 }
1957 if(i < strlen(response))
1958 {
1959 LYINFLOG("parse_result:%d\n",atoi(response+i+1));
1960 return atoi(response+i+1);
1961 }
1962 else
1963 {
1964 LYINFLOG("%s parse_result:fail,this response invalid\n",response);
1965 return 100; //unknown
1966 }
1967 }
1968 else if(strstr(response,"OK"))
1969 {
1970 /** parse the at response value
1971 * eg:
1972 * --> at+cnum
1973 * <-- +CNUM:"1243452"
1974 * need parse the "1243452" to <value>
1975 *@ To-Do
1976 */
1977 int count;
1978 int resp_addr[32] = {0};
1979 char temp_buf[1024] = {0};
1980 char *dest;
1981 dest = NULL;
1982 count = 0;
1983 int res_len = strlen(response);
1984 LYINFLOG("res_len:%d",res_len);
1985 for(int i = 0; i < res_len; i++)
1986 {
1987 if(response[i]==':')
1988 {
1989 resp_addr[count] = i;
1990 count++;
1991 }
1992 if(response[i] == '\n')
1993 {
1994 response[i] = '\0';
1995 }
1996 }
1997 LYINFLOG("count:%d",count);
1998 if(count > 0)
1999 {
2000 for(int i = 0; i < count; i++)
2001 {
2002 if((strlen(temp_buf) + strlen(response+resp_addr[i]+2)) >= 1023)
2003 {
2004 LYINFLOG("2 will be out of range\n");
2005 break;
2006 }
2007 if(strlen(temp_buf) >= 1023)
2008 {
2009 LYINFLOG("1 will be out of range\n");
2010 break;
2011 }
2012 strcat(temp_buf,response+resp_addr[i]+2);
2013
2014 if(strlen(temp_buf) >= 1023)
2015 {
2016 LYINFLOG("1 will be out of range\n");
2017 break;
2018 }
2019 strcat(temp_buf,";");
2020 printf("parse_result[%d]:%s,strcated:%s\n",i,response+resp_addr[i]+2,temp_buf);
2021 }
2022 LYINFLOG("parse_result:%s\n",temp_buf);
2023 if(strlen(temp_buf) > value_len)
2024 {
2025 printf("result length over value:%ld,%d\n",strlen(temp_buf),value_len);
2026 memcpy(value,temp_buf,value_len);
2027 }
2028 else
2029 {
2030 memcpy(value,temp_buf,strlen(temp_buf));
2031 }
2032 }
2033 return 0;
2034 }
2035 else
2036 {
2037 LYINFLOG("%s this response invalid\n",response);
2038 return -1;
2039 }
2040}
2041#ifdef MODEM_GEN97
2042
2043int lynq_oos_recover_timer_interval(int mode, char interval[LY_RECOVER_TIMER_INTERVAL],char result[LY_RECOVER_TIMER_INTERVAL])
2044{
q.huang7de1d662022-09-13 14:19:24 +08002045 int ret=-1;
2046
2047 if((mode < 0) || (mode >1) || (mode == 0 && NULL == interval) || (NULL == result))
lh3a26dd52022-07-01 04:44:57 -07002048 {
q.huang7de1d662022-09-13 14:19:24 +08002049 LYERRLOG("%s mode %d interval %s result %s error",__func__,mode,interval,result);
2050 return -1;
lh3a26dd52022-07-01 04:44:57 -07002051 }
2052
q.huang7de1d662022-09-13 14:19:24 +08002053 lynq_resp_t head;
2054 Parcel* p=NULL;
2055
lh3a26dd52022-07-01 04:44:57 -07002056 if(mode == 0)
2057 {
q.huang7de1d662022-09-13 14:19:24 +08002058 ret=lynq_get_common_request(RIL_REQUEST_OEM_HOOK_RAW,5,p,1,"AT+ERSCFG=%s",interval);
lh3a26dd52022-07-01 04:44:57 -07002059 }
q.huang7de1d662022-09-13 14:19:24 +08002060 else
lh3a26dd52022-07-01 04:44:57 -07002061 {
q.huang7de1d662022-09-13 14:19:24 +08002062 ret=lynq_get_common_request(RIL_REQUEST_OEM_HOOK_RAW,5,p,1,"AT+ERSCFG?");
lh3a26dd52022-07-01 04:44:57 -07002063 }
q.huang7de1d662022-09-13 14:19:24 +08002064
2065 if(ret==0)
lh3a26dd52022-07-01 04:44:57 -07002066 {
q.huang7de1d662022-09-13 14:19:24 +08002067 if(p==NULL)
2068 {
2069 LYERRLOG("%s get p error",__func__);
2070 return -1;
2071 }
2072 ret=GetHeader(p,head);
2073 if(ret!=0)
2074 {
2075 LYERRLOG("%s get head error",__func__,ret);
2076 delete p;
2077 return -1;
2078 }
2079 if(head.error!=0)
2080 {
2081 LYERRLOG("%s mdm return head error %d",__func__,head.error);
2082 delete p;
2083 return head.error;
2084 }
2085
2086 int recv_len;
2087 char res_data[LY_RECOVER_TIMER_INTERVAL] = {0};
2088 char response_interval[LY_RECOVER_TIMER_INTERVAL*2] = {0};
2089
2090
lh3a26dd52022-07-01 04:44:57 -07002091 LYINFLOG("get recover timer interval");
q.huang7de1d662022-09-13 14:19:24 +08002092 p->readInt32(&recv_len);
lh3a26dd52022-07-01 04:44:57 -07002093 if(recv_len == -1)
2094 {
2095 LYINFLOG("no responset");
q.huang7de1d662022-09-13 14:19:24 +08002096 delete p;
lh3a26dd52022-07-01 04:44:57 -07002097 return -1;
2098 }
2099 else
2100 {
2101 LYINFLOG("recv_len:%d",recv_len);
q.huang7de1d662022-09-13 14:19:24 +08002102 p->read(response_interval,recv_len);
lh3a26dd52022-07-01 04:44:57 -07002103 }
2104 LYINFLOG("response_interval:%s",response_interval);
2105 ret = parse_at_result(response_interval,res_data,LY_RECOVER_TIMER_INTERVAL);
2106 if(mode == 1)
2107 {
2108 if(strlen(res_data) <= LY_RECOVER_TIMER_INTERVAL)
2109 {
2110 memcpy(result,res_data,strlen(res_data));
2111 }
2112 }
q.huang7de1d662022-09-13 14:19:24 +08002113 LYERRLOG("%s ret:%d",__func__,ret);
2114 delete p;
2115 return ret;
lh3a26dd52022-07-01 04:44:57 -07002116 }
q.huang7de1d662022-09-13 14:19:24 +08002117
2118 LYERRLOG("%s send request error %d",__func__,ret);
2119
2120 return ret;
lh3a26dd52022-07-01 04:44:57 -07002121}
2122
2123int lynq_oos_deep_sleep_recover_timer_interval(int recovery_threshold,int fullband_timer,int sniffer_timer,int inactive_mode)
2124{
q.huang7de1d662022-09-13 14:19:24 +08002125 int ret=-1;
lh3a26dd52022-07-01 04:44:57 -07002126
lh3a26dd52022-07-01 04:44:57 -07002127 if(((recovery_threshold < 2) || (recovery_threshold > 10)) || ((fullband_timer < 90) || (fullband_timer > 360)) ||
2128 ((sniffer_timer < 10) || (sniffer_timer > 60)) || ((inactive_mode < 0) || (inactive_mode > 1)))
2129 {
q.huang7de1d662022-09-13 14:19:24 +08002130 LYERRLOG("%s paramter recovery_threshold %d fullband_timer %d sniffer_timer %d inactive_mode %d fail!",recovery_threshold,fullband_timer,sniffer_timer,inactive_mode);
lh3a26dd52022-07-01 04:44:57 -07002131 return ret;
2132 }
2133
q.huang7de1d662022-09-13 14:19:24 +08002134 lynq_resp_t head;
2135 Parcel* p=NULL;
2136
2137 ret=lynq_get_common_request(RIL_REQUEST_OEM_HOOK_RAW,5,p,1,"AT+ESRVREC=%d,%d,%d,%d",recovery_threshold,fullband_timer,sniffer_timer,inactive_mode);
2138 if(ret==0)
lh3a26dd52022-07-01 04:44:57 -07002139 {
q.huang7de1d662022-09-13 14:19:24 +08002140 if(p==NULL)
2141 {
2142 LYERRLOG("%s get p error",__func__);
2143 return -1;
2144 }
2145 ret=GetHeader(p,head);
2146 if(ret!=0)
2147 {
2148 LYERRLOG("%s get head error",__func__,ret);
2149 delete p;
2150 return -1;
2151 }
2152 if(head.error!=0)
2153 {
2154 LYERRLOG("%s mdm return head error %d",__func__,head.error);
2155 delete p;
2156 return head.error;
2157 }
2158
2159 int recv_len;
2160 char res_data[LY_RECOVER_TIMER_INTERVAL] = {0};
2161 char response_interval[LY_RECOVER_TIMER_INTERVAL*2] = {0};
2162
2163 p->readInt32(&recv_len);
lh3a26dd52022-07-01 04:44:57 -07002164 if(recv_len == -1)
2165 {
2166 LYINFLOG("no responset");
q.huang7de1d662022-09-13 14:19:24 +08002167 delete p;
lh3a26dd52022-07-01 04:44:57 -07002168 return -1;
2169 }
2170 else
2171 {
2172 LYINFLOG("recv_len:%d",recv_len);
q.huang7de1d662022-09-13 14:19:24 +08002173 p->read(response_interval,recv_len);
lh3a26dd52022-07-01 04:44:57 -07002174 }
2175 LYINFLOG("response_interval:%s",response_interval);
2176 ret = parse_at_result(response_interval,res_data,LY_RECOVER_TIMER_INTERVAL);
q.huang7de1d662022-09-13 14:19:24 +08002177 LYERRLOG("%s ret:%d",__func__,ret);
2178 delete p;
2179 return ret;
lh3a26dd52022-07-01 04:44:57 -07002180 }
q.huang7de1d662022-09-13 14:19:24 +08002181
2182 LYERRLOG("%s send request error %d",__func__,ret);
2183
2184 return ret;
lh3a26dd52022-07-01 04:44:57 -07002185}
2186#endif
2187