blob: fa3090bc6f42c8e10a05f075a414b4b8af79d2ff [file] [log] [blame]
rjw7e50cd32022-01-18 18:30:37 +08001#include <stdio.h>
2#include <sys/types.h>
3#include <sys/socket.h>
4#include <arpa/inet.h>
5#include <string.h>
6#include <unistd.h>
7#include <binder/Parcel.h>
8#include <log/log.h>
9#include <cutils/jstring.h>
10#include <pthread.h>
11#include <vendor-ril/telephony/ril.h>
rjw4a5a78d2022-03-10 11:04:24 +080012#include <vendor-ril/telephony/mtk_ril_sp.h>
rjw7e50cd32022-01-18 18:30:37 +080013
14#include "lynq_network.h"
15#include "liblog/lynq_deflog.h"
q.huang47d4dfe2022-08-17 17:52:29 +080016#include "lynq_network_state_buffer.h"
rjw7e50cd32022-01-18 18:30:37 +080017#define LYNQ_SERVICE_PORT 8088
18#define LYNQ_URC_SERVICE_PORT 8086
19#define LYNQ_URC_ADDRESS "0.0.0.0"
20#define LYNQ_ADDRESS "127.0.0.1"
21#define LYNQ_REQUEST_PARAM_BUF 8192
22#define LYNQ_REC_BUF 8192
23#define LYNQ_RESP_BUF 128
24#define LYNQ_TYPE_BUF 10
25#define USER_LOG_TAG "LYNQ_NETWORK"
26
27
28using ::android::Parcel;
29
30
31typedef struct{
32 int uToken;
33 int request;
34 int paramLen;
35 char param[LYNQ_REQUEST_PARAM_BUF];
36}lynq_client_t;
37
38typedef struct{
39 int resp_type;
40 int request;
41 int slot_id;
42 int error;
43}lynq_resp_t;
44
45lynq_client_t client_t;
46lynq_resp_t response;
rjwbc8a05f2022-03-02 15:23:11 +080047
48int network_len_addr_serv;
49int network_len_urc_addr_serv;
50struct sockaddr_in network_addr_serv;
51struct sockaddr_in network_urc_addr_serv;
52static int network_sock_fd = 0;
53int network_urc_sock_fd = 0;
54int network_Global_uToken = 0;
55int network_slot_id = -1;
56int network_urc_slot_id = -1;
57int network_urc_status = 1;
58int network_wait_urc_id = 0;
59signalStrength_t network_urc_solSigStren;
rjw22947c22022-03-15 09:21:29 +080060/**g_lynq_network_init_flag
61* @brief mark network initialization state
62* 0:deinit status
63* 1:init state
64*/
65static int g_lynq_network_init_flag = 0;
rjw7e50cd32022-01-18 18:30:37 +080066
rjwbc8a05f2022-03-02 15:23:11 +080067static pthread_mutex_t signal_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
68static pthread_cond_t signal_state_change_cond = PTHREAD_COND_INITIALIZER;
rjw7e50cd32022-01-18 18:30:37 +080069
rjw9c301f82022-05-25 09:10:33 +080070/**g_lynq_network_sendto_mutex
71* @brief mark network send request mutex
72*/
73static pthread_mutex_t g_lynq_network_sendto_mutex;
74
75//static pthread_mutex_t g_lynq_network_recv_mutex;
76
rjw7e50cd32022-01-18 18:30:37 +080077typedef enum{
78 LYNQ_E_CARDSTATE_ERROR=8000,
79 /* The voice service state is out of service*/
80 LYNQ_E_STATE_OUT_OF_SERVICE=8001,
81 /* The voice service state is EMERGENCY_ONLY*/
82 LYNQ_E_STATE_EMERGENCY_ONLY=8002,
83 /* The radio power is power off*/
84 LYNQ_E_STATE_POWER_OFF=8003,
85 LYNQ_E_TIME_OUT=8004,
86 /*create or open sms DB fail */
87 LYNQ_E_SMS_DB_FAIL=8005,
88 /*Failed to execute sql statement*/
89 LYNQ_E_SMS_SQL_FAIL = 8006,
90 LYNQ_E_SMS_NOT_FIND = 8007,
91 /* The logic conflict*/
92 LYNQ_E_CONFLICT=9000,
93 /*Null anomaly*/
94 LYNQ_E_NULL_ANONALY=9001
95}LYNQ_E;
96
lh3a26dd52022-07-01 04:44:57 -070097
98/**@brief get response and write msg to parcel
99* @param p [IN] <p>: the parcel
100*
101* @param time_out [IN] <time_out>: timeout.
102* < 0:use defult timeout(5s)
103* >=0:use this timeout
104* @return
105* 0:success
106* other:failure
107*/
108int get_response(Parcel &p,int time_out)
109{
rjwa59bf312022-07-05 11:50:31 +0800110 int len = 0;
111 char recvline[LYNQ_REC_BUF];
lh3a26dd52022-07-01 04:44:57 -0700112 bzero(recvline,LYNQ_REC_BUF);
113 LYINFLOG("get response");
114 /* receive data from server */
115 struct timeval timeOut;
rjwa59bf312022-07-05 11:50:31 +0800116 timeOut.tv_sec = 30; //defualt 5s
lh3a26dd52022-07-01 04:44:57 -0700117 timeOut.tv_usec = 0;
118 if(time_out >= 0)
119 {
120 LYINFLOG("use time out %d",time_out);
121 timeOut.tv_sec = time_out; //just set second
122 }
123 if(setsockopt(network_sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
124 {
125 LYERRLOG("time out setting failed");
126 return -1;
127 }
128 len = recvfrom(network_sock_fd,recvline,sizeof(recvline),0,(struct sockaddr *)&network_addr_serv,(socklen_t *)&network_len_addr_serv);
129 if(len == -1 && errno == EAGAIN)
130 {
131 LYERRLOG("read error,maybe timeout: %s",strerror(errno));
132 return LYNQ_E_TIME_OUT;
rjwa59bf312022-07-05 11:50:31 +0800133 }
lh3a26dd52022-07-01 04:44:57 -0700134 if (recvline != NULL)
135 {
rjwa59bf312022-07-05 11:50:31 +0800136 p.setData((uint8_t *)recvline,len); // p.setData((uint8_t *) buffer, buflen);
137 p.setDataPosition(0);
138 }
139 return 0;
140}
141int JumpHeader(Parcel &p,int *resp_type,int *request,int *slot_id,int *error)
lh3a26dd52022-07-01 04:44:57 -0700142{
143 LYINFLOG("jump header");
rjwa59bf312022-07-05 11:50:31 +0800144 if(p.dataAvail() > 0)
145 {
146 p.readInt32(resp_type);
147 p.readInt32(request);
148 p.readInt32(slot_id);
149 p.readInt32(error);
150 return 0;
151 }
152 else
153 {
154 return -1;
155 }
lh3a26dd52022-07-01 04:44:57 -0700156}
157
q.huang16dcb0f2022-09-07 09:17:37 +0800158int lynq_get_common_request(int request_id, int time_out, Parcel &p, int argc, const char* format,...)
159{
160 lynq_client_t client;
161 int resp_type = -1;
162 int request = -1;
163 int slot_id = -1;
164 int ret;
165 int send_num;
166
167 client.uToken = network_Global_uToken;
168 client.request = request_id;
169 client.paramLen = argc;
170 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
171 if(argc!=0)
172 {
173 va_list args;
174 va_start(args, format);
175 vsnprintf(client.param, LYNQ_REQUEST_PARAM_BUF, format, args);
176 va_end(args);
177 }
178 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
179 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
180 send_num = sendto(network_sock_fd,&client,sizeof(client),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
181
182 if(send_num <= 0)
183
184 {
185 LYERRLOG("send request fail, send num is %d", send_num);
186 return -1;
187 }
188 ret = get_response(p, time_out);
189 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
190 return ret;
191}
192
193
rjwbc8a05f2022-03-02 15:23:11 +0800194int wait_signal_changes()
195{
196 int ret = 0;
197 pthread_mutex_lock(&signal_state_change_mutex);
198 ret = pthread_cond_wait(&signal_state_change_cond,&signal_state_change_mutex);
199 pthread_mutex_unlock(&signal_state_change_mutex);
200 return 0;
201}
202
203void send_signal_changes()
204{
205 pthread_mutex_lock(&signal_state_change_mutex);
206 pthread_cond_signal(&signal_state_change_cond);
207 pthread_mutex_unlock(&signal_state_change_mutex);
208 return;
209}
210
rjw7e50cd32022-01-18 18:30:37 +0800211void *thread_urc_recv(void *p)
212{
213 Parcel *urc_p =NULL;
214 char urc_data[LYNQ_REC_BUF];
rjw7e50cd32022-01-18 18:30:37 +0800215 int resp_type = -1;
216 int urc_id = -1;
217 int res = 0;
218 int none = 0;
219 int NR_sum = 0;
rjw7e50cd32022-01-18 18:30:37 +0800220 int urc_LTE_signalstrength = 0;
221 int urc_WCDMA_signalstrength = 0;
rjw7e50cd32022-01-18 18:30:37 +0800222 LYINFLOG("urc thread is running");
rjwbc8a05f2022-03-02 15:23:11 +0800223 while(network_urc_status)
rjw7e50cd32022-01-18 18:30:37 +0800224 {
225 bzero(urc_data,LYNQ_REC_BUF);
rjwbc8a05f2022-03-02 15:23:11 +0800226 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 +0800227 if(res<=0)
228 {
229 LYERRLOG("thread_urc_recv step2 fail:");
230 break;
231 }
232 urc_p = new Parcel();
rjw7a8791e2022-09-06 09:07:39 +0800233 if(urc_p == NULL)
234 {
235 LYERRLOG("new parcel failure!!!");
236 break;
237 }
rjw7e50cd32022-01-18 18:30:37 +0800238 urc_p->setData((uint8_t *)urc_data,res); // p.setData((uint8_t *) buffer, buflen);
239 urc_p->setDataPosition(0);
240 if(urc_p->dataAvail()>0)
241 {
242 urc_p->readInt32(&resp_type);
243 urc_p->readInt32(&urc_id);
rjwbc8a05f2022-03-02 15:23:11 +0800244 urc_p->readInt32(&network_urc_slot_id);
rjw7e50cd32022-01-18 18:30:37 +0800245 switch(urc_id)
246 {
q.huang47d4dfe2022-08-17 17:52:29 +0800247 case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED:
rjw7e50cd32022-01-18 18:30:37 +0800248 {
q.huangaf58bc82022-08-19 17:11:21 +0800249 set_register_voice_buffer_valid(false);
rjwbc8a05f2022-03-02 15:23:11 +0800250 network_wait_urc_id = urc_id;
251 LYINFLOG("slot_id = %d",network_urc_slot_id);
252 send_signal_changes();
rjw25d01752022-08-04 09:42:00 +0800253 break;
rjw7e50cd32022-01-18 18:30:37 +0800254 }
q.huang47d4dfe2022-08-17 17:52:29 +0800255 case RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED:
256 {
q.huangaf58bc82022-08-19 17:11:21 +0800257 set_register_data_buffer_valid(false);
q.huang47d4dfe2022-08-17 17:52:29 +0800258 network_wait_urc_id = urc_id;
259 LYINFLOG("slot_id = %d",network_urc_slot_id);
260 send_signal_changes();
261 break;
262 }
263 case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED:
264 {
q.huangaf58bc82022-08-19 17:11:21 +0800265 set_register_ims_buffer_valid(false);
q.huang47d4dfe2022-08-17 17:52:29 +0800266 network_wait_urc_id = urc_id;
267 LYINFLOG("slot_id = %d",network_urc_slot_id);
268 send_signal_changes();
269 break;
270 }
271 case RIL_UNSOL_SIGNAL_STRENGTH:
rjw7e50cd32022-01-18 18:30:37 +0800272 {
rjwbc8a05f2022-03-02 15:23:11 +0800273 urc_p->readInt32(&network_urc_solSigStren.rssi);
274 if((network_urc_solSigStren.rssi!=99)&&(network_urc_solSigStren.rssi!=0))
rjw7e50cd32022-01-18 18:30:37 +0800275 {
rjwbc8a05f2022-03-02 15:23:11 +0800276 network_urc_solSigStren.gw_sig_valid = 1;
rjw7e50cd32022-01-18 18:30:37 +0800277 }else{
rjwbc8a05f2022-03-02 15:23:11 +0800278 network_urc_solSigStren.gw_sig_valid = 0;
rjw7e50cd32022-01-18 18:30:37 +0800279 }
rjwbc8a05f2022-03-02 15:23:11 +0800280 if(network_urc_solSigStren.gw_sig_valid == 1)
rjw78d04502022-02-24 13:37:11 +0800281 {
rjwbc8a05f2022-03-02 15:23:11 +0800282 LYINFLOG("urc_GSM_signalstrength:%d",network_urc_solSigStren.rssi);
rjw78d04502022-02-24 13:37:11 +0800283 }
rjw7e50cd32022-01-18 18:30:37 +0800284 urc_p->readInt32(&none);
285 urc_p->readInt32(&none);
286 urc_p->readInt32(&none);
287 urc_p->readInt32(&none);
288 urc_p->readInt32(&none);
289 urc_p->readInt32(&none);
290 urc_p->readInt32(&none);
291 urc_p->readInt32(&urc_LTE_signalstrength);
292 // p.readInt32(&solSigStren->signalStrength.LTE_SignalStrength.signalStrength);
rjwbc8a05f2022-03-02 15:23:11 +0800293 urc_p->readInt32(&network_urc_solSigStren.rsrp);
294 urc_p->readInt32(&network_urc_solSigStren.rsrq);
295 urc_p->readInt32(&network_urc_solSigStren.rssnr);
rjw7e50cd32022-01-18 18:30:37 +0800296 if((urc_LTE_signalstrength!=99)&&(urc_LTE_signalstrength!=0))
297 {
rjwbc8a05f2022-03-02 15:23:11 +0800298 network_urc_solSigStren.lte_sig_valid = 1;
rjw7e50cd32022-01-18 18:30:37 +0800299 }else{
rjwbc8a05f2022-03-02 15:23:11 +0800300 network_urc_solSigStren.lte_sig_valid = 0;
rjw7e50cd32022-01-18 18:30:37 +0800301 }
rjwbc8a05f2022-03-02 15:23:11 +0800302 if(network_urc_solSigStren.lte_sig_valid == 1)
rjw78d04502022-02-24 13:37:11 +0800303 {
304 LYINFLOG("urc_LTE_signalstrength:%d",urc_LTE_signalstrength);
305 }
rjw7e50cd32022-01-18 18:30:37 +0800306 urc_p->readInt32(&none);
307 urc_p->readInt32(&none);
308 urc_p->readInt32(&none);
309 urc_p->readInt32(&none);
310 urc_p->readInt32(&none);
311 urc_p->readInt32(&urc_WCDMA_signalstrength);
312 urc_p->readInt32(&none);
rjwbc8a05f2022-03-02 15:23:11 +0800313 urc_p->readInt32(&network_urc_solSigStren.rscp);
314 urc_p->readInt32(&network_urc_solSigStren.ecno);
rjw7e50cd32022-01-18 18:30:37 +0800315 if((urc_WCDMA_signalstrength!=99)&&(urc_WCDMA_signalstrength!=0))
316 {
rjwbc8a05f2022-03-02 15:23:11 +0800317 network_urc_solSigStren.wcdma_sig_valid = 1;
rjw7e50cd32022-01-18 18:30:37 +0800318 }else{
rjwbc8a05f2022-03-02 15:23:11 +0800319 network_urc_solSigStren.wcdma_sig_valid = 0;
rjw78d04502022-02-24 13:37:11 +0800320 }
rjwbc8a05f2022-03-02 15:23:11 +0800321 if(network_urc_solSigStren.wcdma_sig_valid == 1)
rjw78d04502022-02-24 13:37:11 +0800322 {
323 LYINFLOG("urc_WCDMA_signalstrength:%d",urc_WCDMA_signalstrength);
rjw7e50cd32022-01-18 18:30:37 +0800324 }
rjwbc8a05f2022-03-02 15:23:11 +0800325 urc_p->readInt32(&network_urc_solSigStren.ssRsrp);
326 urc_p->readInt32(&network_urc_solSigStren.ssRsrq);
327 urc_p->readInt32(&network_urc_solSigStren.ssSinr);
328 urc_p->readInt32(&network_urc_solSigStren.csiRsrp);
329 urc_p->readInt32(&network_urc_solSigStren.csiRsrq);
330 urc_p->readInt32(&network_urc_solSigStren.csiSinr);
331 NR_sum = (network_urc_solSigStren.ssRsrp) + (network_urc_solSigStren.ssRsrq) + (network_urc_solSigStren.ssSinr) + (network_urc_solSigStren.csiRsrp)+\
332 (network_urc_solSigStren.csiRsrq) + (network_urc_solSigStren.csiSinr);
rjw7e50cd32022-01-18 18:30:37 +0800333 if(NR_sum != 0)
334 {
rjwbc8a05f2022-03-02 15:23:11 +0800335 network_urc_solSigStren.nr_sig_valid = 1;
rjw7e50cd32022-01-18 18:30:37 +0800336 }else{
rjwbc8a05f2022-03-02 15:23:11 +0800337 network_urc_solSigStren.nr_sig_valid = 0;
rjw78d04502022-02-24 13:37:11 +0800338 }
rjwbc8a05f2022-03-02 15:23:11 +0800339 if(network_urc_solSigStren.nr_sig_valid == 1)
rjw78d04502022-02-24 13:37:11 +0800340 {
341 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 +0800342 network_urc_solSigStren.ssRsrp,network_urc_solSigStren.ssRsrq,network_urc_solSigStren.ssSinr, \
343 network_urc_solSigStren.csiRsrp,network_urc_solSigStren.csiRsrq,network_urc_solSigStren.csiSinr);
rjw7e50cd32022-01-18 18:30:37 +0800344 }
rjwbc8a05f2022-03-02 15:23:11 +0800345 network_wait_urc_id = urc_id;
346 send_signal_changes();
rjw25d01752022-08-04 09:42:00 +0800347 break;
rjw7e50cd32022-01-18 18:30:37 +0800348 }
349 }
350 }
rjw7a8791e2022-09-06 09:07:39 +0800351 delete urc_p;
352 urc_p = NULL;
rjw7e50cd32022-01-18 18:30:37 +0800353 }
q.huang47d4dfe2022-08-17 17:52:29 +0800354 return NULL;
rjw7e50cd32022-01-18 18:30:37 +0800355}
356
357
358int lynq_server_socket_start()
359{
lh3a26dd52022-07-01 04:44:57 -0700360 struct timeval timeOut;
rjwbc8a05f2022-03-02 15:23:11 +0800361 network_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
362 if(-1 == network_sock_fd)
rjw7e50cd32022-01-18 18:30:37 +0800363 {
364 LYERRLOG("socket open error");
365 return -1;
366 }
lh3a26dd52022-07-01 04:44:57 -0700367
368 timeOut.tv_sec = 5;
369 timeOut.tv_usec = 0;
370 if (setsockopt(network_sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
371 {
372 LYERRLOG("time out setting failed\n");
373 return -1;
374 }
rjwbc8a05f2022-03-02 15:23:11 +0800375 LYINFLOG("network_sock_fd = %d",network_sock_fd);
rjw7e50cd32022-01-18 18:30:37 +0800376
rjwbc8a05f2022-03-02 15:23:11 +0800377 memset(&network_addr_serv, 0, sizeof(network_addr_serv));
378 network_addr_serv.sin_family = AF_INET;
379 network_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_ADDRESS);
380 network_addr_serv.sin_port = htons(LYNQ_SERVICE_PORT);
381 network_len_addr_serv = sizeof(network_addr_serv);
lh3a26dd52022-07-01 04:44:57 -0700382
383
rjw7e50cd32022-01-18 18:30:37 +0800384 return 0;
385}
386
387int lynq_urc_socket_start()
388{
389 pthread_t tid;
390 pthread_attr_t attr;
391 int on = 1;
rjwbc8a05f2022-03-02 15:23:11 +0800392 network_urc_sock_fd = -1;
rjw7e50cd32022-01-18 18:30:37 +0800393 int ret = 0;
rjwbc8a05f2022-03-02 15:23:11 +0800394 network_len_urc_addr_serv = sizeof(sockaddr_in);
395 network_urc_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
396 if (network_urc_sock_fd <0){
rjw7e50cd32022-01-18 18:30:37 +0800397 LYERRLOG("urc socket error");
398 ret = -1;
399 }
rjwbc8a05f2022-03-02 15:23:11 +0800400 network_urc_addr_serv.sin_family = AF_INET;
401 network_urc_addr_serv.sin_port = htons(LYNQ_URC_SERVICE_PORT);
402 network_urc_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_URC_ADDRESS);
rjw7e50cd32022-01-18 18:30:37 +0800403 /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
rjwbc8a05f2022-03-02 15:23:11 +0800404 ret = setsockopt(network_urc_sock_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
rjw7e50cd32022-01-18 18:30:37 +0800405 if(ret <0)
406 {
407 LYERRLOG("urc socket set error");
408 return -1;
409 }
rjwbc8a05f2022-03-02 15:23:11 +0800410 ret = bind(network_urc_sock_fd ,(struct sockaddr*)&network_urc_addr_serv, sizeof(network_urc_addr_serv));
rjw7e50cd32022-01-18 18:30:37 +0800411 if(ret <0)
412 {
413 LYERRLOG("urc socket bind error");
414 return -1;
415 }
416 pthread_attr_init(&attr);
417 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
rjwbc8a05f2022-03-02 15:23:11 +0800418 ret = pthread_create(&tid,&attr,thread_urc_recv,(void *)network_urc_sock_fd);
rjw7e50cd32022-01-18 18:30:37 +0800419 if(ret <0)
420 {
421 LYERRLOG("urc pthread create error");
422 return -1;
423 }
424 LYINFLOG("urc start success");
425 return 0;
426}
427
428int lynq_network_init(int utoken){
rjw22947c22022-03-15 09:21:29 +0800429 if(g_lynq_network_init_flag == 1)
430 {
431 LYERRLOG("init twice is not allowed");
432 return -1;
433 }
434 g_lynq_network_init_flag = 1;
rjw7e50cd32022-01-18 18:30:37 +0800435 if(utoken <0){
436 LYERRLOG("init err");
437 return -1;
438 }
rjwbc8a05f2022-03-02 15:23:11 +0800439 network_urc_status = 1;
440 network_Global_uToken = utoken;
rjw7e50cd32022-01-18 18:30:37 +0800441 LYLOGSET(LOG_INFO);
442 LYLOGEINIT(USER_LOG_TAG);
443 int ret = 0;
444
q.huang47d4dfe2022-08-17 17:52:29 +0800445 init_network_timer_all();
446
rjw7e50cd32022-01-18 18:30:37 +0800447 ret = lynq_server_socket_start();
448 if(ret !=0)
449 {
450 LYERRLOG("init socket client fail!!!");
451 return -1;
452 }
453 ret = lynq_urc_socket_start();
454 if(ret != 0)
455 {
456 LYERRLOG("init socket urc fail!!!");
457 return -1;
458 }
rjw9c301f82022-05-25 09:10:33 +0800459 pthread_mutex_init(&g_lynq_network_sendto_mutex, NULL);
rjw7e50cd32022-01-18 18:30:37 +0800460 return 0;
461}
462
463int strUpper(char * str)
464{
465 int i=0;
466 while(1)
467 {
468 if(str[i]=='\0')
469 {
470 break;
471 }
472 if(str[i]>='a'&&str[i]<='z')
473 {
474 str[i]=str[i]-32;
475 }
476 i++;
477 }
478 return 0;
479}
480
rjw62a60152022-06-09 17:43:01 +0800481int copyCellInfoList(Parcel &p,uint64_t *cellinfo,int *tac,int *earfcn)
rjw7e50cd32022-01-18 18:30:37 +0800482{
483 int32_t v=0;
484 int64_t v6=0;
485 if(NULL == cellinfo)
486 {
487 LYERRLOG("*cellinfo error");
488 }
489
490 int nothing = 0;
rjw62a60152022-06-09 17:43:01 +0800491 int tmp_uint64 = 0;
rjw7e50cd32022-01-18 18:30:37 +0800492 p.readInt32(&v);
493 RIL_CellInfoType cellinfoType = RIL_CellInfoType(v);
494 p.readInt32(&nothing);
495 // cellinfo->cellinfo.cellInfoType = RIL_CellInfoType(v);
496 // p.readInt32(&cellinfo->cellinfo.registered);
497 p.readInt32(&v);
498 // cellinfo->cellinfo.timeStampType = RIL_TimeStampType(v);
499 p.readInt64(&v6);
500 // cellinfo->cellinfo.timeStamp = v6;
501 switch(cellinfoType) {
502 case RIL_CELL_INFO_TYPE_GSM: {
503 p.readInt32(&nothing);
504 p.readInt32(&nothing);
505 p.readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800506 p.readInt32(&tmp_uint64);
rjw7e50cd32022-01-18 18:30:37 +0800507 p.readInt32(&nothing);
508 p.readInt32(&nothing);
509 p.readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800510 *cellinfo = (uint64_t)tmp_uint64;
rjw61974852022-05-17 16:30:32 +0800511 tac = &nothing;
rjwa8011682022-05-31 17:31:28 +0800512 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800513 break;
514 }
515 case RIL_CELL_INFO_TYPE_WCDMA: {
516 p.readInt32(&nothing);
517 p.readInt32(&nothing);
518 p.readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800519 p.readInt32(&tmp_uint64);
rjw7e50cd32022-01-18 18:30:37 +0800520 p.readInt32(&nothing);
521 p.readInt32(&nothing);
522 p.readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800523 *cellinfo = (uint64_t)tmp_uint64;
rjw4200a082022-05-17 17:58:35 +0800524 tac = &nothing;
rjwa8011682022-05-31 17:31:28 +0800525 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800526 break;
527 }
528 case RIL_CELL_INFO_TYPE_CDMA: {
529 p.readInt32(&nothing);
530 p.readInt32(&nothing);
531 p.readInt32(&nothing);
532 p.readInt32(&nothing);
533 p.readInt32(&nothing);
534 p.readInt32(&nothing);
535 p.readInt32(&nothing);
536 p.readInt32(&nothing);
537 p.readInt32(&nothing);
538 p.readInt32(&nothing);
539 cellinfo = 0;
rjw61974852022-05-17 16:30:32 +0800540 tac = &nothing;
rjwa8011682022-05-31 17:31:28 +0800541 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800542 break;
543 }
544 case RIL_CELL_INFO_TYPE_LTE: {
545 p.readInt32(&nothing);
546 p.readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800547 p.readInt32(&tmp_uint64);
rjw7e50cd32022-01-18 18:30:37 +0800548 p.readInt32(&nothing);
rjw61974852022-05-17 16:30:32 +0800549 p.readInt32(tac);
rjwa8011682022-05-31 17:31:28 +0800550 p.readInt32(earfcn);
rjw7e50cd32022-01-18 18:30:37 +0800551 p.readInt32(&nothing);
552 p.readInt32(&nothing);
553 p.readInt32(&nothing);
554 p.readInt32(&nothing);
555 p.readInt32(&nothing);
556 p.readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800557 *cellinfo = (uint64_t)tmp_uint64;
rjw7e50cd32022-01-18 18:30:37 +0800558 break;
559 }
560 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
561 p.readInt32(&nothing);
562 p.readInt32(&nothing);
563 p.readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800564 p.readInt32(&tmp_uint64);
rjw7e50cd32022-01-18 18:30:37 +0800565 p.readInt32(&nothing);
566 p.readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800567 *cellinfo = (uint64_t)tmp_uint64;
rjwa8011682022-05-31 17:31:28 +0800568 tac = &nothing;
569 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800570 break;
571 }
572 case RIL_CELL_INFO_TYPE_NR: {
573 p.readInt32(&nothing);
574 p.readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800575 p.readUint64(cellinfo);
rjw7e50cd32022-01-18 18:30:37 +0800576 p.readInt32(&nothing);
rjw61974852022-05-17 16:30:32 +0800577 p.readInt32(tac);
rjwa8011682022-05-31 17:31:28 +0800578 p.readInt32(earfcn);
rjw7e50cd32022-01-18 18:30:37 +0800579 p.readInt32(&nothing);
580 p.readInt32(&nothing);
581 p.readInt32(&nothing);
582 p.readInt32(&nothing);
583 p.readInt32(&nothing);
584 p.readInt32(&nothing);
585 break;
586 }
587 }
rjw62a60152022-06-09 17:43:01 +0800588 LYINFLOG("CID in fUNC :%llu",*cellinfo);
rjwa8011682022-05-31 17:31:28 +0800589 LYINFLOG("tac in fUNC :%d",*tac);
590 LYINFLOG("earfcn in fUNC :%d",*earfcn);
rjw7e50cd32022-01-18 18:30:37 +0800591 return 0;
592}
593
594int lynq_network_deinit(void){
rjw22947c22022-03-15 09:21:29 +0800595 if (g_lynq_network_init_flag == 0)
596 {
597 LYERRLOG("deinit twice is not allowed");
598 return -1;
599 }
600 if (network_sock_fd > 0)
601 {
602 close(network_sock_fd);
603 }
604 g_lynq_network_init_flag = 0;
rjwbc8a05f2022-03-02 15:23:11 +0800605 network_urc_status = 0;
q.huang47d4dfe2022-08-17 17:52:29 +0800606
607 deinit_network_timer_all();
608
rjw7e50cd32022-01-18 18:30:37 +0800609 return 0;
610}
611
612static char * lynqStrdupReadString(Parcel &p) {
613 size_t stringlen;
614 const char16_t *s16;
615
616 s16 = p.readString16Inplace(&stringlen);
617 return strndup16to8(s16, stringlen);
618}
619
620int lynq_query_operater(char *OperatorFN,char *OperatorSH,char *MccMnc)
621{
622 int ret = -1;
623 if(NULL == OperatorFN||NULL == OperatorSH|| NULL == MccMnc)
624 return ret;
625 int send_num = 0;
626 int recv_num = 0;
627 int num = 0;
628 lynq_client_t client_t;
rjw02a50422022-01-25 14:57:53 +0800629 char *resp[LYNQ_RESP_BUF];
rjw7e50cd32022-01-18 18:30:37 +0800630 memset(&client_t,0,sizeof(client_t));
631 client_t.request = RIL_REQUEST_OPERATOR;
632 client_t.paramLen = 0;
rjwbc8a05f2022-03-02 15:23:11 +0800633 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +0800634 memset(client_t.param,0,sizeof(client_t.param));
635
rjw9c301f82022-05-25 09:10:33 +0800636 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +0800637 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +0800638 if(send_num<0)
639 {
640 LYERRLOG("sendto error:");
641 return ret;
642 }
643
644 //get data
rjw7e50cd32022-01-18 18:30:37 +0800645 Parcel p;
rjwa59bf312022-07-05 11:50:31 +0800646 ret = get_response(p,30);
rjw46769c92022-07-04 21:17:25 +0800647 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
648 if (ret != 0)
649 {
650 return ret;
651 }
652
rjw7e50cd32022-01-18 18:30:37 +0800653 if(p.dataAvail() > 0)
654 {
655 p.readInt32(&response.resp_type);
656 p.readInt32(&response.request);
657 p.readInt32(&response.slot_id);
658 p.readInt32(&response.error);
659 if(response.error != 0)
660 {
661 LYERRLOG("response return error");
662 return response.error;
663 }
664 p.readInt32(&num);
665 if(num == 0)
666 {
667 LYERRLOG("no paramters");
668 }else{
669 for(int i = 0; i<num;i++)
670 {
671 resp[i] = lynqStrdupReadString(p);
672 }
673 if(NULL != resp[0])
674 {
rjw02a50422022-01-25 14:57:53 +0800675 strcpy(OperatorFN,resp[0]);
rjw7e50cd32022-01-18 18:30:37 +0800676 }
677 if(NULL != resp[1])
678 {
rjw02a50422022-01-25 14:57:53 +0800679 strcpy(OperatorSH,resp[1]);
rjw7e50cd32022-01-18 18:30:37 +0800680 }
681 if(NULL != resp[2])
682 {
rjw02a50422022-01-25 14:57:53 +0800683 strcpy(MccMnc,resp[2]);
rjw7e50cd32022-01-18 18:30:37 +0800684 }
685 }
686 }
687 return response.error;
688}
689
690int lynq_query_network_selection_mode(int *netselMode)
691{
692 int ret = -1;
693 if(NULL == netselMode)
694 return ret;
695 int send_num = 0;
696 int recv_num = 0;
697 int readnum = 0;
698 lynq_client_t client_t;
rjw7e50cd32022-01-18 18:30:37 +0800699 memset(&client_t,0,sizeof(client_t));
700 client_t.request = RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE;
701 client_t.paramLen = 0;
rjwbc8a05f2022-03-02 15:23:11 +0800702 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +0800703
704 memset(client_t.param,0,sizeof(client_t.param));
rjw9c301f82022-05-25 09:10:33 +0800705 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +0800706 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +0800707 if(send_num<0)
708 {
709 LYERRLOG("sendto error:");
710 return -1;
711 }
712
713 //get data
rjw7e50cd32022-01-18 18:30:37 +0800714 Parcel p;
rjwf00f5272022-07-12 16:42:02 +0800715 ret = get_response(p,600);
rjw46769c92022-07-04 21:17:25 +0800716 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
717 if (ret != 0)
718 {
719 return ret;
720 }
rjw7e50cd32022-01-18 18:30:37 +0800721 if(p.dataAvail() > 0)
722 {
723 p.readInt32(&response.resp_type);
724 p.readInt32(&response.request);
725 p.readInt32(&response.slot_id);
726 p.readInt32(&response.error);
727 if(response.error != 0)
728 {
729 LYERRLOG("response return error");
730 return response.error;
731 }
732 p.readInt32(&readnum);
733 p.readInt32(netselMode);
734 }
735 return response.error;
736}
737
738int lynq_set_network_selection_mode(const char *mode,const char* mccmnc)
739{
740 int ret = -1;
rjw78d04502022-02-24 13:37:11 +0800741 if(NULL == mode)
rjw7e50cd32022-01-18 18:30:37 +0800742 return ret;
rjw78d04502022-02-24 13:37:11 +0800743 if(strlen(mode) == 0)
744 {
745 return ret;
746 }
rjw7e50cd32022-01-18 18:30:37 +0800747 int send_num = 0;
748 lynq_client_t client_t;
749 int recv_num = 0;
rjw7e50cd32022-01-18 18:30:37 +0800750 memset(&client_t,0,sizeof(client_t));
751 if(!strcmp(mode,"Auto"))
752 {
753 client_t.request = RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC;
754 client_t.paramLen = 0;
rjwbc8a05f2022-03-02 15:23:11 +0800755 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +0800756 memset(client_t.param,0,sizeof(client_t.param));
757 }else if(!strcmp(mode,"Manual")){
rjw78d04502022-02-24 13:37:11 +0800758 if(mccmnc == NULL)
759 {
760 LYERRLOG("mccmnc is NULL!!!");
761 return ret;
762 }
763 if(strlen(mccmnc) == 0)
764 {
765 LYERRLOG("mccmnc strlen is 0!!!");
766 return ret;
767 }
rjw7e50cd32022-01-18 18:30:37 +0800768 client_t.request = RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL;
769 client_t.paramLen = 1;
rjwbc8a05f2022-03-02 15:23:11 +0800770 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +0800771 sprintf(client_t.param,"%s",mccmnc);
rjwcdd83ae2022-01-22 14:10:42 +0800772 }else{
773 LYERRLOG("request error");
774 return ret;
rjw7e50cd32022-01-18 18:30:37 +0800775 }
776
rjw9c301f82022-05-25 09:10:33 +0800777 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +0800778 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +0800779 if(send_num<0)
780 {
781 LYERRLOG("sendto error:");
782 return ret;
783 }
784
rjw7e50cd32022-01-18 18:30:37 +0800785 Parcel p;
rjwa59bf312022-07-05 11:50:31 +0800786 ret = get_response(p,30);
rjw46769c92022-07-04 21:17:25 +0800787 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
788 if (ret != 0)
789 {
790 return ret;
791 }
rjw7e50cd32022-01-18 18:30:37 +0800792 if(p.dataAvail() > 0)
793 {
794 p.readInt32(&response.resp_type);
795 p.readInt32(&response.request);
796 p.readInt32(&response.slot_id);
797 p.readInt32(&response.error);
798 }
799 return response.error;
800}
801
802int lynq_query_available_network(char *OperatorFN,char *OperatorSH,char *MccMnc,char * NetStatus)
803{
804 int ret = -1;
805 if(NULL == OperatorFN||NULL == OperatorSH||NULL == MccMnc||NULL == NetStatus)
806 return ret;
807 int send_num = 0;
808 int recv_num = 0;
rjw7e50cd32022-01-18 18:30:37 +0800809 char *resp[128];
810 lynq_client_t client_t;
811 memset(&client_t,0,sizeof(client_t));
812 client_t.request = RIL_REQUEST_QUERY_AVAILABLE_NETWORKS;
813 client_t.paramLen = 0;
rjwbc8a05f2022-03-02 15:23:11 +0800814 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +0800815 memset(client_t.param,0,sizeof(client_t.param));
rjw9c301f82022-05-25 09:10:33 +0800816 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +0800817 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +0800818 if(send_num<0)
819 {
820 LYERRLOG("sendto error:");
821 return ret;
822 }
823
824 //get data
rjw7e50cd32022-01-18 18:30:37 +0800825 Parcel p;
rjw46769c92022-07-04 21:17:25 +0800826 ret = get_response(p,600);
827 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
828 if (ret != 0)
829 {
830 return ret;
831 }
rjw7e50cd32022-01-18 18:30:37 +0800832 if(p.dataAvail() > 0)
833 {
834 p.readInt32(&response.resp_type);
835 p.readInt32(&response.request);
836 p.readInt32(&response.slot_id);
837 p.readInt32(&response.error);
838 if(response.error != 0)
839 {
840 LYERRLOG("response return error");
841 return response.error;
842 }
843 int num =p.readInt32();
844 if(num == 0)
845 {
846 LYERRLOG("no paramters");
847 }else{
848 for(int i = 0; i<num;i++)
849 {
850 resp[i] = lynqStrdupReadString(p);
851 }
852 if(NULL != resp[0])
853 {
rjw02a50422022-01-25 14:57:53 +0800854 strcpy(OperatorFN,resp[0]);
rjw7e50cd32022-01-18 18:30:37 +0800855 }
856 if(NULL != resp[1])
857 {
rjw02a50422022-01-25 14:57:53 +0800858 strcpy(OperatorSH,resp[1]);
rjw7e50cd32022-01-18 18:30:37 +0800859 }
860 if(NULL != resp[2])
861 {
rjw02a50422022-01-25 14:57:53 +0800862 strcpy(MccMnc,resp[2]);
rjw7e50cd32022-01-18 18:30:37 +0800863 }
864 if(NULL != resp[3])
865 {
rjw02a50422022-01-25 14:57:53 +0800866 strcpy(NetStatus,resp[2]);
rjw7e50cd32022-01-18 18:30:37 +0800867 }
868 }
869 }
870 return response.error;
871}
872
rjw4544e132022-04-01 15:00:26 +0800873int 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 +0800874{
875 int ret = -1;
rjwd98d5872022-04-09 13:50:58 +0800876 if(NULL == type || NULL ==regState ||NULL ==imsRegState ||NULL ==LAC ||NULL ==CID ||NULL ==netType ||NULL ==radioTechFam || NULL == netRejected)
rjw7e50cd32022-01-18 18:30:37 +0800877 return ret;
878 int send_num = 0;
879 int recv_num = 0;
880 int num = 0;
881 char str[LYNQ_TYPE_BUF];
rjwcdd83ae2022-01-22 14:10:42 +0800882 char *resp[LYNQ_RESP_BUF];
rjw7e50cd32022-01-18 18:30:37 +0800883 lynq_client_t client_t;
884 memset(&client_t,0,sizeof(client_t));
885 if(strlen(type)>LYNQ_TYPE_BUF)
886 {
887 LYERRLOG("[%s]the parameter is inavaliable !",__FUNCTION__);
888 }
889 memcpy(str,type,strlen(type)+1);
890 strUpper(str);
891 if(!strcmp(str,"VOICE"))
892 {
q.huang47d4dfe2022-08-17 17:52:29 +0800893 if(lynq_get_registration_state_to_buf_voice(regState,netType,netRejected)==0)
894 {
895 return 0;
896 }
rjw7e50cd32022-01-18 18:30:37 +0800897 client_t.request = RIL_REQUEST_VOICE_REGISTRATION_STATE;
898 }else if(!strcmp(str,"DATA")){
q.huang47d4dfe2022-08-17 17:52:29 +0800899 if(lynq_get_registration_state_to_buf_data(regState,LAC,CID,netType)==0)
900 {
901 return 0;
902 }
rjw7e50cd32022-01-18 18:30:37 +0800903 client_t.request = RIL_REQUEST_DATA_REGISTRATION_STATE;
904 }else if(!strcmp(str,"IMS")){
q.huang47d4dfe2022-08-17 17:52:29 +0800905 if(lynq_get_registration_state_to_buf_ims(imsRegState,radioTechFam)==0)
906 {
907 return 0;
908 }
rjw7e50cd32022-01-18 18:30:37 +0800909 client_t.request = RIL_REQUEST_IMS_REGISTRATION_STATE;
910 }else{
911 LYERRLOG("request error");
912 return ret;
913 }
914 client_t.paramLen = 0;
rjwbc8a05f2022-03-02 15:23:11 +0800915 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +0800916 memset(client_t.param,0,sizeof(client_t.param));
917
rjw9c301f82022-05-25 09:10:33 +0800918 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +0800919 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +0800920 if(send_num<0)
921 {
922 LYERRLOG("sendto error:");
923 return ret;
924 }
925
926 //get data
rjw7e50cd32022-01-18 18:30:37 +0800927 Parcel p;
rjwa59bf312022-07-05 11:50:31 +0800928 ret = get_response(p,30);
rjw46769c92022-07-04 21:17:25 +0800929 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
930 if (ret != 0)
931 {
932 return ret;
933 }
rjw7e50cd32022-01-18 18:30:37 +0800934 if(p.dataAvail() > 0)
935 {
936 p.readInt32(&response.resp_type);
937 p.readInt32(&response.request);
938 p.readInt32(&response.slot_id);
939 p.readInt32(&response.error);
940 if(response.error != 0)
941 {
942 LYERRLOG("response return error");
943 return response.error;
944 }
945 if(!strcmp(str,"VOICE"))
946 {
947 p.readInt32(&num);
948 if(num == 15)
949 {
950 *regState = atoi(lynqStrdupReadString(p));
951 lynqStrdupReadString(p);
952 lynqStrdupReadString(p);
953 *netType = atoi(lynqStrdupReadString(p));
rjw4544e132022-04-01 15:00:26 +0800954 lynqStrdupReadString(p);
955 lynqStrdupReadString(p);
956 lynqStrdupReadString(p);
957 lynqStrdupReadString(p);
958 lynqStrdupReadString(p);
959 lynqStrdupReadString(p);
960 lynqStrdupReadString(p);
961 lynqStrdupReadString(p);
962 lynqStrdupReadString(p);
963 lynqStrdupReadString(p);
q.huang47d4dfe2022-08-17 17:52:29 +0800964 *netRejected = atoi(lynqStrdupReadString(p));
965 lynq_set_registration_state_to_buf_voice(*regState,*netType,*netRejected);
rjw7e50cd32022-01-18 18:30:37 +0800966 }
967 }else if(!strcmp(str,"DATA")){
968 p.readInt32(&num);
969 if(num == 11)
970 {
971 *regState = atoi(lynqStrdupReadString(p));
rjwcdd83ae2022-01-22 14:10:42 +0800972 resp[0] = lynqStrdupReadString(p);
rjw02a50422022-01-25 14:57:53 +0800973 strcpy(LAC,resp[0]);
rjwcdd83ae2022-01-22 14:10:42 +0800974
975 resp[1] = lynqStrdupReadString(p);
rjw02a50422022-01-25 14:57:53 +0800976 strcpy(CID,resp[1]);
rjw7e50cd32022-01-18 18:30:37 +0800977 *netType = atoi(lynqStrdupReadString(p));
q.huang47d4dfe2022-08-17 17:52:29 +0800978 lynq_set_registration_state_to_buf_data(*regState,LAC,CID,*netType);
rjw7e50cd32022-01-18 18:30:37 +0800979 }
980
981 }else if(!strcmp(str,"IMS")){
982 p.readInt32(&num);
983 if(num == 2)
984 {
985 p.readInt32(imsRegState);
986 p.readInt32(radioTechFam);
q.huang47d4dfe2022-08-17 17:52:29 +0800987 lynq_set_registration_state_to_buf_ims(*imsRegState,*radioTechFam);
rjw7e50cd32022-01-18 18:30:37 +0800988 }
989 }else{
990 LYERRLOG("request error");
991 return ret;
992 }
993 }
994 return response.error;
995}
996
997int lynq_query_prefferred_networktype(int *preNetType)
998{
999 int ret = -1;
1000 int send_num = 0;
1001 int recv_num = 0;
1002 int num = 0;
rjw7e50cd32022-01-18 18:30:37 +08001003 lynq_client_t client_t;
1004 memset(&client_t,0,sizeof(client_t));
1005 client_t.request = RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE;
1006 client_t.paramLen = 0;
rjwbc8a05f2022-03-02 15:23:11 +08001007 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +08001008 memset(client_t.param,0,sizeof(client_t.param));
rjw9c301f82022-05-25 09:10:33 +08001009 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +08001010 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +08001011 if(send_num<0)
1012 {
1013 LYERRLOG("sendto error:");
1014 return ret;
1015 }
1016
1017 //get data
rjw7e50cd32022-01-18 18:30:37 +08001018 Parcel p;
rjwa59bf312022-07-05 11:50:31 +08001019 ret = get_response(p,30);
rjw46769c92022-07-04 21:17:25 +08001020 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
1021 if (ret != 0)
1022 {
1023 return ret;
1024 }
rjw7e50cd32022-01-18 18:30:37 +08001025 if(p.dataAvail() > 0)
1026 {
1027 p.readInt32(&response.resp_type);
1028 p.readInt32(&response.request);
1029 p.readInt32(&response.slot_id);
1030 p.readInt32(&response.error);
1031 if(response.error != 0)
1032 {
1033 LYERRLOG("response return error");
1034 return response.error;
1035 }
1036 p.readInt32(&num);
1037 p.readInt32(preNetType);
1038 }
1039 return response.error;
1040}
1041
1042int lynq_set_prefferred_networktype(const int preffertype)
1043{
1044 int ret = -1;
1045 if(preffertype < 0||preffertype >33)
1046 return ret;
1047 int send_num = 0;
1048 lynq_client_t client_t;
1049 int recv_num = 0;
rjw7e50cd32022-01-18 18:30:37 +08001050 memset(&client_t,0,sizeof(client_t));
1051 client_t.request = RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE;
1052 client_t.paramLen = 1;
rjwbc8a05f2022-03-02 15:23:11 +08001053 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +08001054 sprintf(client_t.param,"%d",preffertype);
rjw9c301f82022-05-25 09:10:33 +08001055 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +08001056 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +08001057 if(send_num<0)
1058 {
1059 LYERRLOG("sendto error:");
1060 return ret;
1061 }
1062
rjw46769c92022-07-04 21:17:25 +08001063 Parcel p;
rjwa59bf312022-07-05 11:50:31 +08001064 ret = get_response(p,30);
rjw9c301f82022-05-25 09:10:33 +08001065 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
rjw46769c92022-07-04 21:17:25 +08001066 if (ret != 0)
rjw7e50cd32022-01-18 18:30:37 +08001067 {
rjw46769c92022-07-04 21:17:25 +08001068 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001069 }
1070
rjw7e50cd32022-01-18 18:30:37 +08001071 if(p.dataAvail() > 0)
1072 {
1073 p.readInt32(&response.resp_type);
1074 p.readInt32(&response.request);
1075 p.readInt32(&response.slot_id);
1076 p.readInt32(&response.error);
rjw7a8791e2022-09-06 09:07:39 +08001077 if(response.error != 0)
1078 {
1079 LYERRLOG("response return error");
1080 return response.error;
1081 }
rjw7e50cd32022-01-18 18:30:37 +08001082 }
1083
1084 return response.error;
1085
1086}
1087
rjw62a60152022-06-09 17:43:01 +08001088int 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 +08001089{
1090 int ret = -1;
1091 if(NULL == realNum)
1092 return ret;
1093 int send_num = 0;
1094 int recv_num = 0;
1095 int num = 0;
rjw7e50cd32022-01-18 18:30:37 +08001096 lynq_client_t client_t;
1097 memset(&client_t,0,sizeof(client_t));
1098 client_t.request = RIL_REQUEST_GET_CELL_INFO_LIST;
1099 client_t.paramLen = 0;
rjwbc8a05f2022-03-02 15:23:11 +08001100 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +08001101 memset(client_t.param,0,sizeof(client_t.param));
rjw9c301f82022-05-25 09:10:33 +08001102 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +08001103 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +08001104 if(send_num<0)
1105 {
1106 LYERRLOG("sendto error:");
1107 return ret;
1108 }
1109
1110 //get data
rjw7e50cd32022-01-18 18:30:37 +08001111 Parcel p;
rjwa59bf312022-07-05 11:50:31 +08001112 ret = get_response(p,30);
rjw46769c92022-07-04 21:17:25 +08001113 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
1114 if (ret != 0)
1115 {
1116 return ret;
1117 }
rjw7e50cd32022-01-18 18:30:37 +08001118 if(p.dataAvail() > 0)
1119 {
1120 p.readInt32(&response.resp_type);
1121 p.readInt32(&response.request);
1122 p.readInt32(&response.slot_id);
1123 p.readInt32(&response.error);
1124 if(response.error != 0)
1125 {
1126 LYERRLOG("response return error");
1127 return response.error;
1128 }
1129 p.readInt32(&num);
1130 LYINFLOG("cell info num:%d",num);
1131 *realNum = num;
1132 for(int i = 0;i<num;i++)
1133 {
rjwa8011682022-05-31 17:31:28 +08001134 copyCellInfoList(p,&cellinfo[i],&tac[i],&earfcn[i]);
rjw7e50cd32022-01-18 18:30:37 +08001135 }
1136 }
1137 return response.error;
1138
1139}
1140
1141int lynq_set_unsol_cell_info_listrate(const int rate)
1142{
1143 int ret = -1;
1144 int send_num = 0;
1145 int recv_num = 0;
rjw7e50cd32022-01-18 18:30:37 +08001146 lynq_client_t client_t;
1147 memset(&client_t,0,sizeof(client_t));
1148 client_t.request = RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE;
1149 client_t.paramLen = 1;
rjwbc8a05f2022-03-02 15:23:11 +08001150 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +08001151 sprintf(client_t.param,"%d",rate);
rjw9c301f82022-05-25 09:10:33 +08001152 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +08001153 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +08001154 if(send_num<0)
1155 {
1156 LYERRLOG("sendto error:");
1157 return ret;
1158 }
1159
rjw9c301f82022-05-25 09:10:33 +08001160
rjw46769c92022-07-04 21:17:25 +08001161 Parcel p;
rjwa59bf312022-07-05 11:50:31 +08001162 ret = get_response(p,30);
rjw9c301f82022-05-25 09:10:33 +08001163 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
rjw46769c92022-07-04 21:17:25 +08001164 if (ret != 0)
rjw7e50cd32022-01-18 18:30:37 +08001165 {
rjw46769c92022-07-04 21:17:25 +08001166 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001167 }
1168
rjw7e50cd32022-01-18 18:30:37 +08001169 if(p.dataAvail() > 0)
1170 {
1171 p.readInt32(&response.resp_type);
1172 p.readInt32(&response.request);
1173 p.readInt32(&response.slot_id);
1174 p.readInt32(&response.error);
rjw7a8791e2022-09-06 09:07:39 +08001175 if(response.error != 0)
1176 {
1177 LYERRLOG("response return error");
1178 return response.error;
1179 }
rjw7e50cd32022-01-18 18:30:37 +08001180 }
1181
1182 return response.error;
1183}
1184
1185int lynq_set_band_mode(const int bandmode)
1186{
1187 int ret = -1;
1188 int send_num = 0;
1189 int recv_num = 0;
rjw7e50cd32022-01-18 18:30:37 +08001190 lynq_client_t client_t;
1191 memset(&client_t,0,sizeof(client_t));
1192 client_t.request = RIL_REQUEST_SET_BAND_MODE;
1193 client_t.paramLen = 1;
rjwbc8a05f2022-03-02 15:23:11 +08001194 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +08001195 sprintf(client_t.param,"%d",bandmode);
rjw9c301f82022-05-25 09:10:33 +08001196 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +08001197 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +08001198 if(send_num<0)
1199 {
1200 LYERRLOG("sendto error:");
1201 return ret;
1202 }
1203
rjw46769c92022-07-04 21:17:25 +08001204 Parcel p;
rjwa59bf312022-07-05 11:50:31 +08001205 ret = get_response(p,30);
rjw9c301f82022-05-25 09:10:33 +08001206 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
rjw46769c92022-07-04 21:17:25 +08001207 if (ret != 0)
rjw7e50cd32022-01-18 18:30:37 +08001208 {
rjw46769c92022-07-04 21:17:25 +08001209 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001210 }
1211
rjw7e50cd32022-01-18 18:30:37 +08001212 if(p.dataAvail() > 0)
1213 {
1214 p.readInt32(&response.resp_type);
1215 p.readInt32(&response.request);
1216 p.readInt32(&response.slot_id);
1217 p.readInt32(&response.error);
rjw7a8791e2022-09-06 09:07:39 +08001218 if(response.error != 0)
1219 {
1220 LYERRLOG("response return error");
1221 return response.error;
1222 }
rjw7e50cd32022-01-18 18:30:37 +08001223 }
1224
1225 return response.error;
1226}
1227
1228int lynq_query_available_bandmode(int availBanMode[])
1229{
1230 int ret = -1;
1231 if(NULL == availBanMode)
1232 return ret;
1233 int send_num = 0;
1234 int recv_num = 0;
1235 int num = 0;
1236 int res = 0;
rjw7e50cd32022-01-18 18:30:37 +08001237 lynq_client_t client_t;
1238 memset(&client_t,0,sizeof(client_t));
1239 client_t.request = RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE;
1240 client_t.paramLen = 0;
rjwbc8a05f2022-03-02 15:23:11 +08001241 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +08001242 memset(client_t.param,0,sizeof(client_t.param));
rjw9c301f82022-05-25 09:10:33 +08001243 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +08001244 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +08001245 if(send_num<0)
1246 {
1247 LYERRLOG("sendto error:");
1248 return ret;
1249 }
1250
1251 //get data
rjw46769c92022-07-04 21:17:25 +08001252 Parcel p;
rjwa59bf312022-07-05 11:50:31 +08001253 ret = get_response(p,30);
rjw9c301f82022-05-25 09:10:33 +08001254 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
rjw46769c92022-07-04 21:17:25 +08001255 if (ret != 0)
rjw7e50cd32022-01-18 18:30:37 +08001256 {
rjw46769c92022-07-04 21:17:25 +08001257 return ret;
rjw7e50cd32022-01-18 18:30:37 +08001258 }
rjw78d04502022-02-24 13:37:11 +08001259 for(int i = 0;i<10;i++)
rjw7e50cd32022-01-18 18:30:37 +08001260 {
1261 availBanMode[i]=0;
1262 }
rjw7e50cd32022-01-18 18:30:37 +08001263 if(p.dataAvail() > 0)
1264 {
1265 p.readInt32(&response.resp_type);
1266 p.readInt32(&response.request);
1267 p.readInt32(&response.slot_id);
1268 p.readInt32(&response.error);
1269 if(response.error != 0)
1270 {
1271 LYERRLOG("response return error");
1272 return response.error;
1273 }
1274 p.readInt32(&num);
1275 LYINFLOG("num = %d",num);
1276 availBanMode[0] = num;
1277 for(int i=1 ;i<=num;i++)
1278 {
1279 p.readInt32(&res);
1280 availBanMode[i]=res;
1281 }
1282 }
1283
1284 return response.error;
1285}
1286
1287int lynq_radio_on(const int data)
1288{
1289 int ret = -1;
1290 if(data < 0)
1291 return ret;
1292 int send_num = 0;
rjw7e50cd32022-01-18 18:30:37 +08001293 int recv_num = 0;
1294 lynq_client_t client_t;
1295 memset(&client_t,0,sizeof(client_t));
1296 client_t.request = RIL_REQUEST_RADIO_POWER;
1297 client_t.paramLen = 1;
rjwbc8a05f2022-03-02 15:23:11 +08001298 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +08001299 sprintf(client_t.param,"%d",data);
rjw9c301f82022-05-25 09:10:33 +08001300 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +08001301 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +08001302 if(send_num<0)
1303 {
1304 LYERRLOG("sendto error:");
1305 return ret;
1306 }
1307
rjw7e50cd32022-01-18 18:30:37 +08001308 Parcel p;
rjwa59bf312022-07-05 11:50:31 +08001309 ret = get_response(p,30);
rjw46769c92022-07-04 21:17:25 +08001310 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
1311 if (ret != 0)
1312 {
1313 return ret;
1314 }
rjw7e50cd32022-01-18 18:30:37 +08001315 if(p.dataAvail() > 0)
1316 {
1317 p.readInt32(&response.resp_type);
1318 p.readInt32(&response.request);
1319 p.readInt32(&response.slot_id);
1320 p.readInt32(&response.error);
rjw7a8791e2022-09-06 09:07:39 +08001321 if(response.error != 0)
1322 {
1323 LYERRLOG("response return error");
1324 return response.error;
1325 }
rjw7e50cd32022-01-18 18:30:37 +08001326 }
1327
1328 return response.error;
1329}
1330
q.huang16dcb0f2022-09-07 09:17:37 +08001331const char * lynq_get_raw_data(Parcel &p, int* data_len)
1332{
1333 int32_t len;
1334 int status;
1335 char *data;
1336
1337 *data_len=0;
1338
1339 status = p.readInt32(&len);
1340
1341 if (status != 0) {
1342 LYERRLOG("%s status is %d",__func__,status);
1343 return NULL;
1344 }
1345
1346 // The java code writes -1 for null arrays
1347 if (((int)len) == -1 || ((int)len) == 0)
1348 {
1349 LYERRLOG("%s len is %d",__func__,len);
1350 return NULL;
1351 }
1352 LYINFLOG("%s len is %d",__func__,len);
1353
1354 data = (char*) p.readInplace(len);
1355 *data_len=len;
1356
1357 return data;
1358}
1359
1360int lynq_query_radio_state(int *radio_state)
1361{
1362 int ret;
1363 Parcel p;
1364 int resp_type = -1;
1365 int request = -1;
1366 int slot_id = -1;
1367 int error = -1;
1368 int bfind=false;
1369 const char* data;
1370 int data_len;
1371 char* data_str;
1372 char* start;
1373 int length;
1374 int i;
1375 int num_start;
1376
1377 if(NULL == radio_state)
1378 {
1379 LYERRLOG("%s radio state is NULL",__func__);
1380 return -1;
1381 }
1382
1383 ret=lynq_get_common_request(RIL_REQUEST_OEM_HOOK_RAW,5,p,1,"%s","AT+CFUN");
1384 if(ret==0)
1385 {
1386 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1387 if(error==0)
1388 {
1389 data = lynq_get_raw_data(p,&data_len);
1390 if(data==NULL || data_len == 0)
1391 {
1392 LYERRLOG("%s lynq_get_raw_data NULL or data_len is 0",__func__);
1393 return -1;
1394 }
1395 data_str = (char*) calloc(1,data_len+1);
1396 if (NULL == data_str)
1397 {
1398 LYERRLOG("%s alloc mem error, data_len is %d",__func__,data_len+1);
1399 return -1;
1400 }
1401 memmove(data_str, data, data_len);
1402 data_str[data_len]='\0';
1403 LYINFLOG("%s return string is %s",__func__,data_str);
1404 start = strstr(data_str,"CFUN");
1405 if(start!=NULL)
1406 {
1407 start=start+4;
1408 length=strlen(start);
1409 for(i=0; i<length;i++)
1410 {
1411 if((!bfind) && (start[i] >= '0') && (start[i] <= '9'))
1412 {
1413 bfind=true;
1414 num_start=i;
1415 }
1416 else if(bfind && ((start[i] < '0') || (start[i] > '9')))
1417 {
1418 start[i]='\0';
1419 break;
1420 }
1421 }
1422 if(bfind)
1423 {
1424 (*radio_state) = atoi(start+num_start);
1425 LYINFLOG("%s, radio state is %s %d",__func__,start+num_start,*radio_state);
1426 free(data_str);
1427 return 0;
1428 }
1429 }
1430 LYERRLOG("%s return string %s no cfun or no digit",__func__,data_str);
1431 free(data_str);
1432 return -1;
1433 }
1434 else
1435 {
1436 LYERRLOG("%s get error %d from modem",__func__,error);
1437 return error;
1438 }
1439 }
1440
1441 LYERRLOG("%s send request error %d",__func__,ret);
1442
1443 return ret;
1444}
1445
rjw7e50cd32022-01-18 18:30:37 +08001446int lynq_query_radio_tech(int* radioTech)
1447{
1448 int ret = -1;
1449 if(NULL == radioTech)
1450 return ret;
1451 int send_num = 0;
1452 int recv_num = 0;
1453 int num = 0;
rjw7e50cd32022-01-18 18:30:37 +08001454 lynq_client_t client_t;
1455 memset(&client_t,0,sizeof(client_t));
1456 client_t.request = RIL_REQUEST_VOICE_RADIO_TECH;
1457 client_t.paramLen = 0;
rjwbc8a05f2022-03-02 15:23:11 +08001458 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +08001459 memset(client_t.param,0,sizeof(client_t.param));
rjw9c301f82022-05-25 09:10:33 +08001460 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +08001461 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +08001462 if(send_num<0)
1463 {
1464 LYERRLOG("sendto error:");
1465 return ret;
1466 }
1467
rjw7e50cd32022-01-18 18:30:37 +08001468 Parcel p;
rjwa59bf312022-07-05 11:50:31 +08001469 ret = get_response(p,30);
rjw46769c92022-07-04 21:17:25 +08001470 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
1471 if (ret != 0)
1472 {
1473 return ret;
1474 }
rjw7e50cd32022-01-18 18:30:37 +08001475 if(p.dataAvail() > 0)
1476 {
1477 p.readInt32(&response.resp_type);
1478 p.readInt32(&response.request);
1479 p.readInt32(&response.slot_id);
1480 p.readInt32(&response.error);
1481 if(response.error != 0)
1482 {
1483 LYERRLOG("response return error");
1484 return response.error;
1485 }
1486 p.readInt32(&num);
1487 p.readInt32(radioTech);
1488 }
1489 return response.error;
1490}
1491
1492int lynq_solicited_signal_strength(signalStrength_t *solSigStren)
1493{
1494 int ret = -1;
1495 if(NULL == solSigStren)
1496 return ret;
1497 int send_num = 0;
1498 int recv_num = 0;
1499 int sum = 0;
1500 int LTE_signalstrength = 0;
1501 int WCDMA_signalstrength = 0;
1502 int none = 0;
rjw7e50cd32022-01-18 18:30:37 +08001503 lynq_client_t client_t;
1504 memset(&client_t,0,sizeof(client_t));
1505 client_t.request = RIL_REQUEST_SIGNAL_STRENGTH;
1506 client_t.paramLen = 0;
rjwbc8a05f2022-03-02 15:23:11 +08001507 client_t.uToken = network_Global_uToken;
rjw7e50cd32022-01-18 18:30:37 +08001508 memset(client_t.param,0,sizeof(client_t.param));
1509
rjw9c301f82022-05-25 09:10:33 +08001510 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjwbc8a05f2022-03-02 15:23:11 +08001511 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
rjw7e50cd32022-01-18 18:30:37 +08001512 if(send_num<0)
1513 {
1514 LYERRLOG("sendto error:");
1515 return ret;
1516 }
1517
1518 //get data
rjw7e50cd32022-01-18 18:30:37 +08001519 Parcel p;
rjwa59bf312022-07-05 11:50:31 +08001520 ret = get_response(p,30);
rjw46769c92022-07-04 21:17:25 +08001521 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
1522 if (ret != 0)
1523 {
1524 return ret;
1525 }
rjw7e50cd32022-01-18 18:30:37 +08001526 if(p.dataAvail() > 0)
1527 {
1528 p.readInt32(&response.resp_type);
1529 p.readInt32(&response.request);
1530 p.readInt32(&response.slot_id);
1531 p.readInt32(&response.error);
1532 if(response.error != 0)
1533 {
1534 LYERRLOG("response return error");
1535 return response.error;
1536 }
1537
1538 p.readInt32(&solSigStren->rssi);
1539 if((solSigStren->rssi!=99)&&(solSigStren->rssi!=0))
1540 {
1541 solSigStren->gw_sig_valid = 1;
1542 }else{
1543 solSigStren->gw_sig_valid = 0;
1544 }
1545
1546 p.readInt32(&none);
1547 p.readInt32(&none);
1548 p.readInt32(&none);
1549 p.readInt32(&none);
1550 p.readInt32(&none);
1551 p.readInt32(&none);
1552 p.readInt32(&none);
1553 p.readInt32(&LTE_signalstrength);
1554 // p.readInt32(&solSigStren->signalStrength.LTE_SignalStrength.signalStrength);
1555 p.readInt32(&solSigStren->rsrp);
1556 p.readInt32(&solSigStren->rsrq);
1557 p.readInt32(&solSigStren->rssnr);
1558 LYINFLOG("LTE_signalstrength:%d",LTE_signalstrength);
1559 if((LTE_signalstrength!=99)&&(LTE_signalstrength!=0))
1560 {
1561 solSigStren->lte_sig_valid = 1;
1562 }else{
1563 solSigStren->lte_sig_valid = 0;
1564 }
1565
1566 p.readInt32(&none);
1567 p.readInt32(&none);
1568 p.readInt32(&none);
1569 p.readInt32(&none);
1570 p.readInt32(&none);
1571 p.readInt32(&WCDMA_signalstrength);
1572 p.readInt32(&none);
1573 p.readInt32(&solSigStren->rscp);
1574 p.readInt32(&solSigStren->ecno);
1575 LYINFLOG("WCDMA_signalstrength:%d",WCDMA_signalstrength);
1576 if((WCDMA_signalstrength!=99)&&(WCDMA_signalstrength!=0))
1577 {
rjwcdd83ae2022-01-22 14:10:42 +08001578 solSigStren->wcdma_sig_valid = 1;
rjw7e50cd32022-01-18 18:30:37 +08001579 }else{
rjwcdd83ae2022-01-22 14:10:42 +08001580 solSigStren->wcdma_sig_valid = 0;
rjw7e50cd32022-01-18 18:30:37 +08001581 }
rjwcdd83ae2022-01-22 14:10:42 +08001582 /*bug fix*/
rjw7e50cd32022-01-18 18:30:37 +08001583 p.readInt32(&solSigStren->ssRsrp);
1584 p.readInt32(&solSigStren->ssRsrq);
1585 p.readInt32(&solSigStren->ssSinr);
1586 p.readInt32(&solSigStren->csiRsrp);
1587 p.readInt32(&solSigStren->csiRsrq);
1588 p.readInt32(&solSigStren->csiSinr);
1589 sum = (solSigStren->ssRsrp) + (solSigStren->ssRsrq) + (solSigStren->ssSinr) + (solSigStren->csiRsrp)+\
1590 (solSigStren->csiRsrq) + (solSigStren->csiSinr);
1591 if(sum != 0)
1592 {
1593 solSigStren->nr_sig_valid = 1;
1594 }else{
1595 LYERRLOG("None of NR signal info");
1596 }
1597 }
1598 return response.error;
1599}
rjwbc8a05f2022-03-02 15:23:11 +08001600
rjw4a5a78d2022-03-10 11:04:24 +08001601int lynq_set_ims(const int ims_mode)
1602{
1603 int ret = -1;
1604 if (ims_mode < 0 || ims_mode > 1)
1605 {
1606 LYERRLOG("incoming ims_mode error");
1607 return ret;
1608 }
1609 int send_num = 0;
rjw4a5a78d2022-03-10 11:04:24 +08001610 int recv_num = 0;
1611 lynq_client_t client_t;
1612
1613 memset(&client_t,0,sizeof(client_t));
1614 client_t.request = RIL_REQUEST_SET_IMS_ENABLE;
1615 client_t.paramLen = 1;
1616 client_t.uToken = network_Global_uToken;
1617 sprintf(client_t.param,"%d",ims_mode);
rjw9c301f82022-05-25 09:10:33 +08001618 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
rjw4a5a78d2022-03-10 11:04:24 +08001619 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
1620 if (send_num<0)
1621 {
1622 LYERRLOG("sendto error:");
1623 return ret;
1624 }
1625
rjw4a5a78d2022-03-10 11:04:24 +08001626 Parcel p;
rjwa59bf312022-07-05 11:50:31 +08001627 ret = get_response(p,30);
rjw46769c92022-07-04 21:17:25 +08001628 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
1629 if (ret != 0)
1630 {
1631 return ret;
1632 }
rjw4a5a78d2022-03-10 11:04:24 +08001633 if (p.dataAvail() > 0)
1634 {
1635 p.readInt32(&response.resp_type);
1636 p.readInt32(&response.request);
1637 p.readInt32(&response.slot_id);
1638 p.readInt32(&response.error);
rjw7a8791e2022-09-06 09:07:39 +08001639 if(response.error != 0)
1640 {
1641 LYERRLOG("response return error");
1642 return response.error;
1643 }
rjw4a5a78d2022-03-10 11:04:24 +08001644 }
1645
1646 return response.error;
1647}
1648
1649
rjwbc8a05f2022-03-02 15:23:11 +08001650/*Used to wait for an update signal*/
1651int lynq_wait_signalchanges(int *handle)
1652{
1653 LYDBGLOG("start wait signalchanges info");
1654 if(NULL == handle)
1655 {
1656 LYERRLOG("illegal input");
1657 return -1;
1658 }
1659 wait_signal_changes();
1660 LYDBGLOG("get signalchanges");
1661 *handle = network_wait_urc_id;
1662 return 0;
1663}
1664/*Used to get urc info*/
1665int lynq_get_urc_info(const int handle,signalStrength_t *solSigStren,int *slot_id)
1666{
1667 LYDBGLOG("start get urc info");
1668 if(handle != 1002&&handle != 1009)
1669 {
1670 LYINFLOG("invalid handle!!!");
1671 return -1;
1672 }
1673 if(NULL == solSigStren && NULL == slot_id)
1674 {
1675 LYINFLOG("incoming solSigStren or slot_id is NULL!!!");
1676 return -1;
1677 }
1678 switch(handle)
1679 {
1680 case 1002: //RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED
1681 {
1682 LYDBGLOG("get state update to VOICE");
1683 *slot_id = network_urc_slot_id;
1684 LYINFLOG("slot_id = %d",network_urc_slot_id);
rjw25d01752022-08-04 09:42:00 +08001685 break;
rjwbc8a05f2022-03-02 15:23:11 +08001686 }
1687 case 1009: //RIL_UNSOL_SIGNAL_STRENGTH
1688 {
1689 LYDBGLOG("get state update to signal info");
1690 solSigStren->gw_sig_valid = network_urc_solSigStren.gw_sig_valid;
1691 solSigStren->rssi = network_urc_solSigStren.rssi;
1692 solSigStren->wcdma_sig_valid = network_urc_solSigStren.wcdma_sig_valid;
1693 solSigStren->rscp = network_urc_solSigStren.rscp;
1694 solSigStren->ecno = network_urc_solSigStren.ecno;
1695 solSigStren->lte_sig_valid = network_urc_solSigStren.lte_sig_valid;
1696 solSigStren->rsrp = network_urc_solSigStren.rsrp;
1697 solSigStren->rsrq = network_urc_solSigStren.rsrq;
1698 solSigStren->rssnr = network_urc_solSigStren.rssnr;
1699 solSigStren->nr_sig_valid = network_urc_solSigStren.nr_sig_valid;
1700 solSigStren->ssRsrp = network_urc_solSigStren.ssRsrp;
1701 solSigStren->ssRsrq = network_urc_solSigStren.ssRsrq;
1702 solSigStren->ssSinr = network_urc_solSigStren.ssSinr;
1703 solSigStren->csiRsrp = network_urc_solSigStren.csiRsrp;
1704 solSigStren->csiRsrq = network_urc_solSigStren.csiRsrq;
1705 solSigStren->csiSinr = network_urc_solSigStren.csiSinr;
rjw25d01752022-08-04 09:42:00 +08001706 break;
rjwbc8a05f2022-03-02 15:23:11 +08001707 }
1708 }
1709 return 0;
rjw4200a082022-05-17 17:58:35 +08001710}
lh3a26dd52022-07-01 04:44:57 -07001711
1712/**@brief parse at response,return error code,and the response
1713* @param response [IN] <response>:original at response,This parameter must be a character array.
1714
1715* @param value [OUT] <value>: Used to receive the parsed value, if multiple values are separated by ";".
1716* field:
1717* eg:
1718* "+cnum: 123456\n+cnum: 456"
1719* value:12345;456;
1720* @param value_len [IN] <value_len>: The value length.
1721
1722* @return:AT error code
1723*/
1724static int parse_at_result(char response[],char value[],int value_len)
1725{
1726 if(response == NULL || value == NULL)
1727 {
1728 LYERRLOG("parameter invalid");
1729 return -1;
1730 }
1731 if(strstr(response,"ERROR"))
1732 {
1733 int i;
1734 for(i = 0;i < strlen(response);i++)
1735 {
1736 if(response[i]==':')
1737 {
1738 break;
1739 }
1740 }
1741 if(i < strlen(response))
1742 {
1743 LYINFLOG("parse_result:%d\n",atoi(response+i+1));
1744 return atoi(response+i+1);
1745 }
1746 else
1747 {
1748 LYINFLOG("%s parse_result:fail,this response invalid\n",response);
1749 return 100; //unknown
1750 }
1751 }
1752 else if(strstr(response,"OK"))
1753 {
1754 /** parse the at response value
1755 * eg:
1756 * --> at+cnum
1757 * <-- +CNUM:"1243452"
1758 * need parse the "1243452" to <value>
1759 *@ To-Do
1760 */
1761 int count;
1762 int resp_addr[32] = {0};
1763 char temp_buf[1024] = {0};
1764 char *dest;
1765 dest = NULL;
1766 count = 0;
1767 int res_len = strlen(response);
1768 LYINFLOG("res_len:%d",res_len);
1769 for(int i = 0; i < res_len; i++)
1770 {
1771 if(response[i]==':')
1772 {
1773 resp_addr[count] = i;
1774 count++;
1775 }
1776 if(response[i] == '\n')
1777 {
1778 response[i] = '\0';
1779 }
1780 }
1781 LYINFLOG("count:%d",count);
1782 if(count > 0)
1783 {
1784 for(int i = 0; i < count; i++)
1785 {
1786 if((strlen(temp_buf) + strlen(response+resp_addr[i]+2)) >= 1023)
1787 {
1788 LYINFLOG("2 will be out of range\n");
1789 break;
1790 }
1791 if(strlen(temp_buf) >= 1023)
1792 {
1793 LYINFLOG("1 will be out of range\n");
1794 break;
1795 }
1796 strcat(temp_buf,response+resp_addr[i]+2);
1797
1798 if(strlen(temp_buf) >= 1023)
1799 {
1800 LYINFLOG("1 will be out of range\n");
1801 break;
1802 }
1803 strcat(temp_buf,";");
1804 printf("parse_result[%d]:%s,strcated:%s\n",i,response+resp_addr[i]+2,temp_buf);
1805 }
1806 LYINFLOG("parse_result:%s\n",temp_buf);
1807 if(strlen(temp_buf) > value_len)
1808 {
1809 printf("result length over value:%ld,%d\n",strlen(temp_buf),value_len);
1810 memcpy(value,temp_buf,value_len);
1811 }
1812 else
1813 {
1814 memcpy(value,temp_buf,strlen(temp_buf));
1815 }
1816 }
1817 return 0;
1818 }
1819 else
1820 {
1821 LYINFLOG("%s this response invalid\n",response);
1822 return -1;
1823 }
1824}
1825#ifdef MODEM_GEN97
1826
1827int lynq_oos_recover_timer_interval(int mode, char interval[LY_RECOVER_TIMER_INTERVAL],char result[LY_RECOVER_TIMER_INTERVAL])
1828{
1829 int ret;
1830 int send_num;
1831 int recv_len;
1832 Parcel p;
1833 char res_data[LY_RECOVER_TIMER_INTERVAL] = {0};
1834 lynq_client_t client_t;
1835 char response_interval[LY_RECOVER_TIMER_INTERVAL*2] = {0};
1836
1837 ret = -1;
1838 send_num = -1;
1839 recv_len = -1;
1840
1841 LYINFLOG("lynq_oos_recover_timer_interval start");
1842 if((mode < 0) || (mode >1) || (NULL == interval) || (NULL == result))
1843 {
1844 LYERRLOG("lynq_oos_recover_timer_interval paramter fail!!!");
1845 return ret;
1846 }
1847
1848 memset(&client_t,0,sizeof(client_t));
1849 client_t.request = RIL_REQUEST_OEM_HOOK_RAW; //LYNQ_REQUEST_OOS_RECOVER_TIMER_INTERVAL
1850 client_t.paramLen = 1;
1851 client_t.uToken = network_Global_uToken;
1852 if(mode == 0)
1853 {
1854 sprintf(client_t.param,"AT+ERSCFG=%s",interval);
1855 }
1856 else
1857 {
1858 sprintf(client_t.param,"AT+ERSCFG?",interval);
1859 }
1860 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
1861 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
1862 if(send_num < 0)
1863 {
1864 LYERRLOG("sendto error:%s",strerror(errno));
1865 return ret;
1866 }
1867 ret = get_response(p,-1); //use defualt time (5s)
1868 if(ret != 0)
1869 {
1870 return ret;
1871 }
1872 JumpHeader(p, &response.resp_type, &response.request, &response.slot_id, &response.error);
1873 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",response.resp_type, response.request, response.slot_id, response.error);
1874 if(0 == response.error)
1875 {
1876 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
1877 LYINFLOG("get recover timer interval");
1878 p.readInt32(&recv_len);
1879 if(recv_len == -1)
1880 {
1881 LYINFLOG("no responset");
1882 return -1;
1883 }
1884 else
1885 {
1886 LYINFLOG("recv_len:%d",recv_len);
1887 p.read(response_interval,recv_len);
1888 }
1889 LYINFLOG("response_interval:%s",response_interval);
1890 ret = parse_at_result(response_interval,res_data,LY_RECOVER_TIMER_INTERVAL);
1891 if(mode == 1)
1892 {
1893 if(strlen(res_data) <= LY_RECOVER_TIMER_INTERVAL)
1894 {
1895 memcpy(result,res_data,strlen(res_data));
1896 }
1897 }
1898 LYINFLOG("ret:%d",ret);
1899 return ret;
1900 }
1901 else
1902 {
1903 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
1904 return response.error;
1905 }
1906}
1907
1908int lynq_oos_deep_sleep_recover_timer_interval(int recovery_threshold,int fullband_timer,int sniffer_timer,int inactive_mode)
1909{
1910 int ret;
1911 int send_num;
1912 int recv_len;
1913 Parcel p;
1914 char res_data[LY_RECOVER_TIMER_INTERVAL] = {0};
1915 lynq_client_t client_t;
1916 char response_interval[LY_RECOVER_TIMER_INTERVAL*2] = {0};
1917
1918 ret = -1;
1919 send_num = -1;
1920 recv_len = -1;
1921
1922 LYINFLOG("lynq_oos_deep_sleep_recover_timer_interval start");
1923 if(((recovery_threshold < 2) || (recovery_threshold > 10)) || ((fullband_timer < 90) || (fullband_timer > 360)) ||
1924 ((sniffer_timer < 10) || (sniffer_timer > 60)) || ((inactive_mode < 0) || (inactive_mode > 1)))
1925 {
1926 LYERRLOG("lynq_oos_deep_sleep_recover_timer_interval paramter fail!!!");
1927 return ret;
1928 }
1929
1930 memset(&client_t,0,sizeof(client_t));
1931 client_t.request = RIL_REQUEST_OEM_HOOK_RAW; //LYNQ_REQUEST_OOS_DEEP_SLEEP_RECOVER_TIMER_INTERVAL
1932 client_t.paramLen = 1;
1933 client_t.uToken = network_Global_uToken;
1934 sprintf(client_t.param,"AT+ESRVREC=%d,%d,%d,%d",recovery_threshold,fullband_timer,sniffer_timer,inactive_mode);
1935 pthread_mutex_lock(&g_lynq_network_sendto_mutex);
1936 send_num = sendto(network_sock_fd,&client_t,sizeof(client_t),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
1937 if(send_num<0)
1938 {
1939 LYERRLOG("sendto error:%s",strerror(errno));
1940 return ret;
1941 }
1942 ret = get_response(p,-1); //use defualt time (5s)
1943 if(ret != 0)
1944 {
1945 return ret;
1946 }
1947 JumpHeader(p, &response.resp_type, &response.request, &response.slot_id, &response.error);
1948 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",response.resp_type, response.request, response.slot_id, response.error);
1949 if(0 == response.error)
1950 {
1951 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
1952 LYINFLOG("set deep sleep recover timer interval response");
1953 p.readInt32(&recv_len);
1954 if(recv_len == -1)
1955 {
1956 LYINFLOG("no responset");
1957 return -1;
1958 }
1959 else
1960 {
1961 LYINFLOG("recv_len:%d",recv_len);
1962 p.read(response_interval,recv_len);
1963 }
1964 LYINFLOG("response_interval:%s",response_interval);
1965 ret = parse_at_result(response_interval,res_data,LY_RECOVER_TIMER_INTERVAL);
1966 return ret;
1967 }
1968 else
1969 {
1970 pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
1971 return response.error;
1972 }
1973}
1974#endif
1975