blob: 82a02c52d2aac0eac34c4a4205aad36b1402e827 [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
q.huang17774592022-09-13 18:04:12 +0800159/**@brief wait response with expected token and write msg to parcel in some time
160* @param p [IN]: pointer the parcel
161* @param token [IN]: the expected token for the response msg
162* @param time_out [IN]: timeout.
163* @return
164* 0:success
165* other:failure
166*/
q.huang7de1d662022-09-13 14:19:24 +0800167const int waitResponse(Parcel*& p, int token,int time_out)
168{
169 int waitToken = token;
170 int wakeup_token=-1;
171 int resp_type;
172 struct timeval now;
173 struct timespec timeout;
174 int ret;
175 std::list<Parcel*>::iterator iter;
176 int cnt=0;
177
178 gettimeofday(&now,NULL);
179 timeout.tv_sec = now.tv_sec+time_out; //timeout is 1min
180 timeout.tv_nsec = now.tv_usec*1000;
181
182 LYINFLOG("%s wait token is %d",__func__,waitToken);
183
184 BLOCK_RC_MSG_LOCK();
185 while(true) {
186 cnt++;
187 for(iter=g_recv_parcel_list.begin();iter!=g_recv_parcel_list.end();++iter)
188 {
189 (*iter)->setDataPosition(0);
190 (*iter)->readInt32(&resp_type);
191 (*iter)->readInt32(&wakeup_token);
192 if(wakeup_token==waitToken)
193 {
194 LYINFLOG("%s get waitToken",__func__);
195 p=(*iter);
196 p->setDataPosition(0);
197 g_recv_parcel_list.erase(iter);
198 goto waitResponse_end;
199 }
200 }
201 LYINFLOG("%s no wait Token in msg list, list size is %d",__func__,g_recv_parcel_list.size());
202 ret=BLOCK_WAIT_RECV_MSG_TIME_OUT(&timeout);
203 if(ret!=0)
204 {
205 LYERRLOG("%s no expected token after %d second",__func__,time_out);
206 break;
207 }
208 }
209waitResponse_end:
210 LYINFLOG("%s wait token is %d wakeup_token is %d, cnt is %d",__func__,waitToken,wakeup_token,cnt);
211 BLOCK_RC_MSG_UNLOCK();
212 return !(wakeup_token==waitToken);
213}
214
215int JumpHeader(Parcel &p,int *resp_type,int* token,int *request,int *slot_id,int *error)
lh3a26dd52022-07-01 04:44:57 -0700216{
217 LYINFLOG("jump header");
rjwa59bf312022-07-05 11:50:31 +0800218 if(p.dataAvail() > 0)
219 {
220 p.readInt32(resp_type);
q.huang7de1d662022-09-13 14:19:24 +0800221 p.readInt32(token);
rjwa59bf312022-07-05 11:50:31 +0800222 p.readInt32(request);
223 p.readInt32(slot_id);
224 p.readInt32(error);
q.huang7de1d662022-09-13 14:19:24 +0800225 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 +0800226 return 0;
227 }
228 else
229 {
230 return -1;
231 }
lh3a26dd52022-07-01 04:44:57 -0700232}
233
q.huang17774592022-09-13 18:04:12 +0800234/**@brief print solicied response msg's head information
235* @param head [IN]: head information
236* @return none
237*/
q.huang7de1d662022-09-13 14:19:24 +0800238void PrintHeader(lynq_resp_t& head)
239{
240 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);
241}
242
q.huang17774592022-09-13 18:04:12 +0800243/**@brief get solicied response msg's head
244* @param head [OUT]: head information
245* @return
246* 0:success
247* other:failure
248*/
q.huang7de1d662022-09-13 14:19:24 +0800249int GetHeader(Parcel* &p, lynq_resp_t& head)
250{
251 LYINFLOG("get header");
252 if(p->dataAvail() > 0)
253 {
254 p->readInt32(&(head.resp_type));
255 p->readInt32(&(head.token));
256 p->readInt32(&(head.request));
257 p->readInt32(&(head.slot_id));
258 p->readInt32(&(head.error));
259 PrintHeader(head);
260 return 0;
261 }
262 else
263 {
264 return -1;
265 }
266}
267
q.huang17774592022-09-13 18:04:12 +0800268/**@brief send msg to service and get response from service
269* @param request_id [IN]: request id
270* @param time_out [IN]: wait time uplimit
271* @param p [IN]: point to response msg's parcel
272* @param argc [IN]: how many parameters in parameter string
273* @param format [IN]: parameter string's format
274* @param ... [IN]: the specific parameter
275* @return
276* 0:success
277* other:failure
278*/
q.huang7de1d662022-09-13 14:19:24 +0800279int lynq_get_common_request(int request_id, int time_out, Parcel*& p, int argc, const char* format,...)
q.huang16dcb0f2022-09-07 09:17:37 +0800280{
281 lynq_client_t client;
q.huang16dcb0f2022-09-07 09:17:37 +0800282 int ret;
283 int send_num;
284
285 client.uToken = network_Global_uToken;
q.huang7de1d662022-09-13 14:19:24 +0800286 network_Global_uToken=(network_Global_uToken+1)%10000;/*0-10000*/
q.huang16dcb0f2022-09-07 09:17:37 +0800287 client.request = request_id;
288 client.paramLen = argc;
289 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
290 if(argc!=0)
291 {
292 va_list args;
293 va_start(args, format);
294 vsnprintf(client.param, LYNQ_REQUEST_PARAM_BUF, format, args);
295 va_end(args);
296 }
297 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
298 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
q.huang7de1d662022-09-13 14:19:24 +0800299 if(g_inner_test==0)
300 {
301 send_num = sendto(network_sock_fd,&client,sizeof(client),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
302 }
303 else
304 {
305 send_num = 1;
306 g_inner_test = 0;
307 }
308 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
q.huang16dcb0f2022-09-07 09:17:37 +0800309
q.huang7de1d662022-09-13 14:19:24 +0800310 if(send_num <= 0)
q.huang16dcb0f2022-09-07 09:17:37 +0800311 {
312 LYERRLOG("send request fail, send num is %d", send_num);
313 return -1;
314 }
q.huang7de1d662022-09-13 14:19:24 +0800315 ret = waitResponse(p, client.uToken,time_out);
316
q.huang16dcb0f2022-09-07 09:17:37 +0800317 return ret;
318}
319
320
rjwbc8a05f2022-03-02 15:23:11 +0800321int wait_signal_changes()
322{
323 int ret = 0;
324 pthread_mutex_lock(&signal_state_change_mutex);
325 ret = pthread_cond_wait(&signal_state_change_cond,&signal_state_change_mutex);
326 pthread_mutex_unlock(&signal_state_change_mutex);
327 return 0;
328}
329
330void send_signal_changes()
331{
332 pthread_mutex_lock(&signal_state_change_mutex);
333 pthread_cond_signal(&signal_state_change_cond);
334 pthread_mutex_unlock(&signal_state_change_mutex);
335 return;
336}
337
q.huang17774592022-09-13 18:04:12 +0800338/**@ a thread just for recv\buffer solicited msg's response and notice waiting thread
339* @param p [IN]: no meaning
340* @return
341* always null
342*/
q.huang7de1d662022-09-13 14:19:24 +0800343void *thread_rc_recv(void *p)
344{
345 Parcel* rc_p;
346 std::list<Parcel*>::iterator iter;
347 int resp_type = -1;
348 char rc_data[LYNQ_REC_BUF];
349 int rc_len;
350 int null_cnt=0;
351 int wakeup_token;
352
353 LYINFLOG("rc thread is running");
354 while(network_rc_status)
355 {
356 bzero(rc_data,LYNQ_REC_BUF);
357 while(true)
358 {
359 rc_len = recvfrom(network_sock_fd,rc_data,sizeof(rc_data),0,(struct sockaddr *)&network_addr_serv,(socklen_t *)&network_len_addr_serv);
360 if(rc_len<sizeof(int32_t)*2)
361 {
362 LYERRLOG("%s recv len %d less %d",__func__, rc_len,sizeof(int)*2);
363 continue;
364 }
q.huang17774592022-09-13 18:04:12 +0800365 rc_p= new Parcel;
366 if(rc_p==NULL)
367 {
368 null_cnt++;
369 LYERRLOG("%s rc_p is NULL, cnt is %d",__func__, null_cnt);
q.huang7de1d662022-09-13 14:19:24 +0800370 if(null_cnt>20)
371 {
372 goto rc_recv_end;
373 }
374 continue;
q.huang17774592022-09-13 18:04:12 +0800375 }
q.huang7de1d662022-09-13 14:19:24 +0800376 else
377 {
378 null_cnt=0;
379 }
q.huang17774592022-09-13 18:04:12 +0800380
q.huang7de1d662022-09-13 14:19:24 +0800381 rc_p->setData((uint8_t *)rc_data,rc_len); // p.setData((uint8_t *) buffer, buflen);
382 rc_p->setDataPosition(0);
383 if(rc_p->dataAvail()>0)
384 {
385 rc_p->readInt32(&resp_type);
386 rc_p->readInt32(&wakeup_token);
387 BLOCK_RC_MSG_LOCK();
388 g_recv_parcel_list.push_back(rc_p);
389 LYINFLOG("%s wakeup token is %d, list size is %d!",__func__,wakeup_token,g_recv_parcel_list.size());
390 if(g_recv_parcel_list.size()>20) //max 20
391 {
392 iter=g_recv_parcel_list.begin();
393 (*iter)->setDataPosition(0);
394 (*iter)->readInt32(&resp_type);
395 (*iter)->readInt32(&wakeup_token);
396 delete (*(g_recv_parcel_list.begin()));
397 LYERRLOG("%s wakeup token %d is deleted!",__func__,wakeup_token);
398 g_recv_parcel_list.erase(iter);
399 }
400 BLOCK_WAKEUP_RECV_MSG();
401 BLOCK_RC_MSG_UNLOCK();
402 break;
403 }
q.huang17774592022-09-13 18:04:12 +0800404 else
405 {
406 LYERRLOG("%s rc_p data Avail %d not greater than 0",__func__, rc_p->dataAvail());
q.huang7de1d662022-09-13 14:19:24 +0800407 delete rc_p;
q.huang17774592022-09-13 18:04:12 +0800408 }
q.huang7de1d662022-09-13 14:19:24 +0800409 }
410 }
411
412rc_recv_end:
413 return NULL;
414}
415
rjw7e50cd32022-01-18 18:30:37 +0800416void *thread_urc_recv(void *p)
417{
418 Parcel *urc_p =NULL;
419 char urc_data[LYNQ_REC_BUF];
rjw7e50cd32022-01-18 18:30:37 +0800420 int resp_type = -1;
421 int urc_id = -1;
422 int res = 0;
423 int none = 0;
424 int NR_sum = 0;
rjw7e50cd32022-01-18 18:30:37 +0800425 int urc_LTE_signalstrength = 0;
426 int urc_WCDMA_signalstrength = 0;
rjw7e50cd32022-01-18 18:30:37 +0800427 LYINFLOG("urc thread is running");
rjwbc8a05f2022-03-02 15:23:11 +0800428 while(network_urc_status)
rjw7e50cd32022-01-18 18:30:37 +0800429 {
430 bzero(urc_data,LYNQ_REC_BUF);
rjwbc8a05f2022-03-02 15:23:11 +0800431 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 +0800432 if(res<=0)
433 {
434 LYERRLOG("thread_urc_recv step2 fail:");
435 break;
436 }
437 urc_p = new Parcel();
rjw7a8791e2022-09-06 09:07:39 +0800438 if(urc_p == NULL)
439 {
440 LYERRLOG("new parcel failure!!!");
441 break;
442 }
rjw7e50cd32022-01-18 18:30:37 +0800443 urc_p->setData((uint8_t *)urc_data,res); // p.setData((uint8_t *) buffer, buflen);
444 urc_p->setDataPosition(0);
445 if(urc_p->dataAvail()>0)
446 {
447 urc_p->readInt32(&resp_type);
448 urc_p->readInt32(&urc_id);
rjwbc8a05f2022-03-02 15:23:11 +0800449 urc_p->readInt32(&network_urc_slot_id);
rjw7e50cd32022-01-18 18:30:37 +0800450 switch(urc_id)
451 {
q.huang47d4dfe2022-08-17 17:52:29 +0800452 case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED:
rjw7e50cd32022-01-18 18:30:37 +0800453 {
q.huangaf58bc82022-08-19 17:11:21 +0800454 set_register_voice_buffer_valid(false);
rjwbc8a05f2022-03-02 15:23:11 +0800455 network_wait_urc_id = urc_id;
456 LYINFLOG("slot_id = %d",network_urc_slot_id);
457 send_signal_changes();
rjw25d01752022-08-04 09:42:00 +0800458 break;
rjw7e50cd32022-01-18 18:30:37 +0800459 }
q.huang47d4dfe2022-08-17 17:52:29 +0800460 case RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED:
461 {
q.huangaf58bc82022-08-19 17:11:21 +0800462 set_register_data_buffer_valid(false);
q.huang47d4dfe2022-08-17 17:52:29 +0800463 network_wait_urc_id = urc_id;
464 LYINFLOG("slot_id = %d",network_urc_slot_id);
465 send_signal_changes();
466 break;
467 }
468 case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED:
469 {
q.huangaf58bc82022-08-19 17:11:21 +0800470 set_register_ims_buffer_valid(false);
q.huang47d4dfe2022-08-17 17:52:29 +0800471 network_wait_urc_id = urc_id;
472 LYINFLOG("slot_id = %d",network_urc_slot_id);
473 send_signal_changes();
474 break;
475 }
476 case RIL_UNSOL_SIGNAL_STRENGTH:
rjw7e50cd32022-01-18 18:30:37 +0800477 {
rjwbc8a05f2022-03-02 15:23:11 +0800478 urc_p->readInt32(&network_urc_solSigStren.rssi);
479 if((network_urc_solSigStren.rssi!=99)&&(network_urc_solSigStren.rssi!=0))
rjw7e50cd32022-01-18 18:30:37 +0800480 {
rjwbc8a05f2022-03-02 15:23:11 +0800481 network_urc_solSigStren.gw_sig_valid = 1;
rjw7e50cd32022-01-18 18:30:37 +0800482 }else{
rjwbc8a05f2022-03-02 15:23:11 +0800483 network_urc_solSigStren.gw_sig_valid = 0;
rjw7e50cd32022-01-18 18:30:37 +0800484 }
rjwbc8a05f2022-03-02 15:23:11 +0800485 if(network_urc_solSigStren.gw_sig_valid == 1)
rjw78d04502022-02-24 13:37:11 +0800486 {
rjwbc8a05f2022-03-02 15:23:11 +0800487 LYINFLOG("urc_GSM_signalstrength:%d",network_urc_solSigStren.rssi);
rjw78d04502022-02-24 13:37:11 +0800488 }
rjw7e50cd32022-01-18 18:30:37 +0800489 urc_p->readInt32(&none);
490 urc_p->readInt32(&none);
491 urc_p->readInt32(&none);
492 urc_p->readInt32(&none);
493 urc_p->readInt32(&none);
494 urc_p->readInt32(&none);
495 urc_p->readInt32(&none);
496 urc_p->readInt32(&urc_LTE_signalstrength);
497 // p.readInt32(&solSigStren->signalStrength.LTE_SignalStrength.signalStrength);
rjwbc8a05f2022-03-02 15:23:11 +0800498 urc_p->readInt32(&network_urc_solSigStren.rsrp);
499 urc_p->readInt32(&network_urc_solSigStren.rsrq);
500 urc_p->readInt32(&network_urc_solSigStren.rssnr);
rjw7e50cd32022-01-18 18:30:37 +0800501 if((urc_LTE_signalstrength!=99)&&(urc_LTE_signalstrength!=0))
502 {
rjwbc8a05f2022-03-02 15:23:11 +0800503 network_urc_solSigStren.lte_sig_valid = 1;
rjw7e50cd32022-01-18 18:30:37 +0800504 }else{
rjwbc8a05f2022-03-02 15:23:11 +0800505 network_urc_solSigStren.lte_sig_valid = 0;
rjw7e50cd32022-01-18 18:30:37 +0800506 }
rjwbc8a05f2022-03-02 15:23:11 +0800507 if(network_urc_solSigStren.lte_sig_valid == 1)
rjw78d04502022-02-24 13:37:11 +0800508 {
509 LYINFLOG("urc_LTE_signalstrength:%d",urc_LTE_signalstrength);
510 }
rjw7e50cd32022-01-18 18:30:37 +0800511 urc_p->readInt32(&none);
512 urc_p->readInt32(&none);
513 urc_p->readInt32(&none);
514 urc_p->readInt32(&none);
515 urc_p->readInt32(&none);
516 urc_p->readInt32(&urc_WCDMA_signalstrength);
517 urc_p->readInt32(&none);
rjwbc8a05f2022-03-02 15:23:11 +0800518 urc_p->readInt32(&network_urc_solSigStren.rscp);
519 urc_p->readInt32(&network_urc_solSigStren.ecno);
rjw7e50cd32022-01-18 18:30:37 +0800520 if((urc_WCDMA_signalstrength!=99)&&(urc_WCDMA_signalstrength!=0))
521 {
rjwbc8a05f2022-03-02 15:23:11 +0800522 network_urc_solSigStren.wcdma_sig_valid = 1;
rjw7e50cd32022-01-18 18:30:37 +0800523 }else{
rjwbc8a05f2022-03-02 15:23:11 +0800524 network_urc_solSigStren.wcdma_sig_valid = 0;
rjw78d04502022-02-24 13:37:11 +0800525 }
rjwbc8a05f2022-03-02 15:23:11 +0800526 if(network_urc_solSigStren.wcdma_sig_valid == 1)
rjw78d04502022-02-24 13:37:11 +0800527 {
528 LYINFLOG("urc_WCDMA_signalstrength:%d",urc_WCDMA_signalstrength);
rjw7e50cd32022-01-18 18:30:37 +0800529 }
rjwbc8a05f2022-03-02 15:23:11 +0800530 urc_p->readInt32(&network_urc_solSigStren.ssRsrp);
531 urc_p->readInt32(&network_urc_solSigStren.ssRsrq);
532 urc_p->readInt32(&network_urc_solSigStren.ssSinr);
533 urc_p->readInt32(&network_urc_solSigStren.csiRsrp);
534 urc_p->readInt32(&network_urc_solSigStren.csiRsrq);
535 urc_p->readInt32(&network_urc_solSigStren.csiSinr);
536 NR_sum = (network_urc_solSigStren.ssRsrp) + (network_urc_solSigStren.ssRsrq) + (network_urc_solSigStren.ssSinr) + (network_urc_solSigStren.csiRsrp)+\
537 (network_urc_solSigStren.csiRsrq) + (network_urc_solSigStren.csiSinr);
rjw7e50cd32022-01-18 18:30:37 +0800538 if(NR_sum != 0)
539 {
rjwbc8a05f2022-03-02 15:23:11 +0800540 network_urc_solSigStren.nr_sig_valid = 1;
rjw7e50cd32022-01-18 18:30:37 +0800541 }else{
rjwbc8a05f2022-03-02 15:23:11 +0800542 network_urc_solSigStren.nr_sig_valid = 0;
rjw78d04502022-02-24 13:37:11 +0800543 }
rjwbc8a05f2022-03-02 15:23:11 +0800544 if(network_urc_solSigStren.nr_sig_valid == 1)
rjw78d04502022-02-24 13:37:11 +0800545 {
546 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 +0800547 network_urc_solSigStren.ssRsrp,network_urc_solSigStren.ssRsrq,network_urc_solSigStren.ssSinr, \
548 network_urc_solSigStren.csiRsrp,network_urc_solSigStren.csiRsrq,network_urc_solSigStren.csiSinr);
rjw7e50cd32022-01-18 18:30:37 +0800549 }
rjwbc8a05f2022-03-02 15:23:11 +0800550 network_wait_urc_id = urc_id;
551 send_signal_changes();
rjw25d01752022-08-04 09:42:00 +0800552 break;
rjw7e50cd32022-01-18 18:30:37 +0800553 }
554 }
555 }
rjw7a8791e2022-09-06 09:07:39 +0800556 delete urc_p;
557 urc_p = NULL;
rjw7e50cd32022-01-18 18:30:37 +0800558 }
q.huang47d4dfe2022-08-17 17:52:29 +0800559 return NULL;
rjw7e50cd32022-01-18 18:30:37 +0800560}
561
rjw7e50cd32022-01-18 18:30:37 +0800562int lynq_server_socket_start()
563{
q.huang7de1d662022-09-13 14:19:24 +0800564// struct timeval timeOut;
rjwbc8a05f2022-03-02 15:23:11 +0800565 network_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
566 if(-1 == network_sock_fd)
rjw7e50cd32022-01-18 18:30:37 +0800567 {
568 LYERRLOG("socket open error");
569 return -1;
570 }
q.huang7de1d662022-09-13 14:19:24 +0800571# if 0
lh3a26dd52022-07-01 04:44:57 -0700572 timeOut.tv_sec = 5;
573 timeOut.tv_usec = 0;
574 if (setsockopt(network_sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
575 {
576 LYERRLOG("time out setting failed\n");
577 return -1;
578 }
q.huang7de1d662022-09-13 14:19:24 +0800579#endif
580
rjwbc8a05f2022-03-02 15:23:11 +0800581 LYINFLOG("network_sock_fd = %d",network_sock_fd);
rjw7e50cd32022-01-18 18:30:37 +0800582
rjwbc8a05f2022-03-02 15:23:11 +0800583 memset(&network_addr_serv, 0, sizeof(network_addr_serv));
584 network_addr_serv.sin_family = AF_INET;
585 network_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_ADDRESS);
586 network_addr_serv.sin_port = htons(LYNQ_SERVICE_PORT);
587 network_len_addr_serv = sizeof(network_addr_serv);
lh3a26dd52022-07-01 04:44:57 -0700588
q.huang7de1d662022-09-13 14:19:24 +0800589 BLOCK_RC_MSG_LOCK();
590 std::list<Parcel*>::iterator iter;
591 for(iter=g_recv_parcel_list.begin();iter!=g_recv_parcel_list.end();++iter)
592 {
593 delete (*iter);
594 }
595 g_recv_parcel_list.clear();
596 BLOCK_RC_MSG_UNLOCK();
597
598 pthread_t tid;
599 pthread_attr_t attr;
600 int ret;
601
602 pthread_attr_init(&attr);
603 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
604 ret = pthread_create(&tid,&attr,thread_rc_recv,NULL);
605 if(ret <0)
606 {
607 LYERRLOG("rc pthread create error");
608 return -1;
609 }
610 LYINFLOG("rc start success");
lh3a26dd52022-07-01 04:44:57 -0700611
rjw7e50cd32022-01-18 18:30:37 +0800612 return 0;
613}
614
615int lynq_urc_socket_start()
616{
617 pthread_t tid;
618 pthread_attr_t attr;
619 int on = 1;
rjwbc8a05f2022-03-02 15:23:11 +0800620 network_urc_sock_fd = -1;
rjw7e50cd32022-01-18 18:30:37 +0800621 int ret = 0;
rjwbc8a05f2022-03-02 15:23:11 +0800622 network_len_urc_addr_serv = sizeof(sockaddr_in);
623 network_urc_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
624 if (network_urc_sock_fd <0){
rjw7e50cd32022-01-18 18:30:37 +0800625 LYERRLOG("urc socket error");
626 ret = -1;
627 }
rjwbc8a05f2022-03-02 15:23:11 +0800628 network_urc_addr_serv.sin_family = AF_INET;
629 network_urc_addr_serv.sin_port = htons(LYNQ_URC_SERVICE_PORT);
630 network_urc_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_URC_ADDRESS);
rjw7e50cd32022-01-18 18:30:37 +0800631 /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
rjwbc8a05f2022-03-02 15:23:11 +0800632 ret = setsockopt(network_urc_sock_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
rjw7e50cd32022-01-18 18:30:37 +0800633 if(ret <0)
634 {
635 LYERRLOG("urc socket set error");
636 return -1;
637 }
rjwbc8a05f2022-03-02 15:23:11 +0800638 ret = bind(network_urc_sock_fd ,(struct sockaddr*)&network_urc_addr_serv, sizeof(network_urc_addr_serv));
rjw7e50cd32022-01-18 18:30:37 +0800639 if(ret <0)
640 {
641 LYERRLOG("urc socket bind error");
642 return -1;
643 }
644 pthread_attr_init(&attr);
645 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
rjwbc8a05f2022-03-02 15:23:11 +0800646 ret = pthread_create(&tid,&attr,thread_urc_recv,(void *)network_urc_sock_fd);
rjw7e50cd32022-01-18 18:30:37 +0800647 if(ret <0)
648 {
649 LYERRLOG("urc pthread create error");
650 return -1;
651 }
652 LYINFLOG("urc start success");
q.huang7de1d662022-09-13 14:19:24 +0800653
rjw7e50cd32022-01-18 18:30:37 +0800654 return 0;
655}
656
657int lynq_network_init(int utoken){
rjw22947c22022-03-15 09:21:29 +0800658 if(g_lynq_network_init_flag == 1)
659 {
660 LYERRLOG("init twice is not allowed");
661 return -1;
662 }
663 g_lynq_network_init_flag = 1;
rjw7e50cd32022-01-18 18:30:37 +0800664 if(utoken <0){
665 LYERRLOG("init err");
666 return -1;
667 }
rjwbc8a05f2022-03-02 15:23:11 +0800668 network_urc_status = 1;
q.huang7de1d662022-09-13 14:19:24 +0800669 network_rc_status = 1;
rjwbc8a05f2022-03-02 15:23:11 +0800670 network_Global_uToken = utoken;
rjw7e50cd32022-01-18 18:30:37 +0800671 LYLOGSET(LOG_INFO);
672 LYLOGEINIT(USER_LOG_TAG);
673 int ret = 0;
674
q.huang47d4dfe2022-08-17 17:52:29 +0800675 init_network_timer_all();
676
rjw7e50cd32022-01-18 18:30:37 +0800677 ret = lynq_server_socket_start();
678 if(ret !=0)
679 {
680 LYERRLOG("init socket client fail!!!");
681 return -1;
682 }
683 ret = lynq_urc_socket_start();
684 if(ret != 0)
685 {
686 LYERRLOG("init socket urc fail!!!");
687 return -1;
688 }
q.huang7de1d662022-09-13 14:19:24 +0800689 pthread_mutex_init(&g_lynq_network_sendto_mutex, NULL);
690 pthread_mutex_init(&s_RecvMsgBlockMutex, NULL);
691
rjw7e50cd32022-01-18 18:30:37 +0800692 return 0;
693}
694
695int strUpper(char * str)
696{
697 int i=0;
698 while(1)
699 {
700 if(str[i]=='\0')
701 {
702 break;
703 }
704 if(str[i]>='a'&&str[i]<='z')
705 {
706 str[i]=str[i]-32;
707 }
708 i++;
709 }
710 return 0;
711}
712
q.huang7de1d662022-09-13 14:19:24 +0800713int copyCellInfoList(Parcel* &p,uint64_t *cellinfo,int *tac,int *earfcn)
rjw7e50cd32022-01-18 18:30:37 +0800714{
715 int32_t v=0;
716 int64_t v6=0;
717 if(NULL == cellinfo)
718 {
719 LYERRLOG("*cellinfo error");
720 }
721
722 int nothing = 0;
rjw62a60152022-06-09 17:43:01 +0800723 int tmp_uint64 = 0;
q.huang7de1d662022-09-13 14:19:24 +0800724 p->readInt32(&v);
rjw7e50cd32022-01-18 18:30:37 +0800725 RIL_CellInfoType cellinfoType = RIL_CellInfoType(v);
q.huang7de1d662022-09-13 14:19:24 +0800726 p->readInt32(&nothing);
rjw7e50cd32022-01-18 18:30:37 +0800727 // cellinfo->cellinfo.cellInfoType = RIL_CellInfoType(v);
q.huang7de1d662022-09-13 14:19:24 +0800728 // p->readInt32(&cellinfo->cellinfo.registered);
729 p->readInt32(&v);
rjw7e50cd32022-01-18 18:30:37 +0800730 // cellinfo->cellinfo.timeStampType = RIL_TimeStampType(v);
q.huang7de1d662022-09-13 14:19:24 +0800731 p->readInt64(&v6);
rjw7e50cd32022-01-18 18:30:37 +0800732 // cellinfo->cellinfo.timeStamp = v6;
733 switch(cellinfoType) {
734 case RIL_CELL_INFO_TYPE_GSM: {
q.huang7de1d662022-09-13 14:19:24 +0800735 p->readInt32(&nothing);
736 p->readInt32(&nothing);
737 p->readInt32(&nothing);
738 p->readInt32(&tmp_uint64);
739 p->readInt32(&nothing);
740 p->readInt32(&nothing);
741 p->readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800742 *cellinfo = (uint64_t)tmp_uint64;
rjw61974852022-05-17 16:30:32 +0800743 tac = &nothing;
rjwa8011682022-05-31 17:31:28 +0800744 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800745 break;
746 }
747 case RIL_CELL_INFO_TYPE_WCDMA: {
q.huang7de1d662022-09-13 14:19:24 +0800748 p->readInt32(&nothing);
749 p->readInt32(&nothing);
750 p->readInt32(&nothing);
751 p->readInt32(&tmp_uint64);
752 p->readInt32(&nothing);
753 p->readInt32(&nothing);
754 p->readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800755 *cellinfo = (uint64_t)tmp_uint64;
rjw4200a082022-05-17 17:58:35 +0800756 tac = &nothing;
rjwa8011682022-05-31 17:31:28 +0800757 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800758 break;
759 }
760 case RIL_CELL_INFO_TYPE_CDMA: {
q.huang7de1d662022-09-13 14:19:24 +0800761 p->readInt32(&nothing);
762 p->readInt32(&nothing);
763 p->readInt32(&nothing);
764 p->readInt32(&nothing);
765 p->readInt32(&nothing);
766 p->readInt32(&nothing);
767 p->readInt32(&nothing);
768 p->readInt32(&nothing);
769 p->readInt32(&nothing);
770 p->readInt32(&nothing);
rjw7e50cd32022-01-18 18:30:37 +0800771 cellinfo = 0;
rjw61974852022-05-17 16:30:32 +0800772 tac = &nothing;
rjwa8011682022-05-31 17:31:28 +0800773 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800774 break;
775 }
776 case RIL_CELL_INFO_TYPE_LTE: {
q.huang7de1d662022-09-13 14:19:24 +0800777 p->readInt32(&nothing);
778 p->readInt32(&nothing);
779 p->readInt32(&tmp_uint64);
780 p->readInt32(&nothing);
781 p->readInt32(tac);
782 p->readInt32(earfcn);
783 p->readInt32(&nothing);
784 p->readInt32(&nothing);
785 p->readInt32(&nothing);
786 p->readInt32(&nothing);
787 p->readInt32(&nothing);
788 p->readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800789 *cellinfo = (uint64_t)tmp_uint64;
rjw7e50cd32022-01-18 18:30:37 +0800790 break;
791 }
792 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
q.huang7de1d662022-09-13 14:19:24 +0800793 p->readInt32(&nothing);
794 p->readInt32(&nothing);
795 p->readInt32(&nothing);
796 p->readInt32(&tmp_uint64);
797 p->readInt32(&nothing);
798 p->readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800799 *cellinfo = (uint64_t)tmp_uint64;
rjwa8011682022-05-31 17:31:28 +0800800 tac = &nothing;
801 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800802 break;
803 }
804 case RIL_CELL_INFO_TYPE_NR: {
q.huang7de1d662022-09-13 14:19:24 +0800805 p->readInt32(&nothing);
806 p->readInt32(&nothing);
807 p->readUint64(cellinfo);
808 p->readInt32(&nothing);
809 p->readInt32(tac);
810 p->readInt32(earfcn);
811 p->readInt32(&nothing);
812 p->readInt32(&nothing);
813 p->readInt32(&nothing);
814 p->readInt32(&nothing);
815 p->readInt32(&nothing);
816 p->readInt32(&nothing);
rjw7e50cd32022-01-18 18:30:37 +0800817 break;
818 }
819 }
rjw62a60152022-06-09 17:43:01 +0800820 LYINFLOG("CID in fUNC :%llu",*cellinfo);
rjwa8011682022-05-31 17:31:28 +0800821 LYINFLOG("tac in fUNC :%d",*tac);
822 LYINFLOG("earfcn in fUNC :%d",*earfcn);
rjw7e50cd32022-01-18 18:30:37 +0800823 return 0;
824}
825
826int lynq_network_deinit(void){
rjw22947c22022-03-15 09:21:29 +0800827 if (g_lynq_network_init_flag == 0)
828 {
829 LYERRLOG("deinit twice is not allowed");
830 return -1;
831 }
832 if (network_sock_fd > 0)
833 {
834 close(network_sock_fd);
835 }
836 g_lynq_network_init_flag = 0;
rjwbc8a05f2022-03-02 15:23:11 +0800837 network_urc_status = 0;
q.huang7de1d662022-09-13 14:19:24 +0800838 network_rc_status = 0;
q.huang47d4dfe2022-08-17 17:52:29 +0800839
840 deinit_network_timer_all();
q.huang7de1d662022-09-13 14:19:24 +0800841
842 BLOCK_RC_MSG_LOCK();
843 std::list<Parcel*>::iterator iter;
844 for(iter=g_recv_parcel_list.begin();iter!=g_recv_parcel_list.end();++iter)
845 {
846 delete (*iter);
847 }
848 g_recv_parcel_list.clear();
849 BLOCK_RC_MSG_UNLOCK();
850
rjw7e50cd32022-01-18 18:30:37 +0800851 return 0;
852}
853
q.huang7de1d662022-09-13 14:19:24 +0800854static char * lynqStrdupReadString(Parcel* &p) {
rjw7e50cd32022-01-18 18:30:37 +0800855 size_t stringlen;
856 const char16_t *s16;
857
q.huang7de1d662022-09-13 14:19:24 +0800858 s16 = p->readString16Inplace(&stringlen);
rjw7e50cd32022-01-18 18:30:37 +0800859 return strndup16to8(s16, stringlen);
860}
861
862int lynq_query_operater(char *OperatorFN,char *OperatorSH,char *MccMnc)
863{
864 int ret = -1;
865 if(NULL == OperatorFN||NULL == OperatorSH|| NULL == MccMnc)
rjw7e50cd32022-01-18 18:30:37 +0800866 {
q.huang7de1d662022-09-13 14:19:24 +0800867 LYERRLOG("%s some parameter OperatorFN OperatorSH MccMnc %s %s %s is NULL",__func__,OperatorFN,OperatorSH,MccMnc);
868 return ret;
869 }
870 lynq_resp_t head;
871 Parcel* p=NULL;
872
q.huang65f658c2022-09-13 16:01:58 +0800873 ret=lynq_get_common_request(RIL_REQUEST_OPERATOR,5,p,0,"");
q.huang7de1d662022-09-13 14:19:24 +0800874 if(ret==0)
rjw46769c92022-07-04 21:17:25 +0800875 {
q.huang7de1d662022-09-13 14:19:24 +0800876 if(p==NULL)
rjw7e50cd32022-01-18 18:30:37 +0800877 {
q.huang7de1d662022-09-13 14:19:24 +0800878 LYERRLOG("%s get p error",__func__);
879 return -1;
rjw7e50cd32022-01-18 18:30:37 +0800880 }
q.huang7de1d662022-09-13 14:19:24 +0800881 ret=GetHeader(p,head);
882 if(ret!=0)
883 {
884 LYERRLOG("%s get head error",__func__,ret);
885 delete p;
886 return -1;
887 }
888 if(head.error!=0)
889 {
890 LYERRLOG("%s mdm return head error %d",__func__,head.error);
891 delete p;
892 return head.error;
893 }
894
895 int num ;
896 char *resp[LYNQ_RESP_BUF];
897
898 p->readInt32(&num);
rjw7e50cd32022-01-18 18:30:37 +0800899 if(num == 0)
900 {
901 LYERRLOG("no paramters");
902 }else{
903 for(int i = 0; i<num;i++)
904 {
905 resp[i] = lynqStrdupReadString(p);
906 }
907 if(NULL != resp[0])
908 {
rjw02a50422022-01-25 14:57:53 +0800909 strcpy(OperatorFN,resp[0]);
rjw7e50cd32022-01-18 18:30:37 +0800910 }
911 if(NULL != resp[1])
912 {
rjw02a50422022-01-25 14:57:53 +0800913 strcpy(OperatorSH,resp[1]);
rjw7e50cd32022-01-18 18:30:37 +0800914 }
915 if(NULL != resp[2])
916 {
rjw02a50422022-01-25 14:57:53 +0800917 strcpy(MccMnc,resp[2]);
rjw7e50cd32022-01-18 18:30:37 +0800918 }
919 }
q.huang7de1d662022-09-13 14:19:24 +0800920
921 LYINFLOG("%s suc",__func__);
922 delete p;
923 return 0;
rjw7e50cd32022-01-18 18:30:37 +0800924 }
q.huang7de1d662022-09-13 14:19:24 +0800925
926 LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);
927 return ret;
rjw7e50cd32022-01-18 18:30:37 +0800928}
929
930int lynq_query_network_selection_mode(int *netselMode)
931{
932 int ret = -1;
933 if(NULL == netselMode)
rjw7e50cd32022-01-18 18:30:37 +0800934 {
q.huang7de1d662022-09-13 14:19:24 +0800935 LYERRLOG("%s parameter is NULL",__func__);
936 return ret;
937 }
938 lynq_resp_t head;
939 Parcel* p=NULL;
940
q.huang65f658c2022-09-13 16:01:58 +0800941 ret=lynq_get_common_request(RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE,600,p,0,"");
q.huang7de1d662022-09-13 14:19:24 +0800942 if(ret==0)
rjw46769c92022-07-04 21:17:25 +0800943 {
q.huang7de1d662022-09-13 14:19:24 +0800944 if(p==NULL)
rjw7e50cd32022-01-18 18:30:37 +0800945 {
q.huang7de1d662022-09-13 14:19:24 +0800946 LYERRLOG("%s get p error",__func__);
947 return -1;
rjw7e50cd32022-01-18 18:30:37 +0800948 }
q.huang7de1d662022-09-13 14:19:24 +0800949 ret=GetHeader(p,head);
950 if(ret!=0)
951 {
952 LYERRLOG("%s get head error",__func__,ret);
953 delete p;
954 return -1;
955 }
956 if(head.error!=0)
957 {
958 LYERRLOG("%s mdm return head error %d",__func__,head.error);
959 delete p;
960 return head.error;
961 }
962
963 int readnum;
964 p->readInt32(&readnum);
965 p->readInt32(netselMode);
966
967 LYINFLOG("%s suc",__func__);
968 delete p;
969 return 0;
rjw7e50cd32022-01-18 18:30:37 +0800970 }
q.huang7de1d662022-09-13 14:19:24 +0800971 return ret;
rjw7e50cd32022-01-18 18:30:37 +0800972}
973
974int lynq_set_network_selection_mode(const char *mode,const char* mccmnc)
975{
q.huang7de1d662022-09-13 14:19:24 +0800976 int ret = -1;
977 if(NULL == mode || (strlen(mode) == 0))
rjw78d04502022-02-24 13:37:11 +0800978 {
q.huang7de1d662022-09-13 14:19:24 +0800979 LYERRLOG("%s parameter mod %s is error",__func__,mode);
980 return -1;
rjw78d04502022-02-24 13:37:11 +0800981 }
q.huang7de1d662022-09-13 14:19:24 +0800982
983 if(!strcmp(mode,"Manual"))
984 {
985 if(mccmnc == NULL || strlen(mccmnc) == 0)
986 {
987 LYERRLOG("%s parameter mccmnc %s is error",__func__,mccmnc);
988 return -1;
989 }
990 }
991
992 lynq_resp_t head;
993 Parcel* p=NULL;
994
rjw7e50cd32022-01-18 18:30:37 +0800995 if(!strcmp(mode,"Auto"))
996 {
q.huang65f658c2022-09-13 16:01:58 +0800997 ret=lynq_get_common_request(RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC,5,p,0,"");
q.huang7de1d662022-09-13 14:19:24 +0800998 }
999 else if(!strcmp(mode,"Manual"))
1000 {
q.huang65f658c2022-09-13 16:01:58 +08001001 ret=lynq_get_common_request(RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL,5,p,1,"%s",mccmnc);
q.huang7de1d662022-09-13 14:19:24 +08001002 }
1003 else
1004 {
1005 LYERRLOG("%s parameter mode %s is NULL",__func__,mode);
1006 return -1;
1007 }
1008
1009
1010 if(ret==0)
1011 {
1012 if(p==NULL)
rjw78d04502022-02-24 13:37:11 +08001013 {
q.huang7de1d662022-09-13 14:19:24 +08001014 LYERRLOG("%s get p error",__func__);
1015 return -1;
rjw78d04502022-02-24 13:37:11 +08001016 }
q.huang7de1d662022-09-13 14:19:24 +08001017 ret=GetHeader(p,head);
1018 if(ret!=0)
rjw78d04502022-02-24 13:37:11 +08001019 {
q.huang7de1d662022-09-13 14:19:24 +08001020 LYERRLOG("%s get head error %d",__func__,ret);
1021 delete p;
1022 return -1;
rjw78d04502022-02-24 13:37:11 +08001023 }
q.huang7de1d662022-09-13 14:19:24 +08001024 if(head.error!=0)
1025 {
1026 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1027 delete p;
1028 return head.error;
1029 }
1030 LYINFLOG("%s set mode %s mccmnc %s suc",__func__,mode,mccmnc);
1031 delete p;
1032 return 0;
rjw7e50cd32022-01-18 18:30:37 +08001033 }
1034
q.huang7de1d662022-09-13 14:19:24 +08001035 LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);
1036 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001037}
1038
1039int lynq_query_available_network(char *OperatorFN,char *OperatorSH,char *MccMnc,char * NetStatus)
1040{
1041 int ret = -1;
1042 if(NULL == OperatorFN||NULL == OperatorSH||NULL == MccMnc||NULL == NetStatus)
rjw7e50cd32022-01-18 18:30:37 +08001043 {
q.huang7de1d662022-09-13 14:19:24 +08001044 LYERRLOG("%s there is parameter is NULL",__func__);
rjw7e50cd32022-01-18 18:30:37 +08001045 return ret;
q.huang7de1d662022-09-13 14:19:24 +08001046 }
1047
1048 lynq_resp_t head;
1049 Parcel* p=NULL;
rjw7e50cd32022-01-18 18:30:37 +08001050
q.huang7de1d662022-09-13 14:19:24 +08001051 ret=lynq_get_common_request(RIL_REQUEST_QUERY_AVAILABLE_NETWORKS,600,p,0,"");
1052 if(ret==0)
rjw46769c92022-07-04 21:17:25 +08001053 {
q.huang7de1d662022-09-13 14:19:24 +08001054 if(p==NULL)
rjw7e50cd32022-01-18 18:30:37 +08001055 {
q.huang7de1d662022-09-13 14:19:24 +08001056 LYERRLOG("%s get p error",__func__);
1057 return -1;
rjw7e50cd32022-01-18 18:30:37 +08001058 }
q.huang7de1d662022-09-13 14:19:24 +08001059 ret=GetHeader(p,head);
1060 if(ret!=0)
1061 {
1062 LYERRLOG("%s get head error %d",__func__,ret);
1063 delete p;
1064 return -1;
1065 }
1066 if(head.error!=0)
1067 {
1068 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1069 delete p;
1070 return head.error;
1071 }
1072
1073 int num =p->readInt32();
1074 char *resp[128];
rjw7e50cd32022-01-18 18:30:37 +08001075 if(num == 0)
1076 {
q.huang7de1d662022-09-13 14:19:24 +08001077 LYERRLOG("%s get num is 0",__func__);
1078 delete p;
1079 return -1;
rjw7e50cd32022-01-18 18:30:37 +08001080 }else{
1081 for(int i = 0; i<num;i++)
1082 {
1083 resp[i] = lynqStrdupReadString(p);
1084 }
1085 if(NULL != resp[0])
1086 {
rjw02a50422022-01-25 14:57:53 +08001087 strcpy(OperatorFN,resp[0]);
rjw7e50cd32022-01-18 18:30:37 +08001088 }
1089 if(NULL != resp[1])
1090 {
rjw02a50422022-01-25 14:57:53 +08001091 strcpy(OperatorSH,resp[1]);
rjw7e50cd32022-01-18 18:30:37 +08001092 }
1093 if(NULL != resp[2])
1094 {
rjw02a50422022-01-25 14:57:53 +08001095 strcpy(MccMnc,resp[2]);
rjw7e50cd32022-01-18 18:30:37 +08001096 }
1097 if(NULL != resp[3])
1098 {
rjw02a50422022-01-25 14:57:53 +08001099 strcpy(NetStatus,resp[2]);
rjw7e50cd32022-01-18 18:30:37 +08001100 }
1101 }
q.huang7de1d662022-09-13 14:19:24 +08001102 delete p;
1103 LYINFLOG("%s suc",__func__);
1104 return 0;
rjw7e50cd32022-01-18 18:30:37 +08001105 }
q.huang7de1d662022-09-13 14:19:24 +08001106
1107 LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);
1108 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001109}
1110
rjw4544e132022-04-01 15:00:26 +08001111int 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 +08001112{
1113 int ret = -1;
rjwd98d5872022-04-09 13:50:58 +08001114 if(NULL == type || NULL ==regState ||NULL ==imsRegState ||NULL ==LAC ||NULL ==CID ||NULL ==netType ||NULL ==radioTechFam || NULL == netRejected)
q.huang7de1d662022-09-13 14:19:24 +08001115 {
1116 LYERRLOG("%s there is parameter is NULL",__func__);
rjw7e50cd32022-01-18 18:30:37 +08001117 return ret;
q.huang7de1d662022-09-13 14:19:24 +08001118 }
rjw7e50cd32022-01-18 18:30:37 +08001119 if(strlen(type)>LYNQ_TYPE_BUF)
1120 {
1121 LYERRLOG("[%s]the parameter is inavaliable !",__FUNCTION__);
q.huang7de1d662022-09-13 14:19:24 +08001122 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001123 }
q.huang7de1d662022-09-13 14:19:24 +08001124
1125 lynq_resp_t head;
1126 Parcel* p=NULL;
1127
1128 int request;
1129 char str[LYNQ_TYPE_BUF];
rjw7e50cd32022-01-18 18:30:37 +08001130 memcpy(str,type,strlen(type)+1);
1131 strUpper(str);
1132 if(!strcmp(str,"VOICE"))
1133 {
q.huang47d4dfe2022-08-17 17:52:29 +08001134 if(lynq_get_registration_state_to_buf_voice(regState,netType,netRejected)==0)
1135 {
1136 return 0;
1137 }
q.huang7de1d662022-09-13 14:19:24 +08001138 request = RIL_REQUEST_VOICE_REGISTRATION_STATE;
rjw7e50cd32022-01-18 18:30:37 +08001139 }else if(!strcmp(str,"DATA")){
q.huang47d4dfe2022-08-17 17:52:29 +08001140 if(lynq_get_registration_state_to_buf_data(regState,LAC,CID,netType)==0)
1141 {
1142 return 0;
1143 }
q.huang7de1d662022-09-13 14:19:24 +08001144 request = RIL_REQUEST_DATA_REGISTRATION_STATE;
rjw7e50cd32022-01-18 18:30:37 +08001145 }else if(!strcmp(str,"IMS")){
q.huang47d4dfe2022-08-17 17:52:29 +08001146 if(lynq_get_registration_state_to_buf_ims(imsRegState,radioTechFam)==0)
1147 {
1148 return 0;
1149 }
q.huang7de1d662022-09-13 14:19:24 +08001150 request = RIL_REQUEST_IMS_REGISTRATION_STATE;
rjw7e50cd32022-01-18 18:30:37 +08001151 }else{
1152 LYERRLOG("request error");
1153 return ret;
q.huang7de1d662022-09-13 14:19:24 +08001154 }
rjw7e50cd32022-01-18 18:30:37 +08001155
q.huang65f658c2022-09-13 16:01:58 +08001156 ret=lynq_get_common_request(request,5,p,0,"");
q.huang7de1d662022-09-13 14:19:24 +08001157 if(ret==0)
rjw7e50cd32022-01-18 18:30:37 +08001158 {
q.huang7de1d662022-09-13 14:19:24 +08001159 if(p==NULL)
rjw7e50cd32022-01-18 18:30:37 +08001160 {
q.huang7de1d662022-09-13 14:19:24 +08001161 LYERRLOG("%s get p error",__func__);
1162 return -1;
rjw7e50cd32022-01-18 18:30:37 +08001163 }
q.huang7de1d662022-09-13 14:19:24 +08001164 ret=GetHeader(p,head);
1165 if(ret!=0)
1166 {
1167 LYERRLOG("%s get head error %d",__func__,ret);
1168 delete p;
1169 return -1;
1170 }
1171 if(head.error!=0)
1172 {
1173 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1174 delete p;
1175 return head.error;
1176 }
1177 int num;
rjw7e50cd32022-01-18 18:30:37 +08001178 if(!strcmp(str,"VOICE"))
1179 {
q.huang7de1d662022-09-13 14:19:24 +08001180 p->readInt32(&num);
rjw7e50cd32022-01-18 18:30:37 +08001181 if(num == 15)
1182 {
1183 *regState = atoi(lynqStrdupReadString(p));
1184 lynqStrdupReadString(p);
1185 lynqStrdupReadString(p);
1186 *netType = atoi(lynqStrdupReadString(p));
rjw4544e132022-04-01 15:00:26 +08001187 lynqStrdupReadString(p);
1188 lynqStrdupReadString(p);
1189 lynqStrdupReadString(p);
1190 lynqStrdupReadString(p);
1191 lynqStrdupReadString(p);
1192 lynqStrdupReadString(p);
1193 lynqStrdupReadString(p);
1194 lynqStrdupReadString(p);
1195 lynqStrdupReadString(p);
1196 lynqStrdupReadString(p);
q.huang47d4dfe2022-08-17 17:52:29 +08001197 *netRejected = atoi(lynqStrdupReadString(p));
1198 lynq_set_registration_state_to_buf_voice(*regState,*netType,*netRejected);
rjw7e50cd32022-01-18 18:30:37 +08001199 }
q.huang7de1d662022-09-13 14:19:24 +08001200 else
1201 {
1202 LYERRLOG("%s type %s num %d error",__func__,str,num);
1203 delete p;
1204 return -1;
1205 }
1206 }
1207 else if(!strcmp(str,"DATA")){
1208 p->readInt32(&num);
rjw7e50cd32022-01-18 18:30:37 +08001209 if(num == 11)
1210 {
q.huang7de1d662022-09-13 14:19:24 +08001211 char *resp[LYNQ_RESP_BUF];
rjw7e50cd32022-01-18 18:30:37 +08001212 *regState = atoi(lynqStrdupReadString(p));
rjwcdd83ae2022-01-22 14:10:42 +08001213 resp[0] = lynqStrdupReadString(p);
rjw02a50422022-01-25 14:57:53 +08001214 strcpy(LAC,resp[0]);
rjwcdd83ae2022-01-22 14:10:42 +08001215
1216 resp[1] = lynqStrdupReadString(p);
rjw02a50422022-01-25 14:57:53 +08001217 strcpy(CID,resp[1]);
rjw7e50cd32022-01-18 18:30:37 +08001218 *netType = atoi(lynqStrdupReadString(p));
q.huang47d4dfe2022-08-17 17:52:29 +08001219 lynq_set_registration_state_to_buf_data(*regState,LAC,CID,*netType);
rjw7e50cd32022-01-18 18:30:37 +08001220 }
q.huang7de1d662022-09-13 14:19:24 +08001221 else
1222 {
1223 LYERRLOG("%s type %s num %d error",__func__,str,num);
1224 delete p;
1225 return -1;
1226 }
rjw7e50cd32022-01-18 18:30:37 +08001227
q.huang7de1d662022-09-13 14:19:24 +08001228 }
1229 else // "IMS"
1230 {
1231 p->readInt32(&num);
rjw7e50cd32022-01-18 18:30:37 +08001232 if(num == 2)
1233 {
q.huang7de1d662022-09-13 14:19:24 +08001234 p->readInt32(imsRegState);
1235 p->readInt32(radioTechFam);
q.huang47d4dfe2022-08-17 17:52:29 +08001236 lynq_set_registration_state_to_buf_ims(*imsRegState,*radioTechFam);
rjw7e50cd32022-01-18 18:30:37 +08001237 }
q.huang7de1d662022-09-13 14:19:24 +08001238 else
1239 {
1240 LYERRLOG("%s type %s num %d error",__func__,str,num);
1241 delete p;
1242 return -1;
1243 }
rjw7e50cd32022-01-18 18:30:37 +08001244 }
q.huang7de1d662022-09-13 14:19:24 +08001245 LYINFLOG("%s suc",__func__);
1246 delete p;
1247 return 0;
rjw7e50cd32022-01-18 18:30:37 +08001248 }
q.huang7de1d662022-09-13 14:19:24 +08001249
1250 LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);
1251 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001252}
1253
1254int lynq_query_prefferred_networktype(int *preNetType)
q.huang7de1d662022-09-13 14:19:24 +08001255{
rjw7e50cd32022-01-18 18:30:37 +08001256 int ret = -1;
q.huang7de1d662022-09-13 14:19:24 +08001257 if(NULL == preNetType)
rjw7e50cd32022-01-18 18:30:37 +08001258 {
q.huang7de1d662022-09-13 14:19:24 +08001259 LYERRLOG("%s there is parameter is NULL",__func__);
rjw7e50cd32022-01-18 18:30:37 +08001260 return ret;
q.huang7de1d662022-09-13 14:19:24 +08001261 }
1262
1263 lynq_resp_t head;
1264 Parcel* p=NULL;
1265
q.huang65f658c2022-09-13 16:01:58 +08001266 ret=lynq_get_common_request(RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE,5,p,0,"");
q.huang7de1d662022-09-13 14:19:24 +08001267 if(ret==0)
1268 {
1269 if(p==NULL)
1270 {
1271 LYERRLOG("%s get p error",__func__);
1272 return -1;
1273 }
1274 ret=GetHeader(p,head);
1275 if(ret!=0)
1276 {
1277 LYERRLOG("%s get head error %d",__func__,ret);
1278 delete p;
1279 return -1;
1280 }
1281 if(head.error!=0)
1282 {
1283 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1284 delete p;
1285 return head.error;
1286 }
1287 int num;
1288 p->readInt32(&num);
1289 p->readInt32(preNetType);
1290 LYINFLOG("%s suc",__func__);
1291 delete p;
1292 return 0;
rjw7e50cd32022-01-18 18:30:37 +08001293 }
1294
q.huang7de1d662022-09-13 14:19:24 +08001295 LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);
1296 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001297}
1298
1299int lynq_set_prefferred_networktype(const int preffertype)
1300{
1301 int ret = -1;
1302 if(preffertype < 0||preffertype >33)
rjw7e50cd32022-01-18 18:30:37 +08001303 {
q.huang7de1d662022-09-13 14:19:24 +08001304 LYERRLOG("%s parameter %d error",__func__,preffertype);
rjw7e50cd32022-01-18 18:30:37 +08001305 return ret;
q.huang7de1d662022-09-13 14:19:24 +08001306 }
1307
1308 lynq_resp_t head;
1309 Parcel* p=NULL;
1310
q.huang65f658c2022-09-13 16:01:58 +08001311 ret=lynq_get_common_request(RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE,5,p,1,"%d",preffertype);
q.huang7de1d662022-09-13 14:19:24 +08001312 if(ret==0)
rjw7e50cd32022-01-18 18:30:37 +08001313 {
q.huang7de1d662022-09-13 14:19:24 +08001314 if(p==NULL)
rjw7a8791e2022-09-06 09:07:39 +08001315 {
q.huang7de1d662022-09-13 14:19:24 +08001316 LYERRLOG("%s get p error",__func__);
1317 return -1;
rjw7a8791e2022-09-06 09:07:39 +08001318 }
q.huang7de1d662022-09-13 14:19:24 +08001319 ret=GetHeader(p,head);
1320 if(ret!=0)
1321 {
1322 LYERRLOG("%s get head error %d",__func__,ret);
1323 delete p;
1324 return -1;
1325 }
1326 if(head.error!=0)
1327 {
1328 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1329 delete p;
1330 return head.error;
1331 }
1332 LYINFLOG("%s set %d suc",__func__,preffertype);
1333 delete p;
1334 return 0;
rjw7e50cd32022-01-18 18:30:37 +08001335 }
1336
q.huang7de1d662022-09-13 14:19:24 +08001337 LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);
1338 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001339
1340}
1341
rjw62a60152022-06-09 17:43:01 +08001342int 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 +08001343{
1344 int ret = -1;
1345 if(NULL == realNum)
rjw7e50cd32022-01-18 18:30:37 +08001346 {
q.huang7de1d662022-09-13 14:19:24 +08001347 LYERRLOG("%s there is parameter is NULL",__func__);
rjw7e50cd32022-01-18 18:30:37 +08001348 return ret;
q.huang7de1d662022-09-13 14:19:24 +08001349 }
1350
1351 lynq_resp_t head;
1352 Parcel* p=NULL;
1353
q.huang65f658c2022-09-13 16:01:58 +08001354 ret=lynq_get_common_request(RIL_REQUEST_GET_CELL_INFO_LIST,5,p,0,"");
q.huang7de1d662022-09-13 14:19:24 +08001355 if(ret==0)
rjw46769c92022-07-04 21:17:25 +08001356 {
q.huang7de1d662022-09-13 14:19:24 +08001357 if(p==NULL)
rjw7e50cd32022-01-18 18:30:37 +08001358 {
q.huang7de1d662022-09-13 14:19:24 +08001359 LYERRLOG("%s get p error",__func__);
1360 return -1;
rjw7e50cd32022-01-18 18:30:37 +08001361 }
q.huang7de1d662022-09-13 14:19:24 +08001362 ret=GetHeader(p,head);
1363 if(ret!=0)
1364 {
1365 LYERRLOG("%s get head error %d",__func__,ret);
1366 delete p;
1367 return -1;
1368 }
1369 if(head.error!=0)
1370 {
1371 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1372 delete p;
1373 return head.error;
1374 }
1375
1376 int num;
1377
1378 p->readInt32(&num);
rjw7e50cd32022-01-18 18:30:37 +08001379 LYINFLOG("cell info num:%d",num);
1380 *realNum = num;
1381 for(int i = 0;i<num;i++)
1382 {
rjwa8011682022-05-31 17:31:28 +08001383 copyCellInfoList(p,&cellinfo[i],&tac[i],&earfcn[i]);
rjw7e50cd32022-01-18 18:30:37 +08001384 }
q.huang7de1d662022-09-13 14:19:24 +08001385
1386 LYINFLOG("%s suc",__func__);
1387 delete p;
1388 return 0;
rjw7e50cd32022-01-18 18:30:37 +08001389 }
q.huang7de1d662022-09-13 14:19:24 +08001390
1391 LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);
1392 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001393
1394}
1395
1396int lynq_set_unsol_cell_info_listrate(const int rate)
1397{
q.huang7de1d662022-09-13 14:19:24 +08001398 int ret = -1;
1399 lynq_resp_t head;
1400 Parcel* p=NULL;
1401
q.huang65f658c2022-09-13 16:01:58 +08001402 ret=lynq_get_common_request(RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE,5,p,1,"%d",rate);
q.huang7de1d662022-09-13 14:19:24 +08001403 if(ret==0)
rjw7e50cd32022-01-18 18:30:37 +08001404 {
q.huang7de1d662022-09-13 14:19:24 +08001405 if(p==NULL)
rjw7a8791e2022-09-06 09:07:39 +08001406 {
q.huang7de1d662022-09-13 14:19:24 +08001407 LYERRLOG("%s get p error",__func__);
1408 return -1;
rjw7a8791e2022-09-06 09:07:39 +08001409 }
q.huang7de1d662022-09-13 14:19:24 +08001410 ret=GetHeader(p,head);
1411 if(ret!=0)
1412 {
1413 LYERRLOG("%s get head error %d",__func__,ret);
1414 delete p;
1415 return -1;
1416 }
1417 if(head.error!=0)
1418 {
1419 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1420 delete p;
1421 return head.error;
1422 }
1423 LYINFLOG("%s set %d suc",__func__,rate);
1424 delete p;
1425 return 0;
rjw7e50cd32022-01-18 18:30:37 +08001426 }
1427
q.huang7de1d662022-09-13 14:19:24 +08001428 LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);
1429 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001430}
1431
1432int lynq_set_band_mode(const int bandmode)
1433{
q.huang7de1d662022-09-13 14:19:24 +08001434 int ret = -1;
1435 lynq_resp_t head;
1436 Parcel* p=NULL;
1437
q.huang65f658c2022-09-13 16:01:58 +08001438 ret=lynq_get_common_request(RIL_REQUEST_SET_BAND_MODE,5,p,1,"%d",bandmode);
q.huang7de1d662022-09-13 14:19:24 +08001439 if(ret==0)
rjw7e50cd32022-01-18 18:30:37 +08001440 {
q.huang7de1d662022-09-13 14:19:24 +08001441 if(p==NULL)
rjw7a8791e2022-09-06 09:07:39 +08001442 {
q.huang7de1d662022-09-13 14:19:24 +08001443 LYERRLOG("%s get p error",__func__);
1444 return -1;
rjw7a8791e2022-09-06 09:07:39 +08001445 }
q.huang7de1d662022-09-13 14:19:24 +08001446 ret=GetHeader(p,head);
1447 if(ret!=0)
1448 {
1449 LYERRLOG("%s get head error %d",__func__,ret);
1450 delete p;
1451 return -1;
1452 }
1453 if(head.error!=0)
1454 {
1455 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1456 delete p;
1457 return head.error;
1458 }
1459 LYINFLOG("%s set %d suc",__func__,bandmode);
1460 delete p;
1461 return 0;
rjw7e50cd32022-01-18 18:30:37 +08001462 }
1463
q.huang7de1d662022-09-13 14:19:24 +08001464 LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);
1465 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001466}
1467
1468int lynq_query_available_bandmode(int availBanMode[])
1469{
q.huang7de1d662022-09-13 14:19:24 +08001470 int ret=-1;
1471
rjw7e50cd32022-01-18 18:30:37 +08001472 if(NULL == availBanMode)
rjw7e50cd32022-01-18 18:30:37 +08001473 {
q.huang7de1d662022-09-13 14:19:24 +08001474 LYERRLOG("%s parameter is NULL",__func__);
rjw7e50cd32022-01-18 18:30:37 +08001475 return ret;
1476 }
1477
q.huang7de1d662022-09-13 14:19:24 +08001478 lynq_resp_t head;
1479 Parcel* p=NULL;
1480
q.huang65f658c2022-09-13 16:01:58 +08001481 ret=lynq_get_common_request(RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE,5,p,0,"");
q.huang7de1d662022-09-13 14:19:24 +08001482 if(ret==0)
rjw7e50cd32022-01-18 18:30:37 +08001483 {
q.huang7de1d662022-09-13 14:19:24 +08001484 if(p==NULL)
rjw7e50cd32022-01-18 18:30:37 +08001485 {
q.huang7de1d662022-09-13 14:19:24 +08001486 LYERRLOG("%s get p error",__func__);
1487 return -1;
rjw7e50cd32022-01-18 18:30:37 +08001488 }
q.huang7de1d662022-09-13 14:19:24 +08001489 ret=GetHeader(p,head);
1490 if(ret!=0)
1491 {
1492 LYERRLOG("%s get head error",__func__,ret);
1493 delete p;
1494 return -1;
1495 }
1496 if(head.error!=0)
1497 {
1498 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1499 delete p;
1500 return head.error;
1501 }
1502
1503 int num = 0;
1504 int res = 0;
1505 int i;
1506
1507 p->readInt32(&num);
rjw7e50cd32022-01-18 18:30:37 +08001508 LYINFLOG("num = %d",num);
1509 availBanMode[0] = num;
q.huang7de1d662022-09-13 14:19:24 +08001510 for(i=1 ;i<=num;i++)
rjw7e50cd32022-01-18 18:30:37 +08001511 {
q.huang7de1d662022-09-13 14:19:24 +08001512 p->readInt32(&res);
rjw7e50cd32022-01-18 18:30:37 +08001513 availBanMode[i]=res;
1514 }
q.huang7de1d662022-09-13 14:19:24 +08001515
1516 LYINFLOG("%s suc",__func__);
1517 delete p;
1518 return -1;
rjw7e50cd32022-01-18 18:30:37 +08001519 }
1520
q.huang7de1d662022-09-13 14:19:24 +08001521 LYERRLOG("%s send request error %d",__func__,ret);
1522
1523 return ret;
1524
rjw7e50cd32022-01-18 18:30:37 +08001525}
1526
1527int lynq_radio_on(const int data)
q.huang7de1d662022-09-13 14:19:24 +08001528{
rjw7e50cd32022-01-18 18:30:37 +08001529 int ret = -1;
q.huang7de1d662022-09-13 14:19:24 +08001530 if (data < 0 || data > 1)
rjw7e50cd32022-01-18 18:30:37 +08001531 {
q.huang7de1d662022-09-13 14:19:24 +08001532 LYERRLOG("%s parameter %d error",__func__,data);
rjw7e50cd32022-01-18 18:30:37 +08001533 return ret;
q.huang7de1d662022-09-13 14:19:24 +08001534 }
1535
1536 lynq_resp_t head;
1537 Parcel* p=NULL;
1538
q.huang65f658c2022-09-13 16:01:58 +08001539 ret=lynq_get_common_request(RIL_REQUEST_RADIO_POWER,65,p,1,"%d",data);
q.huang7de1d662022-09-13 14:19:24 +08001540 if(ret==0)
rjw46769c92022-07-04 21:17:25 +08001541 {
q.huang7de1d662022-09-13 14:19:24 +08001542 if(p==NULL)
rjw7a8791e2022-09-06 09:07:39 +08001543 {
q.huang7de1d662022-09-13 14:19:24 +08001544 LYERRLOG("%s get p error",__func__);
1545 return -1;
rjw7a8791e2022-09-06 09:07:39 +08001546 }
q.huang7de1d662022-09-13 14:19:24 +08001547 ret=GetHeader(p,head);
1548 if(ret!=0)
1549 {
1550 LYERRLOG("%s get head error %d",__func__,ret);
1551 delete p;
1552 return -1;
1553 }
1554 if(head.error!=0)
1555 {
1556 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1557 delete p;
1558 return head.error;
1559 }
1560 LYINFLOG("%s set %d suc",__func__,data);
1561 delete p;
1562 return 0;
rjw7e50cd32022-01-18 18:30:37 +08001563 }
1564
q.huang7de1d662022-09-13 14:19:24 +08001565 LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);
1566 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001567}
1568
q.huang7de1d662022-09-13 14:19:24 +08001569const char * lynq_get_raw_data(Parcel* &p, int* data_len)
q.huang16dcb0f2022-09-07 09:17:37 +08001570{
1571 int32_t len;
1572 int status;
1573 char *data;
1574
1575 *data_len=0;
1576
q.huang7de1d662022-09-13 14:19:24 +08001577 status = p->readInt32(&len);
q.huang16dcb0f2022-09-07 09:17:37 +08001578
1579 if (status != 0) {
1580 LYERRLOG("%s status is %d",__func__,status);
1581 return NULL;
1582 }
1583
1584 // The java code writes -1 for null arrays
1585 if (((int)len) == -1 || ((int)len) == 0)
1586 {
1587 LYERRLOG("%s len is %d",__func__,len);
1588 return NULL;
1589 }
1590 LYINFLOG("%s len is %d",__func__,len);
1591
q.huang7de1d662022-09-13 14:19:24 +08001592 data = (char*) p->readInplace(len);
q.huang16dcb0f2022-09-07 09:17:37 +08001593 *data_len=len;
1594
1595 return data;
1596}
1597
1598int lynq_query_radio_state(int *radio_state)
1599{
q.huang7de1d662022-09-13 14:19:24 +08001600 int ret=-1;
1601
q.huang16dcb0f2022-09-07 09:17:37 +08001602 if(NULL == radio_state)
1603 {
1604 LYERRLOG("%s radio state is NULL",__func__);
q.huang7de1d662022-09-13 14:19:24 +08001605 return ret;
q.huang16dcb0f2022-09-07 09:17:37 +08001606 }
1607
q.huang7de1d662022-09-13 14:19:24 +08001608 lynq_resp_t head;
1609 Parcel* p=NULL;
1610
q.huang16dcb0f2022-09-07 09:17:37 +08001611 ret=lynq_get_common_request(RIL_REQUEST_OEM_HOOK_RAW,5,p,1,"%s","AT+CFUN");
1612 if(ret==0)
1613 {
q.huang7de1d662022-09-13 14:19:24 +08001614 if(p==NULL)
q.huang16dcb0f2022-09-07 09:17:37 +08001615 {
q.huang7de1d662022-09-13 14:19:24 +08001616 LYERRLOG("%s get p error",__func__);
q.huang16dcb0f2022-09-07 09:17:37 +08001617 return -1;
q.huang16dcb0f2022-09-07 09:17:37 +08001618 }
q.huang7de1d662022-09-13 14:19:24 +08001619 ret=GetHeader(p,head);
1620 if(ret!=0)
1621 {
1622 LYERRLOG("%s get head error",__func__,ret);
1623 delete p;
1624 return -1;
1625 }
1626 if(head.error!=0)
1627 {
1628 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1629 delete p;
1630 return head.error;
1631 }
1632
1633 int bfind=false;
1634 const char* data;
1635 int data_len;
1636 char* data_str;
1637 char* start;
1638 int length;
1639 int i;
1640 int num_start;
1641 data = lynq_get_raw_data(p,&data_len);
1642 if(data==NULL || data_len == 0)
1643 {
1644 LYERRLOG("%s lynq_get_raw_data NULL or data_len is 0",__func__);
1645 delete p;
1646 return -1;
1647 }
1648 data_str = (char*) calloc(1,data_len+1);
1649 if (NULL == data_str)
1650 {
1651 LYERRLOG("%s alloc mem error, data_len is %d",__func__,data_len+1);
1652 delete p;
1653 return -1;
1654 }
1655 memmove(data_str, data, data_len);
1656 data_str[data_len]='\0';
1657 LYINFLOG("%s return string is %s",__func__,data_str);
1658 start = strstr(data_str,"CFUN");
1659 if(start!=NULL)
1660 {
1661 start=start+4;
1662 length=strlen(start);
1663 for(i=0; i<length;i++)
1664 {
1665 if((!bfind) && (start[i] >= '0') && (start[i] <= '9'))
1666 {
1667 bfind=true;
1668 num_start=i;
1669 }
1670 else if(bfind && ((start[i] < '0') || (start[i] > '9')))
1671 {
1672 start[i]='\0';
1673 break;
1674 }
1675 }
1676 if(bfind)
1677 {
1678 (*radio_state) = atoi(start+num_start);
1679 LYINFLOG("%s, radio state is %s %d",__func__,start+num_start,*radio_state);
1680 free(data_str);
1681 delete p;
1682 return 0;
1683 }
1684 }
1685 LYERRLOG("%s return string %s no cfun or no digit",__func__,data_str);
1686 free(data_str);
1687 delete p;
1688 return -1;
q.huang16dcb0f2022-09-07 09:17:37 +08001689 }
1690
1691 LYERRLOG("%s send request error %d",__func__,ret);
1692
1693 return ret;
1694}
1695
rjw7e50cd32022-01-18 18:30:37 +08001696int lynq_query_radio_tech(int* radioTech)
1697{
1698 int ret = -1;
1699 if(NULL == radioTech)
rjw7e50cd32022-01-18 18:30:37 +08001700 {
q.huang7de1d662022-09-13 14:19:24 +08001701 LYERRLOG("%s radio tech is NULL",__func__);
1702 return ret;
1703 }
rjw7e50cd32022-01-18 18:30:37 +08001704
q.huang7de1d662022-09-13 14:19:24 +08001705 lynq_resp_t head;
1706 Parcel* p=NULL;
1707
q.huang65f658c2022-09-13 16:01:58 +08001708 ret=lynq_get_common_request(RIL_REQUEST_VOICE_RADIO_TECH,5,p,0,"");
q.huang7de1d662022-09-13 14:19:24 +08001709 if(ret==0)
rjw46769c92022-07-04 21:17:25 +08001710 {
q.huang7de1d662022-09-13 14:19:24 +08001711 if(p==NULL)
rjw7e50cd32022-01-18 18:30:37 +08001712 {
q.huang7de1d662022-09-13 14:19:24 +08001713 LYERRLOG("%s get p error",__func__);
1714 return -1;
rjw7e50cd32022-01-18 18:30:37 +08001715 }
q.huang7de1d662022-09-13 14:19:24 +08001716 ret=GetHeader(p,head);
1717 if(ret!=0)
1718 {
1719 LYERRLOG("%s get head error",__func__,ret);
1720 delete p;
1721 return -1;
1722 }
1723 if(head.error!=0)
1724 {
1725 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1726 delete p;
1727 return head.error;
1728 }
1729
1730 int num;
1731 p->readInt32(&num);
1732 p->readInt32(radioTech);
1733
1734 LYINFLOG("%s suc",__func__);
1735 delete p;
1736 return head.error;
rjw7e50cd32022-01-18 18:30:37 +08001737 }
q.huang7de1d662022-09-13 14:19:24 +08001738 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001739}
1740
1741int lynq_solicited_signal_strength(signalStrength_t *solSigStren)
1742{
q.huang7de1d662022-09-13 14:19:24 +08001743 int ret=-1;
1744
rjw7e50cd32022-01-18 18:30:37 +08001745 if(NULL == solSigStren)
rjw7e50cd32022-01-18 18:30:37 +08001746 {
q.huang7de1d662022-09-13 14:19:24 +08001747 LYERRLOG("%s parameter is NULL",__func__);
rjw7e50cd32022-01-18 18:30:37 +08001748 return ret;
1749 }
1750
q.huang7de1d662022-09-13 14:19:24 +08001751 lynq_resp_t head;
1752 Parcel* p=NULL;
1753
q.huang65f658c2022-09-13 16:01:58 +08001754 ret=lynq_get_common_request(RIL_REQUEST_SIGNAL_STRENGTH,8,p,0,"");
q.huang7de1d662022-09-13 14:19:24 +08001755 if(ret==0)
rjw46769c92022-07-04 21:17:25 +08001756 {
q.huang7de1d662022-09-13 14:19:24 +08001757 if(p==NULL)
rjw7e50cd32022-01-18 18:30:37 +08001758 {
q.huang7de1d662022-09-13 14:19:24 +08001759 LYERRLOG("%s get p error",__func__);
1760 return -1;
1761 }
1762 ret=GetHeader(p,head);
1763 if(ret!=0)
1764 {
1765 LYERRLOG("%s get head error",__func__,ret);
1766 delete p;
1767 return -1;
1768 }
1769 if(head.error!=0)
1770 {
1771 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1772 delete p;
1773 return head.error;
rjw7e50cd32022-01-18 18:30:37 +08001774 }
1775
q.huang7de1d662022-09-13 14:19:24 +08001776 int sum = 0;
1777 int LTE_signalstrength = 0;
1778 int WCDMA_signalstrength = 0;
1779 int none = 0;
1780
1781 p->readInt32(&solSigStren->rssi);
rjw7e50cd32022-01-18 18:30:37 +08001782 if((solSigStren->rssi!=99)&&(solSigStren->rssi!=0))
1783 {
1784 solSigStren->gw_sig_valid = 1;
1785 }else{
1786 solSigStren->gw_sig_valid = 0;
1787 }
1788
q.huang7de1d662022-09-13 14:19:24 +08001789 p->readInt32(&none);
1790 p->readInt32(&none);
1791 p->readInt32(&none);
1792 p->readInt32(&none);
1793 p->readInt32(&none);
1794 p->readInt32(&none);
1795 p->readInt32(&none);
1796 p->readInt32(&LTE_signalstrength);
1797 // p->readInt32(&solSigStren->signalStrength.LTE_SignalStrength.signalStrength);
1798 p->readInt32(&solSigStren->rsrp);
1799 p->readInt32(&solSigStren->rsrq);
1800 p->readInt32(&solSigStren->rssnr);
rjw7e50cd32022-01-18 18:30:37 +08001801 LYINFLOG("LTE_signalstrength:%d",LTE_signalstrength);
1802 if((LTE_signalstrength!=99)&&(LTE_signalstrength!=0))
1803 {
1804 solSigStren->lte_sig_valid = 1;
1805 }else{
1806 solSigStren->lte_sig_valid = 0;
1807 }
1808
q.huang7de1d662022-09-13 14:19:24 +08001809 p->readInt32(&none);
1810 p->readInt32(&none);
1811 p->readInt32(&none);
1812 p->readInt32(&none);
1813 p->readInt32(&none);
1814 p->readInt32(&WCDMA_signalstrength);
1815 p->readInt32(&none);
1816 p->readInt32(&solSigStren->rscp);
1817 p->readInt32(&solSigStren->ecno);
rjw7e50cd32022-01-18 18:30:37 +08001818 LYINFLOG("WCDMA_signalstrength:%d",WCDMA_signalstrength);
1819 if((WCDMA_signalstrength!=99)&&(WCDMA_signalstrength!=0))
1820 {
rjwcdd83ae2022-01-22 14:10:42 +08001821 solSigStren->wcdma_sig_valid = 1;
rjw7e50cd32022-01-18 18:30:37 +08001822 }else{
rjwcdd83ae2022-01-22 14:10:42 +08001823 solSigStren->wcdma_sig_valid = 0;
rjw7e50cd32022-01-18 18:30:37 +08001824 }
rjwcdd83ae2022-01-22 14:10:42 +08001825 /*bug fix*/
q.huang7de1d662022-09-13 14:19:24 +08001826 p->readInt32(&solSigStren->ssRsrp);
1827 p->readInt32(&solSigStren->ssRsrq);
1828 p->readInt32(&solSigStren->ssSinr);
1829 p->readInt32(&solSigStren->csiRsrp);
1830 p->readInt32(&solSigStren->csiRsrq);
1831 p->readInt32(&solSigStren->csiSinr);
rjw7e50cd32022-01-18 18:30:37 +08001832 sum = (solSigStren->ssRsrp) + (solSigStren->ssRsrq) + (solSigStren->ssSinr) + (solSigStren->csiRsrp)+\
1833 (solSigStren->csiRsrq) + (solSigStren->csiSinr);
1834 if(sum != 0)
1835 {
1836 solSigStren->nr_sig_valid = 1;
1837 }else{
1838 LYERRLOG("None of NR signal info");
q.huang7de1d662022-09-13 14:19:24 +08001839 }
1840
1841 LYINFLOG("%s suc",__func__);
1842 delete p;
1843 return 0;
rjw7e50cd32022-01-18 18:30:37 +08001844 }
q.huang7de1d662022-09-13 14:19:24 +08001845
1846 LYERRLOG("%s send request error %d",__func__,ret);
1847
1848 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001849}
rjwbc8a05f2022-03-02 15:23:11 +08001850
rjw4a5a78d2022-03-10 11:04:24 +08001851int lynq_set_ims(const int ims_mode)
1852{
q.huang7de1d662022-09-13 14:19:24 +08001853 if(ims_mode == -1000)
1854 {
1855 g_inner_test = 1;
1856 return 0;
1857 }
1858
rjw4a5a78d2022-03-10 11:04:24 +08001859 int ret = -1;
1860 if (ims_mode < 0 || ims_mode > 1)
1861 {
q.huang7de1d662022-09-13 14:19:24 +08001862 LYERRLOG("%s parameter %d error",__func__,ims_mode);
rjw4a5a78d2022-03-10 11:04:24 +08001863 return ret;
q.huang7de1d662022-09-13 14:19:24 +08001864 }
1865
1866 lynq_resp_t head;
1867 Parcel* p=NULL;
1868
q.huang65f658c2022-09-13 16:01:58 +08001869 ret=lynq_get_common_request(RIL_REQUEST_SET_IMS_ENABLE,65,p,1,"%d",ims_mode);
q.huang7de1d662022-09-13 14:19:24 +08001870 if(ret==0)
rjw4a5a78d2022-03-10 11:04:24 +08001871 {
q.huang7de1d662022-09-13 14:19:24 +08001872 if(p==NULL)
rjw7a8791e2022-09-06 09:07:39 +08001873 {
q.huang7de1d662022-09-13 14:19:24 +08001874 LYERRLOG("%s get p error",__func__);
1875 return -1;
rjw7a8791e2022-09-06 09:07:39 +08001876 }
q.huang7de1d662022-09-13 14:19:24 +08001877 ret=GetHeader(p,head);
1878 if(ret!=0)
1879 {
1880 LYERRLOG("%s get head error %d",__func__,ret);
1881 delete p;
1882 return -1;
1883 }
1884 if(head.error!=0)
1885 {
1886 LYERRLOG("%s mdm return head error %d",__func__,head.error);
1887 delete p;
1888 return head.error;
1889 }
1890 LYINFLOG("%s set %d suc",__func__,ims_mode);
1891 delete p;
1892 return 0;
rjw4a5a78d2022-03-10 11:04:24 +08001893 }
1894
q.huang7de1d662022-09-13 14:19:24 +08001895 LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);
1896 return ret;
rjw4a5a78d2022-03-10 11:04:24 +08001897}
1898
1899
rjwbc8a05f2022-03-02 15:23:11 +08001900/*Used to wait for an update signal*/
1901int lynq_wait_signalchanges(int *handle)
1902{
1903 LYDBGLOG("start wait signalchanges info");
1904 if(NULL == handle)
1905 {
1906 LYERRLOG("illegal input");
1907 return -1;
1908 }
1909 wait_signal_changes();
1910 LYDBGLOG("get signalchanges");
1911 *handle = network_wait_urc_id;
1912 return 0;
1913}
1914/*Used to get urc info*/
1915int lynq_get_urc_info(const int handle,signalStrength_t *solSigStren,int *slot_id)
1916{
1917 LYDBGLOG("start get urc info");
1918 if(handle != 1002&&handle != 1009)
1919 {
1920 LYINFLOG("invalid handle!!!");
1921 return -1;
1922 }
1923 if(NULL == solSigStren && NULL == slot_id)
1924 {
1925 LYINFLOG("incoming solSigStren or slot_id is NULL!!!");
1926 return -1;
1927 }
1928 switch(handle)
1929 {
1930 case 1002: //RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED
1931 {
1932 LYDBGLOG("get state update to VOICE");
1933 *slot_id = network_urc_slot_id;
1934 LYINFLOG("slot_id = %d",network_urc_slot_id);
rjw25d01752022-08-04 09:42:00 +08001935 break;
rjwbc8a05f2022-03-02 15:23:11 +08001936 }
1937 case 1009: //RIL_UNSOL_SIGNAL_STRENGTH
1938 {
1939 LYDBGLOG("get state update to signal info");
1940 solSigStren->gw_sig_valid = network_urc_solSigStren.gw_sig_valid;
1941 solSigStren->rssi = network_urc_solSigStren.rssi;
1942 solSigStren->wcdma_sig_valid = network_urc_solSigStren.wcdma_sig_valid;
1943 solSigStren->rscp = network_urc_solSigStren.rscp;
1944 solSigStren->ecno = network_urc_solSigStren.ecno;
1945 solSigStren->lte_sig_valid = network_urc_solSigStren.lte_sig_valid;
1946 solSigStren->rsrp = network_urc_solSigStren.rsrp;
1947 solSigStren->rsrq = network_urc_solSigStren.rsrq;
1948 solSigStren->rssnr = network_urc_solSigStren.rssnr;
1949 solSigStren->nr_sig_valid = network_urc_solSigStren.nr_sig_valid;
1950 solSigStren->ssRsrp = network_urc_solSigStren.ssRsrp;
1951 solSigStren->ssRsrq = network_urc_solSigStren.ssRsrq;
1952 solSigStren->ssSinr = network_urc_solSigStren.ssSinr;
1953 solSigStren->csiRsrp = network_urc_solSigStren.csiRsrp;
1954 solSigStren->csiRsrq = network_urc_solSigStren.csiRsrq;
1955 solSigStren->csiSinr = network_urc_solSigStren.csiSinr;
rjw25d01752022-08-04 09:42:00 +08001956 break;
rjwbc8a05f2022-03-02 15:23:11 +08001957 }
1958 }
1959 return 0;
rjw4200a082022-05-17 17:58:35 +08001960}
lh3a26dd52022-07-01 04:44:57 -07001961
1962/**@brief parse at response,return error code,and the response
1963* @param response [IN] <response>:original at response,This parameter must be a character array.
1964
1965* @param value [OUT] <value>: Used to receive the parsed value, if multiple values are separated by ";".
1966* field:
1967* eg:
1968* "+cnum: 123456\n+cnum: 456"
1969* value:12345;456;
1970* @param value_len [IN] <value_len>: The value length.
1971
1972* @return:AT error code
1973*/
1974static int parse_at_result(char response[],char value[],int value_len)
1975{
1976 if(response == NULL || value == NULL)
1977 {
1978 LYERRLOG("parameter invalid");
1979 return -1;
1980 }
1981 if(strstr(response,"ERROR"))
1982 {
1983 int i;
1984 for(i = 0;i < strlen(response);i++)
1985 {
1986 if(response[i]==':')
1987 {
1988 break;
1989 }
1990 }
1991 if(i < strlen(response))
1992 {
1993 LYINFLOG("parse_result:%d\n",atoi(response+i+1));
1994 return atoi(response+i+1);
1995 }
1996 else
1997 {
1998 LYINFLOG("%s parse_result:fail,this response invalid\n",response);
1999 return 100; //unknown
2000 }
2001 }
2002 else if(strstr(response,"OK"))
2003 {
2004 /** parse the at response value
2005 * eg:
2006 * --> at+cnum
2007 * <-- +CNUM:"1243452"
2008 * need parse the "1243452" to <value>
2009 *@ To-Do
2010 */
2011 int count;
2012 int resp_addr[32] = {0};
2013 char temp_buf[1024] = {0};
2014 char *dest;
2015 dest = NULL;
2016 count = 0;
2017 int res_len = strlen(response);
2018 LYINFLOG("res_len:%d",res_len);
2019 for(int i = 0; i < res_len; i++)
2020 {
2021 if(response[i]==':')
2022 {
2023 resp_addr[count] = i;
2024 count++;
2025 }
2026 if(response[i] == '\n')
2027 {
2028 response[i] = '\0';
2029 }
2030 }
2031 LYINFLOG("count:%d",count);
2032 if(count > 0)
2033 {
2034 for(int i = 0; i < count; i++)
2035 {
2036 if((strlen(temp_buf) + strlen(response+resp_addr[i]+2)) >= 1023)
2037 {
2038 LYINFLOG("2 will be out of range\n");
2039 break;
2040 }
2041 if(strlen(temp_buf) >= 1023)
2042 {
2043 LYINFLOG("1 will be out of range\n");
2044 break;
2045 }
2046 strcat(temp_buf,response+resp_addr[i]+2);
2047
2048 if(strlen(temp_buf) >= 1023)
2049 {
2050 LYINFLOG("1 will be out of range\n");
2051 break;
2052 }
2053 strcat(temp_buf,";");
2054 printf("parse_result[%d]:%s,strcated:%s\n",i,response+resp_addr[i]+2,temp_buf);
2055 }
2056 LYINFLOG("parse_result:%s\n",temp_buf);
2057 if(strlen(temp_buf) > value_len)
2058 {
2059 printf("result length over value:%ld,%d\n",strlen(temp_buf),value_len);
2060 memcpy(value,temp_buf,value_len);
2061 }
2062 else
2063 {
2064 memcpy(value,temp_buf,strlen(temp_buf));
2065 }
2066 }
2067 return 0;
2068 }
2069 else
2070 {
2071 LYINFLOG("%s this response invalid\n",response);
2072 return -1;
2073 }
2074}
2075#ifdef MODEM_GEN97
2076
2077int lynq_oos_recover_timer_interval(int mode, char interval[LY_RECOVER_TIMER_INTERVAL],char result[LY_RECOVER_TIMER_INTERVAL])
2078{
q.huang7de1d662022-09-13 14:19:24 +08002079 int ret=-1;
2080
2081 if((mode < 0) || (mode >1) || (mode == 0 && NULL == interval) || (NULL == result))
lh3a26dd52022-07-01 04:44:57 -07002082 {
q.huang7de1d662022-09-13 14:19:24 +08002083 LYERRLOG("%s mode %d interval %s result %s error",__func__,mode,interval,result);
2084 return -1;
lh3a26dd52022-07-01 04:44:57 -07002085 }
2086
q.huang7de1d662022-09-13 14:19:24 +08002087 lynq_resp_t head;
2088 Parcel* p=NULL;
2089
lh3a26dd52022-07-01 04:44:57 -07002090 if(mode == 0)
2091 {
q.huang7de1d662022-09-13 14:19:24 +08002092 ret=lynq_get_common_request(RIL_REQUEST_OEM_HOOK_RAW,5,p,1,"AT+ERSCFG=%s",interval);
lh3a26dd52022-07-01 04:44:57 -07002093 }
q.huang7de1d662022-09-13 14:19:24 +08002094 else
lh3a26dd52022-07-01 04:44:57 -07002095 {
q.huang7de1d662022-09-13 14:19:24 +08002096 ret=lynq_get_common_request(RIL_REQUEST_OEM_HOOK_RAW,5,p,1,"AT+ERSCFG?");
lh3a26dd52022-07-01 04:44:57 -07002097 }
q.huang7de1d662022-09-13 14:19:24 +08002098
2099 if(ret==0)
lh3a26dd52022-07-01 04:44:57 -07002100 {
q.huang7de1d662022-09-13 14:19:24 +08002101 if(p==NULL)
2102 {
2103 LYERRLOG("%s get p error",__func__);
2104 return -1;
2105 }
2106 ret=GetHeader(p,head);
2107 if(ret!=0)
2108 {
2109 LYERRLOG("%s get head error",__func__,ret);
2110 delete p;
2111 return -1;
2112 }
2113 if(head.error!=0)
2114 {
2115 LYERRLOG("%s mdm return head error %d",__func__,head.error);
2116 delete p;
2117 return head.error;
2118 }
2119
2120 int recv_len;
2121 char res_data[LY_RECOVER_TIMER_INTERVAL] = {0};
2122 char response_interval[LY_RECOVER_TIMER_INTERVAL*2] = {0};
2123
2124
lh3a26dd52022-07-01 04:44:57 -07002125 LYINFLOG("get recover timer interval");
q.huang7de1d662022-09-13 14:19:24 +08002126 p->readInt32(&recv_len);
lh3a26dd52022-07-01 04:44:57 -07002127 if(recv_len == -1)
2128 {
2129 LYINFLOG("no responset");
q.huang7de1d662022-09-13 14:19:24 +08002130 delete p;
lh3a26dd52022-07-01 04:44:57 -07002131 return -1;
2132 }
2133 else
2134 {
2135 LYINFLOG("recv_len:%d",recv_len);
q.huang7de1d662022-09-13 14:19:24 +08002136 p->read(response_interval,recv_len);
lh3a26dd52022-07-01 04:44:57 -07002137 }
2138 LYINFLOG("response_interval:%s",response_interval);
2139 ret = parse_at_result(response_interval,res_data,LY_RECOVER_TIMER_INTERVAL);
2140 if(mode == 1)
2141 {
2142 if(strlen(res_data) <= LY_RECOVER_TIMER_INTERVAL)
2143 {
2144 memcpy(result,res_data,strlen(res_data));
2145 }
2146 }
q.huang7de1d662022-09-13 14:19:24 +08002147 LYERRLOG("%s ret:%d",__func__,ret);
2148 delete p;
2149 return ret;
lh3a26dd52022-07-01 04:44:57 -07002150 }
q.huang7de1d662022-09-13 14:19:24 +08002151
2152 LYERRLOG("%s send request error %d",__func__,ret);
2153
2154 return ret;
lh3a26dd52022-07-01 04:44:57 -07002155}
2156
2157int lynq_oos_deep_sleep_recover_timer_interval(int recovery_threshold,int fullband_timer,int sniffer_timer,int inactive_mode)
2158{
q.huang7de1d662022-09-13 14:19:24 +08002159 int ret=-1;
lh3a26dd52022-07-01 04:44:57 -07002160
lh3a26dd52022-07-01 04:44:57 -07002161 if(((recovery_threshold < 2) || (recovery_threshold > 10)) || ((fullband_timer < 90) || (fullband_timer > 360)) ||
2162 ((sniffer_timer < 10) || (sniffer_timer > 60)) || ((inactive_mode < 0) || (inactive_mode > 1)))
2163 {
q.huang7de1d662022-09-13 14:19:24 +08002164 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 -07002165 return ret;
2166 }
2167
q.huang7de1d662022-09-13 14:19:24 +08002168 lynq_resp_t head;
2169 Parcel* p=NULL;
2170
2171 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);
2172 if(ret==0)
lh3a26dd52022-07-01 04:44:57 -07002173 {
q.huang7de1d662022-09-13 14:19:24 +08002174 if(p==NULL)
2175 {
2176 LYERRLOG("%s get p error",__func__);
2177 return -1;
2178 }
2179 ret=GetHeader(p,head);
2180 if(ret!=0)
2181 {
2182 LYERRLOG("%s get head error",__func__,ret);
2183 delete p;
2184 return -1;
2185 }
2186 if(head.error!=0)
2187 {
2188 LYERRLOG("%s mdm return head error %d",__func__,head.error);
2189 delete p;
2190 return head.error;
2191 }
2192
2193 int recv_len;
2194 char res_data[LY_RECOVER_TIMER_INTERVAL] = {0};
2195 char response_interval[LY_RECOVER_TIMER_INTERVAL*2] = {0};
2196
2197 p->readInt32(&recv_len);
lh3a26dd52022-07-01 04:44:57 -07002198 if(recv_len == -1)
2199 {
2200 LYINFLOG("no responset");
q.huang7de1d662022-09-13 14:19:24 +08002201 delete p;
lh3a26dd52022-07-01 04:44:57 -07002202 return -1;
2203 }
2204 else
2205 {
2206 LYINFLOG("recv_len:%d",recv_len);
q.huang7de1d662022-09-13 14:19:24 +08002207 p->read(response_interval,recv_len);
lh3a26dd52022-07-01 04:44:57 -07002208 }
2209 LYINFLOG("response_interval:%s",response_interval);
2210 ret = parse_at_result(response_interval,res_data,LY_RECOVER_TIMER_INTERVAL);
q.huang7de1d662022-09-13 14:19:24 +08002211 LYERRLOG("%s ret:%d",__func__,ret);
2212 delete p;
2213 return ret;
lh3a26dd52022-07-01 04:44:57 -07002214 }
q.huang7de1d662022-09-13 14:19:24 +08002215
2216 LYERRLOG("%s send request error %d",__func__,ret);
2217
2218 return ret;
lh3a26dd52022-07-01 04:44:57 -07002219}
2220#endif
2221