blob: 51598e905cb9cf3cfb468540016a20a13e9527a8 [file] [log] [blame]
liubin281ac462023-07-19 14:22:54 +08001#include "ql/ql_nw.h"
2#include "mbtk_type.h"
3#include "mbtk_info_api.h"
4
5extern mbtk_info_handle_t* ql_info_handle;
6extern int ql_info_handle_num;
7static bool inited = FALSE;
8
liuyangc989a662024-07-10 19:02:23 +08009#define SIGNAL_STRENGTH_INVALID_1 99
10#define SIGNAL_STRENGTH_INVALID_2 255
11
12
liubin281ac462023-07-19 14:22:54 +080013typedef struct
14{
15 uint8 *operator_l;
16 uint8 *operator_s;
17 uint32 mcc_mnc;
18} operator_mcc_mnc_t;
19
20typedef struct
21{
22 QL_NW_EventHandlerFunc_t handlerPtr;
23 void* contextPtr;
24} ql_cust_cb_func;
25
26static ql_cust_cb_func ql_func_cb_handle;
27
28static int roaming_pref = 1; // Open roaming for default.
29
30static operator_mcc_mnc_t operator_mcc_mnc [] =
31{
32 {"China Mobile","CMCC",46000},
33 {"China Unicom","CU",46001},
34 {"China Mobile","CMCC",46002},
35 {"China Telecom","CT",46003},
36 {"China Mobile","CMCC",46004},
37 {"China Telecom","CT",46005},
38 {"China Unicom","CU",46006},
39 {"China Mobile","CMCC",46007},
40 {"China Mobile","CMCC",46008},
41 {"China Unicom","CU",46009},
42 {"China Telecom","CT",46011}
43};
44
45typedef enum {
46 RADIO_TECH_3GPP = 1, /* 3GPP Technologies - GSM, WCDMA */
47 RADIO_TECH_3GPP2 = 2 /* 3GPP2 Technologies - CDMA */
48} RIL_RadioTechnologyFamily;
49
50void ql_nw_state_change_cb(const void* data, int data_len)
51{
52 ///mbtk_net_info_t *reg = (mbtk_net_info_t *)data;
53 uint8 *net_data = NULL;
54
55 net_data = (uint8*)data;
56 /*
57 uint8 data[3];
58 data[0] = (uint8)MBTK_NET_CS_STATE;
59
60 net_data[0] = *(uint8 *)(data); //MBTK_NET_PS_STATE
61 net_data[1] = *(uint8 *)(data + sizeof(uint8)); //mbtk_net_reg_state_enum state Reg State
62 net_data[2] = *(uint8 *)(data + sizeof(uint8) + sizeof(uint8)); //act
63 */
64 if(roaming_pref == 0)
65 {
66 mbtk_modem_info_t info;
67 if(*net_data == 5)
68 {
69 info.fun=4;
70 //ql_netw_status_cb(5);
71 }
72 else
73 info.fun=1;
74 info.rst=0;
liuyang4d35fdd2024-07-18 10:55:02 +080075 //mbtk_set_modem_fun(ql_info_handle, &info);
liubin281ac462023-07-19 14:22:54 +080076 }
77
78 if(ql_func_cb_handle.handlerPtr != NULL)
79 {
80 ql_func_cb_handle.handlerPtr(QL_NW_IND_DATA_REG_EVENT_FLAG,&(net_data[2]), sizeof(&(net_data[2])), NULL);
81 }
82}
83
84QL_NW_ERROR_CODE ql_nw_init()
85{
86 if(!inited && ql_info_handle == NULL)
87 {
88 ql_info_handle = mbtk_info_handle_get();
89 if(ql_info_handle)
90 {
91 ql_info_handle_num++;
92 inited = TRUE;
93 return QL_NW_SUCCESS;
94 } else {
95 LOGE("mbtk_info_handle_get() fail.");
96 return QL_NW_GENERIC_FAILURE;
97 }
98 } else {
99 if(!inited) {
100 ql_info_handle_num++;
101 inited = TRUE;
102 }
103 return QL_NW_SUCCESS;
104 }
105}
106
107QL_NW_ERROR_CODE ql_nw_release()
108{
109 if(ql_info_handle)
110 {
111 LOGD("ql_info_handle_num = %d", ql_info_handle_num);
112 if(ql_info_handle_num == 1) { // 最后一个引用,可释放。
113 int ret = mbtk_info_handle_free(&ql_info_handle);
114 if(ret) {
115 LOGE("mbtk_info_handle_free() fail.");
116 return QL_NW_GENERIC_FAILURE;
117 }
118 else
119 {
120 ql_info_handle_num = 0;
121 ql_info_handle = NULL;
122 return QL_NW_SUCCESS;
123 }
124 } else {
125 ql_info_handle_num--;
126 return QL_NW_SUCCESS;
127 }
128 }
129 else
130 {
131 LOGE("NW handle not inited.");
132 return QL_NW_GENERIC_FAILURE;
133 }
134}
135
136static uint8 net_pre_change(bool mbtk_2_ql,int net_mode)
137{
138 uint8 mbtk_net_pre = 0xFF;
139
140 /*
141 QL_NW_PREF_NET_TYPE_GSM_WCDMA = 0, //4
142 QL_NW_PREF_NET_TYPE_GSM_ONLY = 1, //0
143 QL_NW_PREF_NET_TYPE_WCDMA = 2, //1
144 QL_NW_PREF_NET_TYPE_GSM_WCDMA_AUTO = 3, //2
145 QL_NW_PREF_NET_TYPE_LTE_GSM_WCDMA = 9, //12
146 QL_NW_PREF_NET_TYPE_LTE_ONLY = 11, //5
147 QL_NW_PREF_NET_TYPE_LTE_WCDMA = 12, //9
148 QL_NW_PREF_NET_TYPE_LTE_GSM_GSM_PREF = 13, //7
149 QL_NW_PREF_NET_TYPE_LTE_GSM_LTE_PREF = 14, //8
150 QL_NW_PREF_NET_TYPE_LTE_GSM = 15, //6
151 QL_NW_PREF_NET_TYPE_LTE_WCDMA_WCDMA_PREF = 16, //10
152 QL_NW_PREF_NET_TYPE_LTE_WCDMA_LTE_PREF = 17, //11
153 QL_NW_PREF_NET_TYPE_LTE_GSM_WCDMA_GSM_PREF = 19, //13
154 QL_NW_PREF_NET_TYPE_LTE_GSM_WCDMA_WCDMA_PREF = 20, //14
155 QL_NW_PREF_NET_TYPE_LTE_GSM_WCDMA_LTE_PREF = 21, //15
156 */
157 /*
158 0 : GSM only
159 1 : UMTS only
160 2 : GSM/UMTS(auto)
161 3 : GSM/UMTS(GSM preferred)
162 4 : GSM/UMTS(UMTS preferred)
163 5 : LTE only
164 6 : GSM/LTE(auto)
165 7 : GSM/LTE(GSM preferred)
166 8 : GSM/LTE(LTE preferred)
167 9 : UMTS/LTE(auto)
168 10 : UMTS/LTE(UMTS preferred)
169 11 : UMTS/LTE(LTE preferred)
170 12 : GSM/UMTS/LTE(auto)
171 13 : GSM/UMTS/LTE(GSM preferred)
172 14 : GSM/UMTS/LTE(UMTS preferred)
173 15 : GSM/UMTS/LTE(LTE preferred)
174 */
175
176 if(mbtk_2_ql) {
177 switch(net_mode)
178 {
179 case MBTK_NET_PREF_GSM_UMTS_UMTS_PREF:
180 mbtk_net_pre = QL_NW_PREF_NET_TYPE_GSM_WCDMA;
181 break;
182 case MBTK_NET_PREF_GSM_ONLY:
183 mbtk_net_pre = QL_NW_PREF_NET_TYPE_GSM_ONLY;
184 break;
185 case MBTK_NET_PREF_UMTS_ONLY:
186 mbtk_net_pre = QL_NW_PREF_NET_TYPE_WCDMA;
187 break;
188 case MBTK_NET_PREF_GSM_UMTS_AUTO:
189 mbtk_net_pre = QL_NW_PREF_NET_TYPE_GSM_WCDMA_AUTO;
190 break;
191 case MBTK_NET_PREF_GSM_UMTS_LTE_AUTO:
192 mbtk_net_pre = QL_NW_PREF_NET_TYPE_LTE_GSM_WCDMA;
193 break;
194 case MBTK_NET_PREF_LTE_ONLY:
195 mbtk_net_pre = QL_NW_PREF_NET_TYPE_LTE_ONLY;
196 break;
197 case MBTK_NET_PREF_UMTS_LTE_AUTO:
198 mbtk_net_pre = QL_NW_PREF_NET_TYPE_LTE_WCDMA;
199 break;
200 case MBTK_NET_PREF_GSM_LTE_GSM_PREF:
201 mbtk_net_pre = QL_NW_PREF_NET_TYPE_LTE_GSM_GSM_PREF;
202 break;
203 case MBTK_NET_PREF_GSM_LTE_LTE_PREF:
204 mbtk_net_pre = QL_NW_PREF_NET_TYPE_LTE_GSM_LTE_PREF;
205 break;
206 case MBTK_NET_PREF_GSM_LTE_AUTO:
207 mbtk_net_pre = QL_NW_PREF_NET_TYPE_LTE_GSM;
208 break;
209 case MBTK_NET_PREF_UMTS_LTE_UMTS_PREF:
210 mbtk_net_pre = QL_NW_PREF_NET_TYPE_LTE_WCDMA_WCDMA_PREF;
211 break;
212 case MBTK_NET_PREF_UMTS_LTE_LTE_PREF:
213 mbtk_net_pre = QL_NW_PREF_NET_TYPE_LTE_WCDMA_LTE_PREF;
214 break;
215 case MBTK_NET_PREF_GSM_UMTS_LTE_GSM_PREF:
216 mbtk_net_pre = QL_NW_PREF_NET_TYPE_LTE_GSM_WCDMA_GSM_PREF;
217 break;
218 case MBTK_NET_PREF_GSM_UMTS_LTE_UMTS_PREF:
219 mbtk_net_pre = QL_NW_PREF_NET_TYPE_LTE_GSM_WCDMA_WCDMA_PREF;
220 break;
221 case MBTK_NET_PREF_GSM_UMTS_LTE_LTE_PREF:
222 mbtk_net_pre = QL_NW_PREF_NET_TYPE_LTE_GSM_WCDMA_LTE_PREF;
223 break;
224 default:
225 mbtk_net_pre = 0xFF;
226 break;
227 }
228 } else {
229 switch(net_mode)
230 {
231 case QL_NW_PREF_NET_TYPE_GSM_WCDMA:
232 mbtk_net_pre = MBTK_NET_PREF_GSM_UMTS_UMTS_PREF;
233 break;
234 case QL_NW_PREF_NET_TYPE_GSM_ONLY:
235 mbtk_net_pre = MBTK_NET_PREF_GSM_ONLY;
236 break;
237 case QL_NW_PREF_NET_TYPE_WCDMA:
238 mbtk_net_pre = MBTK_NET_PREF_UMTS_ONLY;
239 break;
240 case QL_NW_PREF_NET_TYPE_GSM_WCDMA_AUTO:
241 mbtk_net_pre = MBTK_NET_PREF_GSM_UMTS_AUTO;
242 break;
243 case QL_NW_PREF_NET_TYPE_LTE_GSM_WCDMA:
244 mbtk_net_pre = MBTK_NET_PREF_GSM_UMTS_LTE_AUTO;
245 break;
246 case QL_NW_PREF_NET_TYPE_LTE_ONLY:
247 mbtk_net_pre = MBTK_NET_PREF_LTE_ONLY;
248 break;
249 case QL_NW_PREF_NET_TYPE_LTE_WCDMA:
250 mbtk_net_pre = MBTK_NET_PREF_UMTS_LTE_AUTO;
251 break;
252 case QL_NW_PREF_NET_TYPE_LTE_GSM_GSM_PREF:
253 mbtk_net_pre = MBTK_NET_PREF_GSM_LTE_GSM_PREF;
254 break;
255 case QL_NW_PREF_NET_TYPE_LTE_GSM_LTE_PREF:
256 mbtk_net_pre = MBTK_NET_PREF_GSM_LTE_LTE_PREF;
257 break;
258 case QL_NW_PREF_NET_TYPE_LTE_GSM:
259 mbtk_net_pre = MBTK_NET_PREF_GSM_LTE_AUTO;
260 break;
261 case QL_NW_PREF_NET_TYPE_LTE_WCDMA_WCDMA_PREF:
262 mbtk_net_pre = MBTK_NET_PREF_UMTS_LTE_UMTS_PREF;
263 break;
264 case QL_NW_PREF_NET_TYPE_LTE_WCDMA_LTE_PREF:
265 mbtk_net_pre = MBTK_NET_PREF_UMTS_LTE_LTE_PREF;
266 break;
267 case QL_NW_PREF_NET_TYPE_LTE_GSM_WCDMA_GSM_PREF:
268 mbtk_net_pre = MBTK_NET_PREF_GSM_UMTS_LTE_GSM_PREF;
269 break;
270 case QL_NW_PREF_NET_TYPE_LTE_GSM_WCDMA_WCDMA_PREF:
271 mbtk_net_pre = MBTK_NET_PREF_GSM_UMTS_LTE_UMTS_PREF;
272 break;
273 case QL_NW_PREF_NET_TYPE_LTE_GSM_WCDMA_LTE_PREF:
274 mbtk_net_pre = MBTK_NET_PREF_GSM_UMTS_LTE_LTE_PREF;
275 break;
276 default:
277 mbtk_net_pre = 0xFF;
278 break;
279 }
280 }
281 return mbtk_net_pre;
282}
283
284QL_NW_ERROR_CODE ql_nw_set_config(QL_NW_CONFIG_INFO_T *pt_info)
285{
286 if(ql_info_handle == NULL || pt_info == NULL)
287 {
288 LOGE("ARG error.");
289 return QL_NW_GENERIC_FAILURE;
290 }
291
292 if(pt_info->preferred_nw_mode < QL_NW_PREF_NET_TYPE_GSM_WCDMA || pt_info->preferred_nw_mode > QL_NW_PREF_NET_TYPE_LTE_GSM_WCDMA_LTE_PREF)
293 {
294 LOGE("Unknown preferred_nw_mode(%d) error.", pt_info->preferred_nw_mode);
295 return QL_NW_GENERIC_FAILURE;
296 }
297
298 roaming_pref = pt_info->roaming_pref;
299
300 mbtk_band_info_t band;
301 memset(&band, 0, sizeof(mbtk_band_info_t));
302 band.net_pref = net_pre_change(FALSE, pt_info->preferred_nw_mode);
303 if(band.net_pref == 0xFF)
304 {
305 LOGE("net_pre_change() fail.");
306 return QL_NW_GENERIC_FAILURE;
307 }
308 if(mbtk_current_band_set(ql_info_handle, &band)) {
309 return QL_NW_GENERIC_FAILURE;
310 } else {
311 return QL_NW_SUCCESS;
312 }
313}
314
315QL_NW_ERROR_CODE ql_nw_get_config(QL_NW_CONFIG_INFO_T *pt_info)
316{
317 if(ql_info_handle == NULL || pt_info == NULL)
318 {
319 LOGE("ARG error.");
320 return QL_NW_GENERIC_FAILURE;
321 }
322 pt_info->roaming_pref = roaming_pref;
323 mbtk_band_info_t band;
324 if(mbtk_current_band_get(ql_info_handle, &band)) {
325 return QL_NW_GENERIC_FAILURE;
326 } else {
327 pt_info->preferred_nw_mode = (QL_NW_PREFERRED_NETWORK_TYPE)net_pre_change(TRUE, band.net_pref);
328 return QL_NW_SUCCESS;
329 }
330}
331
332QL_NW_ERROR_CODE ql_nw_get_nitz_time_info(QL_NW_NITZ_TIME_INFO_T *pt_info)
333{
334 if(ql_info_handle == NULL || pt_info == NULL)
335 {
336 LOGE("ARG error.");
337 return QL_NW_GENERIC_FAILURE;
338 }
339 memset(pt_info, 0x0, sizeof(QL_NW_NITZ_TIME_INFO_T));
340 char time_str[100]={0};
341 ///printf("mbtk_net_time_get begin\n");
342 int err = mbtk_net_time_get(ql_info_handle, time_str);
343 if(err) {
344 LOGE("mbtk_net_time_get() fail.");
345 return QL_NW_GENERIC_FAILURE;
346 } else {
347 memset(pt_info->nitz_time,0,32);
348 memcpy(pt_info->nitz_time,time_str,strlen(time_str));
349 if(mbtk_get_abs_time(time_str, &(pt_info->abs_time))) {
350 LOGE("mbtk_get_abs_time() fail.");
351 return QL_NW_GENERIC_FAILURE;
352 }
353
354 pt_info->leap_sec = 0;
355
356 return QL_NW_SUCCESS;
357 }
358}
359
360//--------------------------------------------------------------------------------------
361QL_NW_ERROR_CODE ql_nw_event_register(unsigned int bitmask)
362{
363 /*
364 NW_IND_VOICE_REG_EVENT_IND_FLAG 语音拨号注册事件
365 NW_IND_DATA_REG_EVENT_IND_FLAG (1 << 1) 数据拨号注册事件
366 NW_IND_SIGNAL_STRENGTH_EVENT_IND_FLAG (1 << 2) 信号强度事件
367 NW_IND_NITZ_TIME_UPDATE_EVENT_IND_FLAG (1 << 3) 网络时间更新事件
368 */
369 if(bitmask == QL_NW_IND_VOICE_REG_EVENT_FLAG)
370 {}
371 if(bitmask == QL_NW_IND_DATA_REG_EVENT_FLAG)
372 {}
373 if(bitmask == QL_NW_IND_SIGNAL_STRENGTH_EVENT_FLAG)
374 {}
375 if(bitmask == QL_NW_IND_NITZ_TIME_UPDATE_EVENT_FLAG)
376 {}
377 return QL_NW_SUCCESS;
378}
379//--------------------------------------------------------------------------------------
380
381QL_NW_ERROR_CODE ql_nw_get_operator_name(QL_NW_OPERATOR_INFO_T *pt_info)
382{
383 if(ql_info_handle == NULL || pt_info == NULL)
384 {
385 LOGE("ARG error.");
386 return QL_NW_GENERIC_FAILURE;
387 }
388 char OperatorFN[128];
389 char OperatorSH[128];
390 char MccMnc[128];
391 mbtk_net_info_t net;
392 if(!mbtk_net_sel_mode_get(ql_info_handle, &net) && net.plmn > 0)
393 {
394 // printf("Net : %d, %d, %d\n", net.net_sel_mode, net.net_type, net.plmn);
395 int i = 0;
396 while(i < ARRAY_SIZE(operator_mcc_mnc))
397 {
398 if(operator_mcc_mnc[i].mcc_mnc == net.plmn)
399 break;
400 i++;
401 }
402
403 if(i == ARRAY_SIZE(operator_mcc_mnc)) // No found mcc&mnc
404 {
405 strcpy(OperatorFN, "UNKNOWN");
406 strcpy(OperatorSH, "UNKNOWN");
407 sprintf(MccMnc, "%d", net.plmn);
408 }
409 else
410 {
411 strcpy(OperatorFN, operator_mcc_mnc[i].operator_l);
412 strcpy(OperatorSH, operator_mcc_mnc[i].operator_s);
413 sprintf(MccMnc, "%d", operator_mcc_mnc[i].mcc_mnc);
414 }
415 memset(pt_info->long_eons,0,128);
416 memcpy(pt_info->long_eons,operator_mcc_mnc[i].operator_l,strlen(operator_mcc_mnc[i].operator_l));
417 memset(pt_info->short_eons,0,128);
418 memcpy(pt_info->short_eons,operator_mcc_mnc[i].operator_s,strlen(operator_mcc_mnc[i].operator_s));
419 memset(pt_info->mcc,0,4);
420 memset(pt_info->mnc,0,4);
421 sprintf(pt_info->mcc, "%d", (operator_mcc_mnc[i].mcc_mnc)/100);
liuyang61a2cf22024-07-22 19:48:09 +0800422 if(0 == operator_mcc_mnc[i].mcc_mnc % 100)
423 {
424 strcpy(pt_info->mnc, "00");
425 }
426 else
427 {
428 sprintf(pt_info->mnc, "%d", (operator_mcc_mnc[i].mcc_mnc)%100);
429 }
liubin281ac462023-07-19 14:22:54 +0800430 //pt_info->act;
431 return QL_NW_SUCCESS;
432 }
433
434 return QL_NW_GENERIC_FAILURE;
435}
436
437QL_NW_ERROR_CODE ql_nw_perform_scan(QL_NW_SCAN_RESULT_LIST_INFO_T *pt_info)
438{
439 if(ql_info_handle == NULL || pt_info == NULL)
440 {
441 LOGE("ARG error.");
442 return -1;
443 }
444 list_node_t* net_list = NULL;
445 int ret = mbtk_available_net_get(ql_info_handle, &net_list);
446 if(ret != 0)
447 {
448 LOGE("mbtk_available_net_get fail.");
449 return QL_NW_GENERIC_FAILURE;
450 }
451 else
452 {
453 memset(pt_info, 0x0, sizeof(QL_NW_SCAN_RESULT_LIST_INFO_T));
454 mbtk_net_info_t* net = NULL;
455 list_first(net_list);
456 int i=0;
457 while ((net = (mbtk_net_info_t*) list_next(net_list)))
458 {
459 //printf("Net : %d, %d, %d, %d\n", net->net_sel_mode, net->net_type, net->net_state, net->plmn);
460 if(net->net_state == 8)
461 pt_info->entry[i].status = QL_NW_ACCESS_TECH_E_UTRAN_CA;
462 else if(net->net_state == 0xff)
463 pt_info->entry[i].status = QL_NW_ACCESS_TECH_NONE;
464 else
465 pt_info->entry[i].status = net->net_state;
466
467 int j = 0;
468 while(j < ARRAY_SIZE(operator_mcc_mnc))
469 {
470 if(operator_mcc_mnc[j].mcc_mnc == net->plmn)
471 break;
472 j++;
473 }
474 if(j == ARRAY_SIZE(operator_mcc_mnc)) // No found mcc&mnc
475 {
476 strcpy(pt_info->entry[i].operator_name.long_eons, "UNKNOWN");
477 strcpy(pt_info->entry[i].operator_name.short_eons, "UNKNOWN");
478 sprintf(pt_info->entry[i].operator_name.mcc, "%d", (net->plmn)/100);
479 sprintf(pt_info->entry[i].operator_name.mnc, "%d", (net->plmn)%100);
480 }
481 else
482 {
483 strcpy(pt_info->entry[i].operator_name.long_eons, operator_mcc_mnc[j].operator_l);
484 strcpy(pt_info->entry[i].operator_name.short_eons, operator_mcc_mnc[j].operator_s);
485 sprintf(pt_info->entry[i].operator_name.mcc, "%d", (net->plmn)/100);
486 sprintf(pt_info->entry[i].operator_name.mnc, "%d", (net->plmn)%100);
487 }
488 pt_info->entry[i].operator_name ;
489 pt_info->entry[i].act = net->net_type;
490 i++;
491 if(i > 40)
492 break;
493 }
494 pt_info->entry_len = i;
495 list_free(net_list);
496 return QL_NW_SUCCESS;
497 }
498}
499
500#if 0
501static int ql_query_registration_state(const char *type, int* regState,int *imsRegState,int * LAC, int *CID,int *netType,int * radioTechFam,int *netRejected)
502{
503 if(ql_info_handle == NULL || str_empty(type) || regState == NULL || imsRegState == NULL
504 || LAC == NULL || CID == NULL || netType == NULL || radioTechFam == NULL || netRejected == NULL)
505 {
506 return -1;
507 }
508 mbtk_net_reg_info_t reg;
509 int err = mbtk_net_reg_get(ql_info_handle, &reg);
510 if(err) {
511 *netRejected = err;
512 return -1;
513 } else {
514 //printf("REG : %d, %d, %d, %04x, %08o\n", reg.state, reg.type, reg.ims_reg, reg.lac, reg.ci);
515 // Voice/Data/IMS
516 if(strcmp("VOICE", type) == 0) {
517 *regState = reg.call_state;
518 } else if(strcmp("DATA", type) == 0) {
519 *regState = reg.data_state;
520 } else if(strcmp("IMS", type) == 0) {
521 *imsRegState = reg.ims_state;
522 } else {
523 return -1;
524 }
525
526 if(reg.call_state != MBTK_NET_REG_STATE_NON || reg.data_state != MBTK_NET_REG_STATE_NON || reg.ims_state != MBTK_NET_REG_STATE_NON) {
527 sprintf(LAC, "%04x", reg.lac);
528 sprintf(CID, "%08o", reg.ci);
529 *netType = reg.type;
530 *radioTechFam = RADIO_TECH_3GPP;
531 }
532 return 0;
533 }
534
535}
536#endif
537
538QL_NW_ERROR_CODE ql_nw_get_reg_status(QL_NW_REG_STATUS_INFO_T *pt_info)
539{
540 if(ql_info_handle == NULL || pt_info == NULL)
541 {
542 LOGE("ARG error.");
543 return QL_NW_GENERIC_FAILURE;
544 }
545 /*VOICE/DATA/IMS*/
546 mbtk_net_reg_info_t reg;
547 int err = mbtk_net_reg_get(ql_info_handle, &reg);
548 if(err) {
549 LOGE("mbtk_net_reg_get fail.");
550 return QL_NW_GENERIC_FAILURE;
551 } else {
552 memset(pt_info, 0x0, sizeof(QL_NW_REG_STATUS_INFO_T));
553 pt_info->data_reg.state = (QL_NW_REG_STATE)reg.data_state;
554 pt_info->data_reg.lac = reg.lac;
555 pt_info->data_reg.cid = reg.ci;
556 pt_info->voice_reg.state = (QL_NW_REG_STATE)reg.call_state;
557 pt_info->voice_reg.lac = reg.lac;
558 pt_info->voice_reg.cid = reg.ci;
559 switch(reg.type)
560 {
561 case MBTK_RADIO_TECH_GSM:
562 case MBTK_RADIO_TECH_GSM_COMPACT:
563 case MBTK_RADIO_TECH_GSM_EGPRS:
564 case MBTK_RADIO_TECH_UTRAN_HSPA:
565 {
566 pt_info->data_reg.rat = QL_NW_RADIO_TECH_GPRS;
567 pt_info->voice_reg.rat = QL_NW_RADIO_TECH_GSM;
568 break;
569 }
570 case MBTK_RADIO_TECH_UTRAN:
571 case MBTK_RADIO_TECH_UTRAN_HSDPA:
572 case MBTK_RADIO_TECH_UTRAN_HSUPA:
573 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
574 {
575 pt_info->data_reg.rat = QL_NW_RADIO_TECH_UMTS;
576 pt_info->voice_reg.rat = QL_NW_RADIO_TECH_UMTS;
577 break;
578 }
579 case MBTK_RADIO_TECH_E_UTRAN:
580 {
581 pt_info->data_reg.rat = QL_NW_RADIO_TECH_LTE;
582 pt_info->voice_reg.rat = QL_NW_RADIO_TECH_LTE;
583 break;
584 }
585 default:
586 {
587 pt_info->data_reg.rat = QL_NW_RADIO_TECH_UNKNOWN;
588 pt_info->voice_reg.rat = QL_NW_RADIO_TECH_UNKNOWN;
589 break;
590 }
591 }
592 }
593
594 return 0;
595
596#if 0
597 int ret = ql_query_registration_state("VOICE", &(pt_info->voice_reg.state), &imsRegState, &(pt_info->voice_reg.lac), &(pt_info->voice_reg.cid), &netType, &(pt_info->voice_reg.rejectCause), &netRejected);
598 if(ret != 0)
599 err = QL_NW_GENERIC_FAILURE;
600 else
601 err = QL_NW_SUCCESS;
602 ret = ql_query_registration_state("DATA", &(pt_info->data_reg.state), &imsRegState, &(pt_info->data_reg.lac), &(pt_info->data_reg.cid), &netType, &(pt_info->data_reg.rejectCause), &netRejected);
603 if(ret != 0)
604 err = QL_NW_GENERIC_FAILURE;
605 else
606 err = QL_NW_SUCCESS;
607
608 if(err == QL_NW_SUCCESS)
609 {
610 if(netType < 0 || netType > 8)
611 pt_info->data_reg.rat = QL_NW_ACCESS_TECH_NONE;
612 else
613 pt_info->data_reg.rat = netType;
614 }
615 return err;
616#endif
617}
618
619QL_NW_ERROR_CODE ql_nw_set_selection(QL_NW_SELECTION_INFO_T *pt_info)
620{
621 if(ql_info_handle == NULL || pt_info == NULL)
622 {
623 LOGE("ARG error.");
624 return QL_NW_GENERIC_FAILURE;
625 }
626
627 mbtk_net_info_t net;
628 net.net_type = 0xFF;
629 char mccmnc[10];
630 if(pt_info->nw_selection_mode == 0)
631 {
632 net.net_sel_mode = 0;
633 net.plmn = 0;
634 }
635 else if(pt_info->nw_selection_mode == 1 && !str_empty(pt_info->mnc) && !str_empty(pt_info->mcc))
636 {
637 net.net_sel_mode = 1;
638 memset(mccmnc, 0, 10);
639 //memcpy(mccmnc, pt_info->mcc, 3);
640 //memcpy(mccmnc + 3, pt_info->mnc, 3);
641 sprintf(mccmnc,"%s%s",pt_info->mcc,pt_info->mnc);
642 net.plmn = (uint32)atoi(mccmnc);
643 if(pt_info->act < QL_NW_ACCESS_TECH_GSM || pt_info->act > QL_NW_ACCESS_TECH_UTRAN_HSPAP)
644 net.net_type = 0xff;
645 else
646 net.net_type = pt_info->act;
647 }
648 else
649 {
650 LOGE("ARG error.");
651 return QL_NW_GENERIC_FAILURE;
652 }
653 //printf("mccmnc = %s\n",mccmnc);
654 //printf("net.plmn = %d\n",net.plmn);
655 int ret = mbtk_net_sel_mode_set(ql_info_handle, &net);
656 if(ret == 0)
657 {
658 return QL_NW_SUCCESS;
659 }
660 else
661 {
662 printf("mbtk_net_sel_mode_set error: %d\n",ret );
663 return QL_NW_GENERIC_FAILURE;
664 }
665}
666
667QL_NW_ERROR_CODE ql_nw_get_selection(QL_NW_SELECTION_INFO_T *pt_info)
668{
669 if(ql_info_handle == NULL || pt_info == NULL)
670 {
671 LOGE("ARG error.");
672 return QL_NW_GENERIC_FAILURE;
673 }
674 char OperatorFN[128];
675 char OperatorSH[128];
676 char MccMnc[128];
677 mbtk_net_info_t net;
678 if(!mbtk_net_sel_mode_get(ql_info_handle, &net) && net.plmn > 0)
679 {
680 memset(pt_info, 0x0, sizeof(QL_NW_SELECTION_INFO_T));
681 // printf("Net : %d, %d, %d\n", net.net_sel_mode, net.net_type, net.plmn);
682 int i = 0;
683 while(i < ARRAY_SIZE(operator_mcc_mnc))
684 {
685 if(operator_mcc_mnc[i].mcc_mnc == net.plmn)
686 break;
687 i++;
688 }
689 if(i == ARRAY_SIZE(operator_mcc_mnc)) // No found mcc&mnc
690 {
691 strcpy(OperatorFN, "UNKNOWN");
692 strcpy(OperatorSH, "UNKNOWN");
693 sprintf(MccMnc, "%d", net.plmn);
694 }
695 else
696 {
697 strcpy(OperatorFN, operator_mcc_mnc[i].operator_l);
698 strcpy(OperatorSH, operator_mcc_mnc[i].operator_s);
699 sprintf(MccMnc, "%d", operator_mcc_mnc[i].mcc_mnc);
700
701 sprintf(pt_info->mcc,"%d",operator_mcc_mnc[i].mcc_mnc/100);
702 sprintf(pt_info->mnc,"%d",operator_mcc_mnc[i].mcc_mnc%100);
703
704 }
705 pt_info->nw_selection_mode = net.net_sel_mode;
706
707 pt_info->act = net.net_type;
708 return QL_NW_SUCCESS;
709 }
710
711 return QL_NW_GENERIC_FAILURE;
712
713}
714
715QL_NW_ERROR_CODE ql_nw_get_signal_strength(QL_NW_SIGNAL_STRENGTH_INFO_T *pt_info)
716{
717 if(ql_info_handle == NULL || pt_info == NULL)
718 {
719 LOGE("ARG error.");
720 return QL_NW_GENERIC_FAILURE;
721 }
722
723 int ret;
724 mbtk_signal_info_t signal;
725 ret = mbtk_net_signal_get(ql_info_handle, &signal);
726 if(ret != 0) {
727 LOGE("mbtk_net_signal_get fail.");
728 return QL_NW_GENERIC_FAILURE;
729 }
730 else
731 {
liuyangc989a662024-07-10 19:02:23 +0800732 int rssi = 0;
733 if(SIGNAL_STRENGTH_INVALID_1 == signal.rssi)
734 {
735 rssi = SIGNAL_STRENGTH_INVALID_1;
736 }
737 else
738 {
739 rssi = 2 * signal.rssi - 113;
740 }
liubin281ac462023-07-19 14:22:54 +0800741 if(signal.type == MBTK_RADIO_TECH_GSM) //GSM
742 {
743 pt_info->GW_SignalStrength.bitErrorRate = signal.ber;
744 pt_info->GW_SignalStrength.ecio = signal.ecno;
745 pt_info->GW_SignalStrength.rscp = signal.rscp;
liuyangc989a662024-07-10 19:02:23 +0800746 pt_info->GW_SignalStrength.rssi = rssi;
747
748 pt_info->LTE_SignalStrength.rsrp = SIGNAL_STRENGTH_INVALID_1;
749 pt_info->LTE_SignalStrength.rsrq = SIGNAL_STRENGTH_INVALID_1;
750 pt_info->LTE_SignalStrength.rssnr = SIGNAL_STRENGTH_INVALID_2;
751 pt_info->LTE_SignalStrength.rssi = SIGNAL_STRENGTH_INVALID_1;
liubin281ac462023-07-19 14:22:54 +0800752 }
753 else if(signal.type == MBTK_RADIO_TECH_E_UTRAN) //LTE
754 {
liuyangc989a662024-07-10 19:02:23 +0800755 pt_info->LTE_SignalStrength.cqi = SIGNAL_STRENGTH_INVALID_1;
liubin281ac462023-07-19 14:22:54 +0800756 pt_info->LTE_SignalStrength.rsrp = signal.rsrp;
757 pt_info->LTE_SignalStrength.rsrq = signal.rsrq;
758 pt_info->LTE_SignalStrength.rssnr = signal.ecno;
liuyangc989a662024-07-10 19:02:23 +0800759 pt_info->LTE_SignalStrength.rssi = rssi;
760
761 pt_info->GW_SignalStrength.bitErrorRate = SIGNAL_STRENGTH_INVALID_1;
762 pt_info->GW_SignalStrength.ecio = SIGNAL_STRENGTH_INVALID_2;
763 pt_info->GW_SignalStrength.rscp = SIGNAL_STRENGTH_INVALID_2;
764 pt_info->GW_SignalStrength.rssi = SIGNAL_STRENGTH_INVALID_1;
liubin281ac462023-07-19 14:22:54 +0800765 }
766 else
767 {
768 return QL_NW_GENERIC_FAILURE;
769 }
liuyangc989a662024-07-10 19:02:23 +0800770 LOGI("ql_GW_SignalStrength: %d , %d, %d, %d", pt_info->GW_SignalStrength.rssi,
771 pt_info->GW_SignalStrength.bitErrorRate, pt_info->GW_SignalStrength.rscp, pt_info->GW_SignalStrength.ecio);
772 LOGI("ql_LTE_SignalStrength: %d , %d, %d, %d", pt_info->LTE_SignalStrength.rssi,
773 pt_info->LTE_SignalStrength.rsrp, pt_info->LTE_SignalStrength.rsrq, pt_info->LTE_SignalStrength.rssnr, pt_info->LTE_SignalStrength.cqi);
liubin281ac462023-07-19 14:22:54 +0800774 return QL_NW_SUCCESS;
775 }
776}
777
778QL_NW_ERROR_CODE ql_nw_get_cell_info(QL_NW_CELL_INFO_T *pt_info)
779{
780 list_node_t* cell_list = NULL;
781 mbtk_cell_type_enum type;
782 if(ql_info_handle == NULL || pt_info == NULL)
783 {
784 LOGE("ARG error.");
785 return QL_NW_GENERIC_FAILURE;
786 }
787
788 memset(pt_info, 0, sizeof(QL_NW_CELL_INFO_T));
789 int err = mbtk_cell_get(ql_info_handle, &type, &cell_list);
790 if(err || cell_list == NULL) {
791 LOGE("mbtk_cell_get fail.");
792 return QL_NW_GENERIC_FAILURE;
793 } else {
794 list_first(cell_list);
795 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
796 if(cell) { // Current server cell.
797 switch(type)
798 {
799 case MBTK_CELL_TYPE_GSM:
800 {
801 LOGD("GSM : lac=%d, ci=%d, arfcn=%d, bsic=%d", cell->value1, cell->value2, cell->value3, cell->value4);
802 pt_info->gsm_info[0].lac = cell->value1;
803 pt_info->gsm_info[0].cid = cell->value2;
804 pt_info->gsm_info[0].arfcn = cell->value3;
805 pt_info->gsm_info[0].bsic = cell->value4;
806 pt_info->gsm_info[0].mcc = cell->value5;
807 pt_info->gsm_info[0].mnc = cell->value6;
808 pt_info->gsm_info[0].flag = 0;
809 pt_info->gsm_info_num++;
810 pt_info->gsm_info_valid = 1;
811 }
812 break;
813 case MBTK_CELL_TYPE_UMTS:
814 {
815 LOGD("UMTS : lac=%d, ci=%d, arfcn=%d", cell->value1, cell->value2, cell->value3);
816 pt_info->umts_info[0].lac = cell->value1;
817 pt_info->umts_info[0].cid = cell->value2;
818 pt_info->umts_info[0].uarfcn = cell->value3;
819 pt_info->umts_info[0].mcc = cell->value4;
820 pt_info->umts_info[0].mnc = cell->value5;
821 pt_info->umts_info[0].psc = cell->value6;
822 pt_info->umts_info[0].flag = 0;
823 pt_info->umts_info_num++;
824 pt_info->umts_info_valid = 1;
825 }
826 break;
827 case MBTK_CELL_TYPE_LTE:
828 {
829 LOGD("LTE : tac=%d, PCI=%d, dlEuarfcn=%d, ulEuarfcn=%d, band=%d", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
830 pt_info->lte_info[0].tac = cell->value1;
831 pt_info->lte_info[0].pci = cell->value2;
832 pt_info->lte_info[0].earfcn = cell->value3;
833 pt_info->lte_info[0].cid = cell->value8;
834 pt_info->lte_info[0].mcc = cell->value6;
835 pt_info->lte_info[0].mnc = cell->value7;
836 pt_info->lte_info[0].flag = 0;
837 pt_info->lte_info_num++;
838 pt_info->lte_info_valid = 1;
839 break;
840 }
841 default:
842 break;
843 }
844 }
845 while ((cell = (mbtk_cell_info_t*) list_next(cell_list)))
846 {
847 switch(type)
848 {
849 case MBTK_CELL_TYPE_GSM:
850 {
851 LOGD("CELL : %d, %d, %d, %d, %d", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
852 pt_info->gsm_info[pt_info->gsm_info_num].lac = cell->value1;
853 pt_info->gsm_info[pt_info->gsm_info_num].cid = cell->value2;
854 pt_info->gsm_info[pt_info->gsm_info_num].arfcn = cell->value3;
855 pt_info->gsm_info[pt_info->gsm_info_num].bsic = cell->value4;
856 pt_info->gsm_info[pt_info->gsm_info_num].flag = 1;
857 pt_info->gsm_info_num++;
858 pt_info->gsm_info_valid = 1;
859 }
860 break;
861 case MBTK_CELL_TYPE_UMTS:
862 {
863 LOGD("CELL : lac=%d, ci=%d, arfcn=%d", cell->value1, cell->value2, cell->value3);
864 pt_info->umts_info[pt_info->umts_info_num].lac = cell->value1;
865 pt_info->umts_info[pt_info->umts_info_num].cid = cell->value2;
866 pt_info->umts_info[pt_info->umts_info_num].uarfcn = cell->value3;
867 pt_info->umts_info[pt_info->umts_info_num].flag = 1;
868 pt_info->umts_info_num++;
869 pt_info->umts_info_valid = 1;
870 }
871 break;
872 case MBTK_CELL_TYPE_LTE:
873 {
874 LOGD("CELL : phyCellId=%d, euArfcn=%d, rsrp=%d, rsrq=%d", cell->value1, cell->value2, cell->value3, cell->value4);
875 pt_info->lte_info[pt_info->lte_info_num].cid = cell->value1;
876 pt_info->lte_info[pt_info->lte_info_num].earfcn = cell->value2;
877 pt_info->lte_info[pt_info->lte_info_num].tac = cell->value3;
878 pt_info->lte_info[pt_info->lte_info_num].pci = cell->value4;
879 pt_info->lte_info[pt_info->lte_info_num].flag = 1;
880 pt_info->lte_info_num++;
881 pt_info->lte_info_valid = 1;
882 }
883 break;
884 default:
885 break;
886 }
887 }
888 list_free(cell_list);
889 }
890
891 LOGD("get_cell_success: %d, %d, %d.",pt_info->gsm_info_valid, pt_info->umts_info_valid, pt_info->lte_info_valid);
892 return QL_NW_SUCCESS;
893}
894
895QL_NW_ERROR_CODE ql_nw_add_event_handler(QL_NW_EventHandlerFunc_t handlerPtr,void* contextPtr)
896{
897 if(ql_info_handle == NULL || handlerPtr == NULL)
898 {
899 LOGE("ARG error.");
900 return QL_NW_GENERIC_FAILURE;
901 }
902 mbtk_net_state_change_cb_reg(ql_info_handle, ql_nw_state_change_cb);
903 ql_func_cb_handle.handlerPtr = handlerPtr;
904 ql_func_cb_handle.contextPtr = contextPtr;
905 return QL_NW_SUCCESS;
906}
907
908QL_NW_ERROR_CODE ql_nw_get_volte_state(VOLTE_STATE *state)
909{
910 int ret;
911 if(ql_info_handle == NULL || state == NULL)
912 {
913 LOGE("ARG error.");
914 return QL_NW_GENERIC_FAILURE;
915 }
916 ret = mbtk_volte_state_get(ql_info_handle, &(state->reg_state));
917 if(ret != 0)
918 return QL_NW_GENERIC_FAILURE;
919 else
920 return QL_NW_SUCCESS;
921}
922
923QL_NW_ERROR_CODE ql_nw_csq_get_signal_strength(QL_NW_CSQ_SIGNAL_STRENGTH_INFO_T *pt_info)
924{
925 int ret;
926 if(ql_info_handle == NULL || pt_info == NULL)
927 {
928 LOGE("ARG error.");
929 return QL_NW_GENERIC_FAILURE;
930 }
931 mbtk_signal_info_t signal;
932 ret = mbtk_net_signal_get(ql_info_handle, &signal);
933 if(ret != 0)
934 return QL_NW_GENERIC_FAILURE;
935 else
936 {
937 pt_info->rssi = (signal.rssi * 2 - 113);
938 pt_info->bitErrorRate = signal.ber;
939 LOGD("pt_info->rssi = %d pt_info->bitErrorRate = %d",pt_info->rssi,pt_info->bitErrorRate);
940 return QL_NW_SUCCESS;
941 }
942}
943
944//*********************************************************************************
945