blob: ec580e2d9cff571ef9eee07221929e545dda3b7d [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
l.yangad3fe722023-10-31 20:40:37 -070028#define SET_SBP_OPEN " AT+ESBP=5,\"SBP_NRRC_BAR_CELL_WITH_CONNECTION_FAILURE\",1 "
29#define SET_SBP_CLOSE " AT+ESBP=5,\"SBP_NRRC_BAR_CELL_WITH_CONNECTION_FAILURE\",0 "
30#define QUERY_SBP_STATUS "AT+ESBP=7,\"SBP_NRRC_BAR_CELL_WITH_CONNECTION_FAILURE\""
31#define OPEN 1
32#define CLOSE 0
33
q.huang8fb88c42023-04-26 17:02:02 +080034
rjw7e50cd32022-01-18 18:30:37 +080035using ::android::Parcel;
36
q.huang52921662022-10-20 15:25:45 +080037static int s_module_wait_urc_id;
38static int s_module_urc_slot_id;
39static signalStrength_t s_network_urc_solSigStren;
rjw7e50cd32022-01-18 18:30:37 +080040
q.huang52921662022-10-20 15:25:45 +080041/**g_module_init_flag
rjw22947c22022-03-15 09:21:29 +080042* @brief mark network initialization state
43* 0:deinit status
44* 1:init state
45*/
q.huang52921662022-10-20 15:25:45 +080046int g_module_init_flag = 0;
rjw7e50cd32022-01-18 18:30:37 +080047
48int lynq_network_init(int utoken){
q.huang52921662022-10-20 15:25:45 +080049 if(g_module_init_flag != MODULE_CLOSED)
rjw22947c22022-03-15 09:21:29 +080050 {
q.huang52921662022-10-20 15:25:45 +080051 LYERRLOG("module state is %d",g_module_init_flag);
52 return LYNQ_E_CONFLICT;
rjw22947c22022-03-15 09:21:29 +080053 }
q.huang52921662022-10-20 15:25:45 +080054
55 if(utoken <0){
56 LYERRLOG("utoken is less than 0",utoken);
57 return LYNQ_E_PARAMETER_ANONALY;
rjw7e50cd32022-01-18 18:30:37 +080058 }
q.huang52921662022-10-20 15:25:45 +080059
60 g_module_init_flag = MODULE_SWITCHING;
61
62 g_module_Global_uToken = utoken;
rjw7e50cd32022-01-18 18:30:37 +080063 LYLOGSET(LOG_INFO);
64 LYLOGEINIT(USER_LOG_TAG);
q.huang52921662022-10-20 15:25:45 +080065
q.huang693ff3b2022-10-20 15:25:45 +080066 int ret;
rjw7e50cd32022-01-18 18:30:37 +080067
q.huang47d4dfe2022-08-17 17:52:29 +080068 init_network_timer_all();
q.huang036b6cf2023-01-10 14:29:20 +080069
70 ret = lynq_start_all_urc_socket_thread();
q.huang52921662022-10-20 15:25:45 +080071 if(ret != 0)
72 {
73 LYERRLOG("init socket urc fail!!!");
74 g_module_init_flag = MODULE_CLOSED;
75 return LYNQ_E_INNER_ERROR;
76 }
77
q.huang036b6cf2023-01-10 14:29:20 +080078 ret = lynq_start_all_rc_socket_thread();
rjw7e50cd32022-01-18 18:30:37 +080079 if(ret !=0)
80 {
81 LYERRLOG("init socket client fail!!!");
q.huang036b6cf2023-01-10 14:29:20 +080082 lynq_close_all_urc_socket_thread();
q.huang52921662022-10-20 15:25:45 +080083 g_module_init_flag = MODULE_CLOSED;
84 return LYNQ_E_INNER_ERROR;
rjw7e50cd32022-01-18 18:30:37 +080085 }
q.huang52921662022-10-20 15:25:45 +080086 g_module_init_flag = MODULE_RUNNING;
q.huang7de1d662022-09-13 14:19:24 +080087
q.huang52921662022-10-20 15:25:45 +080088 return RESULT_OK;
89}
90
91int lynq_network_deinit(void){
92
93 if (g_module_init_flag != MODULE_RUNNING)
94 {
95 LYERRLOG("module state is %d",g_module_init_flag);
96 return LYNQ_E_CONFLICT;
97 }
98 g_module_init_flag = MODULE_SWITCHING;
99
q.huang036b6cf2023-01-10 14:29:20 +0800100 lynq_close_all_urc_socket_thread();
101 lynq_close_all_rc_socket_thread();
q.huang52921662022-10-20 15:25:45 +0800102 deinit_network_timer_all();
103
104 g_module_init_flag = MODULE_CLOSED;
105 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800106}
107
108int strUpper(char * str)
109{
110 int i=0;
111 while(1)
112 {
113 if(str[i]=='\0')
114 {
115 break;
116 }
117 if(str[i]>='a'&&str[i]<='z')
118 {
119 str[i]=str[i]-32;
120 }
121 i++;
122 }
q.huang52921662022-10-20 15:25:45 +0800123 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800124}
125
q.huang7de1d662022-09-13 14:19:24 +0800126int copyCellInfoList(Parcel* &p,uint64_t *cellinfo,int *tac,int *earfcn)
rjw7e50cd32022-01-18 18:30:37 +0800127{
128 int32_t v=0;
129 int64_t v6=0;
130 if(NULL == cellinfo)
131 {
132 LYERRLOG("*cellinfo error");
q.huang52921662022-10-20 15:25:45 +0800133 return LYNQ_E_PARAMETER_ANONALY;
rjw7e50cd32022-01-18 18:30:37 +0800134 }
135
136 int nothing = 0;
rjw62a60152022-06-09 17:43:01 +0800137 int tmp_uint64 = 0;
q.huang7de1d662022-09-13 14:19:24 +0800138 p->readInt32(&v);
rjw7e50cd32022-01-18 18:30:37 +0800139 RIL_CellInfoType cellinfoType = RIL_CellInfoType(v);
q.huang7de1d662022-09-13 14:19:24 +0800140 p->readInt32(&nothing);
rjw7e50cd32022-01-18 18:30:37 +0800141 // cellinfo->cellinfo.cellInfoType = RIL_CellInfoType(v);
q.huang7de1d662022-09-13 14:19:24 +0800142 // p->readInt32(&cellinfo->cellinfo.registered);
143 p->readInt32(&v);
rjw7e50cd32022-01-18 18:30:37 +0800144 // cellinfo->cellinfo.timeStampType = RIL_TimeStampType(v);
q.huang7de1d662022-09-13 14:19:24 +0800145 p->readInt64(&v6);
rjw7e50cd32022-01-18 18:30:37 +0800146 // cellinfo->cellinfo.timeStamp = v6;
147 switch(cellinfoType) {
148 case RIL_CELL_INFO_TYPE_GSM: {
q.huang7de1d662022-09-13 14:19:24 +0800149 p->readInt32(&nothing);
150 p->readInt32(&nothing);
151 p->readInt32(&nothing);
152 p->readInt32(&tmp_uint64);
153 p->readInt32(&nothing);
154 p->readInt32(&nothing);
155 p->readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800156 *cellinfo = (uint64_t)tmp_uint64;
rjw61974852022-05-17 16:30:32 +0800157 tac = &nothing;
rjwa8011682022-05-31 17:31:28 +0800158 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800159 break;
160 }
161 case RIL_CELL_INFO_TYPE_WCDMA: {
q.huang7de1d662022-09-13 14:19:24 +0800162 p->readInt32(&nothing);
163 p->readInt32(&nothing);
164 p->readInt32(&nothing);
165 p->readInt32(&tmp_uint64);
166 p->readInt32(&nothing);
167 p->readInt32(&nothing);
168 p->readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800169 *cellinfo = (uint64_t)tmp_uint64;
rjw4200a082022-05-17 17:58:35 +0800170 tac = &nothing;
rjwa8011682022-05-31 17:31:28 +0800171 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800172 break;
173 }
174 case RIL_CELL_INFO_TYPE_CDMA: {
q.huang7de1d662022-09-13 14:19:24 +0800175 p->readInt32(&nothing);
176 p->readInt32(&nothing);
177 p->readInt32(&nothing);
178 p->readInt32(&nothing);
179 p->readInt32(&nothing);
180 p->readInt32(&nothing);
181 p->readInt32(&nothing);
182 p->readInt32(&nothing);
183 p->readInt32(&nothing);
184 p->readInt32(&nothing);
rjw7e50cd32022-01-18 18:30:37 +0800185 cellinfo = 0;
rjw61974852022-05-17 16:30:32 +0800186 tac = &nothing;
rjwa8011682022-05-31 17:31:28 +0800187 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800188 break;
189 }
190 case RIL_CELL_INFO_TYPE_LTE: {
q.huang7de1d662022-09-13 14:19:24 +0800191 p->readInt32(&nothing);
192 p->readInt32(&nothing);
193 p->readInt32(&tmp_uint64);
194 p->readInt32(&nothing);
195 p->readInt32(tac);
196 p->readInt32(earfcn);
197 p->readInt32(&nothing);
198 p->readInt32(&nothing);
199 p->readInt32(&nothing);
200 p->readInt32(&nothing);
201 p->readInt32(&nothing);
202 p->readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800203 *cellinfo = (uint64_t)tmp_uint64;
rjw7e50cd32022-01-18 18:30:37 +0800204 break;
205 }
206 case RIL_CELL_INFO_TYPE_TD_SCDMA: {
q.huang7de1d662022-09-13 14:19:24 +0800207 p->readInt32(&nothing);
208 p->readInt32(&nothing);
209 p->readInt32(&nothing);
210 p->readInt32(&tmp_uint64);
211 p->readInt32(&nothing);
212 p->readInt32(&nothing);
rjw62a60152022-06-09 17:43:01 +0800213 *cellinfo = (uint64_t)tmp_uint64;
rjwa8011682022-05-31 17:31:28 +0800214 tac = &nothing;
215 earfcn = &nothing;
rjw7e50cd32022-01-18 18:30:37 +0800216 break;
217 }
218 case RIL_CELL_INFO_TYPE_NR: {
q.huang7de1d662022-09-13 14:19:24 +0800219 p->readInt32(&nothing);
220 p->readInt32(&nothing);
221 p->readUint64(cellinfo);
222 p->readInt32(&nothing);
223 p->readInt32(tac);
224 p->readInt32(earfcn);
225 p->readInt32(&nothing);
226 p->readInt32(&nothing);
227 p->readInt32(&nothing);
228 p->readInt32(&nothing);
229 p->readInt32(&nothing);
230 p->readInt32(&nothing);
rjw7e50cd32022-01-18 18:30:37 +0800231 break;
232 }
233 }
rjw62a60152022-06-09 17:43:01 +0800234 LYINFLOG("CID in fUNC :%llu",*cellinfo);
rjwa8011682022-05-31 17:31:28 +0800235 LYINFLOG("tac in fUNC :%d",*tac);
236 LYINFLOG("earfcn in fUNC :%d",*earfcn);
q.huang52921662022-10-20 15:25:45 +0800237 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800238}
239
q.huang7de1d662022-09-13 14:19:24 +0800240static char * lynqStrdupReadString(Parcel* &p) {
rjw7e50cd32022-01-18 18:30:37 +0800241 size_t stringlen;
242 const char16_t *s16;
243
q.huang7de1d662022-09-13 14:19:24 +0800244 s16 = p->readString16Inplace(&stringlen);
rjw7e50cd32022-01-18 18:30:37 +0800245 return strndup16to8(s16, stringlen);
246}
247
248int lynq_query_operater(char *OperatorFN,char *OperatorSH,char *MccMnc)
249{
q.huang52921662022-10-20 15:25:45 +0800250 if(g_module_init_flag != MODULE_RUNNING)
251 {
252 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
253 return LYNQ_E_CONFLICT;
254 }
255
rjw7e50cd32022-01-18 18:30:37 +0800256 if(NULL == OperatorFN||NULL == OperatorSH|| NULL == MccMnc)
rjw7e50cd32022-01-18 18:30:37 +0800257 {
q.huang7de1d662022-09-13 14:19:24 +0800258 LYERRLOG("%s some parameter OperatorFN OperatorSH MccMnc %s %s %s is NULL",__func__,OperatorFN,OperatorSH,MccMnc);
q.huang52921662022-10-20 15:25:45 +0800259 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800260 }
q.huang52921662022-10-20 15:25:45 +0800261
q.huang7de1d662022-09-13 14:19:24 +0800262 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +0800263 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OPERATOR,0,"");
264
265 if(ret!=RESULT_OK)
rjw46769c92022-07-04 21:17:25 +0800266 {
q.huang52921662022-10-20 15:25:45 +0800267 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
268 return ret;
269 }
270
271 int num ;
272 char *resp[LYNQ_RESP_STRING_MAX_NUM];
q.huang7de1d662022-09-13 14:19:24 +0800273
q.huang52921662022-10-20 15:25:45 +0800274 p->readInt32(&num);
275 if(num == 0 || num > LYNQ_RESP_STRING_MAX_NUM)
276 {
277 LYERRLOG("no paramters or num %d too great",num);
278 delete p;
279 return LYNQ_E_INNER_ERROR;
280 }else{
281 int i;
282 for(i = 0; i<num;i++)
rjw7e50cd32022-01-18 18:30:37 +0800283 {
q.huang52921662022-10-20 15:25:45 +0800284 resp[i] = lynqStrdupReadString(p);
rjw7e50cd32022-01-18 18:30:37 +0800285 }
q.huang52921662022-10-20 15:25:45 +0800286 if(NULL != resp[0])
287 {
288 strcpy(OperatorFN,resp[0]);
289 }
290 if(NULL != resp[1])
291 {
292 strcpy(OperatorSH,resp[1]);
293 }
294 if(NULL != resp[2])
295 {
296 strcpy(MccMnc,resp[2]);
297 }
298 for(i = 0; i<num;i++)
299 {
300 if(resp[i]!=NULL)
301 {
302 free(resp[i]);
303 }
304 }
rjw7e50cd32022-01-18 18:30:37 +0800305 }
q.huang7de1d662022-09-13 14:19:24 +0800306
q.huang52921662022-10-20 15:25:45 +0800307 LYINFLOG("%s suc",__func__);
308 delete p;
309 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800310}
311
312int lynq_query_network_selection_mode(int *netselMode)
313{
q.huang52921662022-10-20 15:25:45 +0800314 if(g_module_init_flag != MODULE_RUNNING)
315 {
316 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
317 return LYNQ_E_CONFLICT;
318 }
319
rjw7e50cd32022-01-18 18:30:37 +0800320 if(NULL == netselMode)
rjw7e50cd32022-01-18 18:30:37 +0800321 {
q.huang7de1d662022-09-13 14:19:24 +0800322 LYERRLOG("%s parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800323 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800324 }
q.huang52921662022-10-20 15:25:45 +0800325
326 Parcel* p=NULL;
327 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE,0,"");
328
329 if(ret!=RESULT_OK)
rjw46769c92022-07-04 21:17:25 +0800330 {
q.huang52921662022-10-20 15:25:45 +0800331 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
332 return ret;
333 }
334
335 int readnum;
336 p->readInt32(&readnum);
337 p->readInt32(netselMode);
q.huang7de1d662022-09-13 14:19:24 +0800338
q.huang52921662022-10-20 15:25:45 +0800339 LYINFLOG("%s suc",__func__);
340 delete p;
341 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800342}
343
344int lynq_set_network_selection_mode(const char *mode,const char* mccmnc)
345{
q.huang52921662022-10-20 15:25:45 +0800346 if(g_module_init_flag != MODULE_RUNNING)
347 {
348 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
349 return LYNQ_E_CONFLICT;
350 }
351
q.huang7de1d662022-09-13 14:19:24 +0800352 if(NULL == mode || (strlen(mode) == 0))
rjw78d04502022-02-24 13:37:11 +0800353 {
q.huang7de1d662022-09-13 14:19:24 +0800354 LYERRLOG("%s parameter mod %s is error",__func__,mode);
q.huang52921662022-10-20 15:25:45 +0800355 return LYNQ_E_PARAMETER_ANONALY;
rjw78d04502022-02-24 13:37:11 +0800356 }
q.huang7de1d662022-09-13 14:19:24 +0800357
358 if(!strcmp(mode,"Manual"))
359 {
360 if(mccmnc == NULL || strlen(mccmnc) == 0)
361 {
362 LYERRLOG("%s parameter mccmnc %s is error",__func__,mccmnc);
q.huang52921662022-10-20 15:25:45 +0800363 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800364 }
365 }
366
q.huang7de1d662022-09-13 14:19:24 +0800367 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +0800368 int ret;
q.huang7de1d662022-09-13 14:19:24 +0800369
rjw7e50cd32022-01-18 18:30:37 +0800370 if(!strcmp(mode,"Auto"))
371 {
q.huang8fb88c42023-04-26 17:02:02 +0800372 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 +0800373 }
374 else if(!strcmp(mode,"Manual"))
375 {
q.huang8fb88c42023-04-26 17:02:02 +0800376 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 +0800377 }
378 else
379 {
q.huang52921662022-10-20 15:25:45 +0800380 LYERRLOG("%s parameter mode %s is errir",__func__,mode);
381 return LYNQ_E_PARAMETER_ANONALY;
rjw7e50cd32022-01-18 18:30:37 +0800382 }
383
q.huang52921662022-10-20 15:25:45 +0800384 if(ret!=RESULT_OK)
385 {
386 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
387 return ret;
388 }
389
390 LYINFLOG("%s set mode %s mccmnc %s suc",__func__,mode,mccmnc);
391 delete p;
392 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800393}
394
395int lynq_query_available_network(char *OperatorFN,char *OperatorSH,char *MccMnc,char * NetStatus)
396{
q.huang52921662022-10-20 15:25:45 +0800397 if(g_module_init_flag != MODULE_RUNNING)
398 {
399 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
400 return LYNQ_E_CONFLICT;
401 }
rjw7e50cd32022-01-18 18:30:37 +0800402 if(NULL == OperatorFN||NULL == OperatorSH||NULL == MccMnc||NULL == NetStatus)
rjw7e50cd32022-01-18 18:30:37 +0800403 {
q.huang7de1d662022-09-13 14:19:24 +0800404 LYERRLOG("%s there is parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800405 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800406 }
q.huang52921662022-10-20 15:25:45 +0800407
q.huang7de1d662022-09-13 14:19:24 +0800408 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +0800409 int ret=lynq_send_common_request(p,600,RIL_REQUEST_QUERY_AVAILABLE_NETWORKS,0,"");
rjw7e50cd32022-01-18 18:30:37 +0800410
q.huang52921662022-10-20 15:25:45 +0800411 if(ret!=RESULT_OK)
rjw46769c92022-07-04 21:17:25 +0800412 {
q.huang52921662022-10-20 15:25:45 +0800413 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
414 return ret;
415 }
q.huang7de1d662022-09-13 14:19:24 +0800416
q.huang52921662022-10-20 15:25:45 +0800417 int num =p->readInt32();
418 char *resp[LYNQ_RESP_STRING_MAX_NUM];
419 if(num == 0 || num > LYNQ_RESP_STRING_MAX_NUM)
420 {
421 LYERRLOG("no paramters or num %d too great",num);
422 delete p;
423 return LYNQ_E_INNER_ERROR;
424 }else{
425 int i;
426 for(i = 0; i<num;i++)
427 {
428 resp[i] = lynqStrdupReadString(p);
429 }
430 if(NULL != resp[0])
431 {
432 strcpy(OperatorFN,resp[0]);
433 }
434 if(NULL != resp[1])
435 {
436 strcpy(OperatorSH,resp[1]);
437 }
438 if(NULL != resp[2])
439 {
440 strcpy(MccMnc,resp[2]);
441 }
442 if(NULL != resp[3])
443 {
rjwfe7c8a42022-10-21 15:09:21 +0800444 strcpy(NetStatus,resp[3]);
q.huang52921662022-10-20 15:25:45 +0800445 }
446 for(i = 0; i<num;i++)
447 {
448 if(resp[i]!=NULL)
449 {
450 free(resp[i]);
451 }
452 }
453 }
454 delete p;
455 LYINFLOG("%s suc",__func__);
456 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800457}
458
rjw4544e132022-04-01 15:00:26 +0800459int 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 +0800460{
q.huang52921662022-10-20 15:25:45 +0800461 if(g_module_init_flag != MODULE_RUNNING)
462 {
463 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
464 return LYNQ_E_CONFLICT;
465 }
466
rjwd98d5872022-04-09 13:50:58 +0800467 if(NULL == type || NULL ==regState ||NULL ==imsRegState ||NULL ==LAC ||NULL ==CID ||NULL ==netType ||NULL ==radioTechFam || NULL == netRejected)
q.huang7de1d662022-09-13 14:19:24 +0800468 {
469 LYERRLOG("%s there is parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800470 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800471 }
rjw7e50cd32022-01-18 18:30:37 +0800472 if(strlen(type)>LYNQ_TYPE_BUF)
473 {
474 LYERRLOG("[%s]the parameter is inavaliable !",__FUNCTION__);
q.huang52921662022-10-20 15:25:45 +0800475 return LYNQ_E_PARAMETER_ANONALY;
476 }
q.huang7de1d662022-09-13 14:19:24 +0800477
478 int request;
479 char str[LYNQ_TYPE_BUF];
rjw7e50cd32022-01-18 18:30:37 +0800480 memcpy(str,type,strlen(type)+1);
481 strUpper(str);
482 if(!strcmp(str,"VOICE"))
483 {
q.huangd3804bd2022-10-20 14:36:14 +0800484 if(get_state_from_buf(NETWORK_STATE_BUFFER_TYPE_VOICE_REG,3,regState,netType,netRejected,0)==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_VOICE_REGISTRATION_STATE;
rjw7e50cd32022-01-18 18:30:37 +0800489 }else if(!strcmp(str,"DATA")){
q.huangd3804bd2022-10-20 14:36:14 +0800490 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 +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_DATA_REGISTRATION_STATE;
rjw7e50cd32022-01-18 18:30:37 +0800495 }else if(!strcmp(str,"IMS")){
q.huangd3804bd2022-10-20 14:36:14 +0800496 if(get_state_from_buf(NETWORK_STATE_BUFFER_TYPE_IMS_REG,2,imsRegState,radioTechFam,0)==0)
q.huang47d4dfe2022-08-17 17:52:29 +0800497 {
q.huangd3804bd2022-10-20 14:36:14 +0800498 return RESULT_OK;
q.huang47d4dfe2022-08-17 17:52:29 +0800499 }
q.huang7de1d662022-09-13 14:19:24 +0800500 request = RIL_REQUEST_IMS_REGISTRATION_STATE;
rjw7e50cd32022-01-18 18:30:37 +0800501 }else{
502 LYERRLOG("request error");
q.huang52921662022-10-20 15:25:45 +0800503 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800504 }
rjw7e50cd32022-01-18 18:30:37 +0800505
q.huang52921662022-10-20 15:25:45 +0800506 Parcel* p=NULL;
507 int ret=lynq_send_common_request(p,g_wait_time,request,0,"");
508
509 if(ret!=RESULT_OK)
rjw7e50cd32022-01-18 18:30:37 +0800510 {
q.huang52921662022-10-20 15:25:45 +0800511 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
512 return ret;
513 }
514
515 int num,i;
516 char *resp[LYNQ_RESP_STRING_MAX_NUM];
517 if(!strcmp(str,"VOICE"))
518 {
519 p->readInt32(&num);
520 if(num == 15)
rjw7e50cd32022-01-18 18:30:37 +0800521 {
q.huang693ff3b2022-10-20 15:25:45 +0800522 for(i=0;i<15;i++)
q.huang52921662022-10-20 15:25:45 +0800523 {
524 resp[i]=lynqStrdupReadString(p);
525 }
q.huang693ff3b2022-10-20 15:25:45 +0800526 *regState = atoi(resp[0]);
527 *netType = atoi(resp[3]);
528 *netRejected = atoi(resp[14]);
529 for(i=0;i<15;i++)
q.huang52921662022-10-20 15:25:45 +0800530 {
531 if(resp[i]!=NULL)
532 {
533 free(resp[i]);
534 }
535 }
536 set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_VOICE_REG,3,*regState,*netType,*netRejected,0);
rjw7e50cd32022-01-18 18:30:37 +0800537 }
q.huang52921662022-10-20 15:25:45 +0800538 else
q.huang7de1d662022-09-13 14:19:24 +0800539 {
q.huang52921662022-10-20 15:25:45 +0800540 LYERRLOG("%s type %s num %d error",__func__,str,num);
q.huang7de1d662022-09-13 14:19:24 +0800541 delete p;
q.huang52921662022-10-20 15:25:45 +0800542 return LYNQ_E_INNER_ERROR;
543 }
rjw7e50cd32022-01-18 18:30:37 +0800544 }
q.huang52921662022-10-20 15:25:45 +0800545 else if(!strcmp(str,"DATA")){
546 p->readInt32(&num);
547 if(num == 11)
548 {
549 for(i=0;i<4;i++)
550 {
q.huang693ff3b2022-10-20 15:25:45 +0800551 resp[i]=lynqStrdupReadString(p);
552 }
553 *regState = atoi(resp[0]);
554 strcpy(LAC,resp[1]);
555 strcpy(CID,resp[2]);
556 *netType = atoi(resp[3]);
557 for(i=0;i<4;i++)
q.huang52921662022-10-20 15:25:45 +0800558 {
559 if(resp[i]!=NULL)
560 {
561 free(resp[i]);
562 }
563 }
564 set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_DATA_REG,2,*regState,*netType,2,LAC,CID);
565 }
566 else
567 {
568 LYERRLOG("%s type %s num %d error",__func__,str,num);
569 delete p;
570 return LYNQ_E_INNER_ERROR;
571 }
q.huang7de1d662022-09-13 14:19:24 +0800572
q.huang52921662022-10-20 15:25:45 +0800573 }
574 else // "IMS"
575 {
576 p->readInt32(&num);
577 if(num == 2)
578 {
579 p->readInt32(imsRegState);
580 p->readInt32(radioTechFam);
581 set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_IMS_REG,2,*imsRegState,*radioTechFam,0);
582 }
583 else
584 {
585 LYERRLOG("%s type %s num %d error",__func__,str,num);
586 delete p;
587 return LYNQ_E_INNER_ERROR;
588 }
589 }
590 LYINFLOG("%s suc",__func__);
591 delete p;
592 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800593}
594
595int lynq_query_prefferred_networktype(int *preNetType)
q.huang7de1d662022-09-13 14:19:24 +0800596{
q.huang52921662022-10-20 15:25:45 +0800597 if(g_module_init_flag != MODULE_RUNNING)
598 {
599 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
600 return LYNQ_E_CONFLICT;
601 }
q.huang7de1d662022-09-13 14:19:24 +0800602 if(NULL == preNetType)
rjw7e50cd32022-01-18 18:30:37 +0800603 {
q.huang7de1d662022-09-13 14:19:24 +0800604 LYERRLOG("%s there is parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800605 return LYNQ_E_PARAMETER_ANONALY;
606 }
rjw7e50cd32022-01-18 18:30:37 +0800607
q.huang52921662022-10-20 15:25:45 +0800608 Parcel* p=NULL;
609 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE,0,"");
610
611 if(ret!=RESULT_OK)
612 {
613 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
614 return ret;
615 }
616
617 int num;
618 p->readInt32(&num);
619 p->readInt32(preNetType);
620
621 LYINFLOG("%s suc",__func__);
622 delete p;
623 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800624}
625
626int lynq_set_prefferred_networktype(const int preffertype)
627{
q.huang52921662022-10-20 15:25:45 +0800628 if(g_module_init_flag != MODULE_RUNNING)
629 {
630 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
631 return LYNQ_E_CONFLICT;
632 }
rjw7e50cd32022-01-18 18:30:37 +0800633 if(preffertype < 0||preffertype >33)
rjw7e50cd32022-01-18 18:30:37 +0800634 {
q.huang7de1d662022-09-13 14:19:24 +0800635 LYERRLOG("%s parameter %d error",__func__,preffertype);
q.huang52921662022-10-20 15:25:45 +0800636 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800637 }
q.huang52921662022-10-20 15:25:45 +0800638
q.huang7de1d662022-09-13 14:19:24 +0800639 Parcel* p=NULL;
q.huang0bbd0262023-04-28 15:54:40 +0800640 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 +0800641
642 if(ret!=RESULT_OK)
rjw7e50cd32022-01-18 18:30:37 +0800643 {
q.huang52921662022-10-20 15:25:45 +0800644 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
645 return ret;
646 }
647
648 LYINFLOG("%s set %d suc",__func__,preffertype);
649 delete p;
650 return RESULT_OK;
651
rjw7e50cd32022-01-18 18:30:37 +0800652}
653
rjw62a60152022-06-09 17:43:01 +0800654int 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 +0800655{
q.huang52921662022-10-20 15:25:45 +0800656 if(g_module_init_flag != MODULE_RUNNING)
657 {
658 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
659 return LYNQ_E_CONFLICT;
660 }
rjw7e50cd32022-01-18 18:30:37 +0800661 if(NULL == realNum)
rjw7e50cd32022-01-18 18:30:37 +0800662 {
q.huang7de1d662022-09-13 14:19:24 +0800663 LYERRLOG("%s there is parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800664 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800665 }
666
q.huang52921662022-10-20 15:25:45 +0800667 Parcel* p=NULL;
668 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_GET_CELL_INFO_LIST,0,"");
669
670 if(ret!=RESULT_OK)
rjw46769c92022-07-04 21:17:25 +0800671 {
q.huang52921662022-10-20 15:25:45 +0800672 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
673 return ret;
674 }
675
676 int num;
q.huang7de1d662022-09-13 14:19:24 +0800677
q.huang52921662022-10-20 15:25:45 +0800678 p->readInt32(&num);
679 LYINFLOG("cell info num:%d",num);
680 *realNum = num;
681 for(int i = 0;i<num;i++)
682 {
683 copyCellInfoList(p,&cellinfo[i],&tac[i],&earfcn[i]);
rjw7e50cd32022-01-18 18:30:37 +0800684 }
q.huang52921662022-10-20 15:25:45 +0800685
686 LYINFLOG("%s suc",__func__);
687 delete p;
688 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800689}
690
691int lynq_set_unsol_cell_info_listrate(const int rate)
692{
q.huang52921662022-10-20 15:25:45 +0800693 if(g_module_init_flag != MODULE_RUNNING)
rjw7e50cd32022-01-18 18:30:37 +0800694 {
q.huang52921662022-10-20 15:25:45 +0800695 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
696 return LYNQ_E_CONFLICT;
rjw7e50cd32022-01-18 18:30:37 +0800697 }
q.huang52921662022-10-20 15:25:45 +0800698 Parcel* p=NULL;
699 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 +0800700
q.huang52921662022-10-20 15:25:45 +0800701 if(ret!=RESULT_OK)
702 {
703 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
704 return ret;
705 }
706
707 LYINFLOG("%s set %d suc",__func__,rate);
708 delete p;
709 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800710}
711
712int lynq_set_band_mode(const int bandmode)
713{
q.huang52921662022-10-20 15:25:45 +0800714 if(g_module_init_flag != MODULE_RUNNING)
rjw7e50cd32022-01-18 18:30:37 +0800715 {
q.huang52921662022-10-20 15:25:45 +0800716 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
717 return LYNQ_E_CONFLICT;
rjw7e50cd32022-01-18 18:30:37 +0800718 }
q.huang52921662022-10-20 15:25:45 +0800719 Parcel* p=NULL;
720 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SET_BAND_MODE,1,"%d",bandmode);
rjw7e50cd32022-01-18 18:30:37 +0800721
q.huang52921662022-10-20 15:25:45 +0800722 if(ret!=RESULT_OK)
723 {
724 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
725 return ret;
726 }
727
728 LYINFLOG("%s set %d suc",__func__,bandmode);
729 delete p;
730 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800731}
732
733int lynq_query_available_bandmode(int availBanMode[])
734{
q.huang52921662022-10-20 15:25:45 +0800735 if(g_module_init_flag != MODULE_RUNNING)
736 {
737 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
738 return LYNQ_E_CONFLICT;
739 }
rjw7e50cd32022-01-18 18:30:37 +0800740 if(NULL == availBanMode)
rjw7e50cd32022-01-18 18:30:37 +0800741 {
q.huang7de1d662022-09-13 14:19:24 +0800742 LYERRLOG("%s parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800743 return LYNQ_E_PARAMETER_ANONALY;
rjw7e50cd32022-01-18 18:30:37 +0800744 }
745
q.huang7de1d662022-09-13 14:19:24 +0800746 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +0800747 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE,0,"");
748 if(ret!=RESULT_OK)
rjw7e50cd32022-01-18 18:30:37 +0800749 {
q.huang52921662022-10-20 15:25:45 +0800750 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
751 return ret;
752 }
q.huang7de1d662022-09-13 14:19:24 +0800753
q.huang52921662022-10-20 15:25:45 +0800754 int num = 0;
755 int res = 0;
756 int i;
757
758 p->readInt32(&num);
759 LYINFLOG("num = %d",num);
760 availBanMode[0] = num;
761 for(i=1 ;i<=num;i++)
762 {
763 p->readInt32(&res);
764 availBanMode[i]=res;
765 }
766
767 LYINFLOG("%s suc",__func__);
768 delete p;
769 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800770}
771
q.huang36833592023-04-04 16:46:26 +0800772int lynq_radio_on(const lynq_network_radio_on_type type)
q.huang52921662022-10-20 15:25:45 +0800773{
774 if(g_module_init_flag != MODULE_RUNNING)
775 {
776 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
777 return LYNQ_E_CONFLICT;
778 }
q.huang36833592023-04-04 16:46:26 +0800779 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 +0800780 {
q.huang36833592023-04-04 16:46:26 +0800781 LYERRLOG("%s parameter %d error",__func__,type);
q.huang52921662022-10-20 15:25:45 +0800782 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800783 }
784
q.huang52921662022-10-20 15:25:45 +0800785 Parcel* p=NULL;
q.huang36833592023-04-04 16:46:26 +0800786 int ret;
787
788 if(type==NETWORK_RADIO_ON_TYPE_CFUN_0)
789 {
790 ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"%s","AT+CFUN=0");
791 }
792 else
793 {
794 ret=lynq_send_common_request(p,65,RIL_REQUEST_RADIO_POWER,1,"%d",(type==NETWORK_RADIO_ON_TYPE_NORMAL_MODE));
795 }
rjw7e50cd32022-01-18 18:30:37 +0800796
q.huang52921662022-10-20 15:25:45 +0800797 if(ret!=RESULT_OK)
798 {
799 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
800 return ret;
801 }
802
q.huang36833592023-04-04 16:46:26 +0800803 LYINFLOG("%s set %d suc",__func__,type);
q.huang52921662022-10-20 15:25:45 +0800804 delete p;
805 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800806}
807
q.huang7de1d662022-09-13 14:19:24 +0800808const char * lynq_get_raw_data(Parcel* &p, int* data_len)
q.huang16dcb0f2022-09-07 09:17:37 +0800809{
rjw776c85f2022-10-21 15:09:21 +0800810 int32_t len;
q.huang16dcb0f2022-09-07 09:17:37 +0800811 int status;
812 char *data;
813
814 *data_len=0;
rjw776c85f2022-10-21 15:09:21 +0800815
q.huang7de1d662022-09-13 14:19:24 +0800816 status = p->readInt32(&len);
rjw776c85f2022-10-21 15:09:21 +0800817
q.huang16dcb0f2022-09-07 09:17:37 +0800818 if (status != 0) {
819 LYERRLOG("%s status is %d",__func__,status);
820 return NULL;
rjw776c85f2022-10-21 15:09:21 +0800821 }
822
823 // The java code writes -1 for null arrays
q.huang16dcb0f2022-09-07 09:17:37 +0800824 if (((int)len) == -1 || ((int)len) == 0)
825 {
826 LYERRLOG("%s len is %d",__func__,len);
827 return NULL;
828 }
829 LYINFLOG("%s len is %d",__func__,len);
rjw776c85f2022-10-21 15:09:21 +0800830
q.huang7de1d662022-09-13 14:19:24 +0800831 data = (char*) p->readInplace(len);
q.huang16dcb0f2022-09-07 09:17:37 +0800832 *data_len=len;
rjw776c85f2022-10-21 15:09:21 +0800833
q.huang16dcb0f2022-09-07 09:17:37 +0800834 return data;
835}
836
837int lynq_query_radio_state(int *radio_state)
838{
q.huang52921662022-10-20 15:25:45 +0800839 if(g_module_init_flag != MODULE_RUNNING)
840 {
841 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
842 return LYNQ_E_CONFLICT;
843 }
q.huang16dcb0f2022-09-07 09:17:37 +0800844 if(NULL == radio_state)
845 {
846 LYERRLOG("%s radio state is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800847 return LYNQ_E_PARAMETER_ANONALY;
q.huang16dcb0f2022-09-07 09:17:37 +0800848 }
849
q.huang7de1d662022-09-13 14:19:24 +0800850 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +0800851 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"%s","AT+CFUN");
852 if(ret!=RESULT_OK)
q.huang16dcb0f2022-09-07 09:17:37 +0800853 {
q.huang52921662022-10-20 15:25:45 +0800854 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
855 return ret;
856 }
q.huang7de1d662022-09-13 14:19:24 +0800857
q.huang52921662022-10-20 15:25:45 +0800858 int bfind=false;
859 const char* data;
860 int data_len;
861 char* data_str;
862 char* start;
863 int length;
864 int i;
865 int num_start;
866 data = lynq_get_raw_data(p,&data_len);
867 if(data==NULL || data_len == 0)
868 {
869 LYERRLOG("%s lynq_get_raw_data NULL or data_len is 0",__func__);
q.huang7de1d662022-09-13 14:19:24 +0800870 delete p;
q.huang52921662022-10-20 15:25:45 +0800871 return LYNQ_E_INNER_ERROR;
q.huang16dcb0f2022-09-07 09:17:37 +0800872 }
q.huang52921662022-10-20 15:25:45 +0800873 data_str = (char*) calloc(1,data_len+1);
874 if (NULL == data_str)
875 {
876 LYERRLOG("%s alloc mem error, data_len is %d",__func__,data_len+1);
877 delete p;
878 return LYNQ_E_MALLOC_ERROR;
879 }
880 memmove(data_str, data, data_len);
881 data_str[data_len]='\0';
882 LYINFLOG("%s return string is %s",__func__,data_str);
883 start = strstr(data_str,"CFUN");
884 if(start!=NULL)
885 {
886 start=start+4;
887 length=strlen(start);
888 for(i=0; i<length;i++)
889 {
890 if((!bfind) && (start[i] >= '0') && (start[i] <= '9'))
891 {
892 bfind=true;
893 num_start=i;
894 }
895 else if(bfind && ((start[i] < '0') || (start[i] > '9')))
896 {
897 start[i]='\0';
898 break;
899 }
900 }
901 if(bfind)
902 {
903 (*radio_state) = atoi(start+num_start);
904 LYINFLOG("%s, radio state is %s %d",__func__,start+num_start,*radio_state);
905 free(data_str);
906 delete p;
907 return RESULT_OK;
908 }
909 }
910 LYERRLOG("%s return string %s no cfun or no digit",__func__,data_str);
911 free(data_str);
912 delete p;
913 return LYNQ_E_INNER_ERROR;
q.huang16dcb0f2022-09-07 09:17:37 +0800914}
915
rjw7e50cd32022-01-18 18:30:37 +0800916int lynq_query_radio_tech(int* radioTech)
917{
q.huang52921662022-10-20 15:25:45 +0800918 if(g_module_init_flag != MODULE_RUNNING)
919 {
920 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
921 return LYNQ_E_CONFLICT;
922 }
rjw7e50cd32022-01-18 18:30:37 +0800923 if(NULL == radioTech)
rjw7e50cd32022-01-18 18:30:37 +0800924 {
q.huang7de1d662022-09-13 14:19:24 +0800925 LYERRLOG("%s radio tech is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800926 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +0800927 }
rjw7e50cd32022-01-18 18:30:37 +0800928
q.huang7de1d662022-09-13 14:19:24 +0800929 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +0800930 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_VOICE_RADIO_TECH,0,"");
931
932 if(ret!=RESULT_OK)
rjw46769c92022-07-04 21:17:25 +0800933 {
q.huang52921662022-10-20 15:25:45 +0800934 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
935 return ret;
936 }
q.huang7de1d662022-09-13 14:19:24 +0800937
q.huang52921662022-10-20 15:25:45 +0800938 int num;
939 p->readInt32(&num);
940 p->readInt32(radioTech);
q.huang7de1d662022-09-13 14:19:24 +0800941
q.huang52921662022-10-20 15:25:45 +0800942 LYINFLOG("%s suc",__func__);
943 delete p;
944 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +0800945}
946
947int lynq_solicited_signal_strength(signalStrength_t *solSigStren)
948{
q.huang52921662022-10-20 15:25:45 +0800949 if(g_module_init_flag != MODULE_RUNNING)
950 {
951 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
952 return LYNQ_E_CONFLICT;
953 }
rjw7e50cd32022-01-18 18:30:37 +0800954 if(NULL == solSigStren)
rjw7e50cd32022-01-18 18:30:37 +0800955 {
q.huang7de1d662022-09-13 14:19:24 +0800956 LYERRLOG("%s parameter is NULL",__func__);
q.huang52921662022-10-20 15:25:45 +0800957 return LYNQ_E_PARAMETER_ANONALY;
rjw7e50cd32022-01-18 18:30:37 +0800958 }
959
q.huang7de1d662022-09-13 14:19:24 +0800960 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +0800961 int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SIGNAL_STRENGTH,0,"");
962 if(ret!=RESULT_OK)
rjw46769c92022-07-04 21:17:25 +0800963 {
q.huang52921662022-10-20 15:25:45 +0800964 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
965 return ret;
966 }
967
968 int sum = 0;
969 int LTE_signalstrength = 0;
970 int WCDMA_signalstrength = 0;
971 int none = 0;
rjw7e50cd32022-01-18 18:30:37 +0800972
q.huang52921662022-10-20 15:25:45 +0800973 p->readInt32(&solSigStren->rssi);
974 if((solSigStren->rssi!=99)&&(solSigStren->rssi!=0))
975 {
976 solSigStren->gw_sig_valid = 1;
977 }else{
978 solSigStren->gw_sig_valid = 0;
rjw7e50cd32022-01-18 18:30:37 +0800979 }
q.huang7de1d662022-09-13 14:19:24 +0800980
q.huang52921662022-10-20 15:25:45 +0800981 p->readInt32(&none);
982 p->readInt32(&none);
983 p->readInt32(&none);
984 p->readInt32(&none);
985 p->readInt32(&none);
986 p->readInt32(&none);
987 p->readInt32(&none);
988 p->readInt32(&LTE_signalstrength);
989 // p->readInt32(&solSigStren->signalStrength.LTE_SignalStrength.signalStrength);
990 p->readInt32(&solSigStren->rsrp);
991 p->readInt32(&solSigStren->rsrq);
992 p->readInt32(&solSigStren->rssnr);
993 LYINFLOG("LTE_signalstrength:%d",LTE_signalstrength);
994 if((LTE_signalstrength!=99)&&(LTE_signalstrength!=0))
995 {
996 solSigStren->lte_sig_valid = 1;
997 }else{
998 solSigStren->lte_sig_valid = 0;
999 }
q.huang7de1d662022-09-13 14:19:24 +08001000
q.huang52921662022-10-20 15:25:45 +08001001 p->readInt32(&none);
1002 p->readInt32(&none);
1003 p->readInt32(&none);
1004 p->readInt32(&none);
1005 p->readInt32(&none);
1006 p->readInt32(&WCDMA_signalstrength);
1007 p->readInt32(&none);
1008 p->readInt32(&solSigStren->rscp);
1009 p->readInt32(&solSigStren->ecno);
1010 LYINFLOG("WCDMA_signalstrength:%d",WCDMA_signalstrength);
1011 if((WCDMA_signalstrength!=99)&&(WCDMA_signalstrength!=0))
1012 {
1013 solSigStren->wcdma_sig_valid = 1;
1014 }else{
1015 solSigStren->wcdma_sig_valid = 0;
1016 }
1017 /*bug fix*/
1018 p->readInt32(&solSigStren->ssRsrp);
1019 p->readInt32(&solSigStren->ssRsrq);
1020 p->readInt32(&solSigStren->ssSinr);
1021 p->readInt32(&solSigStren->csiRsrp);
1022 p->readInt32(&solSigStren->csiRsrq);
1023 p->readInt32(&solSigStren->csiSinr);
1024 sum = (solSigStren->ssRsrp) + (solSigStren->ssRsrq) + (solSigStren->ssSinr) + (solSigStren->csiRsrp)+\
1025 (solSigStren->csiRsrq) + (solSigStren->csiSinr);
1026 if(sum != 0)
1027 {
1028 solSigStren->nr_sig_valid = 1;
1029 }else{
1030 LYERRLOG("None of NR signal info");
1031 }
1032
1033 LYINFLOG("%s suc",__func__);
1034 delete p;
1035 return RESULT_OK;
rjw7e50cd32022-01-18 18:30:37 +08001036}
rjwbc8a05f2022-03-02 15:23:11 +08001037
rjw4a5a78d2022-03-10 11:04:24 +08001038int lynq_set_ims(const int ims_mode)
1039{
q.huang52921662022-10-20 15:25:45 +08001040 if(g_module_init_flag != MODULE_RUNNING)
q.huang7de1d662022-09-13 14:19:24 +08001041 {
q.huang52921662022-10-20 15:25:45 +08001042 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1043 return LYNQ_E_CONFLICT;
q.huang7de1d662022-09-13 14:19:24 +08001044 }
rjw4a5a78d2022-03-10 11:04:24 +08001045 if (ims_mode < 0 || ims_mode > 1)
1046 {
q.huang7de1d662022-09-13 14:19:24 +08001047 LYERRLOG("%s parameter %d error",__func__,ims_mode);
q.huang52921662022-10-20 15:25:45 +08001048 return LYNQ_E_PARAMETER_ANONALY;
q.huang7de1d662022-09-13 14:19:24 +08001049 }
rjw4a5a78d2022-03-10 11:04:24 +08001050
q.huang52921662022-10-20 15:25:45 +08001051 Parcel* p=NULL;
1052 int ret = lynq_send_common_request(p,65,RIL_REQUEST_SET_IMS_ENABLE,1,"%d",ims_mode);
1053 if(ret!=RESULT_OK)
1054 {
1055 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
1056 return ret;
1057 }
1058
1059 LYINFLOG("%s set %d suc",__func__,ims_mode);
1060 delete p;
1061 return RESULT_OK;
rjw4a5a78d2022-03-10 11:04:24 +08001062}
1063
q.huang52921662022-10-20 15:25:45 +08001064/*Used to get urc info*/
1065int lynq_get_urc_info(const int handle,signalStrength_t *solSigStren,int *slot_id)
1066{
1067 if(g_module_init_flag != MODULE_RUNNING)
1068 {
1069 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1070 return LYNQ_E_CONFLICT;
1071 }
1072 LYDBGLOG("start get urc info");
1073 if(handle != RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED &&handle != RIL_UNSOL_SIGNAL_STRENGTH)
1074 {
1075 LYINFLOG("invalid handle!!!");
1076 return LYNQ_E_PARAMETER_ANONALY;
1077 }
1078 if((handle ==RIL_UNSOL_SIGNAL_STRENGTH && NULL == solSigStren) ||
1079 (handle ==RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED && NULL == slot_id))
1080 {
1081 LYINFLOG("incoming solSigStren or slot_id is NULL!!!");
1082 return LYNQ_E_PARAMETER_ANONALY;
1083 }
1084 switch(handle)
1085 {
1086 case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: //1002
1087 {
1088 LYDBGLOG("get state update to VOICE");
1089 *slot_id = s_module_urc_slot_id;
1090 LYINFLOG("slot_id = %d",s_module_urc_slot_id);
1091 break;
1092 }
1093 case RIL_UNSOL_SIGNAL_STRENGTH: //1009
1094 {
1095 LYDBGLOG("get state update to signal info");
1096 solSigStren->gw_sig_valid = s_network_urc_solSigStren.gw_sig_valid;
1097 solSigStren->rssi = s_network_urc_solSigStren.rssi;
1098 solSigStren->wcdma_sig_valid = s_network_urc_solSigStren.wcdma_sig_valid;
1099 solSigStren->rscp = s_network_urc_solSigStren.rscp;
1100 solSigStren->ecno = s_network_urc_solSigStren.ecno;
1101 solSigStren->lte_sig_valid = s_network_urc_solSigStren.lte_sig_valid;
1102 solSigStren->rsrp = s_network_urc_solSigStren.rsrp;
1103 solSigStren->rsrq = s_network_urc_solSigStren.rsrq;
1104 solSigStren->rssnr = s_network_urc_solSigStren.rssnr;
1105 solSigStren->nr_sig_valid = s_network_urc_solSigStren.nr_sig_valid;
1106 solSigStren->ssRsrp = s_network_urc_solSigStren.ssRsrp;
1107 solSigStren->ssRsrq = s_network_urc_solSigStren.ssRsrq;
1108 solSigStren->ssSinr = s_network_urc_solSigStren.ssSinr;
1109 solSigStren->csiRsrp = s_network_urc_solSigStren.csiRsrp;
1110 solSigStren->csiRsrq = s_network_urc_solSigStren.csiRsrq;
1111 solSigStren->csiSinr = s_network_urc_solSigStren.csiSinr;
1112 break;
1113 }
1114 }
1115 return RESULT_OK;
1116}
1117
l.yangad3fe722023-10-31 20:40:37 -07001118
1119/*****************************************
1120* @brief:sned at request ,close or open SBP
1121* @param count [IN]:sbp_flag 0:close 1:open
1122* @param sum [OUT]:NA
1123* @return :NA
1124* @todo:
1125* @see:NA
1126* @warning:NA
1127******************************************/
1128int lynq_set_feature_config_sbp(int sbp_flag)
1129{
1130 int ret = 0;
1131 Parcel* p=NULL;
1132
1133 if(sbp_flag != OPEN && sbp_flag != CLOSE)
1134 {
1135 LYERRLOG("Bad input paramater ,you need input 0 or 1 !!!");
1136 return RESULT_ERROR;
1137 }
1138 if(sbp_flag == OPEN)
1139 {
1140 ret = lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"%s",SET_SBP_OPEN);
1141 }
1142 else if(sbp_flag == CLOSE)
1143 {
1144 ret = lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"%s",SET_SBP_CLOSE);
1145 }
1146 if(ret != RESULT_OK)
1147 {
1148
1149 LYERRLOG("%s lynq_send_common_request failure, ret is %d",__func__,ret);
1150 return ret;
1151 }
1152 return 0;
1153}
1154
1155/*****************************************
1156* @brief:send at request,get sbp status
1157* @param count [IN]:NA
1158* @param sum [OUT]:sbp_status
1159* @return :NA
1160* @todo:
1161* @see:NA
1162* @warning:NA
1163******************************************/
1164int lynq_query_feature_config_sbp(int *sbp_status )
1165{
1166 int ret = 0;
1167 Parcel* p=NULL;
1168
1169 ret = lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"%s",QUERY_SBP_STATUS);
1170 if(ret != RESULT_OK)
1171 {
1172
1173 LYERRLOG("%s lynq_send_common_request failure, ret is %d",__func__,ret);
1174 return ret;
1175 }
1176
1177
1178 const char* data;
1179 int data_len;
1180 char* data_str;
1181 char* start;
1182 char status[8] = {'0'};
1183 data = lynq_get_raw_data(p,&data_len);
1184 if(data==NULL || data_len == 0)
1185 {
1186 LYERRLOG("%s lynq_get_raw_data NULL or data_len is 0",__func__);
1187 delete p;
1188 return LYNQ_E_INNER_ERROR;
1189 }
1190 data_str = (char*) calloc(1,data_len+1);
1191 if (NULL == data_str)
1192 {
1193 LYERRLOG("%s alloc mem error, data_len is %d",__func__,data_len+1);
1194 delete p;
1195 return LYNQ_E_MALLOC_ERROR;
1196 }
1197 memmove(data_str, data, data_len);
1198 data_str[data_len]='\0';
1199 LYINFLOG("%s return string is %s",__func__,data_str);
1200 start = strchr(data_str,':');
1201 if(start != NULL)
1202 {
1203 strncpy(status,start+1,4);
1204 *sbp_status = atoi(status);
1205 LYINFLOG("Query sbp status is %d",*sbp_status);
1206 return RESULT_OK;
1207
1208 }
1209 else
1210 {
1211 LYERRLOG("Query sbp status Failed");
1212 return LYNQ_E_INNER_ERROR;
1213 }
1214
1215}
1216
1217
q.huang52921662022-10-20 15:25:45 +08001218static pthread_mutex_t urc_signal_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
1219static pthread_cond_t urc_signal_state_change_cond = PTHREAD_COND_INITIALIZER;
1220
1221int wait_urc_signal_changes()
1222{
1223 pthread_mutex_lock(&urc_signal_state_change_mutex);
1224 pthread_cond_wait(&urc_signal_state_change_cond,&urc_signal_state_change_mutex);
1225 pthread_mutex_unlock(&urc_signal_state_change_mutex);
1226 return RESULT_OK;
1227}
1228
1229void send_urc_signal_changes()
1230{
1231 pthread_mutex_lock(&urc_signal_state_change_mutex);
1232 pthread_cond_signal(&urc_signal_state_change_cond);
1233 pthread_mutex_unlock(&urc_signal_state_change_mutex);
1234 return;
1235}
1236
q.huang036b6cf2023-01-10 14:29:20 +08001237bool is_support_urc(int urc_id)
1238{
1239 switch(urc_id)
1240 {
1241 case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED:
1242 case RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED:
1243 case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED:
1244 case RIL_UNSOL_SIGNAL_STRENGTH:
1245 return true;
1246 default:
1247 return false;
1248 }
1249}
1250
q.huang52921662022-10-20 15:25:45 +08001251void urc_msg_process(Parcel *p)
1252{
1253 int resp_type;
1254 int none = 0;
1255 int NR_sum = 0;
1256 int urc_LTE_signalstrength = 0;
1257 int urc_WCDMA_signalstrength = 0;
1258
q.huang036b6cf2023-01-10 14:29:20 +08001259 int size=p->dataSize();
q.huang52921662022-10-20 15:25:45 +08001260 p->readInt32(&resp_type);
1261 p->readInt32(&s_module_wait_urc_id);
1262 p->readInt32(&s_module_urc_slot_id);
q.huang036b6cf2023-01-10 14:29:20 +08001263 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 +08001264 switch(s_module_wait_urc_id)
1265 {
1266 case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED:
1267 {
1268 set_state_buffer_valid(NETWORK_STATE_BUFFER_TYPE_VOICE_REG,false);
1269 send_urc_signal_changes();
1270 break;
1271 }
1272 case RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED:
1273 {
1274 set_state_buffer_valid(NETWORK_STATE_BUFFER_TYPE_DATA_REG,false);
1275 send_urc_signal_changes();
1276 break;
1277 }
1278 case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED:
1279 {
1280 set_state_buffer_valid(NETWORK_STATE_BUFFER_TYPE_IMS_REG,false);
1281 send_urc_signal_changes();
1282 break;
1283 }
1284 case RIL_UNSOL_SIGNAL_STRENGTH:
1285 {
1286 p->readInt32(&s_network_urc_solSigStren.rssi);
1287 if((s_network_urc_solSigStren.rssi!=99)&&(s_network_urc_solSigStren.rssi!=0))
1288 {
1289 s_network_urc_solSigStren.gw_sig_valid = 1;
1290 }else{
1291 s_network_urc_solSigStren.gw_sig_valid = 0;
1292 }
1293 if(s_network_urc_solSigStren.gw_sig_valid == 1)
1294 {
1295 LYINFLOG("urc_GSM_signalstrength:%d",s_network_urc_solSigStren.rssi);
1296 }
1297 p->readInt32(&none);
1298 p->readInt32(&none);
1299 p->readInt32(&none);
1300 p->readInt32(&none);
1301 p->readInt32(&none);
1302 p->readInt32(&none);
1303 p->readInt32(&none);
1304 p->readInt32(&urc_LTE_signalstrength);
1305 // p.readInt32(&solSigStren->signalStrength.LTE_SignalStrength.signalStrength);
1306 p->readInt32(&s_network_urc_solSigStren.rsrp);
1307 p->readInt32(&s_network_urc_solSigStren.rsrq);
1308 p->readInt32(&s_network_urc_solSigStren.rssnr);
1309 if((urc_LTE_signalstrength!=99)&&(urc_LTE_signalstrength!=0))
1310 {
1311 s_network_urc_solSigStren.lte_sig_valid = 1;
1312 }else{
1313 s_network_urc_solSigStren.lte_sig_valid = 0;
1314 }
1315 if(s_network_urc_solSigStren.lte_sig_valid == 1)
1316 {
1317 LYINFLOG("urc_LTE_signalstrength:%d",urc_LTE_signalstrength);
1318 }
1319 p->readInt32(&none);
1320 p->readInt32(&none);
1321 p->readInt32(&none);
1322 p->readInt32(&none);
1323 p->readInt32(&none);
1324 p->readInt32(&urc_WCDMA_signalstrength);
1325 p->readInt32(&none);
1326 p->readInt32(&s_network_urc_solSigStren.rscp);
1327 p->readInt32(&s_network_urc_solSigStren.ecno);
1328 if((urc_WCDMA_signalstrength!=99)&&(urc_WCDMA_signalstrength!=0))
1329 {
1330 s_network_urc_solSigStren.wcdma_sig_valid = 1;
1331 }else{
1332 s_network_urc_solSigStren.wcdma_sig_valid = 0;
1333 }
1334 if(s_network_urc_solSigStren.wcdma_sig_valid == 1)
1335 {
1336 LYINFLOG("urc_WCDMA_signalstrength:%d",urc_WCDMA_signalstrength);
1337 }
1338 p->readInt32(&s_network_urc_solSigStren.ssRsrp);
1339 p->readInt32(&s_network_urc_solSigStren.ssRsrq);
1340 p->readInt32(&s_network_urc_solSigStren.ssSinr);
1341 p->readInt32(&s_network_urc_solSigStren.csiRsrp);
1342 p->readInt32(&s_network_urc_solSigStren.csiRsrq);
1343 p->readInt32(&s_network_urc_solSigStren.csiSinr);
1344 NR_sum = (s_network_urc_solSigStren.ssRsrp) + (s_network_urc_solSigStren.ssRsrq) + (s_network_urc_solSigStren.ssSinr) + (s_network_urc_solSigStren.csiRsrp)+\
1345 (s_network_urc_solSigStren.csiRsrq) + (s_network_urc_solSigStren.csiSinr);
1346 if(NR_sum != 0)
1347 {
1348 s_network_urc_solSigStren.nr_sig_valid = 1;
1349 }else{
1350 s_network_urc_solSigStren.nr_sig_valid = 0;
1351 }
1352 if(s_network_urc_solSigStren.nr_sig_valid == 1)
1353 {
1354 LYINFLOG("[NR signal]ssRsrp is %d , ssRsrq is %d , ssSinr is %d , csiRsrp is %d , csiRsrq is %d , csiSinr is %d",\
1355 s_network_urc_solSigStren.ssRsrp,s_network_urc_solSigStren.ssRsrq,s_network_urc_solSigStren.ssSinr, \
1356 s_network_urc_solSigStren.csiRsrp,s_network_urc_solSigStren.csiRsrq,s_network_urc_solSigStren.csiSinr);
1357 }
1358 send_urc_signal_changes();
1359 break;
1360 }
1361 }
1362}
rjw4a5a78d2022-03-10 11:04:24 +08001363
rjwbc8a05f2022-03-02 15:23:11 +08001364/*Used to wait for an update signal*/
1365int lynq_wait_signalchanges(int *handle)
1366{
1367 LYDBGLOG("start wait signalchanges info");
1368 if(NULL == handle)
1369 {
1370 LYERRLOG("illegal input");
q.huang52921662022-10-20 15:25:45 +08001371 return LYNQ_E_PARAMETER_ANONALY;
rjwbc8a05f2022-03-02 15:23:11 +08001372 }
q.huang52921662022-10-20 15:25:45 +08001373 wait_urc_signal_changes();
rjwbc8a05f2022-03-02 15:23:11 +08001374 LYDBGLOG("get signalchanges");
q.huang52921662022-10-20 15:25:45 +08001375 *handle = s_module_wait_urc_id;
1376 return RESULT_OK;
rjw4200a082022-05-17 17:58:35 +08001377}
lh3a26dd52022-07-01 04:44:57 -07001378
q.huang52921662022-10-20 15:25:45 +08001379#ifdef MODEM_GEN97
lh3a26dd52022-07-01 04:44:57 -07001380/**@brief parse at response,return error code,and the response
1381* @param response [IN] <response>:original at response,This parameter must be a character array.
1382
1383* @param value [OUT] <value>: Used to receive the parsed value, if multiple values are separated by ";".
1384* field:
1385* eg:
1386* "+cnum: 123456\n+cnum: 456"
1387* value:12345;456;
1388* @param value_len [IN] <value_len>: The value length.
1389
1390* @return:AT error code
1391*/
1392static int parse_at_result(char response[],char value[],int value_len)
1393{
1394 if(response == NULL || value == NULL)
1395 {
1396 LYERRLOG("parameter invalid");
q.huang52921662022-10-20 15:25:45 +08001397 return LYNQ_E_PARAMETER_ANONALY;
lh3a26dd52022-07-01 04:44:57 -07001398 }
1399 if(strstr(response,"ERROR"))
1400 {
1401 int i;
1402 for(i = 0;i < strlen(response);i++)
1403 {
1404 if(response[i]==':')
1405 {
1406 break;
1407 }
1408 }
1409 if(i < strlen(response))
1410 {
1411 LYINFLOG("parse_result:%d\n",atoi(response+i+1));
1412 return atoi(response+i+1);
1413 }
1414 else
1415 {
1416 LYINFLOG("%s parse_result:fail,this response invalid\n",response);
1417 return 100; //unknown
1418 }
1419 }
1420 else if(strstr(response,"OK"))
1421 {
1422 /** parse the at response value
1423 * eg:
1424 * --> at+cnum
1425 * <-- +CNUM:"1243452"
1426 * need parse the "1243452" to <value>
1427 *@ To-Do
1428 */
1429 int count;
1430 int resp_addr[32] = {0};
1431 char temp_buf[1024] = {0};
1432 char *dest;
1433 dest = NULL;
1434 count = 0;
1435 int res_len = strlen(response);
1436 LYINFLOG("res_len:%d",res_len);
1437 for(int i = 0; i < res_len; i++)
1438 {
1439 if(response[i]==':')
1440 {
1441 resp_addr[count] = i;
1442 count++;
1443 }
1444 if(response[i] == '\n')
1445 {
1446 response[i] = '\0';
1447 }
1448 }
1449 LYINFLOG("count:%d",count);
1450 if(count > 0)
1451 {
1452 for(int i = 0; i < count; i++)
1453 {
1454 if((strlen(temp_buf) + strlen(response+resp_addr[i]+2)) >= 1023)
1455 {
1456 LYINFLOG("2 will be out of range\n");
1457 break;
1458 }
1459 if(strlen(temp_buf) >= 1023)
1460 {
1461 LYINFLOG("1 will be out of range\n");
1462 break;
1463 }
1464 strcat(temp_buf,response+resp_addr[i]+2);
1465
1466 if(strlen(temp_buf) >= 1023)
1467 {
1468 LYINFLOG("1 will be out of range\n");
1469 break;
1470 }
1471 strcat(temp_buf,";");
1472 printf("parse_result[%d]:%s,strcated:%s\n",i,response+resp_addr[i]+2,temp_buf);
1473 }
1474 LYINFLOG("parse_result:%s\n",temp_buf);
1475 if(strlen(temp_buf) > value_len)
1476 {
1477 printf("result length over value:%ld,%d\n",strlen(temp_buf),value_len);
1478 memcpy(value,temp_buf,value_len);
1479 }
1480 else
1481 {
1482 memcpy(value,temp_buf,strlen(temp_buf));
1483 }
1484 }
q.huang52921662022-10-20 15:25:45 +08001485 return RESULT_OK;
lh3a26dd52022-07-01 04:44:57 -07001486 }
1487 else
1488 {
1489 LYINFLOG("%s this response invalid\n",response);
q.huang52921662022-10-20 15:25:45 +08001490 return LYNQ_E_INNER_ERROR;
lh3a26dd52022-07-01 04:44:57 -07001491 }
1492}
lh3a26dd52022-07-01 04:44:57 -07001493
1494int lynq_oos_recover_timer_interval(int mode, char interval[LY_RECOVER_TIMER_INTERVAL],char result[LY_RECOVER_TIMER_INTERVAL])
1495{
q.huang52921662022-10-20 15:25:45 +08001496 if(g_module_init_flag != MODULE_RUNNING)
1497 {
1498 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1499 return LYNQ_E_CONFLICT;
1500 }
1501
q.huang7de1d662022-09-13 14:19:24 +08001502 if((mode < 0) || (mode >1) || (mode == 0 && NULL == interval) || (NULL == result))
lh3a26dd52022-07-01 04:44:57 -07001503 {
q.huang7de1d662022-09-13 14:19:24 +08001504 LYERRLOG("%s mode %d interval %s result %s error",__func__,mode,interval,result);
q.huang52921662022-10-20 15:25:45 +08001505 return LYNQ_E_PARAMETER_ANONALY;
lh3a26dd52022-07-01 04:44:57 -07001506 }
1507
q.huang7de1d662022-09-13 14:19:24 +08001508 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +08001509 int ret;
q.huang7de1d662022-09-13 14:19:24 +08001510
lh3a26dd52022-07-01 04:44:57 -07001511 if(mode == 0)
1512 {
q.huang52921662022-10-20 15:25:45 +08001513 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 -07001514 }
q.huang7de1d662022-09-13 14:19:24 +08001515 else
lh3a26dd52022-07-01 04:44:57 -07001516 {
q.huang52921662022-10-20 15:25:45 +08001517 ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"AT+ERSCFG?");
lh3a26dd52022-07-01 04:44:57 -07001518 }
q.huang7de1d662022-09-13 14:19:24 +08001519
q.huang52921662022-10-20 15:25:45 +08001520 if(ret!=RESULT_OK)
lh3a26dd52022-07-01 04:44:57 -07001521 {
q.huang52921662022-10-20 15:25:45 +08001522 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
1523 return ret;
1524 }
q.huang7de1d662022-09-13 14:19:24 +08001525
q.huang52921662022-10-20 15:25:45 +08001526 int recv_len;
1527 char res_data[LY_RECOVER_TIMER_INTERVAL] = {0};
1528 char response_interval[LY_RECOVER_TIMER_INTERVAL*2] = {0};
q.huang7de1d662022-09-13 14:19:24 +08001529
q.huang52921662022-10-20 15:25:45 +08001530 LYINFLOG("get recover timer interval");
1531 p->readInt32(&recv_len);
1532 if(recv_len == -1)
1533 {
1534 LYINFLOG("no responset");
q.huang7de1d662022-09-13 14:19:24 +08001535 delete p;
q.huang52921662022-10-20 15:25:45 +08001536 return LYNQ_E_INNER_ERROR;
lh3a26dd52022-07-01 04:44:57 -07001537 }
q.huang52921662022-10-20 15:25:45 +08001538 else
1539 {
1540 LYINFLOG("recv_len:%d",recv_len);
1541 p->read(response_interval,recv_len);
1542 }
1543 LYINFLOG("response_interval:%s",response_interval);
1544 ret = parse_at_result(response_interval,res_data,LY_RECOVER_TIMER_INTERVAL);
1545 if(mode == 1)
1546 {
1547 if(strlen(res_data) <= LY_RECOVER_TIMER_INTERVAL)
1548 {
1549 memcpy(result,res_data,strlen(res_data));
1550 }
1551 }
1552 LYERRLOG("%s ret:%d",__func__,ret);
1553 delete p;
1554 return ret;
lh3a26dd52022-07-01 04:44:57 -07001555}
1556
1557int lynq_oos_deep_sleep_recover_timer_interval(int recovery_threshold,int fullband_timer,int sniffer_timer,int inactive_mode)
1558{
q.huang52921662022-10-20 15:25:45 +08001559 if(g_module_init_flag != MODULE_RUNNING)
1560 {
1561 LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
1562 return LYNQ_E_CONFLICT;
1563 }
Hong_Liu13009ef2023-05-10 09:08:56 -07001564 if(((recovery_threshold < 2) || (recovery_threshold > 10)) || (fullband_timer < 90) ||
lh3a26dd52022-07-01 04:44:57 -07001565 ((sniffer_timer < 10) || (sniffer_timer > 60)) || ((inactive_mode < 0) || (inactive_mode > 1)))
1566 {
q.huang52921662022-10-20 15:25:45 +08001567 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);
1568 return LYNQ_E_PARAMETER_ANONALY;
lh3a26dd52022-07-01 04:44:57 -07001569 }
1570
q.huang7de1d662022-09-13 14:19:24 +08001571 Parcel* p=NULL;
q.huang52921662022-10-20 15:25:45 +08001572 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 +08001573
q.huang52921662022-10-20 15:25:45 +08001574 if(ret!=RESULT_OK)
lh3a26dd52022-07-01 04:44:57 -07001575 {
q.huang52921662022-10-20 15:25:45 +08001576 LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);
1577 return ret;
1578 }
1579
1580 int recv_len;
1581 char res_data[LY_RECOVER_TIMER_INTERVAL] = {0};
1582 char response_interval[LY_RECOVER_TIMER_INTERVAL*2] = {0};
1583
1584 p->readInt32(&recv_len);
1585 if(recv_len == -1)
1586 {
1587 LYINFLOG("no responset");
q.huang7de1d662022-09-13 14:19:24 +08001588 delete p;
q.huang52921662022-10-20 15:25:45 +08001589 return LYNQ_E_INNER_ERROR;
lh3a26dd52022-07-01 04:44:57 -07001590 }
q.huang52921662022-10-20 15:25:45 +08001591 else
1592 {
1593 LYINFLOG("recv_len:%d",recv_len);
1594 p->read(response_interval,recv_len);
1595 }
1596 LYINFLOG("response_interval:%s",response_interval);
1597 ret = parse_at_result(response_interval,res_data,LY_RECOVER_TIMER_INTERVAL);
1598 LYERRLOG("%s ret:%d",__func__,ret);
1599 delete p;
1600 return ret;
1601
lh3a26dd52022-07-01 04:44:57 -07001602}
1603#endif
1604