blob: 18edcd978b2e845ca3a0d40d0baebc1f825cfc3d [file] [log] [blame]
b.liu68a94c92025-05-24 12:53:41 +08001#include "gsw_nw_interface.h"
2#include <dlfcn.h>
3#include <time.h>
4#include <pthread.h>
5
6//mbtk include
7#define LYNQ_AIR_PLANE_MODE_OFF 1 //at+cfun = 1
8#define LYNQ_AIR_PLANE_MODE_ON 4 // at+cfun = 4
9#define LYNQ_AIR_CFUN_MODE_OFF 0 // at+cfun = 0
10
11#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
12
13#define FPLMN_STRING_LENGTH 120
14#define ENTRY_LENGTH 6
15#define FPLMN_ARRAY_SIZE (FPLMN_STRING_LENGTH / 6) + 1
16
17#ifndef FALSE
18#define FALSE (0)
19#endif
20
21
22#ifndef TRUE
23#define TRUE (!FALSE)
24#endif
25
26typedef unsigned int uint32;
27typedef unsigned char uint8;
28typedef unsigned short uint16;
29typedef void (*mbtk_info_callback_func)(const void* data, int data_len);
30
31typedef enum
32{
33 MBTK_DEV_MODEM_MIN_FUN, //Modem 最小功能
34 MBTK_DEV_MODEM_FULL_FUN, //Modem 全功能
35 MBTK_DEV_MODEM_DISABLE_RECEIVE_RF_CIRCUITS = 3, //Modem 禁用射频接收电路
36 MBTK_DEV_MODEM_DISABLE_TRANSMIT_AND_RECEIVE_RF_CIRCUITS, //Modem禁用射频发射和接收电路
37 MBTK_DEV_MODEM_DISABLE_SIM, //Modem 禁用(U)SIM 卡
38 MBTK_DEV_MODEM_TURN_OFF_FULL_SECONDARY_RECEIVE, //Modem 完全禁用辅助接收
39}MBTK_DEV_MODEM_FUNCTION;
40
41typedef enum
42{
43 MBTK_CELL_TYPE_GSM = 0,
44 MBTK_CELL_TYPE_UMTS,
45 MBTK_CELL_TYPE_LTE
46} mbtk_cell_type_enum;
47
48typedef struct
49{
50 MBTK_DEV_MODEM_FUNCTION fun;
51 int rst;
52} mbtk_modem_info_t;
53
54typedef struct
55{
56 int client_fd;
57 pthread_t read_thread_id;
58 int exit_fd[2];
59 bool is_waitting;
60 pthread_cond_t cond;
61 pthread_mutex_t mutex;
62
63 pthread_mutex_t send_mutex;
64
65 // Temp response data.
66 uint16 info_err;
67 uint16 data_len;
68 void *data;
69
70 //mbtk wyq for server_ready_status add start
71 char server_ready_status;
72 //mbtk wyq for server_ready_status add end
73
74 mbtk_info_callback_func net_state_cb;
75 mbtk_info_callback_func call_state_cb;
76 mbtk_info_callback_func sms_state_cb;
77 mbtk_info_callback_func radio_state_cb;
78 mbtk_info_callback_func sim_state_cb;
79 mbtk_info_callback_func pdp_state_cb;
80 //add signal by xr
81 mbtk_info_callback_func signal_state_cb;
82} mbtk_info_handle_t;
83
84
85
86typedef struct
87{
88 // LTE server cell: tac, PCI, dlEuarfcn, ulEuarfcn, band
89 // LTE cell: phyCellId,euArfcn,rsrp,rsrq
90 // WCDMA server cell: lac, ci, arfcn
91 // WCDMA cell: lac, ci, arfcn
92 // GSM server cell: lac, ci, arfcn, bsic
93 // GSM cell:
94 uint32 value1;
95 uint32 value2;
96 uint32 value3;
97 uint32 value4;
98 uint32 value5;
99 uint32 value6;
100 uint32 value7;
101 uint32 value8;
102 uint32 value9;
103 uint32 value10;
104} __attribute__((packed)) mbtk_cell_info_t;
105
106
107
108
109
110typedef struct
111{
112 uint8 net_pref; // mbtk_net_pref_enum
113 uint16 gsm_band; // mbtk_gsm_band_enum
114 uint16 umts_band; // mbtk_umts_band_enum
115 uint32 tdlte_band; // mbtk_tdlte_band_enum
116 uint32 fddlte_band; // mbtk_fddlte_band_enum
117 uint32 lte_ext_band; // mbtk_lte_ext_band_enum
118} __attribute__((packed)) mbtk_band_info_t;
119
120typedef struct list_arraynode
121{
122 void *data;
123 struct list_arraynode *next;
124} list_arraynode_t;
125
126typedef struct list_treenode
127{
128 list_arraynode_t *data;
129 int count;
130 struct list_treenode *left;
131 struct list_treenode *right;
132} list_treenode_t;
133
134typedef int (*list_sort_func)(void *data1, void *data2);
135typedef void (*list_free_func)(void *data);
136
137typedef struct list_node
138{
139 uint32 size;
140 list_sort_func sort_func;
141 list_free_func free_func;
142
143 uint32 cur_index;
144 list_arraynode_t *cur_array_data;
145
146 list_arraynode_t array_data;
147 list_treenode_t tree_data;
148} list_node_t;
149
150/*
1510: GSM
1521: GSM Compact
1532: UTRAN
1543: GSM w/EGPRS
1554: UTRAN w/HSDPA
1565: UTRAN w/HSUPA
1576: UTRAN w/HSDPA and HSUPA
1587: E-UTRAN
1598: UTRAN HSPA+
160*/
161typedef enum {
162 MBTK_RADIO_TECH_GSM = 0,
163 MBTK_RADIO_TECH_GSM_COMPACT,
164 MBTK_RADIO_TECH_UTRAN,
165 MBTK_RADIO_TECH_GSM_EGPRS,
166 MBTK_RADIO_TECH_UTRAN_HSDPA,
167 MBTK_RADIO_TECH_UTRAN_HSUPA,
168 MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA,
169 MBTK_RADIO_TECH_E_UTRAN, // LTE
170 MBTK_RADIO_TECH_UTRAN_HSPA
171} mbtk_radio_technology_enum;
172
173typedef struct
174{
175 /*
176 0: automatic
177 1: manual
178 */
179 uint8 net_sel_mode;
180 /*
181 0: GSM
182 1: GSM Compact
183 2: UTRAN
184 3: GSM w/EGPRS
185 4: UTRAN w/HSDPA
186 5: UTRAN w/HSUPA
187 6: UTRAN w/HSDPA and HSUPA
188 7: E-UTRAN
189 8: UTRAN HSPA+
190 0xFF: Unused
191 */
192 uint8 net_type;
193 //uint8 plmn[10]; // 46000
194 /*
195 0: unknown
196 1: available
197 2: current
198 3: forbidden
199 */
200 uint8 net_state;
201 uint32 plmn;
202} __attribute__((packed)) mbtk_net_info_t;
203
204
205typedef enum
206{
207 MBTK_NET_REG_STATE_NON = 0,
208 MBTK_NET_REG_STATE_HOME,
209 MBTK_NET_REG_STATE_SEARCHING,
210 MBTK_NET_REG_STATE_DENIED,
211 MBTK_NET_REG_STATE_UNKNOWN,
212 MBTK_NET_REG_STATE_ROAMING,
213 MBTK_NET_REG_STATE_SMS_ONLY,
214 MBTK_NET_REG_STATE_ROAMING_SMS,
215 MBTK_NET_REG_STATE_ATTACHED_EMERGENCY,
216 MBTK_NET_REG_STATE_CSFB_HOME,
217 MBTK_NET_REG_STATE_CSFB_ROAMING,
218 MBTK_NET_REG_STATE_EMERGENCY_ONLY
219} mbtk_net_reg_state_enum;
220
221typedef struct
222{
223 uint8 call_state;// mbtk_net_reg_state_enum
224 uint8 data_state;// mbtk_net_reg_state_enum
225 uint8 ims_state;// mbtk_net_reg_state_enum
226 uint8 type; // mbtk_radio_technology_enum
227 uint16 lac;
228 uint32 ci;
229} __attribute__((packed)) mbtk_net_reg_info_t;
230
231typedef struct
232{
233 uint8 type; // mbtk_radio_technology_enum
234 uint8 rssi; // 0: 113 dBm or less
235 // 1: 111 dBm
236 // 2��30: 109��53 dBm
237 // 31: 51 dBm or greater
238 // 99: not known or not detectable
239 uint8 rxlev;// 0:rssi < -110 dBm
240 // 1: -110 dBm �� rssi < -109 dBm
241 // 2: -109 dBm �� rssi < -108 dBm
242 // ......
243 // 61: -50 dBm �� rssi < -49 dBm
244 // 62: -49 dBm �� rssi < -48 dBm
245 // 63: -48 dBm �� rssi
246 // 99: not known or not detectable
247 uint8 ber; // 0...7 as RXQUAL values in the table in 3GPP TS 45.008 [20] subclause 8.2.4
248 // 99 not known or not detectable
249 uint8 rscp; // 0: rscp < -120 dBm
250 // 1: -120 dBm �� rscp < -119 dBm
251 // 2: -119 dBm �� rscp < -118 dBm
252 // ......
253 // 94: -27 dBm �� rscp < -26 dBm
254 // 95: -26 dBm �� rscp < -25 dBm
255 // 96: - 25 dBm �� rscp
256 // 255: not known or not detectable
257 uint8 ecno; // 0: Ec/Io < -24 dB
258 // 1: -24 dB �� Ec/Io < -23.5 dB
259 // 2: -23.5 dB �� Ec/Io < -23 dB
260 // ......
261 // 47: -1 dB �� Ec/Io < -0.5 dB
262 // 48: -0.5 dB �� Ec/Io < 0 dB
263 // 49: 0 dB �� Ec/Io
264 // 255: not known or not detectable
265 uint8 rsrq; // 0: rsrq < -19.5 dB
266 // 1: -19.5 dB �� rsrq < -19 dB
267 // 2: -19 dB �� rsrq < -18.5 dB
268 // ......
269 // 32: -4 dB �� rsrq < -3.5 dB
270 // 33: -3.5 dB �� rsrq < -3 dB
271 // 34: -3 dB �� rsrq
272 // 255: not known or not detectable
273 uint8 rsrp; // 0: rsrp < -140 dBm
274 // 1: -140 dBm �� rsrp < -139 dBm
275 // 2: -139 dBm �� rsrp < -138 dBm
276 // ......
277 // 95: -46 dBm �� rsrp < -45 dBm
278 // 96: -45 dBm �� rsrp < -44 dBm
279 // 97: -44 dBm �� rsrp
280 // 255: not known or not detectable
281} __attribute__((packed)) mbtk_signal_info_t;
282
283typedef struct{
284 uint8_t mode;
285 uint32_t oosPhase[3]; //单位为秒
286} mbtk_oos_info;
287
288typedef struct
289{
290 /* Configuration parameters for MCM network full band network scan when OOS (out of service)*/
291 int t_min;
292 int t_step;
293 int t_max;
294}GSW_NW_OOS_CONFIG_INFO_T;
295
296
297#define GSW_HAL_FAIL GSW_HAL_NORMAL_FAIL
298#define GSW_HAL_MEM_INVAILD GSW_HAL_ARG_INVALID
299#define lib_mbtk_path "/lib/libmbtk_lib.so"
300mbtk_info_handle_t* nw_info_handle = NULL;
301
302static GSW_NW_ServingInfoHandlePtr serving_cb;
303static GSW_NW_SigInfoHandlePtr sig_cb;
304static GSW_NW_RejectCauseHandlePtr reject_cb;
305static GSW_NW_ModemStateHandlePtr modem_cb;
306
307static void *dlHandle_mbtk;
308int nw_init_flag = 0;
309int mode = -1;
310int fplmn_max_length = 0;
311
312gsw_nw_plmn_list_t gsw_nw_plmn_list;
313char fplmn_array[FPLMN_ARRAY_SIZE][7];
314int fplmn_index = 0;
315
316static mbtk_info_handle_t* (*mbtk_info_handle_get)(void);
317static int (*mbtk_info_handle_free)(mbtk_info_handle_t** handle);
318int (*mbtk_net_sel_mode_get)(mbtk_info_handle_t* handle, mbtk_net_info_t *net);
319int (*mbtk_net_reg_get)(mbtk_info_handle_t* handle, mbtk_net_reg_info_t *reg);
320int (*mbtk_cell_get)(mbtk_info_handle_t* handle, mbtk_cell_type_enum *type, list_node_t **cell_list);
321int (*mbtk_get_modem_fun)(mbtk_info_handle_t* handle, int* fun);
322static int (*mbtk_set_modem_fun)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info);
323int (*mbtk_current_band_get)(mbtk_info_handle_t* handle, mbtk_band_info_t *band);
324int (*mbtk_current_band_set)(mbtk_info_handle_t* handle, const mbtk_band_info_t *band);
325int (*mbtk_net_signal_get)(mbtk_info_handle_t* handle, mbtk_signal_info_t *signal);
326int (*mbtk_wakeup_state_set)(mbtk_info_handle_t* handle, uint32 wakeup_state);
327int (*mbtk_signal_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
328int (*mbtk_net_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
329int (*mbtk_fplmn_get)(mbtk_info_handle_t *handle, void *fplmn);
330int (*mbtk_fplmn_set)(mbtk_info_handle_t *handle, void *fplmn);
331int (*mbtk_radio_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
332int (*mbtk_oos_get)(mbtk_info_handle_t* handle, mbtk_oos_info *oos_info);
333int (*mbtk_oos_set)(mbtk_info_handle_t* handle, mbtk_oos_info *oos_info);
334
335static void (*mbtk_log)(int level, const char *format, ...);
336static void (*mbtk_log_init)(char *path, char *tag);
337
338#ifndef LOG_ERR_LEVEL
339#define LOG_ERR_LEVEL 3 /* error conditions */
340#endif
341#ifndef LOG_WARN_LEVEL
342#define LOG_WARN_LEVEL 4 /* warning conditions */
343#endif
344#ifndef LOG_INFO_LEVEL
345#define LOG_INFO_LEVEL 6 /* informational */
346#endif
347#ifndef LOG_DEBUG_LEVEL
348#define LOG_DEBUG_LEVEL 7 /* debug-level messages */
349#endif
350#ifndef LOG_VERBOSE_LEVEL
351#define LOG_VERBOSE_LEVEL 8
352#endif
353
l.yang6a42e4d2025-05-28 01:04:20 -0700354#define GSW_NW "[HAL][GSW_NW]"
355
b.liu68a94c92025-05-24 12:53:41 +0800356#define LOGV(fmt, args ...) \
357 do{ \
358 char *file_ptr_1001 = __FILE__; \
359 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
360 char line_1001[10] = {0}; \
361 sprintf(line_1001, "%d", __LINE__); \
362 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
363 if(*ptr_1001 == '/') \
364 break; \
365 ptr_1001--; \
366 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700367 mbtk_log(LOG_VERBOSE_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800368 } while(0)
369
370#define LOGI(fmt, args...) \
371 do{ \
372 char *file_ptr_1001 = __FILE__; \
373 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
374 char line_1001[10] = {0}; \
375 sprintf(line_1001, "%d", __LINE__); \
376 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
377 if(*ptr_1001 == '/') \
378 break; \
379 ptr_1001--; \
380 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700381 mbtk_log(LOG_INFO_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800382 } while(0)
383
384#define LOGD(fmt, args...) \
385 do{ \
386 char *file_ptr_1001 = __FILE__; \
387 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
388 char line_1001[10] = {0}; \
389 sprintf(line_1001, "%d", __LINE__); \
390 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
391 if(*ptr_1001 == '/') \
392 break; \
393 ptr_1001--; \
394 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700395 mbtk_log(LOG_DEBUG_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800396 } while(0)
397
398#define LOGW(fmt, args...) \
399 do{ \
400 char *file_ptr_1001 = __FILE__; \
401 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
402 char line_1001[10] = {0}; \
403 sprintf(line_1001, "%d", __LINE__); \
404 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
405 if(*ptr_1001 == '/') \
406 break; \
407 ptr_1001--; \
408 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700409 mbtk_log(LOG_WARN_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800410 } while(0)
411
412#define LOGE(fmt, args...) \
413 do{ \
414 char *file_ptr_1001 = __FILE__; \
415 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
416 char line_1001[10] = {0}; \
417 sprintf(line_1001, "%d", __LINE__); \
418 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
419 if(*ptr_1001 == '/') \
420 break; \
421 ptr_1001--; \
422 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700423 mbtk_log(LOG_ERR_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800424 } while(0)
425
426
427
428typedef struct
429{
430 char *lynq_operator_l;
431 char *lynq_operator_s;
432 uint32 lynq_mcc_mnc;
433} lynq_operator_mcc_mnc_t;
434
435static lynq_operator_mcc_mnc_t lynq_operator_mcc_mnc[] =
436{
437 {"China Mobile","CMCC",46000},
438 {"China Unicom","CU",46001},
439 {"China Mobile","CMCC",46002},
440 {"China Telecom","CT",46003},
441 {"China Mobile","CMCC",46004},
442 {"China Telecom","CT",46005},
443 {"China Unicom","CU",46006},
444 {"China Mobile","CMCC",46007},
445 {"China Mobile","CMCC",46008},
446 {"China Unicom","CU",46009},
447 {"China Telecom","CT",46011}
448};
449
450
451//GSW include
452typedef enum prefer_mode
453{
454 GSW_PREFER_MODE_GSW = 1, /**<2G only*/
455 GSW_PREFER_MODE_WCDMA = 2, /**< 3G only*/
456 GSW_PREFER_MODE_WCDMA_GSM = 3, /**< 3G/2G*/
457 GSW_PREFER_MODE_LTE = 4, /**< 4G only*/
458 GSW_PREFER_MODE_NR5G = 5, /**< 5G only*/
459 GSW_PREFER_MODE_NR5G_LTE = 8, /**< 5G/4G*/
460 GSW_PREFER_MODE_LTE_WCDMA_GSM = 9, /**< 4G/3G/2G*/
461 GSW_PREFER_MODE_NR5G_LTE_WCDMA_GSM = 32, /**< 5G/4G/3G/2G*/
462} PREFER_MODE_E;
463
464static int mbtk_nw_api_import()
465{
466 dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);
467 if (dlHandle_mbtk == NULL)
468 {
469 return GSW_HAL_FAIL;
470 }
471
472 mbtk_log_init = (void (*)(char *path, char *tag))dlsym(dlHandle_mbtk, "mbtk_log_init");
473 if (mbtk_log_init == NULL)
474 {
475 return GSW_HAL_FAIL;
476 }
477
478 mbtk_log = (void (*)(int level, const char *format, ...))dlsym(dlHandle_mbtk, "mbtk_log");
479 if (mbtk_log == NULL)
480 {
481 return GSW_HAL_FAIL;
482 }
483
484 mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");
485 if (mbtk_info_handle_get == NULL)
486 {
487 LOGE("mbtk_info_handle_get dlsym fail\n");
488 return GSW_HAL_FAIL;
489 }
490
491 mbtk_info_handle_free = (int (*)(mbtk_info_handle_t** handle))dlsym(dlHandle_mbtk, "mbtk_info_handle_free");
492 if (mbtk_info_handle_free == NULL)
493 {
494 LOGE("mbtk_info_handle_free dlsym fail\n");
495 return GSW_HAL_FAIL;
496 }
497
498 mbtk_net_sel_mode_get = (int (*)(mbtk_info_handle_t* handle, mbtk_net_info_t *net))dlsym(dlHandle_mbtk, "mbtk_net_sel_mode_get");
499 if (mbtk_net_sel_mode_get == NULL)
500 {
501 LOGE("mbtk_net_sel_mode_get dlsym fail\n");
502 return GSW_HAL_FAIL;
503 }
504
505 mbtk_net_reg_get = (int (*)(mbtk_info_handle_t* handle, mbtk_net_reg_info_t *reg))dlsym(dlHandle_mbtk, "mbtk_net_reg_get");
506 if (mbtk_net_reg_get == NULL)
507 {
508 LOGE("mbtk_net_reg_get dlsym fail\n");
509 return GSW_HAL_FAIL;
510 }
511
512 mbtk_get_modem_fun = (int (*)(mbtk_info_handle_t* handle, int* fun))dlsym(dlHandle_mbtk, "mbtk_get_modem_fun");
513 if (mbtk_get_modem_fun == NULL)
514 {
515 LOGE("mbtk_get_modem_fun dlsym fail\n");
516 return GSW_HAL_FAIL;
517 }
518
519 mbtk_set_modem_fun = (int (*)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info))dlsym(dlHandle_mbtk, "mbtk_set_modem_fun");
520 if (mbtk_set_modem_fun == NULL)
521 {
522 LOGE("mbtk_set_modem_fun dlsym fail\n");
523 return GSW_HAL_FAIL;
524 }
525
526 mbtk_current_band_get = (int (*)(mbtk_info_handle_t* handle, mbtk_band_info_t *band))dlsym(dlHandle_mbtk, "mbtk_current_band_get");
527 if (mbtk_current_band_get == NULL)
528 {
529 LOGE("mbtk_current_band_get dlsym fail\n");
530 return GSW_HAL_FAIL;
531 }
532
533 mbtk_current_band_set = (int (*)(mbtk_info_handle_t* handle, const mbtk_band_info_t *band))dlsym(dlHandle_mbtk, "mbtk_current_band_set");
534 if (mbtk_current_band_set == NULL)
535 {
536 LOGE("mbtk_current_band_set dlsym fail\n");
537 return GSW_HAL_FAIL;
538 }
539
540 mbtk_net_signal_get = (int (*)(mbtk_info_handle_t* handle, mbtk_signal_info_t *signal))dlsym(dlHandle_mbtk, "mbtk_net_signal_get");
541 if (mbtk_net_signal_get == NULL)
542 {
543 LOGE("mbtk_net_signal_get dlsym fail\n");
544 return GSW_HAL_FAIL;
545 }
546
547 mbtk_wakeup_state_set = (int (*)(mbtk_info_handle_t* handle, uint32 wakeup_state))dlsym(dlHandle_mbtk, "mbtk_wakeup_state_set");
548 if (mbtk_wakeup_state_set == NULL)
549 {
550 LOGE("mbtk_wakeup_state_set dlsym fail\n");
551 return GSW_HAL_FAIL;
552 }
553
554 mbtk_cell_get = (int (*)(mbtk_info_handle_t* handle, mbtk_cell_type_enum *type, list_node_t **cell_list))dlsym(dlHandle_mbtk, "mbtk_cell_get");
555 if (mbtk_cell_get == NULL)
556 {
557 LOGE("mbtk_cell_get dlsym fail\n");
558 return GSW_HAL_FAIL;
559 }
560
561 mbtk_signal_state_change_cb_reg = (int (*)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb))dlsym(dlHandle_mbtk, "mbtk_signal_state_change_cb_reg");
562 if (mbtk_signal_state_change_cb_reg == NULL)
563 {
564 LOGE("mbtk_signal_state_change_cb_reg dlsym fail\n");
565 return GSW_HAL_FAIL;
566 }
567
568 mbtk_net_state_change_cb_reg = (int (*)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb))dlsym(dlHandle_mbtk, "mbtk_net_state_change_cb_reg");
569 if (mbtk_net_state_change_cb_reg == NULL)
570 {
571 LOGE("mbtk_net_state_change_cb_reg dlsym fail\n");
572 return GSW_HAL_FAIL;
573 }
574
575 mbtk_fplmn_get = (int(*)(mbtk_info_handle_t *handle, void *fplmn))dlsym(dlHandle_mbtk, "mbtk_fplmn_get");
576 if (mbtk_fplmn_get == NULL)
577 {
578 LOGE("mbtk_fplmn_get dlsym fail\n");
579 return GSW_HAL_FAIL;
580 }
581
582 mbtk_fplmn_set = (int(*)(mbtk_info_handle_t *handle, void *fplmn))dlsym(dlHandle_mbtk, "mbtk_fplmn_set");
583 if (mbtk_fplmn_set == NULL)
584 {
585 LOGE("mbtk_fplmn_get dlsym fail\n");
586 return GSW_HAL_FAIL;
587 }
588
589 mbtk_radio_state_change_cb_reg = (int (*)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb))dlsym(dlHandle_mbtk, "mbtk_radio_state_change_cb_reg");
590 if (mbtk_radio_state_change_cb_reg == NULL)
591 {
592 LOGE("mbtk_radio_state_change_cb_reg dlsym fail\n");
593 return GSW_HAL_FAIL;
594 }
595
596 mbtk_oos_get = (int (*)(mbtk_info_handle_t* handle, mbtk_oos_info *oos))dlsym(dlHandle_mbtk, "mbtk_oos_get");
597 if (mbtk_oos_get == NULL)
598 {
599 LOGE("mbtk_oos_get dlsym fail\n");
600 return GSW_HAL_FAIL;
601 }
602
603 mbtk_oos_set = (int (*)(mbtk_info_handle_t* handle, mbtk_oos_info *oos))dlsym(dlHandle_mbtk, "mbtk_oos_set");
604 if (mbtk_oos_set == NULL)
605 {
606 LOGE("mbtk_oos_set dlsym fail\n");
607 return GSW_HAL_FAIL;
608 }
609
610 return GSW_HAL_SUCCESS;
611}
612
613void list_first(list_node_t *list)
614{
615 if (list) {
616 list->cur_index = 0;
617 list->cur_array_data = list->array_data.next;
618 }
619}
620
621void* list_next(list_node_t *list)
622{
623 if (list) {
624 list_arraynode_t *node = list->cur_array_data;
625 if (node) {
626 LOGE("node is not null\n");
627 list->cur_array_data = list->cur_array_data->next;
628 list->cur_index++;
629 return node->data;
630 } else {
631 LOGE("node is null\n");
632 return NULL;
633 }
634 } else {
635 LOGE("list is null\n");
636 return NULL;
637 }
638}
639
640void list_free(list_node_t *list)
641{
642 if (list) {
643 list_arraynode_t *node = &(list->array_data); // Head node
644 list_arraynode_t *node_temp = NULL;
645 while (node->next) {
646 node_temp = node->next;
647 node->next = node->next->next;
648
649 if (list->free_func) {
650 list->free_func(node_temp->data);
651 } else {
652 free(node_temp->data);
653 }
654 free(node_temp);
655 }
656 free(list);
657 }
658}
659
660static int gsw_rssi_to_csq(int rssi)
661{
662 LOGD("rssi = %d\n",rssi);
663 if(rssi >= -113 && rssi <= -51)
664 {
665 return (rssi + 113) / 2;
666 }
667
668 else
669 {
670 return 99;
671 }
672}
673
674static int gsw_rscp_to_csq(int rscp)
675{
676 LOGD("rscp = %d\n",rscp);
677 if(rscp <= -25 && rscp > -120)
678 {
679 return rscp + 120;
680 }
681 else
682 {
683 return 255;
684 }
685
686}
687
688static int gsw_rsrp_to_csq(int rsrp)
689{
690 LOGD("rsrp = %d\n",rsrp);
691
692 if(rsrp <= -44 && rsrp > -140)
693 {
694 return rsrp + 140;
695 }
696
697 else
698 {
699 return 255;
700 }
701}
702
703static int rscp_convert_to_dBm(int rscp)
704{
705 if(rscp <= 96 && rscp >= 0)
706 {
707 return rscp - 120;
708 }
709 else
710 {
711 return -25;
712 }
713}
714
715
716static int8_t rssi_convert_to_dBm(uint8 rssi)
717{
718 if(rssi <= 31)
719 {
720 return rssi * 2 - 113;
721 }
722 else
723 {
724 return -125;
725 }
726}
727
728static int16_t rsrp_convert_to_dBm(uint8 rsrp)
729{
730 if(rsrp <= 96)
731 {
732 return rsrp - 140;
733 }
734 else
735 {
736 return -44;
737 }
738}
739
740static int16_t rsrq_convert_to_dB(uint8 rsrq)
741{
742 if(rsrq >= 1 && rsrq <= 34)
743 {
744 return (rsrq + 1) / 2 - 20;
745 }
746 else
747 {
748 return -20;
749 }
750}
751
752static int16_t ecno_convert_to_dB(uint8 ecno)
753{
754 if(ecno >= 48)
755 {
756 return 0;
757 }
758 else if(ecno == 255)
759 {
760 return 255;
761 }
762 else
763 {
764 return 48 - ecno;
765 }
766}
767
768
769static int convert_reg_state(int reg_state_t)
770{
771 LOGD("reg_state_t = %d\n",reg_state_t);
772 int reg_state = 0;
773
774 switch (reg_state_t)
775 {
776 case MBTK_NET_REG_STATE_NON:
777 {
778 reg_state = GSW_NETWORK_REG_NOT_REGISTERED;
779 break;
780 }
781 case MBTK_NET_REG_STATE_HOME:
782 {
783 reg_state = GSW_NETWORK_REG_REGISTERED;
784 break;
785 }
786 case MBTK_NET_REG_STATE_SEARCHING:
787 {
788 reg_state = GSW_NETWORK_REG_NOT_REGISTERED_SEARCHING;
789 break;
790 }
791 case MBTK_NET_REG_STATE_DENIED:
792 {
793 reg_state = GSW_NETWORK_REG_REGISTRATION_DENIED;
794 break;
795 }
796 case MBTK_NET_REG_STATE_UNKNOWN:
797 {
798 reg_state = GSW_NETWORK_REG_REGISTRATION_UNKNOWN;
799 break;
800 }
801 case MBTK_NET_REG_STATE_ROAMING:
802 {
803 reg_state = GSW_NETWORK_REG_REGISTRATION_ROAMING;
804 break;
805 }
806 case MBTK_NET_REG_STATE_SMS_ONLY:
807 case MBTK_NET_REG_STATE_ROAMING_SMS:
808 case MBTK_NET_REG_STATE_ATTACHED_EMERGENCY:
809 case MBTK_NET_REG_STATE_CSFB_HOME:
810 case MBTK_NET_REG_STATE_CSFB_ROAMING:
811 case MBTK_NET_REG_STATE_EMERGENCY_ONLY:
812 {
813 reg_state = GSW_NETWORK_REG_LIMITED_SERVICE;
814 break;
815 }
816 }
817
818 return reg_state;
819}
820
821
822static int convert_net_mode(int net_mode)
823{
824 LOGD("net_mode = %d\n",net_mode);
825 switch(net_mode)
826 {
827 case MBTK_RADIO_TECH_GSM:
828 case MBTK_RADIO_TECH_GSM_COMPACT:
829 case MBTK_RADIO_TECH_GSM_EGPRS:
830 {
831 return GSW_NETWORK_RADIO_GSM;
832 }
833 case MBTK_RADIO_TECH_UTRAN:
834 case MBTK_RADIO_TECH_UTRAN_HSDPA:
835 case MBTK_RADIO_TECH_UTRAN_HSUPA:
836 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
837 case MBTK_RADIO_TECH_UTRAN_HSPA:
838 {
839 return GSW_NETWORK_RADIO_UMTS;
840 }
841 case MBTK_RADIO_TECH_E_UTRAN:
842 {
843 return GSW_NETWORK_RADIO_LTE;
844 }
845
846 default:
847 {
848 return GSW_NETWORK_RADIO_NO_SVC;
849 }
850 }
851
852 return GSW_NETWORK_RADIO_NO_SVC;
853}
854
855static int convert_mbtk_net_config(int config)
856{
857 int net_pref = -1;
858
859 switch(config)
860 {
861 case GSW_PREFER_MODE_GSW:
862 {
863 net_pref = 0;
864 break;
865 }
866
867 case GSW_PREFER_MODE_WCDMA:
868 {
869 net_pref = 1;
870 break;
871 }
872
873 case GSW_PREFER_MODE_WCDMA_GSM:
874 {
875 net_pref = 2;
876 break;
877 }
878
879 case GSW_PREFER_MODE_LTE:
880 case GSW_PREFER_MODE_NR5G:
881 case GSW_PREFER_MODE_NR5G_LTE:
882 {
883 net_pref = 5;
884 break;
885 }
886
887 case GSW_PREFER_MODE_LTE_WCDMA_GSM:
888 case GSW_PREFER_MODE_NR5G_LTE_WCDMA_GSM:
889 {
890 net_pref = 15;
891 break;
892 }
893 }
894
895 return net_pref;
896}
897
898
899static int convert_gsw_net_config(int config)
900{
901 int net_config = -1;
902 LOGD("config = %d\n");
903
904 switch (config)
905 {
906 case 0:
907 {
908 net_config = GSW_PREFER_MODE_GSW;
909 break;
910 }
911
912 case 1:
913 {
914 net_config = GSW_PREFER_MODE_WCDMA;
915 break;
916 }
917
918 case 2:
919 {
920 net_config = GSW_PREFER_MODE_WCDMA_GSM;
921 break;
922 }
923
924 case 5:
925 {
926 net_config = GSW_PREFER_MODE_LTE;
927 break;
928 }
929
930 case 15:
931 {
932 net_config = GSW_PREFER_MODE_LTE_WCDMA_GSM;
933 break;
934 }
935 }
936
937 return net_config;
938}
939
940//64F010 -> 46001 (64->46,F0->0,10->01)
941static void transform_fplmn_str_to_plmn(char *entry)
942{
943 if (strncmp(entry, "FFFFFF", ENTRY_LENGTH) == 0) {
944 return; //if FFFFFF,means invalid fplmn, do nothing
945 }
946
947 char temp = entry[0];
948 entry[0] = entry[1];
949 entry[1] = temp;
950
951 temp = entry[ENTRY_LENGTH - 2];
952 entry[ENTRY_LENGTH - 2] = entry[ENTRY_LENGTH - 1];
953 entry[ENTRY_LENGTH - 1] = temp;
954
955 memmove(entry + 2, entry + 3, ENTRY_LENGTH - 2);
956
957 LOGE("after transform_fplmn_str_to_plmn: %s\n", entry);
958
959 //valid fplmn
960 fplmn_index++;
961}
962
963static void extract_mcc_mnc(char *entry, char *mcc, char *mnc)
964{
965 strncpy(mcc,entry,3);
966 mcc[3] = '\0';
967 strncpy(mnc,entry + 3,2);
968 mnc[2] = '\0';
969
970 LOGE("entry = %s, mcc = %s, mnc = %s\n", entry, mcc, mnc);
971}
972
973
974static void update_fplmn_list(char *fplmn_str)
975{
976 LOGE("fplmn_str = %s\n",fplmn_str);
977 char temp_fplmn_array[FPLMN_ARRAY_SIZE][7];
978 memset(fplmn_array, 0, sizeof(fplmn_array));
979 memset(temp_fplmn_array, 0, sizeof(temp_fplmn_array));
980 fplmn_index = 0;
981 int array_length = 0;
982
983 for (int i = 0; i < strlen(fplmn_str); i += 6) {
984
985 int length = (i + 6 < strlen(fplmn_str)) ? 6 : strlen(fplmn_str) - i;
986 strncpy(temp_fplmn_array[array_length], fplmn_str + i, length);
987 temp_fplmn_array[array_length][length] = '\0';
988 array_length++;
989 if (i + 6 >= strlen(fplmn_str)) {
990 break;
991 }
992 }
993
994 for (int i = 0; i < array_length; i++) {
995 LOGE("array[%d] = %s\n", i, temp_fplmn_array[i]);
996 transform_fplmn_str_to_plmn(temp_fplmn_array[i]);
997 strncpy(fplmn_array[i], temp_fplmn_array[i], ENTRY_LENGTH);
998 LOGE("fplmn_array[%d] = %s\n", i, fplmn_array[i]);
999 }
1000
1001}
1002
1003static void format_plmn(char *result, char *plmn_entry)
1004{
1005 strncpy(result, plmn_entry, strlen(plmn_entry));
1006 LOGE("result = %s, numStr = %s\n",result, plmn_entry);
1007
1008 if (strlen(result) >= 2) {
1009 char temp = result[0];
1010 result[0] = result[1];
1011 result[1] = temp;
1012 }
1013
1014 LOGE("1.result = %s\n",result);
1015
1016 if (strlen(result) >= 3) {
1017 memmove(&result[3], &result[2], strlen(result) - 2 + 1);
1018 result[2] = 'F';
1019 }
1020
1021 LOGE("2.result = %s\n",result);
1022
1023 if (strlen(result) >= 2) {
1024 char temp = result[strlen(result) - 1];
1025 result[strlen(result) - 1] = result[strlen(result) - 2];
1026 result[strlen(result) - 2] = temp;
1027 }
1028
1029 LOGE("3.result = %s\n",result);
1030}
1031
1032
1033static void convert_plmn_to_fplmn_str(char *fplmn_str)
1034{
1035 char temp_fplmn_str[128] = {0};
1036 char temp[20]; // 临时存储单个格式化后的数字
1037 int index = 0;
1038
1039 for (int i = 0; i < fplmn_index; i++) {
1040 memset(temp, 0x0, sizeof(temp));
1041 format_plmn(temp, fplmn_array[i]);
1042 strcat(temp_fplmn_str, temp);
1043 index += strlen(temp);
1044 }
1045
1046 while(index < (6 * fplmn_max_length))
1047 {
1048 temp_fplmn_str[index++] = 'F';
1049 }
1050
1051 // 修剪或截断formattedNumbers,确保它不超过6 * fplmn_max_length个字符
1052 if (index > (6 * fplmn_max_length)) {
1053 temp_fplmn_str[(6 * fplmn_max_length)] = '\0';
1054 }
1055
1056 LOGE("%s\n", temp_fplmn_str);
1057 strncpy(fplmn_str, temp_fplmn_str, strlen(temp_fplmn_str));
1058 LOGE("fplmn_str = %s\n", fplmn_str);
1059}
1060
1061static int check_index(char *mcc, char *mnc)
1062{
1063 int i = 0;
1064
1065 for(i = 0; i < fplmn_index; i++)
1066 {
1067 if(strncmp(fplmn_array[i], mcc, 3) == 0 && strncmp(fplmn_array[i] + 3, mnc, 2) == 0)
1068 {
1069 LOGE("index = %d\n", i);
1070 return i;
1071 }
1072 }
1073
1074 LOGE("not find\n");
1075 return -1;
1076}
1077
1078static void remove_fplmn(int index)
1079{
1080 int write_index = 0;
1081 for (int i = 0; i < fplmn_index; i++) {
1082 if (i != index) {
1083 strncpy(fplmn_array[write_index++], fplmn_array[i], ENTRY_LENGTH);
1084 }
1085 }
1086 fplmn_index--;
1087}
1088
1089static void gsw_serving_info_callback_thread()
1090{
1091 GSW_NW_SERVING_INFO *serving_info = (GSW_NW_SERVING_INFO*)malloc(sizeof(GSW_NW_SERVING_INFO));
1092 memset(serving_info, 0x0, sizeof(GSW_NW_SERVING_INFO));
1093 int ret = -1;
1094 ret = gsw_get_nwinfo(serving_info);
1095 if(ret != 0)
1096 {
1097 LOGE("gsw_get_nwinfo failed\n");
1098 free(serving_info);
1099 return;
1100 }
1101
1102 if(serving_cb)
1103 {
1104 serving_cb(*serving_info);
1105 free(serving_info);
1106 }
1107}
1108
1109static void gsw_serving_info_callback(const void* data, int data_len)
1110{
1111 LOGE("gsw_serving_info_callback start\n");
1112
1113 if(data && data_len > 0)
1114 {
1115 pthread_t thread;
1116 pthread_create(&thread, NULL, (void*)gsw_serving_info_callback_thread, NULL);
1117 }
1118
1119 else
1120 {
1121 LOGE("data is NULL\n");
1122 return;
1123 }
1124
1125}
1126
1127static void gsw_sig_info_callback(const void* data, int data_len)
1128{
1129 LOGE("gsw_sig_info_callback start\n");
1130
1131 if(data && data_len == 8)
1132 {
1133 uint8 *net_data = (uint8*)data;
1134 mbtk_radio_technology_enum type = (mbtk_radio_technology_enum)net_data[0];
1135
1136 signalStrength_t sig_strength;
1137 memset(&sig_strength, 0x0, sizeof(signalStrength_t));
1138
1139 sig_strength.gw_sig_valid = 0;
1140 sig_strength.wcdma_sig_valid = 0;
1141 sig_strength.lte_sig_valid = 0;
1142 sig_strength.nr_sig_valid = 0;
1143
1144 if(type == MBTK_RADIO_TECH_GSM || type == MBTK_RADIO_TECH_GSM_COMPACT || \
1145 type == MBTK_RADIO_TECH_GSM_EGPRS) //GSM
1146 {
1147 sig_strength.gw_sig_valid = 1;
1148 sig_strength.rssi = rssi_convert_to_dBm(net_data[1]);
1149 }
1150
1151 else if(type == MBTK_RADIO_TECH_E_UTRAN)
1152 {
1153 sig_strength.lte_sig_valid = 1;
1154 sig_strength.rsrp = rsrp_convert_to_dBm(net_data[7]);
1155 sig_strength.rsrq = rsrq_convert_to_dB(net_data[6]);
1156 sig_strength.rssnr = -99;
1157 }
1158
1159 else if (type == MBTK_RADIO_TECH_UTRAN || type == MBTK_RADIO_TECH_UTRAN_HSDPA || \
1160 type == MBTK_RADIO_TECH_UTRAN_HSUPA || type == MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA || \
1161 type == MBTK_RADIO_TECH_UTRAN_HSPA )//WCDMA
1162 {
1163 sig_strength.wcdma_sig_valid = 1;
1164 sig_strength.rscp = rssi_convert_to_dBm(net_data[1]);
1165 sig_strength.ecno = ecno_convert_to_dB(net_data[5]);
1166 }
1167
1168 if(sig_cb != NULL)
1169 {
1170 sig_cb(sig_strength);
1171 }
1172 }
1173
1174 else
1175 {
1176 LOGE("data is NULL\n");
1177 }
1178}
1179
1180static void gsw_modem_status_event_callback(const void* data, int data_len)
1181{
1182 LOGE("gsw_modem_status_event_callback start\n");
1183
1184 gsw_mode_state_e state = GSW_MODEM_STATE_UNKNOWN;
1185
1186 if(data && data_len > 0)
1187 {
1188 uint8 *net_data = (uint8*)data;
1189 LOGE("gsw_modem_status_event_callback,data = %d\n", *net_data);
1190 if(*net_data == 1)
1191 {
1192 state = GSW_MODEM_STATE_ONLINE;
1193 }
1194 else if(*net_data == 0)
1195 {
1196 state = GSW_MODEM_STATE_OFFLINE;
1197 }
1198
1199 if(modem_cb != NULL)
1200 {
1201 modem_cb(state);
1202 }
1203 }
1204
1205}
1206
1207static void gsw_reject_callback(GSW_NW_RADIO_ACCESS_TECH_E rat, GSW_SERVICE_DOMAIN_E domain, int cause)
1208{
1209 LOGE("gsw_reject_callback start,rat = %d,domain = %d,cause = %d\n",rat,domain,cause);
1210
1211 GSW_NW_REJ_CAUSE_E *rej_cause = (GSW_NW_REJ_CAUSE_E*)malloc(sizeof(GSW_NW_REJ_CAUSE_E));
1212 memset(rej_cause, 0x0, sizeof(GSW_NW_REJ_CAUSE_E));
1213
1214 rej_cause->rej_cause = cause;
1215 rej_cause->rej_rat = rat;
1216 rej_cause->rej_domain = domain;
1217
1218 if(reject_cb != NULL)
1219 {
1220 LOGE("reject_cb is not NULL\n");
1221 reject_cb(rej_cause);
1222 }
1223 else
1224 {
1225 LOGE("reject_cb is NULL\n");
1226 }
1227
1228 free(rej_cause);
1229 LOGE("gsw_reject_callback end\n");
1230}
1231
1232
1233
1234/**
1235 * @brief SDK interface to call back serving info
1236 * @param [in] handle_ptr
1237 * @retval 0: success
1238 * @retval other: fail
1239 */
1240int gsw_reg_serving_info_callback(GSW_NW_ServingInfoHandlePtr handle_ptr)
1241{
1242 if (nw_init_flag == 0 || nw_info_handle == NULL)
1243 {
1244 return GSW_HAL_FAIL;
1245 }
1246
1247 if(handle_ptr == NULL)
1248 {
1249 LOGE("handle_ptr is NULL\n");
1250 return GSW_HAL_FAIL;
1251 }
1252
1253 serving_cb = handle_ptr;
1254
1255 return GSW_HAL_SUCCESS;
1256
1257}
1258
1259
1260/**
1261 * @brief SDK interface to call back sig info
1262 * @param [in] handle_ptr
1263 * @retval 0: success
1264 * @retval other: fail
1265 */
1266int gsw_reg_sig_info_callback(GSW_NW_SigInfoHandlePtr handle_ptr)
1267{
1268 if (nw_init_flag == 0 || nw_info_handle == NULL)
1269 {
1270 return GSW_HAL_FAIL;
1271 }
1272
1273 if(handle_ptr == NULL)
1274 {
1275 LOGE("handle_ptr is NULL\n");
1276 return GSW_HAL_FAIL;
1277 }
1278
1279 sig_cb = handle_ptr;
1280
1281 return GSW_HAL_SUCCESS;
1282
1283}
1284
1285
1286/**
1287 * @brief SDK interface to call back rej cause
1288 * @param [in] handle_ptr
1289 * @retval 0: success
1290 * @retval other: fail
1291 */
1292int gsw_reg_rej_cause_callback(GSW_NW_RejectCauseHandlePtr handle_ptr)
1293{
1294 if (nw_init_flag == 0 || nw_info_handle == NULL)
1295 {
1296 return GSW_HAL_FAIL;
1297 }
1298
1299 if(handle_ptr == NULL)
1300 {
1301 LOGE("handle_ptr is NULL\n");
1302 return GSW_HAL_FAIL;
1303 }
1304
1305 reject_cb = handle_ptr;
1306
1307 return GSW_HAL_SUCCESS;
1308}
1309
1310
1311/**
1312 * @brief network sdk init
1313 * @param [in] token usr id define by who use
1314 * @retval 0: success
1315 * @retval other: fail
1316 */
1317int gsw_nw_sdk_init(int token)
1318{
1319 int ret = -1;
1320
1321 if (nw_init_flag == 1 && nw_info_handle != NULL)
1322 {
1323 return GSW_HAL_SUCCESS;
1324 }
1325
1326 ret = mbtk_nw_api_import();
1327 if (ret != 0)
1328 {
1329 LOGE("mbtk_nw_api_import fail\n");
1330 return GSW_HAL_FAIL;
1331 }
1332
1333 nw_info_handle = mbtk_info_handle_get();
1334
1335 if (nw_info_handle == NULL)
1336 {
1337 LOGE("mbtk_info_handle_get fail\n");
1338 return GSW_HAL_FAIL;
1339 }
1340
1341 char fplmn[256] = {0};
1342 ret = mbtk_fplmn_get(nw_info_handle, fplmn);
1343 if(ret != 0)
1344 {
1345 LOGE("mbtk_fplmn_get failed : %d\n",ret);
1346 return GSW_HAL_FAIL;
1347 }
1348 fplmn_max_length = (strlen(fplmn)/6);
1349 LOGE("fplmn = %s, fplmn_max_length = %d\n",fplmn,fplmn_max_length);
1350 ret = mbtk_signal_state_change_cb_reg(nw_info_handle, gsw_sig_info_callback);
1351
1352 if (ret != 0)
1353 {
1354 LOGE("mbtk_signal_state_change_cb_reg fail\n");
1355 return GSW_HAL_FAIL;
1356 }
1357
1358 ret = mbtk_net_state_change_cb_reg(nw_info_handle, gsw_serving_info_callback);
1359 if (ret != 0)
1360 {
1361 LOGE("mbtk_net_state_change_cb_reg fail\n");
1362 return GSW_HAL_FAIL;
1363 }
1364
1365 nw_init_flag = 1;
1366
1367 return GSW_HAL_SUCCESS;
1368}
1369
1370
1371/**
1372 * @brief network sdk deinit
1373 * @param
1374 * @retval 0: success
1375 * @retval other: fail
1376 */
1377int gsw_nw_sdk_deinit(void)
1378{
1379 int ret = -1;
1380
1381 if (nw_init_flag == 0 || nw_info_handle == NULL)
1382 {
1383 return GSW_HAL_FAIL;
1384 }
1385
1386 ret = mbtk_info_handle_free(&nw_info_handle);
1387 if(ret != GSW_HAL_SUCCESS)
1388 {
1389 LOGE("mbtk_info_handle_free fail\n");
1390 return GSW_HAL_FAIL;
1391 }
1392
1393 dlclose(dlHandle_mbtk);
1394 nw_info_handle = NULL;
1395 nw_init_flag = 0;
1396
1397 return GSW_HAL_SUCCESS;
1398
1399}
1400
1401
1402/**
1403 * @brief get current network reg info
1404 * @param [out] serving_info struct for network info
1405 * include regstate ps_state opreator name mcc mcn etc
1406 * @retval 0: success
1407 * @retval other: fail
1408 */
1409int gsw_get_nwinfo(GSW_NW_SERVING_INFO *serving_info)
1410{
1411
1412 int ret = -1;
1413 LOGE("gsw_get_nwinfo start\n");
1414 if (nw_init_flag == 0 || nw_info_handle == NULL)
1415 {
1416 LOGE("nw_sdk_deinit not init\n");
1417 return GSW_HAL_FAIL;
1418 }
1419
1420 LOGE("mbtk_net_reg_get start \n");
1421 //regstate
1422 mbtk_net_reg_info_t reg;
1423 memset(&reg, 0x0, sizeof(mbtk_net_reg_info_t));
1424 ret = mbtk_net_reg_get(nw_info_handle, &reg);
1425 if(ret)
1426 {
1427 LOGE("mbtk_net_reg_get fail\n");
1428 return GSW_HAL_FAIL;
1429 }
1430
1431 LOGE("convert_cs_reg_state\n");
1432 //cs_state
1433 serving_info->reg_state = convert_reg_state(reg.call_state);
1434 LOGE("convert_ps_reg_state\n");
1435 //ps_state
1436 serving_info->ps_state = convert_reg_state(reg.data_state);
1437 LOGE("convert_rat_mode\n");
1438 //reg_rat
1439 serving_info->reg_rat = convert_net_mode(reg.type);
1440 //srv_domain
1441 if(serving_info->reg_state == GSW_NETWORK_REG_REGISTERED || serving_info->reg_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1442 {
1443 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTERED || serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1444 {
1445 serving_info->srv_domain = GSW_SRV_DOMAIN_CS_PS;
1446 }
1447
1448 else
1449 {
1450 serving_info->srv_domain = GSW_SRV_DOMAIN_CS_ONLY;
1451 }
1452 }
1453
1454 else if (serving_info->ps_state == GSW_NETWORK_REG_REGISTERED || serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1455 {
1456 serving_info->srv_domain = GSW_SRV_DOMAIN_PS_ONLY;
1457 }
1458
1459 else
1460 {
1461 serving_info->srv_domain = GSW_SRV_DOMAIN_NO_SVC;
1462 //if ps and cs is both not registed, reg_rat seted to GSW_NETWORK_RADIO_NO_SVC
1463 serving_info->reg_rat = GSW_NETWORK_RADIO_NO_SVC;
1464 }
1465
1466 LOGD("roaming_ind\n");
1467 //roaming_ind
1468 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1469 {
1470 serving_info->roaming_ind = GSW_NETWORK_ROAMING_ON;
1471 }
1472 else
1473 {
1474 serving_info->roaming_ind = GSW_NETWORK_ROAMING_OFF;
1475 }
1476
1477 LOGD("reject\n");
1478 //reject
1479 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_DENIED || serving_info->reg_state == GSW_NETWORK_REG_REGISTRATION_DENIED)
1480 {
1481 LOGD("reject_callback\n");
1482 gsw_reject_callback(serving_info->reg_rat,serving_info->srv_domain,99);
1483 }
1484
1485 LOGD("reg_plmn / operator name\n");
1486 //reg_plmn / operator name
1487 mbtk_net_info_t net;
1488 memset(&net, 0x0, sizeof(mbtk_net_info_t));
1489 LOGD("mbtk_net_sel_mode_get start \n");
1490 ret = mbtk_net_sel_mode_get(nw_info_handle, &net);
1491 LOGD("mbtk_net_sel_mode_get end \n");
1492 if(ret == 0 && net.plmn > 0)
1493 {
1494 int i = 0;
1495
1496 LOGD("start to find mcc");
1497 while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
1498 {
1499 if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
1500 {
1501 LOGD("find mcc\n");
1502 break;
1503 }
1504 i++;
1505 }
1506
1507
1508 if(i == ARRAY_SIZE(lynq_operator_mcc_mnc))
1509 {
1510 LOGD("not find mcc");
1511 strcpy(serving_info->operator_name, "unknown");
1512 sprintf(serving_info->reg_plmn, "%d", net.plmn);
1513 }
1514
1515 else
1516 {
1517 LOGD("find mcc\n");
1518 strcpy(serving_info->operator_name, lynq_operator_mcc_mnc[i].lynq_operator_l);
1519 sprintf(serving_info->reg_plmn, "%d", net.plmn);
1520 }
1521
1522 LOGE("operator_name = %s\n", serving_info->operator_name);
1523 LOGE("reg_plmn = %s\n", serving_info->reg_plmn);
1524 }
1525
1526
1527 LOGD("get cell id/tac/lac/sid/nid\n");
1528 //cell id/tac/lac/sid/nid
1529 mbtk_cell_type_enum cell_type;
1530 if(serving_info->reg_rat == GSW_NETWORK_RADIO_GSM)
1531 {
1532 cell_type = MBTK_CELL_TYPE_GSM;
1533 }
1534 else if(serving_info->reg_rat == GSW_NETWORK_RADIO_UMTS)
1535 {
1536 cell_type = MBTK_CELL_TYPE_UMTS;
1537 }
1538 else
1539 {
1540 cell_type = MBTK_CELL_TYPE_LTE;
1541 }
1542
1543 list_node_t* cell_list = NULL;
1544
1545 LOGD("mbtk_cell_get start\n");
1546 ret = mbtk_cell_get(nw_info_handle, &cell_type, &cell_list);
1547 if(ret != 0 || cell_list == NULL)
1548 {
1549 LOGE("mbtk_cell_get fail\n");
1550 return GSW_HAL_FAIL;
1551 }
1552 else
1553 {
1554 LOGE("mbtk_cell_get end,start to get node\n");
1555 list_first(cell_list);
1556 LOGE("list_first end\n");
1557 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
1558 if(cell)
1559 {
1560 LOGE("cell is not null,value2 = %u\n",cell->value2);
1561 switch(cell_type)
1562 {
1563 case MBTK_CELL_TYPE_LTE:
1564 {
1565 LOGE("is lte\n");
1566 //LOGE("LTE : tac=%x, PCI=%x, dlEuarfcn=%x, ulEuarfcn=%x, band=%x\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
1567 LOGE("LTE : tac=%d, PCI=%d, dlEuarfcn=%d, ulEuarfcn=%d, band=%d\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
1568 snprintf(serving_info->tac,sizeof(serving_info->tac),"%d",cell->value1);
1569 strcpy(serving_info->lac,"");
1570 snprintf(serving_info->cell_id,sizeof(serving_info->cell_id),"%d",cell->value8);
1571 break;
1572 }
1573
1574 case MBTK_CELL_TYPE_GSM:
1575 {
1576 LOGE("is gsm\n");
1577 LOGE("GSM : lac=%d, ci=%d, arfcn=%d, bsic=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
1578 sprintf(serving_info->lac,"%d",cell->value1);
1579 memset(serving_info->tac,0,sizeof(serving_info->tac));
1580 sprintf(serving_info->cell_id,"%d",cell->value2);
1581 break;
1582 }
1583 case MBTK_CELL_TYPE_UMTS:
1584 {
1585 LOGE("is wcdma\n");
1586 LOGE("UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
1587 sprintf(serving_info->lac,"%d",cell->value1);
1588 memset(serving_info->tac,0,sizeof(serving_info->tac));
1589 sprintf(serving_info->cell_id,"%d",cell->value2);
1590 break;
1591 }
1592
1593 default:
1594 break;
1595 }
1596 }
1597 else
1598 {
1599 LOGE("cell is null\n");
1600 }
1601 }
1602
1603 //not support now
1604 serving_info->sid = 0;
1605 serving_info->nid = 0;
1606
1607 return GSW_HAL_SUCCESS;
1608}
1609
1610
1611/**
1612 * @brief get current network type
1613 * @param [out] netype as GSW_NW_RADIO_ACCESS_TECH_E type
1614 * @retval 0: success
1615 * @retval other: fail
1616 */
1617int gsw_get_netype(int *netype)
1618{
1619 int ret = -1;
1620
1621 if (nw_init_flag == 0 || nw_info_handle == NULL)
1622 {
1623 return GSW_HAL_FAIL;
1624 }
1625
1626 //regstate
1627 mbtk_net_reg_info_t reg;
1628 ret = mbtk_net_reg_get(nw_info_handle, &reg);
1629 if(ret)
1630 {
1631 LOGE("mbtk_net_reg_get fail\n");
1632 return GSW_HAL_FAIL;
1633 }
1634
1635 if(reg.data_state == MBTK_NET_REG_STATE_HOME || reg.data_state == MBTK_NET_REG_STATE_ROAMING)
1636 {
1637 *netype = convert_net_mode(reg.type);
1638 }
1639 else
1640 {
1641 *netype = GSW_NETWORK_RADIO_NO_SVC;
1642 }
1643
1644 return GSW_HAL_SUCCESS;
1645}
1646
1647
1648/**
1649 * @brief get radio opmode, as open and close airplane mode
1650 * @param [out] op_mode 1 is radio on, 0 is radio off
1651 * @retval 0: success
1652 * @retval other: fail
1653 */
1654int gsw_get_opmode(int *op_mode)
1655{
1656 int tmp_rf = -1;
1657 int ret = -1;
1658 if (nw_init_flag == 0 || nw_info_handle == NULL)
1659 {
1660 return GSW_HAL_FAIL;
1661 }
1662
1663 ret = mbtk_get_modem_fun(nw_info_handle, &tmp_rf);
1664 if (ret != 0)
1665 {
1666 LOGE("mbtk_get_modem_fun fail\n");
1667 return GSW_HAL_FAIL;
1668 }
1669 if(tmp_rf == LYNQ_AIR_CFUN_MODE_OFF)
1670 {
1671 *op_mode = GSW_OP_MODE_LPM;
1672 }
1673
1674 if(tmp_rf == LYNQ_AIR_PLANE_MODE_ON)
1675 {
1676 *op_mode = GSW_OP_MODE_OFFLINE;
1677 }
1678
1679 if(tmp_rf == LYNQ_AIR_PLANE_MODE_OFF)
1680 {
1681 *op_mode = GSW_OP_MODE_ONLINE;
1682 }
1683
1684 return GSW_HAL_SUCCESS;
1685}
1686
1687
1688
1689/**
1690 * @brief set radio opmode, as open and close airplane mode
1691 * @param [in] op_mode 1 is radio on, 0 is radio off
1692 * @retval 0: success
1693 * @retval other: fail
1694 */
1695int gsw_set_opmode(int op_mode)
1696{
1697 mbtk_modem_info_t info;
1698 int rf_mode = -1;
1699 int ret = -1;
1700
1701 if (nw_init_flag == 0 || nw_info_handle == NULL)
1702 {
1703 return GSW_HAL_FAIL;
1704 }
1705
1706 if(op_mode == GSW_OP_MODE_LPM)
1707 {
1708 rf_mode = LYNQ_AIR_CFUN_MODE_OFF;
1709 }
1710
1711 if(op_mode == GSW_OP_MODE_ONLINE)
1712 {
1713 rf_mode = LYNQ_AIR_PLANE_MODE_OFF;
1714 }
1715
1716 if(op_mode == GSW_OP_MODE_OFFLINE)
1717 {
1718 rf_mode = LYNQ_AIR_PLANE_MODE_ON;
1719 }
1720
1721 if (rf_mode != LYNQ_AIR_PLANE_MODE_ON && rf_mode != LYNQ_AIR_PLANE_MODE_OFF && rf_mode != LYNQ_AIR_CFUN_MODE_OFF)
1722 {
1723 LOGE("Input mode is error!\n");
1724 return GSW_HAL_FAIL;
1725 }
1726
1727 info.fun = rf_mode;
1728 info.rst = 0;
1729 ret = mbtk_set_modem_fun(nw_info_handle, &info);
1730 if (ret != 0)
1731 {
1732 LOGE("gsw_set_opmode fail\n");
1733 return GSW_HAL_FAIL;
1734 }
1735
1736 return GSW_HAL_SUCCESS;
1737
1738}
1739
1740
1741/**
1742 * @brief get network mode preference of mdm search network scale
1743 * @param [out] mode_pref net_work pref mode:
1744 * enum prefer_mode
1745 * @retval 0: success
1746 * @retval other: fail
1747 */
1748int gsw_get_mode_preference(int *mode_pref)
1749{
1750 if (nw_init_flag == 0 || nw_info_handle == NULL)
1751 {
1752 return GSW_HAL_FAIL;
1753 }
1754
1755 int ret = -1;
1756 mbtk_band_info_t band;
1757 memset(&band, 0, sizeof(mbtk_band_info_t));
1758
1759 ret = mbtk_current_band_get(nw_info_handle, &band);
1760 if(ret != 0)
1761 {
1762 LOGE("mbtk_current_band_get fail\n");
1763 return GSW_HAL_FAIL;
1764 }
1765
1766 *mode_pref = convert_gsw_net_config(band.net_pref);
1767 LOGE("band.net_pref = %d\n", *mode_pref);
1768 if(*mode_pref <= 0)
1769 {
1770 LOGE("no support mode\n");
1771 return GSW_HAL_FAIL;
1772 }
1773 return GSW_HAL_SUCCESS;
1774
1775
1776}
1777
1778/**
1779 * @brief set network mode preference of mdm search network scale
1780 * @param [in] mode_pref net_work pref mode:
1781 * enum prefer_mode
1782 * @retval 0: success
1783 * @retval other: fail
1784 */
1785int gsw_set_mode_preference(int mode_pref)
1786{
1787 if (nw_init_flag == 0 || nw_info_handle == NULL)
1788 {
1789 return GSW_HAL_FAIL;
1790 }
1791
1792 int ret = -1;
1793
1794 mbtk_band_info_t band;
1795 memset(&band, 0, sizeof(mbtk_band_info_t));
1796
1797 band.net_pref = convert_mbtk_net_config(mode_pref);
1798 LOGE("band.net_pref = %d\n", band.net_pref);
1799
1800 if(band.net_pref < 0)
1801 {
1802 LOGE("no support mode\n");
1803 return GSW_HAL_FAIL;
1804 }
1805
1806 ret = mbtk_current_band_set(nw_info_handle, &band);
1807 if(ret != 0)
1808 {
1809 LOGE("mbtk_current_band_set fail\n");
1810 return GSW_HAL_FAIL;
1811 }
1812
1813 return GSW_HAL_SUCCESS;
1814}
1815
1816/**
1817 * @brief get signal csq value
1818 * @param [out] csq_value csq of signalstrengh 0 - 31, 99 invalid
1819 * @retval 0: success
1820 * @retval other: fail
1821 */
1822int gsw_get_sig_info(int *csq_value)
1823{
1824 int ret = -1;
1825
1826 if (nw_init_flag == 0 || nw_info_handle == NULL)
1827 {
1828 return GSW_HAL_FAIL;
1829 }
1830
1831 mbtk_signal_info_t signal;
1832 memset(&signal, 0x0, sizeof(mbtk_signal_info_t));
1833 ret = mbtk_net_signal_get(nw_info_handle, &signal);
1834 if(ret != 0)
1835 {
1836 LOGE("mbtk_net_signal_get fail\n");
1837 return GSW_HAL_FAIL;
1838 }
1839
1840 LOGD("signal.type=%d\n", signal.type);
1841 switch(signal.type)
1842 {
1843 case MBTK_RADIO_TECH_GSM:
1844 case MBTK_RADIO_TECH_GSM_COMPACT:
1845 case MBTK_RADIO_TECH_GSM_EGPRS:
1846 {
1847 LOGD("rssi = %d\n",signal.rssi);
1848 *csq_value = rssi_convert_to_dBm(signal.rssi);
1849 break;
1850 }
1851 case MBTK_RADIO_TECH_E_UTRAN:
1852 {
1853 LOGD("rsrp = %d\n",signal.rsrp);
1854 *csq_value = rsrp_convert_to_dBm(signal.rsrp);
1855 break;
1856 }
1857 case MBTK_RADIO_TECH_UTRAN:
1858 case MBTK_RADIO_TECH_UTRAN_HSDPA:
1859 case MBTK_RADIO_TECH_UTRAN_HSUPA:
1860 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
1861 case MBTK_RADIO_TECH_UTRAN_HSPA:
1862 {
1863 LOGD("rscp = %d\n",signal.rscp);
1864 *csq_value = rscp_convert_to_dBm(signal.rscp);
1865 break;
1866 }
1867 default:
1868 {
1869 LOGD("[%s] unknown reg type.[%d]\n", __func__, signal.type);
1870 return GSW_HAL_FAIL;
1871 }
1872 }
1873 return GSW_HAL_SUCCESS;
1874}
1875
1876/**
1877 * @brief set nework power mode, for tcam enter standby or exit standby
1878 * @param [in] mode TRUE(1) when enter standby, FALSE(0) after wake up
1879 * @retval 0: success
1880 * @retval other: fail
1881 */
1882int gsw_network_set_power_mode(char mode)
1883{
1884 int ret = -1;
1885
1886 if (nw_init_flag == 0 || nw_info_handle == NULL)
1887 {
1888 return GSW_HAL_FAIL;
1889 }
1890
1891 if(mode != 0 && mode != 1)
1892 {
1893 LOGE("Input mode is error!\n");
1894 return GSW_HAL_FAIL;
1895 }
1896
1897 if(mode == 1)
1898 {
1899 mode = 6;
1900 }
1901
1902 ret = mbtk_wakeup_state_set(nw_info_handle, mode);
1903 if(ret != 0)
1904 {
1905 LOGE("mbtk_wakeup_state_set fail\n");
1906 return GSW_HAL_FAIL;
1907 }
1908
1909 return GSW_HAL_SUCCESS;
1910
1911
1912
1913}
1914
1915/**
1916 * @brief convert rsrp rscp rssi to csq value.
1917 * @param [in] netType signal radio tech 2 means 2G 3 mens 3G,4 is 4G,5 is 5G
1918 * @param [in] sigvalue input signal_strength for different nettype
1919 * rsrp for 4G/5G, rscp for 3G, rssi for 2G
1920
1921 * @retval csq
1922 * @retval other: fail
1923 */
1924int gsw_sigInfo_to_csq(int netType, int sigValue)
1925{
1926 switch(netType)
1927 {
1928 case 1:
1929 case 2:
1930 case 3:
1931 case 4: //GSM
1932 {
1933 return gsw_rssi_to_csq(sigValue);
1934 }
1935
1936 case 5: //WCDMA
1937 {
1938 return gsw_rscp_to_csq(sigValue);
1939 }
1940
1941 case 6: //LTE
1942 {
1943 return gsw_rsrp_to_csq(sigValue);
1944 }
1945
1946 default:
1947 {
1948 LOGE("parameter error\n");
1949 return GSW_HAL_FAIL;
1950 }
1951 }
1952}
1953
1954/*
1955 * @brief get mobile operator name
1956 @param [out] nw_operator_name_infos get the long and short operator name info
1957 @retval 0: success
1958 @retval 0: other: fail
1959 */
1960int gsw_get_mobile_operator_name(gsw_mobile_operator_name *nw_operator_name_infos)
1961{
1962 char OperatorFN[128];
1963 char OperatorSH[128];
1964 char temp[12] = {0};
1965 mbtk_net_info_t net;
1966
1967 if (nw_init_flag == 0 || nw_info_handle == NULL)
1968 {
1969 return GSW_HAL_FAIL;
1970 }
1971
1972 if(!mbtk_net_sel_mode_get(nw_info_handle, &net) && net.plmn > 0)
1973 {
1974 LOGE("Net : %d, %d, %d\n", net.net_sel_mode, net.net_type, net.plmn);
1975 int i = 0;
1976 while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
1977 {
1978 if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
1979 break;
1980 i++;
1981 }
1982
1983 if(i == ARRAY_SIZE(lynq_operator_mcc_mnc)) // No found mcc&mnc
1984 {
1985 strcpy(OperatorFN, "UNKNOWN");
1986 strcpy(OperatorSH, "UNKNOWN");
1987 }
1988 else
1989 {
1990 strcpy(OperatorFN, lynq_operator_mcc_mnc[i].lynq_operator_l);
1991 strcpy(OperatorSH, lynq_operator_mcc_mnc[i].lynq_operator_s);
1992
1993 memset(temp,0,12);
1994 memset(nw_operator_name_infos->mcc,0,4);
1995 sprintf(temp, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)/100);
1996 strncpy(nw_operator_name_infos->mcc, temp, strlen(temp));
1997
1998 memset(temp,0,12);
1999 memset(nw_operator_name_infos->mnc,0,4);
2000 sprintf(temp, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)%100);
2001 strncpy(nw_operator_name_infos->mnc, temp, strlen(temp));
2002 }
2003
2004 memset(nw_operator_name_infos->long_eons,0,128);
2005 memcpy(nw_operator_name_infos->long_eons,OperatorFN,strlen(OperatorFN));
2006 memset(nw_operator_name_infos->short_eons,0,128);
2007 memcpy(nw_operator_name_infos->short_eons,OperatorSH,strlen(OperatorSH));
2008
2009 return GSW_HAL_SUCCESS;
2010 }
2011
2012 else
2013 {
2014 LOGE("mbtk_net_sel_mode_get fail\n");
2015 return GSW_HAL_FAIL;
2016 }
2017
2018 return GSW_HAL_SUCCESS;
2019}
2020
2021
2022/*
2023 * @brief get current serving cell info
2024 * @param cell_info: [out] struct for current cell info
2025 * include earfcn mcc mnc pci psc tac lac etc.
2026 * @return int: 0 is success, other failed
2027 */
2028int gsw_get_cell_info(GSW_NW_CELL_INFO *cell_info)
2029{
2030 int ret = -1;
2031
2032 if (nw_init_flag == 0 || nw_info_handle == NULL)
2033 {
2034 LOGE("nw_sdk_deinit not init\n");
2035 return GSW_HAL_FAIL;
2036 }
2037
2038 list_node_t* cell_list = NULL;
2039 int neibor_count = 0;
2040 mbtk_cell_type_enum type;
2041 ret = mbtk_cell_get(nw_info_handle, &type, &cell_list);
2042 if(ret || cell_list == NULL) {
2043 LOGE("mbtk_cell_get failed : %d\n", ret);
2044 } else {
2045 list_first(cell_list);
2046 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
2047 if(cell) { // Current server cell.
2048 switch(type)
2049 {
2050 case 0:
2051 {
2052 LOGD("GSM : lac=%d, ci=%d, arfcn=%d, bsic=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
2053 char gsm_temp[12] = {0};
2054
2055 cell_info->rat = GSW_NETWORK_RADIO_GSM;
2056
2057 cell_info->mcc_valid = 1;
2058 snprintf(gsm_temp, sizeof(gsm_temp) ,"%d", cell->value5);
2059 strncpy(cell_info->mcc, gsm_temp, sizeof(cell_info->mcc));
2060
2061 memset(gsm_temp, 0, sizeof(gsm_temp));
2062
2063 cell_info->mnc_valid = 1;
2064 snprintf(gsm_temp, sizeof(gsm_temp) ,"%d", cell->value6);
2065 strncpy(cell_info->mnc, gsm_temp, sizeof(cell_info->mnc));
2066
2067 cell_info->cell_id_valid = 1;
2068 cell_info->cell_id = cell->value2;
2069
2070 cell_info->lac_valid = 1;
2071 cell_info->lac = cell->value1;
2072
2073 cell_info->arfcn_valid = 1;
2074 cell_info->arfcn = cell->value3;
2075
2076 break;
2077 }
2078
2079 case 1:
2080 {
2081 LOGD("UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
2082 char wcdma_temp[12] = {0};
2083
2084 cell_info->rat = GSW_NETWORK_RADIO_UMTS;
2085
2086 cell_info->mcc_valid = 1;
2087 snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%d", cell->value4);
2088 strncpy(cell_info->mcc, wcdma_temp, sizeof(cell_info->mcc));
2089
2090 memset(wcdma_temp, 0, sizeof(wcdma_temp));
2091
2092 cell_info->mnc_valid = 1;
2093 snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%d", cell->value5);
2094 strncpy(cell_info->mnc, wcdma_temp, sizeof(cell_info->mnc));
2095
2096 cell_info->lac_valid = 1;
2097 cell_info->lac = cell->value1;
2098
2099 cell_info->cell_id_valid = 1;
2100 cell_info->cell_id = cell->value2;
2101
2102 cell_info->uarfcn_valid = 1;
2103 cell_info->uarfcn = cell->value3;
2104
2105 cell_info->psc_valid = 1;
2106 cell_info->psc = cell->value6;
2107 break;
2108 }
2109
2110 case 2:
2111 {
2112 LOGE("LTE : tac=%d, PCI=%d, dlEuarfcn=%d, ulEuarfcn=%d, band=%d\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
2113
2114 char lte_temp[12] = {0};
2115
2116 cell_info->rat = GSW_NETWORK_RADIO_LTE;
2117
2118 cell_info->mcc_valid = 1;
2119 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);
2120 strncpy(cell_info->mcc, lte_temp, sizeof(cell_info->mcc));
2121
2122 memset(lte_temp, 0, sizeof(lte_temp));
2123
2124 cell_info->mnc_valid = 1;
2125 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);
2126 strncpy(cell_info->mnc, lte_temp, sizeof(cell_info->mnc));
2127
2128 cell_info->tac_valid = 1;
2129 cell_info->tac = cell->value1;
2130
2131 cell_info->pci_valid = 1;
2132 cell_info->pci = cell->value2;
2133
2134 cell_info->earfcn_valid = 1;
2135 cell_info->earfcn = cell->value3;
2136
2137 cell_info->bler_valid = 1;
2138 cell_info->bler = cell->value4;
2139
2140 cell_info->band_valid = 1;
2141 cell_info->band = cell->value5;
2142
2143 cell_info->rsrp_valid = 1;
2144 cell_info->rsrp = cell->value8;
2145
2146 cell_info->rsrq_valid = 1;
2147 cell_info->rsrq = cell->value9;
2148
2149 cell_info->cell_id_valid = 1;
2150 cell_info->cell_id = cell->value10;
2151
2152 break;
2153 }
2154
2155 default:
2156 break;
2157 }
2158 }
2159
2160 while ((cell = (mbtk_cell_info_t*) list_next(cell_list)) && neibor_count < 5)
2161 {
2162 switch(type)
2163 {
2164 //GSM
2165 case 0:
2166 {
2167
2168 }
2169 //WCDMA
2170 case 1:
2171 {
2172 LOGE("CELL : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
2173
2174 //cell_info->ext_info[neibor_count]->lac = cell->value1;
2175
2176 cell_info->ext_info[neibor_count].cell_id_valid = 1;
2177 cell_info->ext_info[neibor_count].cell_id = cell->value2;
2178
2179 cell_info->ext_info[neibor_count].arfcn_valid = 1;
2180 cell_info->ext_info[neibor_count].arfcn = cell->value3;
2181
2182 cell_info->ext_info[neibor_count].rat = cell_info->rat = GSW_NETWORK_RADIO_UMTS;
2183
2184 neibor_count++;
2185
2186 }
2187 //LTE
2188 case 2:
2189 {
2190 LOGE("CELL : phyCellId=%d, euArfcn=%d, rsrp=%d, rsrq=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
2191 char lte_temp[12] = {0};
2192 cell_info->ext_info[neibor_count].rat = GSW_NETWORK_RADIO_LTE;
2193
2194 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);
2195 strncpy(cell_info->ext_info[neibor_count].mcc, lte_temp, sizeof(cell_info->mcc));
2196
2197 memset(lte_temp, 0, sizeof(lte_temp));
2198
2199 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);
2200 strncpy(cell_info->ext_info[neibor_count].mnc, lte_temp, sizeof(cell_info->mnc));
2201
2202 cell_info->ext_info[neibor_count].pci = cell->value1;
2203 cell_info->ext_info[neibor_count].pci_valid = 1;
2204
2205 cell_info->ext_info[neibor_count].arfcn = cell->value2;
2206 cell_info->ext_info[neibor_count].arfcn_valid = 1;
2207
2208 cell_info->ext_info[neibor_count].rsrp = cell->value3;
2209 cell_info->ext_info[neibor_count].rsrp_valid = 1;
2210
2211 cell_info->ext_info[neibor_count].rsrq = cell->value4;
2212 cell_info->ext_info[neibor_count].rsrq_valid = 1;
2213
2214 cell_info->ext_info[neibor_count].cell_id = cell->value5;
2215 cell_info->ext_info[neibor_count].cell_id_valid = 1;
2216
2217 cell_info->ext_info[neibor_count].band = cell->value9;
2218 cell_info->ext_info[neibor_count].band_valid = 1;
2219
2220 cell_info->ext_info[neibor_count].rssi = cell->value10;
2221 cell_info->ext_info[neibor_count].rssi_valid = 1;
2222
2223 neibor_count++;
2224 }
2225
2226 default:
2227 break;
2228 }
2229 }
2230 }
2231 list_free(cell_list);
2232
2233 return GSW_HAL_SUCCESS;
2234}
2235
2236/*
2237 * @brief set modem status event callback
2238 @param [in] handle_ptr callback function address
2239 @retval 0: success
2240 @retval 0: other: fail
2241 */
2242int gsw_reg_set_modem_status_event_callback(GSW_NW_ModemStateHandlePtr handle_ptr)
2243{
2244
2245 if (nw_init_flag == 0 || nw_info_handle == NULL)
2246 {
2247 return GSW_HAL_FAIL;
2248 }
2249
2250 int ret = -1;
2251
2252 if(handle_ptr == NULL)
2253 {
2254 LOGE("handle_ptr is NULL\n");
2255 return GSW_HAL_FAIL;
2256 }
2257
2258 modem_cb = handle_ptr;
2259
2260 ret = mbtk_radio_state_change_cb_reg(nw_info_handle,gsw_modem_status_event_callback);
2261 if(ret != 0)
2262 {
2263 LOGE("mbtk_radio_state_change_cb_reg failed : %d\n", ret);
2264 return GSW_HAL_FAIL;
2265 }
2266
2267 return GSW_HAL_SUCCESS;
2268
2269}
2270
2271
2272/*
2273 * @brief get PLMNs from the FPLMN list
2274 * @param [inout] plmn_list:
2275 * @retval 0: success
2276 * @retval other: fail
2277 */
2278int gsw_get_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2279{
2280 if (nw_init_flag == 0 || nw_info_handle == NULL)
2281 {
2282 return GSW_HAL_FAIL;
2283 }
2284
2285 int ret = -1;
2286 char fplmn[256] = {0};
2287 LOGE("mbtk_fplmn_get enter\n");
2288 ret = mbtk_fplmn_get(nw_info_handle, fplmn);
2289 LOGE("mbtk_fplmn_get exit\n");
2290 if(ret != 0)
2291 {
2292 LOGE("mbtk_fplmn_get failed : %d\n",ret);
2293 return GSW_HAL_FAIL;
2294 }
2295
2296 update_fplmn_list(fplmn);
2297 for(int i = 0; i < fplmn_index; i++)
2298 {
2299 if(strcmp(fplmn_array[i],"FFFFFF") == 0)
2300 {
2301 continue;
2302 }
2303 extract_mcc_mnc(fplmn_array[i], plmn_list->plmn_list[plmn_list->plmn_list_len].mcc, plmn_list->plmn_list[plmn_list->plmn_list_len].mnc);
2304 LOGE("mcc = %s, mnc = %s\n", plmn_list->plmn_list[plmn_list->plmn_list_len].mcc, plmn_list->plmn_list[plmn_list->plmn_list_len].mnc);
2305 plmn_list->plmn_list_len++;
2306 }
2307
2308 LOGE("fplmn = %s\n", fplmn);
2309 return GSW_HAL_SUCCESS;
2310}
2311
2312/*
2313 * @brief add PLMNs from the plmn_list to the FPLMN list
2314 * @param [in] plmn_list:
2315 * @retval 0: success
2316 * @retval other: fail
2317 */
2318int gsw_add_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2319{
2320
2321 if (nw_init_flag == 0 || nw_info_handle == NULL)
2322 {
2323 return GSW_HAL_FAIL;
2324 }
2325
2326 if(plmn_list->plmn_list_len >= fplmn_max_length)
2327 {
2328 LOGE("can't save all the plmn\n");
2329 return GSW_HAL_FAIL;
2330 }
2331
2332 int i = 0;
2333 int index = -1;
2334
2335 for(i = 0; i < plmn_list->plmn_list_len; i++)
2336 {
2337 index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);
2338
2339 if(index == -1)
2340 {
2341 LOGE("no this PLMN, add it\n");
2342 if((fplmn_index + plmn_list->plmn_list_len) > fplmn_max_length)
2343 {
2344 LOGE("can't save all the plmn\n");
2345 return GSW_HAL_FAIL;
2346 }
2347
2348 else
2349 {
2350 memcpy(fplmn_array[fplmn_index], plmn_list->plmn_list[i].mcc, 3);
2351 memcpy(fplmn_array[fplmn_index] + 3, plmn_list->plmn_list[i].mnc, 2);
2352 fplmn_array[fplmn_index][5] = '\0';
2353 LOGE("fplmn_array[%d] = %s\n", fplmn_index, fplmn_array[fplmn_index]);
2354 fplmn_index++;
2355 }
2356 }
2357
2358 else
2359 {
2360 LOGE("already have this PLMN, don't add it\n");
2361 }
2362 }
2363
2364 char fplmn_str[256] = {0};
2365 convert_plmn_to_fplmn_str(fplmn_str);
2366
2367 LOGE("fplmn_str = %s\n", fplmn_str);
2368
2369 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2370 if(ret != 0)
2371 {
2372 LOGE("mbtk_fplmn_set failed : %d\n",ret);
2373 return GSW_HAL_FAIL;
2374 }
2375
2376 LOGE("gsw_add_forbidden_networks exit\n");
2377 return GSW_HAL_SUCCESS;
2378}
2379
2380/*
2381 * @brief Remove PLMNs from the plmn_list from the FPLMN list
2382 * @param [in] plmn_list:
2383 * @retval 0: success
2384 * @retval other: fail
2385 */
2386int gsw_remove_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2387{
2388 LOGE("gsw_remove_forbidden_networks enter\n");
2389 if (nw_init_flag == 0 || nw_info_handle == NULL)
2390 {
2391 return GSW_HAL_FAIL;
2392 }
2393
2394 int i = 0;
2395 int index = -1;
2396
2397 for(i = 0; i < plmn_list->plmn_list_len; i++)
2398 {
2399 index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);
2400 if(index != -1)
2401 {
2402 remove_fplmn(index);
2403 }
2404 else
2405 {
2406 LOGE("no this PLMN, can't remove it\n");
2407 }
2408 }
2409
2410 for(i = 0; i < fplmn_index; i++)
2411 {
2412 LOGE("fplmn_array[%d] = %s\n", i, fplmn_array[i]);
2413 }
2414
2415 char fplmn_str[256] = {0};
2416 convert_plmn_to_fplmn_str(fplmn_str);
2417 LOGE("fplmn_str = %s\n", fplmn_str);
2418
2419 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2420 if(ret != 0)
2421 {
2422 LOGE("mbtk_fplmn_set failed : %d\n",ret);
2423 return GSW_HAL_FAIL;
2424 }
2425
2426 LOGE("gsw_remove_forbidden_networks exit\n");
2427 return GSW_HAL_SUCCESS;
2428}
2429
2430/*
2431 * @brief clear FPLMN list
2432 * @param
2433 * @retval 0: success
2434 * @retval other: fail
2435 */
2436int gsw_clear_forbidden_networks(void)
2437{
2438 if (nw_init_flag == 0 || nw_info_handle == NULL)
2439 {
2440 return GSW_HAL_FAIL;
2441 }
2442
2443 char fplmn_str[FPLMN_STRING_LENGTH+1];
2444 memset(fplmn_str, 'F', (6 * fplmn_max_length));
2445 fplmn_str[(6 * fplmn_max_length)] = '\0';
2446
2447 LOGE("%s\n", fplmn_str);
2448 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2449 if(ret != 0)
2450 {
2451 LOGE("mbtk_fplmn_set failed : %d\n",ret);
2452 return GSW_HAL_FAIL;
2453 }
2454
2455 return GSW_HAL_SUCCESS;
2456}
2457
2458/*
2459 * @brief get oos config
2460 * @param [in] oos_config
2461 * @retval 0: success
2462 * @retval other: fail
2463 */
2464int gsw_oos_config_get(GSW_NW_OOS_CONFIG_INFO_T *pt_info)
2465{
2466 if (nw_init_flag == 0 || nw_info_handle == NULL)
2467 {
2468 return GSW_HAL_FAIL;
2469 }
2470
2471 if(pt_info == NULL)
2472 {
2473 LOGE("pt_info is null\n");
2474 return GSW_HAL_FAIL;
2475 }
2476
2477 int ret = -1;
2478
2479 mbtk_oos_info oos_info;
2480 memset(&oos_info, 0x00, sizeof(mbtk_oos_info));
2481
2482 ret = mbtk_oos_get(nw_info_handle, &oos_info);
2483 if(ret != 0)
2484 {
2485 LOGE("mbtk_oos_get failed : %d\n",ret);
2486 return GSW_HAL_FAIL;
2487 }
2488
2489 if(oos_info.mode == 0)
2490 {
2491 pt_info->t_min = 0;
2492 pt_info->t_step = 0;
2493 pt_info->t_max = 0;
2494 }
2495
2496 else
2497 {
2498 pt_info->t_min = (int)oos_info.oosPhase[0];
2499 pt_info->t_step = (int)oos_info.oosPhase[1];
2500 pt_info->t_max = (int)oos_info.oosPhase[2];
2501 }
2502
2503 return GSW_HAL_SUCCESS;
2504}
2505
2506
2507/*
2508 * @brief set oos config
2509 * @param [in] oos_config
2510 * @retval 0: success
2511 * @retval other: fail
2512 */
2513int gsw_oos_config_set(GSW_NW_OOS_CONFIG_INFO_T *pt_info)
2514{
2515 if (nw_init_flag == 0 || nw_info_handle == NULL)
2516 {
2517 return GSW_HAL_FAIL;
2518 }
2519
2520 if(pt_info == NULL)
2521 {
2522 LOGE("pt_info is null\n");
2523 return GSW_HAL_FAIL;
2524 }
2525
2526 int ret = -1;
2527 mbtk_oos_info oos_info;
2528 memset(&oos_info, 0x00, sizeof(mbtk_oos_info));
2529
2530 if (pt_info->t_min < 0 || pt_info->t_step < 0 || pt_info->t_max < 0)
2531 {
2532 LOGE("gsw_oos_config_set set time < 0 ");
2533 return GSW_HAL_FAIL;
2534 }
2535 else if ((pt_info->t_min > 0 && pt_info->t_min <= 255) && pt_info->t_step == 0 && pt_info->t_max == 0)
2536 {
2537 oos_info.mode = 1;
2538 oos_info.oosPhase[0] = pt_info->t_min;
2539 }
2540 else if ((pt_info->t_min > 0 && pt_info->t_min <= 255) && (pt_info->t_step > 0 && pt_info->t_step <= 255) && pt_info->t_max == 0)
2541 {
2542 oos_info.mode = 1;
2543 oos_info.oosPhase[0] = pt_info->t_min;
2544 oos_info.oosPhase[1] = pt_info->t_step;
2545 }
2546 else if ((pt_info->t_min > 0 && pt_info->t_min <= 255) && (pt_info->t_step > 0 && pt_info->t_step <= 255) && (pt_info->t_max > 0 && pt_info->t_max <= 255))
2547 {
2548 oos_info.mode = 1;
2549 oos_info.oosPhase[0] = pt_info->t_min;
2550 oos_info.oosPhase[1] = pt_info->t_step;
2551 oos_info.oosPhase[2] = pt_info->t_max;
2552 }
2553 else if (pt_info->t_min == 0 && pt_info->t_step == 0 && pt_info->t_max == 0)
2554 {
2555 oos_info.mode = 0;
2556 }
2557 else
2558 {
2559 LOGE("gsw_oos_config_set set Format err");
2560 return GSW_HAL_FAIL;
2561 }
2562
2563 ret = mbtk_oos_set(nw_info_handle, &oos_info);
2564 if(ret != 0)
2565 {
2566 LOGE("mbtk_oos_set failed : %d\n",ret);
2567 return GSW_HAL_FAIL;
2568 }
2569
2570 return GSW_HAL_SUCCESS;
2571}
2572
2573
2574