blob: 31f88c506d3ea9316a75f0e2dcef8866401509d3 [file] [log] [blame]
rjw7e50cd32022-01-18 18:30:37 +08001#include <stdio.h>
2#include <sys/types.h>
3#include <sys/socket.h>
4#include <arpa/inet.h>
5#include <string.h>
6#include <unistd.h>
7#include <binder/Parcel.h>
8#include <log/log.h>
9#include <cutils/jstring.h>
10#include <pthread.h>
11#include <vendor-ril/telephony/ril.h>
rjw4a5a78d2022-03-10 11:04:24 +080012#include <vendor-ril/telephony/mtk_ril_sp.h>
rjw7e50cd32022-01-18 18:30:37 +080013#include "liblog/lynq_deflog.h"
q.huang52921662022-10-20 15:25:45 +080014#include "lynq_network.h"
15#include "lynq_module_common.h"
16#include "lynq_module_socket.h"
17#include "lynq_module_state_buffer.h"
18
19#define LYNQ_RESP_STRING_MAX_NUM 128
rjw7e50cd32022-01-18 18:30:37 +080020#define LYNQ_TYPE_BUF 10
21#define USER_LOG_TAG "LYNQ_NETWORK"
22
q.huang8fb88c42023-04-26 17:02:02 +080023/*in CR AUTO00210807 MTK confirm set network selection mode max time is 14min 30s, first set 5 min 10s*/
24#define WAIT_TIME_LENGTH_FOR_SET_NETWORK_SELECTION_MODE (310)
q.huang0bbd0262023-04-28 15:54:40 +080025/*in CR AUTO00207414, in modem, 23G detach need 10s, 5g ims detach need 5s, so set length to 12s */
26#define WAIT_TIME_LENGTH_FOR_SET_PREFFERRED_NETWORK_TYPE (12)
27
q.huang8fb88c42023-04-26 17:02:02 +080028
rjw7e50cd32022-01-18 18:30:37 +080029using ::android::Parcel;
30
q.huang52921662022-10-20 15:25:45 +080031static int s_module_wait_urc_id;
32static int s_module_urc_slot_id;
33static signalStrength_t s_network_urc_solSigStren;
rjw7e50cd32022-01-18 18:30:37 +080034
q.huang52921662022-10-20 15:25:45 +080035/**g_module_init_flag
rjw22947c22022-03-15 09:21:29 +080036* @brief mark network initialization state
37* 0:deinit status
38* 1:init state
39*/
q.huang52921662022-10-20 15:25:45 +080040int g_module_init_flag = 0;
rjw7e50cd32022-01-18 18:30:37 +080041
42int lynq_network_init(int utoken){
q.huang52921662022-10-20 15:25:45 +080043 if(g_module_init_flag != MODULE_CLOSED)
rjw22947c22022-03-15 09:21:29 +080044 {
q.huang52921662022-10-20 15:25:45 +080045 LYERRLOG("module state is %d",g_module_init_flag);
46 return LYNQ_E_CONFLICT;
rjw22947c22022-03-15 09:21:29 +080047 }
q.huang52921662022-10-20 15:25:45 +080048
49 if(utoken <0){
50 LYERRLOG("utoken is less than 0",utoken);
51 return LYNQ_E_PARAMETER_ANONALY;
rjw7e50cd32022-01-18 18:30:37 +080052 }
q.huang52921662022-10-20 15:25:45 +080053
54 g_module_init_flag = MODULE_SWITCHING;
55
56 g_module_Global_uToken = utoken;
rjw7e50cd32022-01-18 18:30:37 +080057 LYLOGSET(LOG_INFO);
58 LYLOGEINIT(USER_LOG_TAG);
q.huang52921662022-10-20 15:25:45 +080059
q.huang693ff3b2022-10-20 15:25:45 +080060 int ret;
rjw7e50cd32022-01-18 18:30:37 +080061
q.huang47d4dfe2022-08-17 17:52:29 +080062 init_network_timer_all();
q.huang036b6cf2023-01-10 14:29:20 +080063
64 ret = lynq_start_all_urc_socket_thread();
q.huang52921662022-10-20 15:25:45 +080065 if(ret != 0)
66 {
67 LYERRLOG("init socket urc fail!!!");
68 g_module_init_flag = MODULE_CLOSED;
69 return LYNQ_E_INNER_ERROR;
70 }
71
q.huang036b6cf2023-01-10 14:29:20 +080072 ret = lynq_start_all_rc_socket_thread();
rjw7e50cd32022-01-18 18:30:37 +080073 if(ret !=0)
74 {
75 LYERRLOG("init socket client fail!!!");
q.huang036b6cf2023-01-10 14:29:20 +080076 lynq_close_all_urc_socket_thread();
q.huang52921662022-10-20 15:25:45 +080077 g_module_init_flag = MODULE_CLOSED;
78 return LYNQ_E_INNER_ERROR;
rjw7e50cd32022-01-18 18:30:37 +080079 }
q.huang52921662022-10-20 15:25:45 +080080 g_module_init_flag = MODULE_RUNNING;
q.huang7de1d662022-09-13 14:19:24 +080081
q.huang52921662022-10-20 15:25:45 +080082 return RESULT_OK;
83}
84
85int lynq_network_deinit(void){
86
87 if (g_module_init_flag != MODULE_RUNNING)
88 {
89 LYERRLOG("module state is %d",g_module_init_flag);
90 return LYNQ_E_CONFLICT;
91 }
92 g_module_init_flag = MODULE_SWITCHING;
93
q.huang036b6cf2023-01-10 14:29:20 +080094 lynq_close_all_urc_socket_thread();
95 lynq_close_all_rc_socket_thread();
q.huang52921662022-10-20 15:25:45 +080096 deinit_network_timer_all();
97
98 g_module_init_flag = MODULE_CLOSED;
99 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800100}
101
102int strUpper(char * str)
103{
104 int i=0;
105 while(1)
106 {
107 if(str[i]=='\0')
108 {
109 break;
110 }
111 if(str[i]>='a'&&str[i]<='z')
112 {
113 str[i]=str[i]-32;
114 }
115 i++;
116 }
q.huang52921662022-10-20 15:25:45 +0800117 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800118}
119
q.huang7de1d662022-09-13 14:19:24 +0800120int copyCellInfoList(Parcel* &p,uint64_t *cellinfo,int *tac,int *earfcn)
rjw7e50cd32022-01-18 18:30:37 +0800121{
122 int32_t v=0;
123 int64_t v6=0;
124 if(NULL == cellinfo)
125 {
126 LYERRLOG("*cellinfo error");
q.huang52921662022-10-20 15:25:45 +0800127 return LYNQ_E_PARAMETER_ANONALY;
rjw7e50cd32022-01-18 18:30:37 +0800128 }
129
130 int nothing = 0;
rjw62a60152022-06-09 17:43:01 +0800131 int tmp_uint64 = 0;
q.huang7de1d662022-09-13 14:19:24 +0800132 p->readInt32(&v);
rjw7e50cd32022-01-18 18:30:37 +0800133 RIL_CellInfoType cellinfoType = RIL_CellInfoType(v);
q.huang7de1d662022-09-13 14:19:24 +0800134 p->readInt32(&nothing);
rjw7e50cd32022-01-18 18:30:37 +0800135 // cellinfo->cellinfo.cellInfoType = RIL_CellInfoType(v);
q.huang7de1d662022-09-13 14:19:24 +0800136 // p->readInt32(&cellinfo->cellinfo.registered);
137 p->readInt32(&v);
rjw7e50cd32022-01-18 18:30:37 +0800138 // cellinfo->cellinfo.timeStampType = RIL_TimeStampType(v);
q.huang7de1d662022-09-13 14:19:24 +0800139 p->readInt64(&v6);
rjw7e50cd32022-01-18 18:30:37 +0800140 // cellinfo->cellinfo.timeStamp = v6;
141 switch(cellinfoType) {
142 case RIL_CELL_INFO_TYPE_GSM: {
q.huang7de1d662022-09-13 14:19:24 +0800143 p->readInt32(&nothing);
144 p->readInt32(&nothing);
145 p->readInt32(&nothing);
146 p->readInt32(&tmp_uint64);
147 p->readInt32(&nothing);
148 p->readInt32(&nothing);
149 p->readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800150 *cellinfo = (uint64_t)tmp_uint64;
rjw61974852022-05-17 16:30:32 +0800151 tac = &nothing;
rjwa8011682022-05-31 17:31:28 +0800152 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800153 break;
154 }
155 case RIL_CELL_INFO_TYPE_WCDMA: {
q.huang7de1d662022-09-13 14:19:24 +0800156 p->readInt32(&nothing);
157 p->readInt32(&nothing);
158 p->readInt32(&nothing);
159 p->readInt32(&tmp_uint64);
160 p->readInt32(&nothing);
161 p->readInt32(&nothing);
162 p->readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800163 *cellinfo = (uint64_t)tmp_uint64;
rjw4200a082022-05-17 17:58:35 +0800164 tac = &nothing;
rjwa8011682022-05-31 17:31:28 +0800165 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800166 break;
167 }
168 case RIL_CELL_INFO_TYPE_CDMA: {
q.huang7de1d662022-09-13 14:19:24 +0800169 p->readInt32(&nothing);
170 p->readInt32(&nothing);
171 p->readInt32(&nothing);
172 p->readInt32(&nothing);
173 p->readInt32(&nothing);
174 p->readInt32(&nothing);
175 p->readInt32(&nothing);
176 p->readInt32(&nothing);
177 p->readInt32(&nothing);
178 p->readInt32(&nothing);
rjw7e50cd32022-01-18 18:30:37 +0800179 cellinfo = 0;
rjw61974852022-05-17 16:30:32 +0800180 tac = &nothing;
rjwa8011682022-05-31 17:31:28 +0800181 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800182 break;
183 }
184 case RIL_CELL_INFO_TYPE_LTE: {
q.huang7de1d662022-09-13 14:19:24 +0800185 p->readInt32(&nothing);
186 p->readInt32(&nothing);
187 p->readInt32(&tmp_uint64);
188 p->readInt32(&nothing);
189 p->readInt32(tac);
190 p->readInt32(earfcn);
191 p->readInt32(&nothing);
192 p->readInt32(&nothing);
193 p->readInt32(&nothing);
194 p->readInt32(&nothing);
195 p->readInt32(&nothing);
196 p->readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800197 *cellinfo = (uint64_t)tmp_uint64;
rjw7e50cd32022-01-18 18:30:37 +0800198 break;
199 }
200 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
q.huang7de1d662022-09-13 14:19:24 +0800201 p->readInt32(&nothing);
202 p->readInt32(&nothing);
203 p->readInt32(&nothing);
204 p->readInt32(&tmp_uint64);
205 p->readInt32(&nothing);
206 p->readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800207 *cellinfo = (uint64_t)tmp_uint64;
rjwa8011682022-05-31 17:31:28 +0800208 tac = &nothing;
209 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800210 break;
211 }
212 case RIL_CELL_INFO_TYPE_NR: {
q.huang7de1d662022-09-13 14:19:24 +0800213 p->readInt32(&nothing);
214 p->readInt32(&nothing);
215 p->readUint64(cellinfo);
216 p->readInt32(&nothing);
217 p->readInt32(tac);
218 p->readInt32(earfcn);
219 p->readInt32(&nothing);
220 p->readInt32(&nothing);
221 p->readInt32(&nothing);
222 p->readInt32(&nothing);
223 p->readInt32(&nothing);
224 p->readInt32(&nothing);
rjw7e50cd32022-01-18 18:30:37 +0800225 break;
226 }
227 }
rjw62a60152022-06-09 17:43:01 +0800228 LYINFLOG("CID in fUNC :%llu",*cellinfo);
rjwa8011682022-05-31 17:31:28 +0800229 LYINFLOG("tac in fUNC :%d",*tac);
230 LYINFLOG("earfcn in fUNC :%d",*earfcn);
q.huang52921662022-10-20 15:25:45 +0800231 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800232}
233
q.huang7de1d662022-09-13 14:19:24 +0800234static char * lynqStrdupReadString(Parcel* &p) {
rjw7e50cd32022-01-18 18:30:37 +0800235 size_t stringlen;
236 const char16_t *s16;
237
q.huang7de1d662022-09-13 14:19:24 +0800238 s16 = p->readString16Inplace(&stringlen);
rjw7e50cd32022-01-18 18:30:37 +0800239 return strndup16to8(s16, stringlen);
240}
241
242int lynq_query_operater(char *OperatorFN,char *OperatorSH,char *MccMnc)
243{
q.huang52921662022-10-20 15:25:45 +0800244 if(g_module_init_flag != MODULE_RUNNING)
245 {
246 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
247 return LYNQ_E_CONFLICT;
248 }
249
rjw7e50cd32022-01-18 18:30:37 +0800250 if(NULL == OperatorFN||NULL == OperatorSH|| NULL == MccMnc)
rjw7e50cd32022-01-18 18:30:37 +0800251 {
q.huang7de1d662022-09-13 14:19:24 +0800252 LYERRLOG("%s some parameter OperatorFN OperatorSH MccMnc %s %s %s is NULL",__func__,OperatorFN,OperatorSH,MccMnc);
q.huang52921662022-10-20 15:25:45 +0800253 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800254 }
q.huang52921662022-10-20 15:25:45 +0800255
q.huang7de1d662022-09-13 14:19:24 +0800256 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +0800257 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OPERATOR,0,"");
258
259 if(ret!=RESULT_OK)
rjw46769c92022-07-04 21:17:25 +0800260 {
q.huang52921662022-10-20 15:25:45 +0800261 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
262 return ret;
263 }
264
265 int num ;
266 char *resp[LYNQ_RESP_STRING_MAX_NUM];
q.huang7de1d662022-09-13 14:19:24 +0800267
q.huang52921662022-10-20 15:25:45 +0800268 p->readInt32(&num);
269 if(num == 0 || num > LYNQ_RESP_STRING_MAX_NUM)
270 {
271 LYERRLOG("no paramters or num %d too great",num);
272 delete p;
273 return LYNQ_E_INNER_ERROR;
274 }else{
275 int i;
276 for(i = 0; i<num;i++)
rjw7e50cd32022-01-18 18:30:37 +0800277 {
q.huang52921662022-10-20 15:25:45 +0800278 resp[i] = lynqStrdupReadString(p);
rjw7e50cd32022-01-18 18:30:37 +0800279 }
q.huang52921662022-10-20 15:25:45 +0800280 if(NULL != resp[0])
281 {
282 strcpy(OperatorFN,resp[0]);
283 }
284 if(NULL != resp[1])
285 {
286 strcpy(OperatorSH,resp[1]);
287 }
288 if(NULL != resp[2])
289 {
290 strcpy(MccMnc,resp[2]);
291 }
292 for(i = 0; i<num;i++)
293 {
294 if(resp[i]!=NULL)
295 {
296 free(resp[i]);
297 }
298 }
rjw7e50cd32022-01-18 18:30:37 +0800299 }
q.huang7de1d662022-09-13 14:19:24 +0800300
q.huang52921662022-10-20 15:25:45 +0800301 LYINFLOG("%s suc",__func__);
302 delete p;
303 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800304}
305
306int lynq_query_network_selection_mode(int *netselMode)
307{
q.huang52921662022-10-20 15:25:45 +0800308 if(g_module_init_flag != MODULE_RUNNING)
309 {
310 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
311 return LYNQ_E_CONFLICT;
312 }
313
rjw7e50cd32022-01-18 18:30:37 +0800314 if(NULL == netselMode)
rjw7e50cd32022-01-18 18:30:37 +0800315 {
q.huang7de1d662022-09-13 14:19:24 +0800316 LYERRLOG("%s parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800317 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800318 }
q.huang52921662022-10-20 15:25:45 +0800319
320 Parcel* p=NULL;
321 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE,0,"");
322
323 if(ret!=RESULT_OK)
rjw46769c92022-07-04 21:17:25 +0800324 {
q.huang52921662022-10-20 15:25:45 +0800325 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
326 return ret;
327 }
328
329 int readnum;
330 p->readInt32(&readnum);
331 p->readInt32(netselMode);
q.huang7de1d662022-09-13 14:19:24 +0800332
q.huang52921662022-10-20 15:25:45 +0800333 LYINFLOG("%s suc",__func__);
334 delete p;
335 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800336}
337
338int lynq_set_network_selection_mode(const char *mode,const char* mccmnc)
339{
q.huang52921662022-10-20 15:25:45 +0800340 if(g_module_init_flag != MODULE_RUNNING)
341 {
342 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
343 return LYNQ_E_CONFLICT;
344 }
345
q.huang7de1d662022-09-13 14:19:24 +0800346 if(NULL == mode || (strlen(mode) == 0))
rjw78d04502022-02-24 13:37:11 +0800347 {
q.huang7de1d662022-09-13 14:19:24 +0800348 LYERRLOG("%s parameter mod %s is error",__func__,mode);
q.huang52921662022-10-20 15:25:45 +0800349 return LYNQ_E_PARAMETER_ANONALY;
rjw78d04502022-02-24 13:37:11 +0800350 }
q.huang7de1d662022-09-13 14:19:24 +0800351
352 if(!strcmp(mode,"Manual"))
353 {
354 if(mccmnc == NULL || strlen(mccmnc) == 0)
355 {
356 LYERRLOG("%s parameter mccmnc %s is error",__func__,mccmnc);
q.huang52921662022-10-20 15:25:45 +0800357 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800358 }
359 }
360
q.huang7de1d662022-09-13 14:19:24 +0800361 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +0800362 int ret;
q.huang7de1d662022-09-13 14:19:24 +0800363
rjw7e50cd32022-01-18 18:30:37 +0800364 if(!strcmp(mode,"Auto"))
365 {
q.huang8fb88c42023-04-26 17:02:02 +0800366 ret=lynq_send_common_request(p,WAIT_TIME_LENGTH_FOR_SET_NETWORK_SELECTION_MODE,RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC,0,"");
q.huang7de1d662022-09-13 14:19:24 +0800367 }
368 else if(!strcmp(mode,"Manual"))
369 {
q.huang8fb88c42023-04-26 17:02:02 +0800370 ret=lynq_send_common_request(p,WAIT_TIME_LENGTH_FOR_SET_NETWORK_SELECTION_MODE,RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL,1,"%s",mccmnc);
q.huang7de1d662022-09-13 14:19:24 +0800371 }
372 else
373 {
q.huang52921662022-10-20 15:25:45 +0800374 LYERRLOG("%s parameter mode %s is errir",__func__,mode);
375 return LYNQ_E_PARAMETER_ANONALY;
rjw7e50cd32022-01-18 18:30:37 +0800376 }
377
q.huang52921662022-10-20 15:25:45 +0800378 if(ret!=RESULT_OK)
379 {
380 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
381 return ret;
382 }
383
384 LYINFLOG("%s set mode %s mccmnc %s suc",__func__,mode,mccmnc);
385 delete p;
386 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800387}
388
389int lynq_query_available_network(char *OperatorFN,char *OperatorSH,char *MccMnc,char * NetStatus)
390{
q.huang52921662022-10-20 15:25:45 +0800391 if(g_module_init_flag != MODULE_RUNNING)
392 {
393 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
394 return LYNQ_E_CONFLICT;
395 }
rjw7e50cd32022-01-18 18:30:37 +0800396 if(NULL == OperatorFN||NULL == OperatorSH||NULL == MccMnc||NULL == NetStatus)
rjw7e50cd32022-01-18 18:30:37 +0800397 {
q.huang7de1d662022-09-13 14:19:24 +0800398 LYERRLOG("%s there is parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800399 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800400 }
q.huang52921662022-10-20 15:25:45 +0800401
q.huang7de1d662022-09-13 14:19:24 +0800402 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +0800403 int ret=lynq_send_common_request(p,600,RIL_REQUEST_QUERY_AVAILABLE_NETWORKS,0,"");
rjw7e50cd32022-01-18 18:30:37 +0800404
q.huang52921662022-10-20 15:25:45 +0800405 if(ret!=RESULT_OK)
rjw46769c92022-07-04 21:17:25 +0800406 {
q.huang52921662022-10-20 15:25:45 +0800407 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
408 return ret;
409 }
q.huang7de1d662022-09-13 14:19:24 +0800410
q.huang52921662022-10-20 15:25:45 +0800411 int num =p->readInt32();
412 char *resp[LYNQ_RESP_STRING_MAX_NUM];
413 if(num == 0 || num > LYNQ_RESP_STRING_MAX_NUM)
414 {
415 LYERRLOG("no paramters or num %d too great",num);
416 delete p;
417 return LYNQ_E_INNER_ERROR;
418 }else{
419 int i;
420 for(i = 0; i<num;i++)
421 {
422 resp[i] = lynqStrdupReadString(p);
423 }
424 if(NULL != resp[0])
425 {
426 strcpy(OperatorFN,resp[0]);
427 }
428 if(NULL != resp[1])
429 {
430 strcpy(OperatorSH,resp[1]);
431 }
432 if(NULL != resp[2])
433 {
434 strcpy(MccMnc,resp[2]);
435 }
436 if(NULL != resp[3])
437 {
rjwfe7c8a42022-10-21 15:09:21 +0800438 strcpy(NetStatus,resp[3]);
q.huang52921662022-10-20 15:25:45 +0800439 }
440 for(i = 0; i<num;i++)
441 {
442 if(resp[i]!=NULL)
443 {
444 free(resp[i]);
445 }
446 }
447 }
448 delete p;
449 LYINFLOG("%s suc",__func__);
450 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800451}
452
rjw4544e132022-04-01 15:00:26 +0800453int 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 +0800454{
q.huang52921662022-10-20 15:25:45 +0800455 if(g_module_init_flag != MODULE_RUNNING)
456 {
457 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
458 return LYNQ_E_CONFLICT;
459 }
460
rjwd98d5872022-04-09 13:50:58 +0800461 if(NULL == type || NULL ==regState ||NULL ==imsRegState ||NULL ==LAC ||NULL ==CID ||NULL ==netType ||NULL ==radioTechFam || NULL == netRejected)
q.huang7de1d662022-09-13 14:19:24 +0800462 {
463 LYERRLOG("%s there is parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800464 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800465 }
rjw7e50cd32022-01-18 18:30:37 +0800466 if(strlen(type)>LYNQ_TYPE_BUF)
467 {
468 LYERRLOG("[%s]the parameter is inavaliable !",__FUNCTION__);
q.huang52921662022-10-20 15:25:45 +0800469 return LYNQ_E_PARAMETER_ANONALY;
470 }
q.huang7de1d662022-09-13 14:19:24 +0800471
472 int request;
473 char str[LYNQ_TYPE_BUF];
rjw7e50cd32022-01-18 18:30:37 +0800474 memcpy(str,type,strlen(type)+1);
475 strUpper(str);
476 if(!strcmp(str,"VOICE"))
477 {
q.huangd3804bd2022-10-20 14:36:14 +0800478 if(get_state_from_buf(NETWORK_STATE_BUFFER_TYPE_VOICE_REG,3,regState,netType,netRejected,0)==0)
q.huang47d4dfe2022-08-17 17:52:29 +0800479 {
q.huangd3804bd2022-10-20 14:36:14 +0800480 return RESULT_OK;
q.huang47d4dfe2022-08-17 17:52:29 +0800481 }
q.huang7de1d662022-09-13 14:19:24 +0800482 request = RIL_REQUEST_VOICE_REGISTRATION_STATE;
rjw7e50cd32022-01-18 18:30:37 +0800483 }else if(!strcmp(str,"DATA")){
q.huangd3804bd2022-10-20 14:36:14 +0800484 if(get_state_from_buf(NETWORK_STATE_BUFFER_TYPE_DATA_REG,2,regState,netType,2,LAC,CID)==0)
q.huang47d4dfe2022-08-17 17:52:29 +0800485 {
q.huangd3804bd2022-10-20 14:36:14 +0800486 return RESULT_OK;
q.huang47d4dfe2022-08-17 17:52:29 +0800487 }
q.huang7de1d662022-09-13 14:19:24 +0800488 request = RIL_REQUEST_DATA_REGISTRATION_STATE;
rjw7e50cd32022-01-18 18:30:37 +0800489 }else if(!strcmp(str,"IMS")){
q.huangd3804bd2022-10-20 14:36:14 +0800490 if(get_state_from_buf(NETWORK_STATE_BUFFER_TYPE_IMS_REG,2,imsRegState,radioTechFam,0)==0)
q.huang47d4dfe2022-08-17 17:52:29 +0800491 {
q.huangd3804bd2022-10-20 14:36:14 +0800492 return RESULT_OK;
q.huang47d4dfe2022-08-17 17:52:29 +0800493 }
q.huang7de1d662022-09-13 14:19:24 +0800494 request = RIL_REQUEST_IMS_REGISTRATION_STATE;
rjw7e50cd32022-01-18 18:30:37 +0800495 }else{
496 LYERRLOG("request error");
q.huang52921662022-10-20 15:25:45 +0800497 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800498 }
rjw7e50cd32022-01-18 18:30:37 +0800499
q.huang52921662022-10-20 15:25:45 +0800500 Parcel* p=NULL;
501 int ret=lynq_send_common_request(p,g_wait_time,request,0,"");
502
503 if(ret!=RESULT_OK)
rjw7e50cd32022-01-18 18:30:37 +0800504 {
q.huang52921662022-10-20 15:25:45 +0800505 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
506 return ret;
507 }
508
509 int num,i;
510 char *resp[LYNQ_RESP_STRING_MAX_NUM];
511 if(!strcmp(str,"VOICE"))
512 {
513 p->readInt32(&num);
514 if(num == 15)
rjw7e50cd32022-01-18 18:30:37 +0800515 {
q.huang693ff3b2022-10-20 15:25:45 +0800516 for(i=0;i<15;i++)
q.huang52921662022-10-20 15:25:45 +0800517 {
518 resp[i]=lynqStrdupReadString(p);
519 }
q.huang693ff3b2022-10-20 15:25:45 +0800520 *regState = atoi(resp[0]);
521 *netType = atoi(resp[3]);
522 *netRejected = atoi(resp[14]);
523 for(i=0;i<15;i++)
q.huang52921662022-10-20 15:25:45 +0800524 {
525 if(resp[i]!=NULL)
526 {
527 free(resp[i]);
528 }
529 }
530 set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_VOICE_REG,3,*regState,*netType,*netRejected,0);
rjw7e50cd32022-01-18 18:30:37 +0800531 }
q.huang52921662022-10-20 15:25:45 +0800532 else
q.huang7de1d662022-09-13 14:19:24 +0800533 {
q.huang52921662022-10-20 15:25:45 +0800534 LYERRLOG("%s type %s num %d error",__func__,str,num);
q.huang7de1d662022-09-13 14:19:24 +0800535 delete p;
q.huang52921662022-10-20 15:25:45 +0800536 return LYNQ_E_INNER_ERROR;
537 }
rjw7e50cd32022-01-18 18:30:37 +0800538 }
q.huang52921662022-10-20 15:25:45 +0800539 else if(!strcmp(str,"DATA")){
540 p->readInt32(&num);
541 if(num == 11)
542 {
543 for(i=0;i<4;i++)
544 {
q.huang693ff3b2022-10-20 15:25:45 +0800545 resp[i]=lynqStrdupReadString(p);
546 }
547 *regState = atoi(resp[0]);
548 strcpy(LAC,resp[1]);
549 strcpy(CID,resp[2]);
550 *netType = atoi(resp[3]);
551 for(i=0;i<4;i++)
q.huang52921662022-10-20 15:25:45 +0800552 {
553 if(resp[i]!=NULL)
554 {
555 free(resp[i]);
556 }
557 }
558 set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_DATA_REG,2,*regState,*netType,2,LAC,CID);
559 }
560 else
561 {
562 LYERRLOG("%s type %s num %d error",__func__,str,num);
563 delete p;
564 return LYNQ_E_INNER_ERROR;
565 }
q.huang7de1d662022-09-13 14:19:24 +0800566
q.huang52921662022-10-20 15:25:45 +0800567 }
568 else // "IMS"
569 {
570 p->readInt32(&num);
571 if(num == 2)
572 {
573 p->readInt32(imsRegState);
574 p->readInt32(radioTechFam);
575 set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_IMS_REG,2,*imsRegState,*radioTechFam,0);
576 }
577 else
578 {
579 LYERRLOG("%s type %s num %d error",__func__,str,num);
580 delete p;
581 return LYNQ_E_INNER_ERROR;
582 }
583 }
584 LYINFLOG("%s suc",__func__);
585 delete p;
586 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800587}
588
589int lynq_query_prefferred_networktype(int *preNetType)
q.huang7de1d662022-09-13 14:19:24 +0800590{
q.huang52921662022-10-20 15:25:45 +0800591 if(g_module_init_flag != MODULE_RUNNING)
592 {
593 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
594 return LYNQ_E_CONFLICT;
595 }
q.huang7de1d662022-09-13 14:19:24 +0800596 if(NULL == preNetType)
rjw7e50cd32022-01-18 18:30:37 +0800597 {
q.huang7de1d662022-09-13 14:19:24 +0800598 LYERRLOG("%s there is parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800599 return LYNQ_E_PARAMETER_ANONALY;
600 }
rjw7e50cd32022-01-18 18:30:37 +0800601
q.huang52921662022-10-20 15:25:45 +0800602 Parcel* p=NULL;
603 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE,0,"");
604
605 if(ret!=RESULT_OK)
606 {
607 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
608 return ret;
609 }
610
611 int num;
612 p->readInt32(&num);
613 p->readInt32(preNetType);
614
615 LYINFLOG("%s suc",__func__);
616 delete p;
617 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800618}
619
620int lynq_set_prefferred_networktype(const int preffertype)
621{
q.huang52921662022-10-20 15:25:45 +0800622 if(g_module_init_flag != MODULE_RUNNING)
623 {
624 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
625 return LYNQ_E_CONFLICT;
626 }
rjw7e50cd32022-01-18 18:30:37 +0800627 if(preffertype < 0||preffertype >33)
rjw7e50cd32022-01-18 18:30:37 +0800628 {
q.huang7de1d662022-09-13 14:19:24 +0800629 LYERRLOG("%s parameter %d error",__func__,preffertype);
q.huang52921662022-10-20 15:25:45 +0800630 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800631 }
q.huang52921662022-10-20 15:25:45 +0800632
q.huang7de1d662022-09-13 14:19:24 +0800633 Parcel* p=NULL;
q.huang0bbd0262023-04-28 15:54:40 +0800634 int ret=lynq_send_common_request(p,WAIT_TIME_LENGTH_FOR_SET_PREFFERRED_NETWORK_TYPE,RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE,1,"%d",preffertype);
q.huang52921662022-10-20 15:25:45 +0800635
636 if(ret!=RESULT_OK)
rjw7e50cd32022-01-18 18:30:37 +0800637 {
q.huang52921662022-10-20 15:25:45 +0800638 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
639 return ret;
640 }
641
642 LYINFLOG("%s set %d suc",__func__,preffertype);
643 delete p;
644 return RESULT_OK;
645
rjw7e50cd32022-01-18 18:30:37 +0800646}
647
rjw62a60152022-06-09 17:43:01 +0800648int 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 +0800649{
q.huang52921662022-10-20 15:25:45 +0800650 if(g_module_init_flag != MODULE_RUNNING)
651 {
652 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
653 return LYNQ_E_CONFLICT;
654 }
rjw7e50cd32022-01-18 18:30:37 +0800655 if(NULL == realNum)
rjw7e50cd32022-01-18 18:30:37 +0800656 {
q.huang7de1d662022-09-13 14:19:24 +0800657 LYERRLOG("%s there is parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800658 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800659 }
660
q.huang52921662022-10-20 15:25:45 +0800661 Parcel* p=NULL;
662 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_GET_CELL_INFO_LIST,0,"");
663
664 if(ret!=RESULT_OK)
rjw46769c92022-07-04 21:17:25 +0800665 {
q.huang52921662022-10-20 15:25:45 +0800666 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
667 return ret;
668 }
669
670 int num;
q.huang7de1d662022-09-13 14:19:24 +0800671
q.huang52921662022-10-20 15:25:45 +0800672 p->readInt32(&num);
673 LYINFLOG("cell info num:%d",num);
674 *realNum = num;
675 for(int i = 0;i<num;i++)
676 {
677 copyCellInfoList(p,&cellinfo[i],&tac[i],&earfcn[i]);
rjw7e50cd32022-01-18 18:30:37 +0800678 }
q.huang52921662022-10-20 15:25:45 +0800679
680 LYINFLOG("%s suc",__func__);
681 delete p;
682 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800683}
684
685int lynq_set_unsol_cell_info_listrate(const int rate)
686{
q.huang52921662022-10-20 15:25:45 +0800687 if(g_module_init_flag != MODULE_RUNNING)
rjw7e50cd32022-01-18 18:30:37 +0800688 {
q.huang52921662022-10-20 15:25:45 +0800689 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
690 return LYNQ_E_CONFLICT;
rjw7e50cd32022-01-18 18:30:37 +0800691 }
q.huang52921662022-10-20 15:25:45 +0800692 Parcel* p=NULL;
693 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE,1,"%d",rate);
rjw7e50cd32022-01-18 18:30:37 +0800694
q.huang52921662022-10-20 15:25:45 +0800695 if(ret!=RESULT_OK)
696 {
697 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
698 return ret;
699 }
700
701 LYINFLOG("%s set %d suc",__func__,rate);
702 delete p;
703 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800704}
705
706int lynq_set_band_mode(const int bandmode)
707{
q.huang52921662022-10-20 15:25:45 +0800708 if(g_module_init_flag != MODULE_RUNNING)
rjw7e50cd32022-01-18 18:30:37 +0800709 {
q.huang52921662022-10-20 15:25:45 +0800710 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
711 return LYNQ_E_CONFLICT;
rjw7e50cd32022-01-18 18:30:37 +0800712 }
q.huang52921662022-10-20 15:25:45 +0800713 Parcel* p=NULL;
714 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SET_BAND_MODE,1,"%d",bandmode);
rjw7e50cd32022-01-18 18:30:37 +0800715
q.huang52921662022-10-20 15:25:45 +0800716 if(ret!=RESULT_OK)
717 {
718 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
719 return ret;
720 }
721
722 LYINFLOG("%s set %d suc",__func__,bandmode);
723 delete p;
724 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800725}
726
727int lynq_query_available_bandmode(int availBanMode[])
728{
q.huang52921662022-10-20 15:25:45 +0800729 if(g_module_init_flag != MODULE_RUNNING)
730 {
731 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
732 return LYNQ_E_CONFLICT;
733 }
rjw7e50cd32022-01-18 18:30:37 +0800734 if(NULL == availBanMode)
rjw7e50cd32022-01-18 18:30:37 +0800735 {
q.huang7de1d662022-09-13 14:19:24 +0800736 LYERRLOG("%s parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800737 return LYNQ_E_PARAMETER_ANONALY;
rjw7e50cd32022-01-18 18:30:37 +0800738 }
739
q.huang7de1d662022-09-13 14:19:24 +0800740 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +0800741 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE,0,"");
742 if(ret!=RESULT_OK)
rjw7e50cd32022-01-18 18:30:37 +0800743 {
q.huang52921662022-10-20 15:25:45 +0800744 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
745 return ret;
746 }
q.huang7de1d662022-09-13 14:19:24 +0800747
q.huang52921662022-10-20 15:25:45 +0800748 int num = 0;
749 int res = 0;
750 int i;
751
752 p->readInt32(&num);
753 LYINFLOG("num = %d",num);
754 availBanMode[0] = num;
755 for(i=1 ;i<=num;i++)
756 {
757 p->readInt32(&res);
758 availBanMode[i]=res;
759 }
760
761 LYINFLOG("%s suc",__func__);
762 delete p;
763 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800764}
765
q.huang36833592023-04-04 16:46:26 +0800766int lynq_radio_on(const lynq_network_radio_on_type type)
q.huang52921662022-10-20 15:25:45 +0800767{
768 if(g_module_init_flag != MODULE_RUNNING)
769 {
770 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
771 return LYNQ_E_CONFLICT;
772 }
q.huang36833592023-04-04 16:46:26 +0800773 if (type != NETWORK_RADIO_ON_TYPE_CFUN_0 && type != NETWORK_RADIO_ON_TYPE_NORMAL_MODE && type!=NETWORK_RADIO_ON_TYPE_FLIGHT_MODE)
rjw7e50cd32022-01-18 18:30:37 +0800774 {
q.huang36833592023-04-04 16:46:26 +0800775 LYERRLOG("%s parameter %d error",__func__,type);
q.huang52921662022-10-20 15:25:45 +0800776 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800777 }
778
q.huang52921662022-10-20 15:25:45 +0800779 Parcel* p=NULL;
q.huang36833592023-04-04 16:46:26 +0800780 int ret;
781
782 if(type==NETWORK_RADIO_ON_TYPE_CFUN_0)
783 {
784 ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"%s","AT+CFUN=0");
785 }
786 else
787 {
788 ret=lynq_send_common_request(p,65,RIL_REQUEST_RADIO_POWER,1,"%d",(type==NETWORK_RADIO_ON_TYPE_NORMAL_MODE));
789 }
rjw7e50cd32022-01-18 18:30:37 +0800790
q.huang52921662022-10-20 15:25:45 +0800791 if(ret!=RESULT_OK)
792 {
793 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
794 return ret;
795 }
796
q.huang36833592023-04-04 16:46:26 +0800797 LYINFLOG("%s set %d suc",__func__,type);
q.huang52921662022-10-20 15:25:45 +0800798 delete p;
799 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800800}
801
q.huang7de1d662022-09-13 14:19:24 +0800802const char * lynq_get_raw_data(Parcel* &p, int* data_len)
q.huang16dcb0f2022-09-07 09:17:37 +0800803{
rjw776c85f2022-10-21 15:09:21 +0800804 int32_t len;
q.huang16dcb0f2022-09-07 09:17:37 +0800805 int status;
806 char *data;
807
808 *data_len=0;
rjw776c85f2022-10-21 15:09:21 +0800809
q.huang7de1d662022-09-13 14:19:24 +0800810 status = p->readInt32(&len);
rjw776c85f2022-10-21 15:09:21 +0800811
q.huang16dcb0f2022-09-07 09:17:37 +0800812 if (status != 0) {
813 LYERRLOG("%s status is %d",__func__,status);
814 return NULL;
rjw776c85f2022-10-21 15:09:21 +0800815 }
816
817 // The java code writes -1 for null arrays
q.huang16dcb0f2022-09-07 09:17:37 +0800818 if (((int)len) == -1 || ((int)len) == 0)
819 {
820 LYERRLOG("%s len is %d",__func__,len);
821 return NULL;
822 }
823 LYINFLOG("%s len is %d",__func__,len);
rjw776c85f2022-10-21 15:09:21 +0800824
q.huang7de1d662022-09-13 14:19:24 +0800825 data = (char*) p->readInplace(len);
q.huang16dcb0f2022-09-07 09:17:37 +0800826 *data_len=len;
rjw776c85f2022-10-21 15:09:21 +0800827
q.huang16dcb0f2022-09-07 09:17:37 +0800828 return data;
829}
830
831int lynq_query_radio_state(int *radio_state)
832{
q.huang52921662022-10-20 15:25:45 +0800833 if(g_module_init_flag != MODULE_RUNNING)
834 {
835 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
836 return LYNQ_E_CONFLICT;
837 }
q.huang16dcb0f2022-09-07 09:17:37 +0800838 if(NULL == radio_state)
839 {
840 LYERRLOG("%s radio state is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800841 return LYNQ_E_PARAMETER_ANONALY;
q.huang16dcb0f2022-09-07 09:17:37 +0800842 }
843
q.huang7de1d662022-09-13 14:19:24 +0800844 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +0800845 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"%s","AT+CFUN");
846 if(ret!=RESULT_OK)
q.huang16dcb0f2022-09-07 09:17:37 +0800847 {
q.huang52921662022-10-20 15:25:45 +0800848 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
849 return ret;
850 }
q.huang7de1d662022-09-13 14:19:24 +0800851
q.huang52921662022-10-20 15:25:45 +0800852 int bfind=false;
853 const char* data;
854 int data_len;
855 char* data_str;
856 char* start;
857 int length;
858 int i;
859 int num_start;
860 data = lynq_get_raw_data(p,&data_len);
861 if(data==NULL || data_len == 0)
862 {
863 LYERRLOG("%s lynq_get_raw_data NULL or data_len is 0",__func__);
q.huang7de1d662022-09-13 14:19:24 +0800864 delete p;
q.huang52921662022-10-20 15:25:45 +0800865 return LYNQ_E_INNER_ERROR;
q.huang16dcb0f2022-09-07 09:17:37 +0800866 }
q.huang52921662022-10-20 15:25:45 +0800867 data_str = (char*) calloc(1,data_len+1);
868 if (NULL == data_str)
869 {
870 LYERRLOG("%s alloc mem error, data_len is %d",__func__,data_len+1);
871 delete p;
872 return LYNQ_E_MALLOC_ERROR;
873 }
874 memmove(data_str, data, data_len);
875 data_str[data_len]='\0';
876 LYINFLOG("%s return string is %s",__func__,data_str);
877 start = strstr(data_str,"CFUN");
878 if(start!=NULL)
879 {
880 start=start+4;
881 length=strlen(start);
882 for(i=0; i<length;i++)
883 {
884 if((!bfind) && (start[i] >= '0') && (start[i] <= '9'))
885 {
886 bfind=true;
887 num_start=i;
888 }
889 else if(bfind && ((start[i] < '0') || (start[i] > '9')))
890 {
891 start[i]='\0';
892 break;
893 }
894 }
895 if(bfind)
896 {
897 (*radio_state) = atoi(start+num_start);
898 LYINFLOG("%s, radio state is %s %d",__func__,start+num_start,*radio_state);
899 free(data_str);
900 delete p;
901 return RESULT_OK;
902 }
903 }
904 LYERRLOG("%s return string %s no cfun or no digit",__func__,data_str);
905 free(data_str);
906 delete p;
907 return LYNQ_E_INNER_ERROR;
q.huang16dcb0f2022-09-07 09:17:37 +0800908}
909
rjw7e50cd32022-01-18 18:30:37 +0800910int lynq_query_radio_tech(int* radioTech)
911{
q.huang52921662022-10-20 15:25:45 +0800912 if(g_module_init_flag != MODULE_RUNNING)
913 {
914 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
915 return LYNQ_E_CONFLICT;
916 }
rjw7e50cd32022-01-18 18:30:37 +0800917 if(NULL == radioTech)
rjw7e50cd32022-01-18 18:30:37 +0800918 {
q.huang7de1d662022-09-13 14:19:24 +0800919 LYERRLOG("%s radio tech is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800920 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800921 }
rjw7e50cd32022-01-18 18:30:37 +0800922
q.huang7de1d662022-09-13 14:19:24 +0800923 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +0800924 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_VOICE_RADIO_TECH,0,"");
925
926 if(ret!=RESULT_OK)
rjw46769c92022-07-04 21:17:25 +0800927 {
q.huang52921662022-10-20 15:25:45 +0800928 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
929 return ret;
930 }
q.huang7de1d662022-09-13 14:19:24 +0800931
q.huang52921662022-10-20 15:25:45 +0800932 int num;
933 p->readInt32(&num);
934 p->readInt32(radioTech);
q.huang7de1d662022-09-13 14:19:24 +0800935
q.huang52921662022-10-20 15:25:45 +0800936 LYINFLOG("%s suc",__func__);
937 delete p;
938 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800939}
940
941int lynq_solicited_signal_strength(signalStrength_t *solSigStren)
942{
q.huang52921662022-10-20 15:25:45 +0800943 if(g_module_init_flag != MODULE_RUNNING)
944 {
945 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
946 return LYNQ_E_CONFLICT;
947 }
rjw7e50cd32022-01-18 18:30:37 +0800948 if(NULL == solSigStren)
rjw7e50cd32022-01-18 18:30:37 +0800949 {
q.huang7de1d662022-09-13 14:19:24 +0800950 LYERRLOG("%s parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800951 return LYNQ_E_PARAMETER_ANONALY;
rjw7e50cd32022-01-18 18:30:37 +0800952 }
953
q.huang7de1d662022-09-13 14:19:24 +0800954 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +0800955 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SIGNAL_STRENGTH,0,"");
956 if(ret!=RESULT_OK)
rjw46769c92022-07-04 21:17:25 +0800957 {
q.huang52921662022-10-20 15:25:45 +0800958 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
959 return ret;
960 }
961
962 int sum = 0;
963 int LTE_signalstrength = 0;
964 int WCDMA_signalstrength = 0;
965 int none = 0;
rjw7e50cd32022-01-18 18:30:37 +0800966
q.huang52921662022-10-20 15:25:45 +0800967 p->readInt32(&solSigStren->rssi);
968 if((solSigStren->rssi!=99)&&(solSigStren->rssi!=0))
969 {
970 solSigStren->gw_sig_valid = 1;
971 }else{
972 solSigStren->gw_sig_valid = 0;
rjw7e50cd32022-01-18 18:30:37 +0800973 }
q.huang7de1d662022-09-13 14:19:24 +0800974
q.huang52921662022-10-20 15:25:45 +0800975 p->readInt32(&none);
976 p->readInt32(&none);
977 p->readInt32(&none);
978 p->readInt32(&none);
979 p->readInt32(&none);
980 p->readInt32(&none);
981 p->readInt32(&none);
982 p->readInt32(&LTE_signalstrength);
983 // p->readInt32(&solSigStren->signalStrength.LTE_SignalStrength.signalStrength);
984 p->readInt32(&solSigStren->rsrp);
985 p->readInt32(&solSigStren->rsrq);
986 p->readInt32(&solSigStren->rssnr);
987 LYINFLOG("LTE_signalstrength:%d",LTE_signalstrength);
988 if((LTE_signalstrength!=99)&&(LTE_signalstrength!=0))
989 {
990 solSigStren->lte_sig_valid = 1;
991 }else{
992 solSigStren->lte_sig_valid = 0;
993 }
q.huang7de1d662022-09-13 14:19:24 +0800994
q.huang52921662022-10-20 15:25:45 +0800995 p->readInt32(&none);
996 p->readInt32(&none);
997 p->readInt32(&none);
998 p->readInt32(&none);
999 p->readInt32(&none);
1000 p->readInt32(&WCDMA_signalstrength);
1001 p->readInt32(&none);
1002 p->readInt32(&solSigStren->rscp);
1003 p->readInt32(&solSigStren->ecno);
1004 LYINFLOG("WCDMA_signalstrength:%d",WCDMA_signalstrength);
1005 if((WCDMA_signalstrength!=99)&&(WCDMA_signalstrength!=0))
1006 {
1007 solSigStren->wcdma_sig_valid = 1;
1008 }else{
1009 solSigStren->wcdma_sig_valid = 0;
1010 }
1011 /*bug fix*/
1012 p->readInt32(&solSigStren->ssRsrp);
1013 p->readInt32(&solSigStren->ssRsrq);
1014 p->readInt32(&solSigStren->ssSinr);
1015 p->readInt32(&solSigStren->csiRsrp);
1016 p->readInt32(&solSigStren->csiRsrq);
1017 p->readInt32(&solSigStren->csiSinr);
1018 sum = (solSigStren->ssRsrp) + (solSigStren->ssRsrq) + (solSigStren->ssSinr) + (solSigStren->csiRsrp)+\
1019 (solSigStren->csiRsrq) + (solSigStren->csiSinr);
1020 if(sum != 0)
1021 {
1022 solSigStren->nr_sig_valid = 1;
1023 }else{
1024 LYERRLOG("None of NR signal info");
1025 }
1026
1027 LYINFLOG("%s suc",__func__);
1028 delete p;
1029 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +08001030}
rjwbc8a05f2022-03-02 15:23:11 +08001031
rjw4a5a78d2022-03-10 11:04:24 +08001032int lynq_set_ims(const int ims_mode)
1033{
q.huang52921662022-10-20 15:25:45 +08001034 if(g_module_init_flag != MODULE_RUNNING)
q.huang7de1d662022-09-13 14:19:24 +08001035 {
q.huang52921662022-10-20 15:25:45 +08001036 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1037 return LYNQ_E_CONFLICT;
q.huang7de1d662022-09-13 14:19:24 +08001038 }
rjw4a5a78d2022-03-10 11:04:24 +08001039 if (ims_mode < 0 || ims_mode > 1)
1040 {
q.huang7de1d662022-09-13 14:19:24 +08001041 LYERRLOG("%s parameter %d error",__func__,ims_mode);
q.huang52921662022-10-20 15:25:45 +08001042 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +08001043 }
rjw4a5a78d2022-03-10 11:04:24 +08001044
q.huang52921662022-10-20 15:25:45 +08001045 Parcel* p=NULL;
1046 int ret = lynq_send_common_request(p,65,RIL_REQUEST_SET_IMS_ENABLE,1,"%d",ims_mode);
1047 if(ret!=RESULT_OK)
1048 {
1049 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
1050 return ret;
1051 }
1052
1053 LYINFLOG("%s set %d suc",__func__,ims_mode);
1054 delete p;
1055 return RESULT_OK;
rjw4a5a78d2022-03-10 11:04:24 +08001056}
1057
q.huang52921662022-10-20 15:25:45 +08001058/*Used to get urc info*/
1059int lynq_get_urc_info(const int handle,signalStrength_t *solSigStren,int *slot_id)
1060{
1061 if(g_module_init_flag != MODULE_RUNNING)
1062 {
1063 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1064 return LYNQ_E_CONFLICT;
1065 }
1066 LYDBGLOG("start get urc info");
1067 if(handle != RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED &&handle != RIL_UNSOL_SIGNAL_STRENGTH)
1068 {
1069 LYINFLOG("invalid handle!!!");
1070 return LYNQ_E_PARAMETER_ANONALY;
1071 }
1072 if((handle ==RIL_UNSOL_SIGNAL_STRENGTH && NULL == solSigStren) ||
1073 (handle ==RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED && NULL == slot_id))
1074 {
1075 LYINFLOG("incoming solSigStren or slot_id is NULL!!!");
1076 return LYNQ_E_PARAMETER_ANONALY;
1077 }
1078 switch(handle)
1079 {
1080 case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: //1002
1081 {
1082 LYDBGLOG("get state update to VOICE");
1083 *slot_id = s_module_urc_slot_id;
1084 LYINFLOG("slot_id = %d",s_module_urc_slot_id);
1085 break;
1086 }
1087 case RIL_UNSOL_SIGNAL_STRENGTH: //1009
1088 {
1089 LYDBGLOG("get state update to signal info");
1090 solSigStren->gw_sig_valid = s_network_urc_solSigStren.gw_sig_valid;
1091 solSigStren->rssi = s_network_urc_solSigStren.rssi;
1092 solSigStren->wcdma_sig_valid = s_network_urc_solSigStren.wcdma_sig_valid;
1093 solSigStren->rscp = s_network_urc_solSigStren.rscp;
1094 solSigStren->ecno = s_network_urc_solSigStren.ecno;
1095 solSigStren->lte_sig_valid = s_network_urc_solSigStren.lte_sig_valid;
1096 solSigStren->rsrp = s_network_urc_solSigStren.rsrp;
1097 solSigStren->rsrq = s_network_urc_solSigStren.rsrq;
1098 solSigStren->rssnr = s_network_urc_solSigStren.rssnr;
1099 solSigStren->nr_sig_valid = s_network_urc_solSigStren.nr_sig_valid;
1100 solSigStren->ssRsrp = s_network_urc_solSigStren.ssRsrp;
1101 solSigStren->ssRsrq = s_network_urc_solSigStren.ssRsrq;
1102 solSigStren->ssSinr = s_network_urc_solSigStren.ssSinr;
1103 solSigStren->csiRsrp = s_network_urc_solSigStren.csiRsrp;
1104 solSigStren->csiRsrq = s_network_urc_solSigStren.csiRsrq;
1105 solSigStren->csiSinr = s_network_urc_solSigStren.csiSinr;
1106 break;
1107 }
1108 }
1109 return RESULT_OK;
1110}
1111
1112static pthread_mutex_t urc_signal_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
1113static pthread_cond_t urc_signal_state_change_cond = PTHREAD_COND_INITIALIZER;
1114
1115int wait_urc_signal_changes()
1116{
1117 pthread_mutex_lock(&urc_signal_state_change_mutex);
1118 pthread_cond_wait(&urc_signal_state_change_cond,&urc_signal_state_change_mutex);
1119 pthread_mutex_unlock(&urc_signal_state_change_mutex);
1120 return RESULT_OK;
1121}
1122
1123void send_urc_signal_changes()
1124{
1125 pthread_mutex_lock(&urc_signal_state_change_mutex);
1126 pthread_cond_signal(&urc_signal_state_change_cond);
1127 pthread_mutex_unlock(&urc_signal_state_change_mutex);
1128 return;
1129}
1130
q.huang036b6cf2023-01-10 14:29:20 +08001131bool is_support_urc(int urc_id)
1132{
1133 switch(urc_id)
1134 {
1135 case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED:
1136 case RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED:
1137 case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED:
1138 case RIL_UNSOL_SIGNAL_STRENGTH:
1139 return true;
1140 default:
1141 return false;
1142 }
1143}
1144
q.huang52921662022-10-20 15:25:45 +08001145void urc_msg_process(Parcel *p)
1146{
1147 int resp_type;
1148 int none = 0;
1149 int NR_sum = 0;
1150 int urc_LTE_signalstrength = 0;
1151 int urc_WCDMA_signalstrength = 0;
1152
q.huang036b6cf2023-01-10 14:29:20 +08001153 int size=p->dataSize();
q.huang52921662022-10-20 15:25:45 +08001154 p->readInt32(&resp_type);
1155 p->readInt32(&s_module_wait_urc_id);
1156 p->readInt32(&s_module_urc_slot_id);
q.huang036b6cf2023-01-10 14:29:20 +08001157 LYINFLOG("%s urc id = %d, slot_id = %d, size is %d, msg is %s",__func__, s_module_wait_urc_id,s_module_urc_slot_id,size,requestToString(s_module_wait_urc_id));
q.huang52921662022-10-20 15:25:45 +08001158 switch(s_module_wait_urc_id)
1159 {
1160 case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED:
1161 {
1162 set_state_buffer_valid(NETWORK_STATE_BUFFER_TYPE_VOICE_REG,false);
1163 send_urc_signal_changes();
1164 break;
1165 }
1166 case RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED:
1167 {
1168 set_state_buffer_valid(NETWORK_STATE_BUFFER_TYPE_DATA_REG,false);
1169 send_urc_signal_changes();
1170 break;
1171 }
1172 case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED:
1173 {
1174 set_state_buffer_valid(NETWORK_STATE_BUFFER_TYPE_IMS_REG,false);
1175 send_urc_signal_changes();
1176 break;
1177 }
1178 case RIL_UNSOL_SIGNAL_STRENGTH:
1179 {
1180 p->readInt32(&s_network_urc_solSigStren.rssi);
1181 if((s_network_urc_solSigStren.rssi!=99)&&(s_network_urc_solSigStren.rssi!=0))
1182 {
1183 s_network_urc_solSigStren.gw_sig_valid = 1;
1184 }else{
1185 s_network_urc_solSigStren.gw_sig_valid = 0;
1186 }
1187 if(s_network_urc_solSigStren.gw_sig_valid == 1)
1188 {
1189 LYINFLOG("urc_GSM_signalstrength:%d",s_network_urc_solSigStren.rssi);
1190 }
1191 p->readInt32(&none);
1192 p->readInt32(&none);
1193 p->readInt32(&none);
1194 p->readInt32(&none);
1195 p->readInt32(&none);
1196 p->readInt32(&none);
1197 p->readInt32(&none);
1198 p->readInt32(&urc_LTE_signalstrength);
1199 // p.readInt32(&solSigStren->signalStrength.LTE_SignalStrength.signalStrength);
1200 p->readInt32(&s_network_urc_solSigStren.rsrp);
1201 p->readInt32(&s_network_urc_solSigStren.rsrq);
1202 p->readInt32(&s_network_urc_solSigStren.rssnr);
1203 if((urc_LTE_signalstrength!=99)&&(urc_LTE_signalstrength!=0))
1204 {
1205 s_network_urc_solSigStren.lte_sig_valid = 1;
1206 }else{
1207 s_network_urc_solSigStren.lte_sig_valid = 0;
1208 }
1209 if(s_network_urc_solSigStren.lte_sig_valid == 1)
1210 {
1211 LYINFLOG("urc_LTE_signalstrength:%d",urc_LTE_signalstrength);
1212 }
1213 p->readInt32(&none);
1214 p->readInt32(&none);
1215 p->readInt32(&none);
1216 p->readInt32(&none);
1217 p->readInt32(&none);
1218 p->readInt32(&urc_WCDMA_signalstrength);
1219 p->readInt32(&none);
1220 p->readInt32(&s_network_urc_solSigStren.rscp);
1221 p->readInt32(&s_network_urc_solSigStren.ecno);
1222 if((urc_WCDMA_signalstrength!=99)&&(urc_WCDMA_signalstrength!=0))
1223 {
1224 s_network_urc_solSigStren.wcdma_sig_valid = 1;
1225 }else{
1226 s_network_urc_solSigStren.wcdma_sig_valid = 0;
1227 }
1228 if(s_network_urc_solSigStren.wcdma_sig_valid == 1)
1229 {
1230 LYINFLOG("urc_WCDMA_signalstrength:%d",urc_WCDMA_signalstrength);
1231 }
1232 p->readInt32(&s_network_urc_solSigStren.ssRsrp);
1233 p->readInt32(&s_network_urc_solSigStren.ssRsrq);
1234 p->readInt32(&s_network_urc_solSigStren.ssSinr);
1235 p->readInt32(&s_network_urc_solSigStren.csiRsrp);
1236 p->readInt32(&s_network_urc_solSigStren.csiRsrq);
1237 p->readInt32(&s_network_urc_solSigStren.csiSinr);
1238 NR_sum = (s_network_urc_solSigStren.ssRsrp) + (s_network_urc_solSigStren.ssRsrq) + (s_network_urc_solSigStren.ssSinr) + (s_network_urc_solSigStren.csiRsrp)+\
1239 (s_network_urc_solSigStren.csiRsrq) + (s_network_urc_solSigStren.csiSinr);
1240 if(NR_sum != 0)
1241 {
1242 s_network_urc_solSigStren.nr_sig_valid = 1;
1243 }else{
1244 s_network_urc_solSigStren.nr_sig_valid = 0;
1245 }
1246 if(s_network_urc_solSigStren.nr_sig_valid == 1)
1247 {
1248 LYINFLOG("[NR signal]ssRsrp is %d , ssRsrq is %d , ssSinr is %d , csiRsrp is %d , csiRsrq is %d , csiSinr is %d",\
1249 s_network_urc_solSigStren.ssRsrp,s_network_urc_solSigStren.ssRsrq,s_network_urc_solSigStren.ssSinr, \
1250 s_network_urc_solSigStren.csiRsrp,s_network_urc_solSigStren.csiRsrq,s_network_urc_solSigStren.csiSinr);
1251 }
1252 send_urc_signal_changes();
1253 break;
1254 }
1255 }
1256}
rjw4a5a78d2022-03-10 11:04:24 +08001257
rjwbc8a05f2022-03-02 15:23:11 +08001258/*Used to wait for an update signal*/
1259int lynq_wait_signalchanges(int *handle)
1260{
1261 LYDBGLOG("start wait signalchanges info");
1262 if(NULL == handle)
1263 {
1264 LYERRLOG("illegal input");
q.huang52921662022-10-20 15:25:45 +08001265 return LYNQ_E_PARAMETER_ANONALY;
rjwbc8a05f2022-03-02 15:23:11 +08001266 }
q.huang52921662022-10-20 15:25:45 +08001267 wait_urc_signal_changes();
rjwbc8a05f2022-03-02 15:23:11 +08001268 LYDBGLOG("get signalchanges");
q.huang52921662022-10-20 15:25:45 +08001269 *handle = s_module_wait_urc_id;
1270 return RESULT_OK;
rjw4200a082022-05-17 17:58:35 +08001271}
lh3a26dd52022-07-01 04:44:57 -07001272
q.huang52921662022-10-20 15:25:45 +08001273#ifdef MODEM_GEN97
lh3a26dd52022-07-01 04:44:57 -07001274/**@brief parse at response,return error code,and the response
1275* @param response [IN] <response>:original at response,This parameter must be a character array.
1276
1277* @param value [OUT] <value>: Used to receive the parsed value, if multiple values are separated by ";".
1278* field:
1279* eg:
1280* "+cnum: 123456\n+cnum: 456"
1281* value:12345;456;
1282* @param value_len [IN] <value_len>: The value length.
1283
1284* @return:AT error code
1285*/
1286static int parse_at_result(char response[],char value[],int value_len)
1287{
1288 if(response == NULL || value == NULL)
1289 {
1290 LYERRLOG("parameter invalid");
q.huang52921662022-10-20 15:25:45 +08001291 return LYNQ_E_PARAMETER_ANONALY;
lh3a26dd52022-07-01 04:44:57 -07001292 }
1293 if(strstr(response,"ERROR"))
1294 {
1295 int i;
1296 for(i = 0;i < strlen(response);i++)
1297 {
1298 if(response[i]==':')
1299 {
1300 break;
1301 }
1302 }
1303 if(i < strlen(response))
1304 {
1305 LYINFLOG("parse_result:%d\n",atoi(response+i+1));
1306 return atoi(response+i+1);
1307 }
1308 else
1309 {
1310 LYINFLOG("%s parse_result:fail,this response invalid\n",response);
1311 return 100; //unknown
1312 }
1313 }
1314 else if(strstr(response,"OK"))
1315 {
1316 /** parse the at response value
1317 * eg:
1318 * --> at+cnum
1319 * <-- +CNUM:"1243452"
1320 * need parse the "1243452" to <value>
1321 *@ To-Do
1322 */
1323 int count;
1324 int resp_addr[32] = {0};
1325 char temp_buf[1024] = {0};
1326 char *dest;
1327 dest = NULL;
1328 count = 0;
1329 int res_len = strlen(response);
1330 LYINFLOG("res_len:%d",res_len);
1331 for(int i = 0; i < res_len; i++)
1332 {
1333 if(response[i]==':')
1334 {
1335 resp_addr[count] = i;
1336 count++;
1337 }
1338 if(response[i] == '\n')
1339 {
1340 response[i] = '\0';
1341 }
1342 }
1343 LYINFLOG("count:%d",count);
1344 if(count > 0)
1345 {
1346 for(int i = 0; i < count; i++)
1347 {
1348 if((strlen(temp_buf) + strlen(response+resp_addr[i]+2)) >= 1023)
1349 {
1350 LYINFLOG("2 will be out of range\n");
1351 break;
1352 }
1353 if(strlen(temp_buf) >= 1023)
1354 {
1355 LYINFLOG("1 will be out of range\n");
1356 break;
1357 }
1358 strcat(temp_buf,response+resp_addr[i]+2);
1359
1360 if(strlen(temp_buf) >= 1023)
1361 {
1362 LYINFLOG("1 will be out of range\n");
1363 break;
1364 }
1365 strcat(temp_buf,";");
1366 printf("parse_result[%d]:%s,strcated:%s\n",i,response+resp_addr[i]+2,temp_buf);
1367 }
1368 LYINFLOG("parse_result:%s\n",temp_buf);
1369 if(strlen(temp_buf) > value_len)
1370 {
1371 printf("result length over value:%ld,%d\n",strlen(temp_buf),value_len);
1372 memcpy(value,temp_buf,value_len);
1373 }
1374 else
1375 {
1376 memcpy(value,temp_buf,strlen(temp_buf));
1377 }
1378 }
q.huang52921662022-10-20 15:25:45 +08001379 return RESULT_OK;
lh3a26dd52022-07-01 04:44:57 -07001380 }
1381 else
1382 {
1383 LYINFLOG("%s this response invalid\n",response);
q.huang52921662022-10-20 15:25:45 +08001384 return LYNQ_E_INNER_ERROR;
lh3a26dd52022-07-01 04:44:57 -07001385 }
1386}
lh3a26dd52022-07-01 04:44:57 -07001387
1388int lynq_oos_recover_timer_interval(int mode, char interval[LY_RECOVER_TIMER_INTERVAL],char result[LY_RECOVER_TIMER_INTERVAL])
1389{
q.huang52921662022-10-20 15:25:45 +08001390 if(g_module_init_flag != MODULE_RUNNING)
1391 {
1392 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1393 return LYNQ_E_CONFLICT;
1394 }
1395
q.huang7de1d662022-09-13 14:19:24 +08001396 if((mode < 0) || (mode >1) || (mode == 0 && NULL == interval) || (NULL == result))
lh3a26dd52022-07-01 04:44:57 -07001397 {
q.huang7de1d662022-09-13 14:19:24 +08001398 LYERRLOG("%s mode %d interval %s result %s error",__func__,mode,interval,result);
q.huang52921662022-10-20 15:25:45 +08001399 return LYNQ_E_PARAMETER_ANONALY;
lh3a26dd52022-07-01 04:44:57 -07001400 }
1401
q.huang7de1d662022-09-13 14:19:24 +08001402 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +08001403 int ret;
q.huang7de1d662022-09-13 14:19:24 +08001404
lh3a26dd52022-07-01 04:44:57 -07001405 if(mode == 0)
1406 {
q.huang52921662022-10-20 15:25:45 +08001407 ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"AT+ERSCFG=%s",interval);
lh3a26dd52022-07-01 04:44:57 -07001408 }
q.huang7de1d662022-09-13 14:19:24 +08001409 else
lh3a26dd52022-07-01 04:44:57 -07001410 {
q.huang52921662022-10-20 15:25:45 +08001411 ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"AT+ERSCFG?");
lh3a26dd52022-07-01 04:44:57 -07001412 }
q.huang7de1d662022-09-13 14:19:24 +08001413
q.huang52921662022-10-20 15:25:45 +08001414 if(ret!=RESULT_OK)
lh3a26dd52022-07-01 04:44:57 -07001415 {
q.huang52921662022-10-20 15:25:45 +08001416 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
1417 return ret;
1418 }
q.huang7de1d662022-09-13 14:19:24 +08001419
q.huang52921662022-10-20 15:25:45 +08001420 int recv_len;
1421 char res_data[LY_RECOVER_TIMER_INTERVAL] = {0};
1422 char response_interval[LY_RECOVER_TIMER_INTERVAL*2] = {0};
q.huang7de1d662022-09-13 14:19:24 +08001423
q.huang52921662022-10-20 15:25:45 +08001424 LYINFLOG("get recover timer interval");
1425 p->readInt32(&recv_len);
1426 if(recv_len == -1)
1427 {
1428 LYINFLOG("no responset");
q.huang7de1d662022-09-13 14:19:24 +08001429 delete p;
q.huang52921662022-10-20 15:25:45 +08001430 return LYNQ_E_INNER_ERROR;
lh3a26dd52022-07-01 04:44:57 -07001431 }
q.huang52921662022-10-20 15:25:45 +08001432 else
1433 {
1434 LYINFLOG("recv_len:%d",recv_len);
1435 p->read(response_interval,recv_len);
1436 }
1437 LYINFLOG("response_interval:%s",response_interval);
1438 ret = parse_at_result(response_interval,res_data,LY_RECOVER_TIMER_INTERVAL);
1439 if(mode == 1)
1440 {
1441 if(strlen(res_data) <= LY_RECOVER_TIMER_INTERVAL)
1442 {
1443 memcpy(result,res_data,strlen(res_data));
1444 }
1445 }
1446 LYERRLOG("%s ret:%d",__func__,ret);
1447 delete p;
1448 return ret;
lh3a26dd52022-07-01 04:44:57 -07001449}
1450
1451int lynq_oos_deep_sleep_recover_timer_interval(int recovery_threshold,int fullband_timer,int sniffer_timer,int inactive_mode)
1452{
q.huang52921662022-10-20 15:25:45 +08001453 if(g_module_init_flag != MODULE_RUNNING)
1454 {
1455 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1456 return LYNQ_E_CONFLICT;
1457 }
1458 if(((recovery_threshold < 2) || (recovery_threshold > 10)) || ((fullband_timer < 90) || (fullband_timer > 360)) ||
lh3a26dd52022-07-01 04:44:57 -07001459 ((sniffer_timer < 10) || (sniffer_timer > 60)) || ((inactive_mode < 0) || (inactive_mode > 1)))
1460 {
q.huang52921662022-10-20 15:25:45 +08001461 LYERRLOG("%s paramter recovery_threshold %d fullband_timer %d sniffer_timer %d inactive_mode %d error!",__func__,recovery_threshold,fullband_timer,sniffer_timer,inactive_mode);
1462 return LYNQ_E_PARAMETER_ANONALY;
lh3a26dd52022-07-01 04:44:57 -07001463 }
1464
q.huang7de1d662022-09-13 14:19:24 +08001465 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +08001466 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"AT+ESRVREC=%d,%d,%d,%d",recovery_threshold,fullband_timer,sniffer_timer,inactive_mode);
q.huang7de1d662022-09-13 14:19:24 +08001467
q.huang52921662022-10-20 15:25:45 +08001468 if(ret!=RESULT_OK)
lh3a26dd52022-07-01 04:44:57 -07001469 {
q.huang52921662022-10-20 15:25:45 +08001470 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
1471 return ret;
1472 }
1473
1474 int recv_len;
1475 char res_data[LY_RECOVER_TIMER_INTERVAL] = {0};
1476 char response_interval[LY_RECOVER_TIMER_INTERVAL*2] = {0};
1477
1478 p->readInt32(&recv_len);
1479 if(recv_len == -1)
1480 {
1481 LYINFLOG("no responset");
q.huang7de1d662022-09-13 14:19:24 +08001482 delete p;
q.huang52921662022-10-20 15:25:45 +08001483 return LYNQ_E_INNER_ERROR;
lh3a26dd52022-07-01 04:44:57 -07001484 }
q.huang52921662022-10-20 15:25:45 +08001485 else
1486 {
1487 LYINFLOG("recv_len:%d",recv_len);
1488 p->read(response_interval,recv_len);
1489 }
1490 LYINFLOG("response_interval:%s",response_interval);
1491 ret = parse_at_result(response_interval,res_data,LY_RECOVER_TIMER_INTERVAL);
1492 LYERRLOG("%s ret:%d",__func__,ret);
1493 delete p;
1494 return ret;
1495
lh3a26dd52022-07-01 04:44:57 -07001496}
1497#endif
1498