blob: b63690d35bc787861f2a38430d1e097c2add8e74 [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>
cz.lif4a9a932025-06-05 11:37:59 +08005#define SIG_TIMER 5
b.liu68a94c92025-05-24 12:53:41 +08006//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
q.huang238b22a2025-06-10 14:36:59 +080017#define MBTK_ERR_OK 0
xf.li56b78fb2025-06-13 03:29:21 -070018#define GSW_IMEI_LENGTH 15+1
q.huang238b22a2025-06-10 14:36:59 +080019
q.huangfa0a0a32025-06-12 17:07:23 +080020#define INT_32_MAX (0x7FFFFFFF)
21
q.huang238b22a2025-06-10 14:36:59 +080022
b.liu68a94c92025-05-24 12:53:41 +080023#ifndef FALSE
24#define FALSE (0)
25#endif
26
27
28#ifndef TRUE
29#define TRUE (!FALSE)
30#endif
31
32typedef unsigned int uint32;
33typedef unsigned char uint8;
q.huang861c07d2025-06-24 16:54:58 +080034typedef signed char int8;
b.liu68a94c92025-05-24 12:53:41 +080035typedef unsigned short uint16;
36typedef void (*mbtk_info_callback_func)(const void* data, int data_len);
37
38typedef enum
39{
40 MBTK_DEV_MODEM_MIN_FUN, //Modem 最小功能
41 MBTK_DEV_MODEM_FULL_FUN, //Modem 全功能
42 MBTK_DEV_MODEM_DISABLE_RECEIVE_RF_CIRCUITS = 3, //Modem 禁用射频接收电路
43 MBTK_DEV_MODEM_DISABLE_TRANSMIT_AND_RECEIVE_RF_CIRCUITS, //Modem禁用射频发射和接收电路
44 MBTK_DEV_MODEM_DISABLE_SIM, //Modem 禁用(U)SIM 卡
45 MBTK_DEV_MODEM_TURN_OFF_FULL_SECONDARY_RECEIVE, //Modem 完全禁用辅助接收
46}MBTK_DEV_MODEM_FUNCTION;
47
48typedef enum
49{
50 MBTK_CELL_TYPE_GSM = 0,
51 MBTK_CELL_TYPE_UMTS,
52 MBTK_CELL_TYPE_LTE
53} mbtk_cell_type_enum;
54
55typedef struct
56{
57 MBTK_DEV_MODEM_FUNCTION fun;
58 int rst;
59} mbtk_modem_info_t;
60
61typedef struct
62{
63 int client_fd;
64 pthread_t read_thread_id;
65 int exit_fd[2];
66 bool is_waitting;
67 pthread_cond_t cond;
68 pthread_mutex_t mutex;
69
70 pthread_mutex_t send_mutex;
71
72 // Temp response data.
73 uint16 info_err;
74 uint16 data_len;
75 void *data;
76
77 //mbtk wyq for server_ready_status add start
78 char server_ready_status;
79 //mbtk wyq for server_ready_status add end
80
81 mbtk_info_callback_func net_state_cb;
82 mbtk_info_callback_func call_state_cb;
83 mbtk_info_callback_func sms_state_cb;
84 mbtk_info_callback_func radio_state_cb;
85 mbtk_info_callback_func sim_state_cb;
86 mbtk_info_callback_func pdp_state_cb;
87 //add signal by xr
88 mbtk_info_callback_func signal_state_cb;
89} mbtk_info_handle_t;
90
91
92
93typedef struct
94{
q.huang638d5872025-06-21 13:44:43 +080095 // NR server cell:
96 // NR cell:
b.liu68a94c92025-05-24 12:53:41 +080097 // LTE server cell: tac, PCI, dlEuarfcn, ulEuarfcn, band
98 // LTE cell: phyCellId,euArfcn,rsrp,rsrq
99 // WCDMA server cell: lac, ci, arfcn
100 // WCDMA cell: lac, ci, arfcn
101 // GSM server cell: lac, ci, arfcn, bsic
102 // GSM cell:
q.huang638d5872025-06-21 13:44:43 +0800103 uint32 value1; //tac
104 uint32 value2; //pci
105 uint32 value3; //dlEuarfcn
106 uint32 value4; //bler
107 uint32 value5; //band
108 uint32 value6; //mcc
109 uint32 value7; //mnc
110 uint32 value8; //rsrp
111 uint32 value9; //rsrq
112 uint32 value10; //cell identiy
113 uint32 value11; //sinr
114 uint32 value12; //is tdd
115 uint32 value13;
116 uint32 value14;
117 uint32 value15;
b.liu68a94c92025-05-24 12:53:41 +0800118} __attribute__((packed)) mbtk_cell_info_t;
119
120
b.liu68a94c92025-05-24 12:53:41 +0800121typedef struct
122{
123 uint8 net_pref; // mbtk_net_pref_enum
124 uint16 gsm_band; // mbtk_gsm_band_enum
125 uint16 umts_band; // mbtk_umts_band_enum
126 uint32 tdlte_band; // mbtk_tdlte_band_enum
127 uint32 fddlte_band; // mbtk_fddlte_band_enum
128 uint32 lte_ext_band; // mbtk_lte_ext_band_enum
129} __attribute__((packed)) mbtk_band_info_t;
130
131typedef struct list_arraynode
132{
133 void *data;
134 struct list_arraynode *next;
135} list_arraynode_t;
136
137typedef struct list_treenode
138{
139 list_arraynode_t *data;
140 int count;
141 struct list_treenode *left;
142 struct list_treenode *right;
143} list_treenode_t;
144
145typedef int (*list_sort_func)(void *data1, void *data2);
146typedef void (*list_free_func)(void *data);
147
148typedef struct list_node
149{
150 uint32 size;
151 list_sort_func sort_func;
152 list_free_func free_func;
153
154 uint32 cur_index;
155 list_arraynode_t *cur_array_data;
156
157 list_arraynode_t array_data;
158 list_treenode_t tree_data;
159} list_node_t;
160
161/*
1620: GSM
1631: GSM Compact
1642: UTRAN
1653: GSM w/EGPRS
1664: UTRAN w/HSDPA
1675: UTRAN w/HSUPA
1686: UTRAN w/HSDPA and HSUPA
1697: E-UTRAN
1708: UTRAN HSPA+
171*/
172typedef enum {
173 MBTK_RADIO_TECH_GSM = 0,
174 MBTK_RADIO_TECH_GSM_COMPACT,
175 MBTK_RADIO_TECH_UTRAN,
176 MBTK_RADIO_TECH_GSM_EGPRS,
177 MBTK_RADIO_TECH_UTRAN_HSDPA,
178 MBTK_RADIO_TECH_UTRAN_HSUPA,
179 MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA,
180 MBTK_RADIO_TECH_E_UTRAN, // LTE
181 MBTK_RADIO_TECH_UTRAN_HSPA
182} mbtk_radio_technology_enum;
183
184typedef struct
185{
186 /*
187 0: automatic
188 1: manual
189 */
190 uint8 net_sel_mode;
191 /*
192 0: GSM
193 1: GSM Compact
194 2: UTRAN
195 3: GSM w/EGPRS
196 4: UTRAN w/HSDPA
197 5: UTRAN w/HSUPA
198 6: UTRAN w/HSDPA and HSUPA
199 7: E-UTRAN
200 8: UTRAN HSPA+
201 0xFF: Unused
202 */
203 uint8 net_type;
204 //uint8 plmn[10]; // 46000
205 /*
206 0: unknown
207 1: available
208 2: current
209 3: forbidden
210 */
211 uint8 net_state;
212 uint32 plmn;
213} __attribute__((packed)) mbtk_net_info_t;
214
215
216typedef enum
217{
218 MBTK_NET_REG_STATE_NON = 0,
219 MBTK_NET_REG_STATE_HOME,
220 MBTK_NET_REG_STATE_SEARCHING,
221 MBTK_NET_REG_STATE_DENIED,
222 MBTK_NET_REG_STATE_UNKNOWN,
223 MBTK_NET_REG_STATE_ROAMING,
224 MBTK_NET_REG_STATE_SMS_ONLY,
225 MBTK_NET_REG_STATE_ROAMING_SMS,
226 MBTK_NET_REG_STATE_ATTACHED_EMERGENCY,
227 MBTK_NET_REG_STATE_CSFB_HOME,
228 MBTK_NET_REG_STATE_CSFB_ROAMING,
229 MBTK_NET_REG_STATE_EMERGENCY_ONLY
230} mbtk_net_reg_state_enum;
231
232typedef struct
233{
234 uint8 call_state;// mbtk_net_reg_state_enum
235 uint8 data_state;// mbtk_net_reg_state_enum
236 uint8 ims_state;// mbtk_net_reg_state_enum
237 uint8 type; // mbtk_radio_technology_enum
238 uint16 lac;
239 uint32 ci;
240} __attribute__((packed)) mbtk_net_reg_info_t;
241
242typedef struct
243{
244 uint8 type; // mbtk_radio_technology_enum
245 uint8 rssi; // 0: 113 dBm or less
246 // 1: 111 dBm
247 // 2��30: 109��53 dBm
248 // 31: 51 dBm or greater
249 // 99: not known or not detectable
250 uint8 rxlev;// 0:rssi < -110 dBm
251 // 1: -110 dBm �� rssi < -109 dBm
252 // 2: -109 dBm �� rssi < -108 dBm
253 // ......
254 // 61: -50 dBm �� rssi < -49 dBm
255 // 62: -49 dBm �� rssi < -48 dBm
256 // 63: -48 dBm �� rssi
257 // 99: not known or not detectable
258 uint8 ber; // 0...7 as RXQUAL values in the table in 3GPP TS 45.008 [20] subclause 8.2.4
259 // 99 not known or not detectable
260 uint8 rscp; // 0: rscp < -120 dBm
261 // 1: -120 dBm �� rscp < -119 dBm
262 // 2: -119 dBm �� rscp < -118 dBm
263 // ......
264 // 94: -27 dBm �� rscp < -26 dBm
265 // 95: -26 dBm �� rscp < -25 dBm
266 // 96: - 25 dBm �� rscp
267 // 255: not known or not detectable
268 uint8 ecno; // 0: Ec/Io < -24 dB
269 // 1: -24 dB �� Ec/Io < -23.5 dB
270 // 2: -23.5 dB �� Ec/Io < -23 dB
271 // ......
272 // 47: -1 dB �� Ec/Io < -0.5 dB
273 // 48: -0.5 dB �� Ec/Io < 0 dB
274 // 49: 0 dB �� Ec/Io
275 // 255: not known or not detectable
276 uint8 rsrq; // 0: rsrq < -19.5 dB
277 // 1: -19.5 dB �� rsrq < -19 dB
278 // 2: -19 dB �� rsrq < -18.5 dB
279 // ......
280 // 32: -4 dB �� rsrq < -3.5 dB
281 // 33: -3.5 dB �� rsrq < -3 dB
282 // 34: -3 dB �� rsrq
283 // 255: not known or not detectable
284 uint8 rsrp; // 0: rsrp < -140 dBm
285 // 1: -140 dBm �� rsrp < -139 dBm
286 // 2: -139 dBm �� rsrp < -138 dBm
287 // ......
288 // 95: -46 dBm �� rsrp < -45 dBm
289 // 96: -45 dBm �� rsrp < -44 dBm
290 // 97: -44 dBm �� rsrp
291 // 255: not known or not detectable
q.huang861c07d2025-06-24 16:54:58 +0800292 int8 sinr; //-20-35 dbm
b.liu68a94c92025-05-24 12:53:41 +0800293} __attribute__((packed)) mbtk_signal_info_t;
294
295typedef struct{
296 uint8_t mode;
297 uint32_t oosPhase[3]; //单位为秒
298} mbtk_oos_info;
299
300typedef struct
301{
302 /* Configuration parameters for MCM network full band network scan when OOS (out of service)*/
303 int t_min;
304 int t_step;
305 int t_max;
306}GSW_NW_OOS_CONFIG_INFO_T;
307
b.liu68a94c92025-05-24 12:53:41 +0800308#define lib_mbtk_path "/lib/libmbtk_lib.so"
309mbtk_info_handle_t* nw_info_handle = NULL;
310
q.huang638d5872025-06-21 13:44:43 +0800311static GSW_NW_ServingInfoHandlePtr serving_cb=NULL;
312static GSW_NW_SigInfoHandlePtr sig_cb=NULL;
313static GSW_NW_RejectCauseHandlePtr reject_cb=NULL;
314static GSW_NW_ModemStateHandlePtr modem_cb=NULL;
315static GSW_NW_AirplaneModeHandlePtr airplane_cb=NULL;
b.liu68a94c92025-05-24 12:53:41 +0800316
317static void *dlHandle_mbtk;
318int nw_init_flag = 0;
319int mode = -1;
320int fplmn_max_length = 0;
321
322gsw_nw_plmn_list_t gsw_nw_plmn_list;
323char fplmn_array[FPLMN_ARRAY_SIZE][7];
324int fplmn_index = 0;
325
326static mbtk_info_handle_t* (*mbtk_info_handle_get)(void);
327static int (*mbtk_info_handle_free)(mbtk_info_handle_t** handle);
328int (*mbtk_net_sel_mode_get)(mbtk_info_handle_t* handle, mbtk_net_info_t *net);
329int (*mbtk_net_reg_get)(mbtk_info_handle_t* handle, mbtk_net_reg_info_t *reg);
330int (*mbtk_cell_get)(mbtk_info_handle_t* handle, mbtk_cell_type_enum *type, list_node_t **cell_list);
331int (*mbtk_get_modem_fun)(mbtk_info_handle_t* handle, int* fun);
332static int (*mbtk_set_modem_fun)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info);
333int (*mbtk_current_band_get)(mbtk_info_handle_t* handle, mbtk_band_info_t *band);
334int (*mbtk_current_band_set)(mbtk_info_handle_t* handle, const mbtk_band_info_t *band);
335int (*mbtk_net_signal_get)(mbtk_info_handle_t* handle, mbtk_signal_info_t *signal);
336int (*mbtk_wakeup_state_set)(mbtk_info_handle_t* handle, uint32 wakeup_state);
337int (*mbtk_signal_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
338int (*mbtk_net_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
339int (*mbtk_fplmn_get)(mbtk_info_handle_t *handle, void *fplmn);
340int (*mbtk_fplmn_set)(mbtk_info_handle_t *handle, void *fplmn);
341int (*mbtk_radio_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
342int (*mbtk_oos_get)(mbtk_info_handle_t* handle, mbtk_oos_info *oos_info);
343int (*mbtk_oos_set)(mbtk_info_handle_t* handle, mbtk_oos_info *oos_info);
q.huang238b22a2025-06-10 14:36:59 +0800344int (*mbtk_imei_get)(mbtk_info_handle_t* handle, void *imei);
345
b.liu68a94c92025-05-24 12:53:41 +0800346
347static void (*mbtk_log)(int level, const char *format, ...);
348static void (*mbtk_log_init)(char *path, char *tag);
349
350#ifndef LOG_ERR_LEVEL
351#define LOG_ERR_LEVEL 3 /* error conditions */
352#endif
353#ifndef LOG_WARN_LEVEL
354#define LOG_WARN_LEVEL 4 /* warning conditions */
355#endif
356#ifndef LOG_INFO_LEVEL
357#define LOG_INFO_LEVEL 6 /* informational */
358#endif
359#ifndef LOG_DEBUG_LEVEL
360#define LOG_DEBUG_LEVEL 7 /* debug-level messages */
361#endif
362#ifndef LOG_VERBOSE_LEVEL
363#define LOG_VERBOSE_LEVEL 8
364#endif
365
l.yang6a42e4d2025-05-28 01:04:20 -0700366#define GSW_NW "[HAL][GSW_NW]"
367
b.liu68a94c92025-05-24 12:53:41 +0800368#define LOGV(fmt, args ...) \
369 do{ \
370 char *file_ptr_1001 = __FILE__; \
371 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
372 char line_1001[10] = {0}; \
373 sprintf(line_1001, "%d", __LINE__); \
374 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
375 if(*ptr_1001 == '/') \
376 break; \
377 ptr_1001--; \
378 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700379 mbtk_log(LOG_VERBOSE_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800380 } while(0)
381
382#define LOGI(fmt, args...) \
383 do{ \
384 char *file_ptr_1001 = __FILE__; \
385 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
386 char line_1001[10] = {0}; \
387 sprintf(line_1001, "%d", __LINE__); \
388 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
389 if(*ptr_1001 == '/') \
390 break; \
391 ptr_1001--; \
392 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700393 mbtk_log(LOG_INFO_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800394 } while(0)
395
396#define LOGD(fmt, args...) \
397 do{ \
398 char *file_ptr_1001 = __FILE__; \
399 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
400 char line_1001[10] = {0}; \
401 sprintf(line_1001, "%d", __LINE__); \
402 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
403 if(*ptr_1001 == '/') \
404 break; \
405 ptr_1001--; \
406 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700407 mbtk_log(LOG_DEBUG_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800408 } while(0)
409
410#define LOGW(fmt, args...) \
411 do{ \
412 char *file_ptr_1001 = __FILE__; \
413 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
414 char line_1001[10] = {0}; \
415 sprintf(line_1001, "%d", __LINE__); \
416 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
417 if(*ptr_1001 == '/') \
418 break; \
419 ptr_1001--; \
420 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700421 mbtk_log(LOG_WARN_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800422 } while(0)
423
424#define LOGE(fmt, args...) \
425 do{ \
q.huangfa0a0a32025-06-12 17:07:23 +0800426 char *file_ptr_1001 = __FILE__; \
b.liu68a94c92025-05-24 12:53:41 +0800427 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
428 char line_1001[10] = {0}; \
429 sprintf(line_1001, "%d", __LINE__); \
430 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
431 if(*ptr_1001 == '/') \
432 break; \
433 ptr_1001--; \
434 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700435 mbtk_log(LOG_ERR_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800436 } while(0)
437
438
439
440typedef struct
441{
442 char *lynq_operator_l;
443 char *lynq_operator_s;
444 uint32 lynq_mcc_mnc;
445} lynq_operator_mcc_mnc_t;
446
447static lynq_operator_mcc_mnc_t lynq_operator_mcc_mnc[] =
448{
449 {"China Mobile","CMCC",46000},
450 {"China Unicom","CU",46001},
451 {"China Mobile","CMCC",46002},
452 {"China Telecom","CT",46003},
453 {"China Mobile","CMCC",46004},
454 {"China Telecom","CT",46005},
455 {"China Unicom","CU",46006},
456 {"China Mobile","CMCC",46007},
457 {"China Mobile","CMCC",46008},
458 {"China Unicom","CU",46009},
459 {"China Telecom","CT",46011}
460};
461
462
463//GSW include
464typedef enum prefer_mode
465{
466 GSW_PREFER_MODE_GSW = 1, /**<2G only*/
467 GSW_PREFER_MODE_WCDMA = 2, /**< 3G only*/
468 GSW_PREFER_MODE_WCDMA_GSM = 3, /**< 3G/2G*/
469 GSW_PREFER_MODE_LTE = 4, /**< 4G only*/
470 GSW_PREFER_MODE_NR5G = 5, /**< 5G only*/
471 GSW_PREFER_MODE_NR5G_LTE = 8, /**< 5G/4G*/
472 GSW_PREFER_MODE_LTE_WCDMA_GSM = 9, /**< 4G/3G/2G*/
473 GSW_PREFER_MODE_NR5G_LTE_WCDMA_GSM = 32, /**< 5G/4G/3G/2G*/
474} PREFER_MODE_E;
475
476static int mbtk_nw_api_import()
477{
478 dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);
479 if (dlHandle_mbtk == NULL)
480 {
xy.heb41615b2025-05-28 16:33:20 +0800481 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800482 }
483
484 mbtk_log_init = (void (*)(char *path, char *tag))dlsym(dlHandle_mbtk, "mbtk_log_init");
485 if (mbtk_log_init == NULL)
486 {
xy.heb41615b2025-05-28 16:33:20 +0800487 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800488 }
489
490 mbtk_log = (void (*)(int level, const char *format, ...))dlsym(dlHandle_mbtk, "mbtk_log");
491 if (mbtk_log == NULL)
492 {
xy.heb41615b2025-05-28 16:33:20 +0800493 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800494 }
495
496 mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");
497 if (mbtk_info_handle_get == NULL)
498 {
499 LOGE("mbtk_info_handle_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800500 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800501 }
502
503 mbtk_info_handle_free = (int (*)(mbtk_info_handle_t** handle))dlsym(dlHandle_mbtk, "mbtk_info_handle_free");
504 if (mbtk_info_handle_free == NULL)
505 {
506 LOGE("mbtk_info_handle_free dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800507 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800508 }
509
510 mbtk_net_sel_mode_get = (int (*)(mbtk_info_handle_t* handle, mbtk_net_info_t *net))dlsym(dlHandle_mbtk, "mbtk_net_sel_mode_get");
511 if (mbtk_net_sel_mode_get == NULL)
512 {
513 LOGE("mbtk_net_sel_mode_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800514 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800515 }
516
517 mbtk_net_reg_get = (int (*)(mbtk_info_handle_t* handle, mbtk_net_reg_info_t *reg))dlsym(dlHandle_mbtk, "mbtk_net_reg_get");
518 if (mbtk_net_reg_get == NULL)
519 {
520 LOGE("mbtk_net_reg_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800521 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800522 }
523
524 mbtk_get_modem_fun = (int (*)(mbtk_info_handle_t* handle, int* fun))dlsym(dlHandle_mbtk, "mbtk_get_modem_fun");
525 if (mbtk_get_modem_fun == NULL)
526 {
527 LOGE("mbtk_get_modem_fun dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800528 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800529 }
530
531 mbtk_set_modem_fun = (int (*)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info))dlsym(dlHandle_mbtk, "mbtk_set_modem_fun");
532 if (mbtk_set_modem_fun == NULL)
533 {
534 LOGE("mbtk_set_modem_fun dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800535 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800536 }
537
538 mbtk_current_band_get = (int (*)(mbtk_info_handle_t* handle, mbtk_band_info_t *band))dlsym(dlHandle_mbtk, "mbtk_current_band_get");
539 if (mbtk_current_band_get == NULL)
540 {
541 LOGE("mbtk_current_band_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800542 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800543 }
544
545 mbtk_current_band_set = (int (*)(mbtk_info_handle_t* handle, const mbtk_band_info_t *band))dlsym(dlHandle_mbtk, "mbtk_current_band_set");
546 if (mbtk_current_band_set == NULL)
547 {
548 LOGE("mbtk_current_band_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800549 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800550 }
551
552 mbtk_net_signal_get = (int (*)(mbtk_info_handle_t* handle, mbtk_signal_info_t *signal))dlsym(dlHandle_mbtk, "mbtk_net_signal_get");
553 if (mbtk_net_signal_get == NULL)
554 {
555 LOGE("mbtk_net_signal_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800556 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800557 }
558
559 mbtk_wakeup_state_set = (int (*)(mbtk_info_handle_t* handle, uint32 wakeup_state))dlsym(dlHandle_mbtk, "mbtk_wakeup_state_set");
560 if (mbtk_wakeup_state_set == NULL)
561 {
562 LOGE("mbtk_wakeup_state_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800563 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800564 }
565
566 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");
567 if (mbtk_cell_get == NULL)
568 {
569 LOGE("mbtk_cell_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800570 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800571 }
572
573 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");
574 if (mbtk_signal_state_change_cb_reg == NULL)
575 {
576 LOGE("mbtk_signal_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800577 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800578 }
579
580 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");
581 if (mbtk_net_state_change_cb_reg == NULL)
582 {
583 LOGE("mbtk_net_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800584 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800585 }
586
587 mbtk_fplmn_get = (int(*)(mbtk_info_handle_t *handle, void *fplmn))dlsym(dlHandle_mbtk, "mbtk_fplmn_get");
588 if (mbtk_fplmn_get == NULL)
589 {
590 LOGE("mbtk_fplmn_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800591 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800592 }
593
594 mbtk_fplmn_set = (int(*)(mbtk_info_handle_t *handle, void *fplmn))dlsym(dlHandle_mbtk, "mbtk_fplmn_set");
595 if (mbtk_fplmn_set == NULL)
596 {
597 LOGE("mbtk_fplmn_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800598 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800599 }
600
601 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");
602 if (mbtk_radio_state_change_cb_reg == NULL)
603 {
604 LOGE("mbtk_radio_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800605 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800606 }
607
608 mbtk_oos_get = (int (*)(mbtk_info_handle_t* handle, mbtk_oos_info *oos))dlsym(dlHandle_mbtk, "mbtk_oos_get");
609 if (mbtk_oos_get == NULL)
610 {
611 LOGE("mbtk_oos_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800612 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800613 }
614
615 mbtk_oos_set = (int (*)(mbtk_info_handle_t* handle, mbtk_oos_info *oos))dlsym(dlHandle_mbtk, "mbtk_oos_set");
616 if (mbtk_oos_set == NULL)
617 {
618 LOGE("mbtk_oos_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800619 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800620 }
q.huang238b22a2025-06-10 14:36:59 +0800621
622 mbtk_imei_get = (int (*)(mbtk_info_handle_t* handle, void *imei))dlsym(dlHandle_mbtk, "mbtk_imei_get");
623 if (mbtk_imei_get == NULL)
624 {
625 LOGE("mbtk_imei_get dlsym fail\n");
626 return GSW_HAL_NORMAL_FAIL;
627 }
b.liu68a94c92025-05-24 12:53:41 +0800628
629 return GSW_HAL_SUCCESS;
630}
631
632void list_first(list_node_t *list)
633{
634 if (list) {
635 list->cur_index = 0;
636 list->cur_array_data = list->array_data.next;
637 }
638}
639
640void* list_next(list_node_t *list)
641{
642 if (list) {
643 list_arraynode_t *node = list->cur_array_data;
644 if (node) {
645 LOGE("node is not null\n");
646 list->cur_array_data = list->cur_array_data->next;
647 list->cur_index++;
648 return node->data;
649 } else {
650 LOGE("node is null\n");
651 return NULL;
652 }
653 } else {
654 LOGE("list is null\n");
655 return NULL;
656 }
657}
658
659void list_free(list_node_t *list)
660{
661 if (list) {
662 list_arraynode_t *node = &(list->array_data); // Head node
663 list_arraynode_t *node_temp = NULL;
664 while (node->next) {
665 node_temp = node->next;
666 node->next = node->next->next;
667
668 if (list->free_func) {
669 list->free_func(node_temp->data);
670 } else {
671 free(node_temp->data);
672 }
673 free(node_temp);
674 }
675 free(list);
676 }
677}
678
q.huang861c07d2025-06-24 16:54:58 +0800679#if 0
q.huang638d5872025-06-21 13:44:43 +0800680static int32_t gsm_rssi_convert_to_dBm(uint8 rssi)
681{
682 if(rssi <= 31)
683 {
684 return rssi * 2 - 113; //0 map -113
685 //31 map -51
686 }
687 else
688 {
689 return INT_32_MAX;
690 }
691}
q.huang861c07d2025-06-24 16:54:58 +0800692#endif
q.huang638d5872025-06-21 13:44:43 +0800693
q.huangfa0a0a32025-06-12 17:07:23 +0800694static int32_t rscp_convert_to_minus_dBm(uint8 rscp)
b.liu68a94c92025-05-24 12:53:41 +0800695{
q.huangfa0a0a32025-06-12 17:07:23 +0800696 if(rscp <= 96)
b.liu68a94c92025-05-24 12:53:41 +0800697 {
q.huangfa0a0a32025-06-12 17:07:23 +0800698 return 121-rscp; // 96 map 25
699 // 0 map -121, below -120
b.liu68a94c92025-05-24 12:53:41 +0800700 }
b.liu68a94c92025-05-24 12:53:41 +0800701 else
702 {
q.huangfa0a0a32025-06-12 17:07:23 +0800703 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800704 }
705}
706
q.huangfa0a0a32025-06-12 17:07:23 +0800707static int32_t rsrp_convert_to_minus_dBm(uint8 rsrp)
b.liu68a94c92025-05-24 12:53:41 +0800708{
q.huangfa0a0a32025-06-12 17:07:23 +0800709 if(rsrp <= 97)
b.liu68a94c92025-05-24 12:53:41 +0800710 {
q.huangfa0a0a32025-06-12 17:07:23 +0800711 return 141-rsrp; // 97 map 44
712 // 0 map 141 below 140
b.liu68a94c92025-05-24 12:53:41 +0800713 }
714 else
715 {
q.huangfa0a0a32025-06-12 17:07:23 +0800716 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800717 }
718}
719
q.huangfa0a0a32025-06-12 17:07:23 +0800720static int32_t rsrq_convert_to_minus_dB(uint8 rsrq)
b.liu68a94c92025-05-24 12:53:41 +0800721{
q.huangfa0a0a32025-06-12 17:07:23 +0800722 if(rsrq <= 34)
b.liu68a94c92025-05-24 12:53:41 +0800723 {
q.huangfa0a0a32025-06-12 17:07:23 +0800724 return (40-rsrq)/2; //=20-rsrq / 2;
725 // 34 map 3
726 // 0 map 20
b.liu68a94c92025-05-24 12:53:41 +0800727 }
728 else
729 {
q.huangfa0a0a32025-06-12 17:07:23 +0800730 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800731 }
732}
733
q.huang861c07d2025-06-24 16:54:58 +0800734static int32_t sinr_convert_to_10_times_dB(int8 sinr)
q.huang638d5872025-06-21 13:44:43 +0800735{
736 if(sinr <=35 && sinr>=-20)
737 {
738 return sinr*10; //35 map 350 db
739 // -20 map -2000 db
740 }
741 else
742 {
743 return INT_32_MAX;
744 }
745}
746
747
748static int32_t rscp_minus_dbm_convert_to_rssi_dBm(int32_t rscp)
749{
750 if(rscp!=INT_32_MAX)
751 {
752 return -rscp;
753 }
754 else
755 {
756 return INT_32_MAX;
757 }
758}
759
760static int32_t rsrp_minus_dbm_convert_to_rssi_dBm(int32_t rsrp)
761{
762 if(rsrp!=INT_32_MAX)
763 {
764 return -rsrp;
765 }
766 else
767 {
768 return INT_32_MAX;
769 }
770}
771
q.huang861c07d2025-06-24 16:54:58 +0800772static int32_t rxlev_convert_to_rssi_dBm(uint8 rxlev)
773{
774 if(rxlev<=63)
775 {
776 return rxlev-111; //0 map -111, below -110
777 // 63 map -48
778 }
779 else
780 {
781 return INT_32_MAX;
782 }
783
784}
b.liu68a94c92025-05-24 12:53:41 +0800785
q.huangfa0a0a32025-06-12 17:07:23 +0800786//int ecno; /**< Valid values are positive integers. This value is the actual Ec/Io multiplied
787// * by -10. Example: If the actual Ec/Io is -12.5 dB, then this response value
788// * will be 125.*/
789//uint8 ecno; // 0: Ec/Io < -24 dB
790 // 1: -24 dB �� Ec/Io < -23.5 dB
791 // 2: -23.5 dB �� Ec/Io < -23 dB
792 // ......
793 // 47: -1 dB �� Ec/Io < -0.5 dB
794 // 48: -0.5 dB �� Ec/Io < 0 dB
795 // 49: 0 dB �� Ec/Io
796 // 255: not known or not detectabl
797static int32_t ecno_convert_to_minus_10_times_dB(uint8 ecno)
b.liu68a94c92025-05-24 12:53:41 +0800798{
q.huangfa0a0a32025-06-12 17:07:23 +0800799 if(ecno <=49)
b.liu68a94c92025-05-24 12:53:41 +0800800 {
q.huangfa0a0a32025-06-12 17:07:23 +0800801 return 245-ecno*5; //49 map 0 db
802 // 1 map 240 db
803 // 0 map 245 below 240
b.liu68a94c92025-05-24 12:53:41 +0800804 }
q.huangfa0a0a32025-06-12 17:07:23 +0800805 else
b.liu68a94c92025-05-24 12:53:41 +0800806 {
q.huangfa0a0a32025-06-12 17:07:23 +0800807 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800808 }
809}
810
b.liu68a94c92025-05-24 12:53:41 +0800811
b.liu68a94c92025-05-24 12:53:41 +0800812
q.huangfa0a0a32025-06-12 17:07:23 +0800813/* change realCsq to level */
814static int rscpToLevel(int rscp)
b.liu68a94c92025-05-24 12:53:41 +0800815{
q.huangfa0a0a32025-06-12 17:07:23 +0800816
817 if (rscp < -110) {
b.liu68a94c92025-05-24 12:53:41 +0800818 return 0;
q.huangfa0a0a32025-06-12 17:07:23 +0800819 } else if (rscp <= -95) {
820 return rscp+111; // to 16
821 } else if (rscp >=-93 && rscp <=-90) {
822 return rscp+110; // to 20
823 } else if (rscp >=-89 && rscp <=-59) {
824 return (rscp+152)/3; // =(rscp+89)/3+21 to 31
825 } else if (rscp ==- 94) { // Geely requirement, -94 map 16
826 return 16;
827 } else if(rscp <= -25) {
828 return 31;
b.liu68a94c92025-05-24 12:53:41 +0800829 }
q.huangfa0a0a32025-06-12 17:07:23 +0800830 return 99;
b.liu68a94c92025-05-24 12:53:41 +0800831}
832
q.huangfa0a0a32025-06-12 17:07:23 +0800833static int rsrpToLevel(int rsrp)
834{
835 if (rsrp < -130) {
836 return 0;
837 } else if (rsrp <= -118) {
838 return (rsrp+132)/2; // to 7
839 } else if (rsrp <=-109) {
840 return rsrp+125; // to 16
841 } else if (rsrp <=-103) {
842 return (rsrp+141)/2; // =(rsrp+109)/2+16 to 19
843 } else if (rsrp <=- 85) {
844 return (rsrp+160)/3; // =(rsrp+103)/3+19 to 25
845 } else if(rsrp <= -55) {
846 return (rsrp+210)/5; // =(rsrp+85)/5+25 to 31
847 } else if(rsrp <=-44)
848 {
849 return 31;
850 }
851 return 99;
852}
853
q.huang861c07d2025-06-24 16:54:58 +0800854//uint8 rssi; // 0: 113 dBm or less
855 // 1: 111 dBm
856 // 2��30: 109��53 dBm
857 // 31: 51 dBm or greater
858 // 99: not known or not detectable
859//uint8 rxlev;// 0:rssi < -110 dBm
860 // 1: -110 dBm �� rssi < -109 dBm
861 // 2: -109 dBm �� rssi < -108 dBm
862 // 60 ......
863 // 61: -50 dBm �� rssi < -49 dBm
864 // 62: -49 dBm �� rssi < -48 dBm
865 // 63: -48 dBm �� rssi
866 // 99: not known or not detectable
q.huangfa0a0a32025-06-12 17:07:23 +0800867
q.huang861c07d2025-06-24 16:54:58 +0800868/* change realCsq to level */
869static int rxlevToLevel(uint8 rxlev)
870{
871 if (rxlev <=60) {
872 return (rxlev+3)/2; // =(rxlev+1)/2+1,
873 // 0 map 1
874 // 1,2 map 2
875 // 59,60 map 31
876 }
877 else if(rxlev <=63)
878 {
879 return 31;
880 }
881 return 99;
882}
b.liu68a94c92025-05-24 12:53:41 +0800883
884static int convert_reg_state(int reg_state_t)
885{
886 LOGD("reg_state_t = %d\n",reg_state_t);
887 int reg_state = 0;
888
889 switch (reg_state_t)
890 {
891 case MBTK_NET_REG_STATE_NON:
892 {
893 reg_state = GSW_NETWORK_REG_NOT_REGISTERED;
894 break;
895 }
896 case MBTK_NET_REG_STATE_HOME:
897 {
898 reg_state = GSW_NETWORK_REG_REGISTERED;
899 break;
900 }
901 case MBTK_NET_REG_STATE_SEARCHING:
902 {
903 reg_state = GSW_NETWORK_REG_NOT_REGISTERED_SEARCHING;
904 break;
905 }
906 case MBTK_NET_REG_STATE_DENIED:
907 {
908 reg_state = GSW_NETWORK_REG_REGISTRATION_DENIED;
909 break;
910 }
911 case MBTK_NET_REG_STATE_UNKNOWN:
912 {
913 reg_state = GSW_NETWORK_REG_REGISTRATION_UNKNOWN;
914 break;
915 }
916 case MBTK_NET_REG_STATE_ROAMING:
917 {
918 reg_state = GSW_NETWORK_REG_REGISTRATION_ROAMING;
919 break;
920 }
921 case MBTK_NET_REG_STATE_SMS_ONLY:
922 case MBTK_NET_REG_STATE_ROAMING_SMS:
923 case MBTK_NET_REG_STATE_ATTACHED_EMERGENCY:
924 case MBTK_NET_REG_STATE_CSFB_HOME:
925 case MBTK_NET_REG_STATE_CSFB_ROAMING:
926 case MBTK_NET_REG_STATE_EMERGENCY_ONLY:
927 {
928 reg_state = GSW_NETWORK_REG_LIMITED_SERVICE;
929 break;
930 }
931 }
932
933 return reg_state;
934}
935
936
937static int convert_net_mode(int net_mode)
938{
939 LOGD("net_mode = %d\n",net_mode);
940 switch(net_mode)
941 {
942 case MBTK_RADIO_TECH_GSM:
943 case MBTK_RADIO_TECH_GSM_COMPACT:
944 case MBTK_RADIO_TECH_GSM_EGPRS:
945 {
946 return GSW_NETWORK_RADIO_GSM;
947 }
948 case MBTK_RADIO_TECH_UTRAN:
949 case MBTK_RADIO_TECH_UTRAN_HSDPA:
950 case MBTK_RADIO_TECH_UTRAN_HSUPA:
951 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
952 case MBTK_RADIO_TECH_UTRAN_HSPA:
953 {
954 return GSW_NETWORK_RADIO_UMTS;
955 }
956 case MBTK_RADIO_TECH_E_UTRAN:
957 {
958 return GSW_NETWORK_RADIO_LTE;
959 }
960
961 default:
962 {
963 return GSW_NETWORK_RADIO_NO_SVC;
964 }
965 }
966
967 return GSW_NETWORK_RADIO_NO_SVC;
968}
969
970static int convert_mbtk_net_config(int config)
971{
972 int net_pref = -1;
973
974 switch(config)
975 {
976 case GSW_PREFER_MODE_GSW:
977 {
978 net_pref = 0;
979 break;
980 }
981
982 case GSW_PREFER_MODE_WCDMA:
983 {
984 net_pref = 1;
985 break;
986 }
987
988 case GSW_PREFER_MODE_WCDMA_GSM:
989 {
990 net_pref = 2;
991 break;
992 }
993
994 case GSW_PREFER_MODE_LTE:
995 case GSW_PREFER_MODE_NR5G:
996 case GSW_PREFER_MODE_NR5G_LTE:
997 {
998 net_pref = 5;
999 break;
1000 }
1001
1002 case GSW_PREFER_MODE_LTE_WCDMA_GSM:
1003 case GSW_PREFER_MODE_NR5G_LTE_WCDMA_GSM:
1004 {
1005 net_pref = 15;
1006 break;
1007 }
1008 }
1009
1010 return net_pref;
1011}
1012
1013
1014static int convert_gsw_net_config(int config)
1015{
1016 int net_config = -1;
q.huang72680852025-06-11 13:42:21 +08001017 LOGD("config = %d\n",config);
b.liu68a94c92025-05-24 12:53:41 +08001018
1019 switch (config)
1020 {
1021 case 0:
1022 {
1023 net_config = GSW_PREFER_MODE_GSW;
1024 break;
1025 }
1026
1027 case 1:
1028 {
1029 net_config = GSW_PREFER_MODE_WCDMA;
1030 break;
1031 }
1032
1033 case 2:
1034 {
1035 net_config = GSW_PREFER_MODE_WCDMA_GSM;
1036 break;
1037 }
1038
1039 case 5:
1040 {
1041 net_config = GSW_PREFER_MODE_LTE;
1042 break;
1043 }
1044
1045 case 15:
1046 {
1047 net_config = GSW_PREFER_MODE_LTE_WCDMA_GSM;
1048 break;
1049 }
1050 }
1051
1052 return net_config;
1053}
1054
1055//64F010 -> 46001 (64->46,F0->0,10->01)
1056static void transform_fplmn_str_to_plmn(char *entry)
1057{
1058 if (strncmp(entry, "FFFFFF", ENTRY_LENGTH) == 0) {
1059 return; //if FFFFFF,means invalid fplmn, do nothing
1060 }
1061
1062 char temp = entry[0];
1063 entry[0] = entry[1];
1064 entry[1] = temp;
1065
1066 temp = entry[ENTRY_LENGTH - 2];
1067 entry[ENTRY_LENGTH - 2] = entry[ENTRY_LENGTH - 1];
1068 entry[ENTRY_LENGTH - 1] = temp;
1069
1070 memmove(entry + 2, entry + 3, ENTRY_LENGTH - 2);
1071
1072 LOGE("after transform_fplmn_str_to_plmn: %s\n", entry);
1073
1074 //valid fplmn
1075 fplmn_index++;
1076}
1077
1078static void extract_mcc_mnc(char *entry, char *mcc, char *mnc)
1079{
1080 strncpy(mcc,entry,3);
1081 mcc[3] = '\0';
1082 strncpy(mnc,entry + 3,2);
1083 mnc[2] = '\0';
1084
1085 LOGE("entry = %s, mcc = %s, mnc = %s\n", entry, mcc, mnc);
1086}
1087
1088
1089static void update_fplmn_list(char *fplmn_str)
1090{
1091 LOGE("fplmn_str = %s\n",fplmn_str);
1092 char temp_fplmn_array[FPLMN_ARRAY_SIZE][7];
1093 memset(fplmn_array, 0, sizeof(fplmn_array));
1094 memset(temp_fplmn_array, 0, sizeof(temp_fplmn_array));
1095 fplmn_index = 0;
1096 int array_length = 0;
1097
1098 for (int i = 0; i < strlen(fplmn_str); i += 6) {
1099
1100 int length = (i + 6 < strlen(fplmn_str)) ? 6 : strlen(fplmn_str) - i;
1101 strncpy(temp_fplmn_array[array_length], fplmn_str + i, length);
1102 temp_fplmn_array[array_length][length] = '\0';
1103 array_length++;
1104 if (i + 6 >= strlen(fplmn_str)) {
1105 break;
1106 }
1107 }
1108
1109 for (int i = 0; i < array_length; i++) {
1110 LOGE("array[%d] = %s\n", i, temp_fplmn_array[i]);
1111 transform_fplmn_str_to_plmn(temp_fplmn_array[i]);
1112 strncpy(fplmn_array[i], temp_fplmn_array[i], ENTRY_LENGTH);
1113 LOGE("fplmn_array[%d] = %s\n", i, fplmn_array[i]);
1114 }
1115
1116}
1117
1118static void format_plmn(char *result, char *plmn_entry)
1119{
1120 strncpy(result, plmn_entry, strlen(plmn_entry));
1121 LOGE("result = %s, numStr = %s\n",result, plmn_entry);
1122
1123 if (strlen(result) >= 2) {
1124 char temp = result[0];
1125 result[0] = result[1];
1126 result[1] = temp;
1127 }
1128
1129 LOGE("1.result = %s\n",result);
1130
1131 if (strlen(result) >= 3) {
1132 memmove(&result[3], &result[2], strlen(result) - 2 + 1);
1133 result[2] = 'F';
1134 }
1135
1136 LOGE("2.result = %s\n",result);
1137
1138 if (strlen(result) >= 2) {
1139 char temp = result[strlen(result) - 1];
1140 result[strlen(result) - 1] = result[strlen(result) - 2];
1141 result[strlen(result) - 2] = temp;
1142 }
1143
1144 LOGE("3.result = %s\n",result);
1145}
1146
1147
1148static void convert_plmn_to_fplmn_str(char *fplmn_str)
1149{
1150 char temp_fplmn_str[128] = {0};
1151 char temp[20]; // 临时存储单个格式化后的数字
1152 int index = 0;
1153
1154 for (int i = 0; i < fplmn_index; i++) {
1155 memset(temp, 0x0, sizeof(temp));
1156 format_plmn(temp, fplmn_array[i]);
1157 strcat(temp_fplmn_str, temp);
1158 index += strlen(temp);
1159 }
1160
1161 while(index < (6 * fplmn_max_length))
1162 {
1163 temp_fplmn_str[index++] = 'F';
1164 }
1165
1166 // 修剪或截断formattedNumbers,确保它不超过6 * fplmn_max_length个字符
1167 if (index > (6 * fplmn_max_length)) {
1168 temp_fplmn_str[(6 * fplmn_max_length)] = '\0';
1169 }
1170
1171 LOGE("%s\n", temp_fplmn_str);
1172 strncpy(fplmn_str, temp_fplmn_str, strlen(temp_fplmn_str));
1173 LOGE("fplmn_str = %s\n", fplmn_str);
1174}
1175
1176static int check_index(char *mcc, char *mnc)
1177{
1178 int i = 0;
1179
1180 for(i = 0; i < fplmn_index; i++)
1181 {
1182 if(strncmp(fplmn_array[i], mcc, 3) == 0 && strncmp(fplmn_array[i] + 3, mnc, 2) == 0)
1183 {
1184 LOGE("index = %d\n", i);
1185 return i;
1186 }
1187 }
1188
1189 LOGE("not find\n");
1190 return -1;
1191}
1192
1193static void remove_fplmn(int index)
1194{
1195 int write_index = 0;
1196 for (int i = 0; i < fplmn_index; i++) {
1197 if (i != index) {
1198 strncpy(fplmn_array[write_index++], fplmn_array[i], ENTRY_LENGTH);
1199 }
1200 }
1201 fplmn_index--;
1202}
1203
q.huangfa0a0a32025-06-12 17:07:23 +08001204static void convert_mbtk_sig_info_to_gsw_sig_info(const mbtk_signal_info_t* signal, signalStrength_t* sig_strength)
1205{
1206 LOGD("signal->type=%d", signal->type);
1207 memset(sig_strength,0,sizeof (signalStrength_t));
1208 switch(signal->type)
1209 {
1210 case MBTK_RADIO_TECH_E_UTRAN:
1211 {
1212 LOGI("rsrp = %d",signal->rsrp);
1213 sig_strength->lte_sig_valid = 1;
q.huangc8b93122025-06-17 17:46:05 +08001214 sig_strength->rsrp = rsrp_convert_to_minus_dBm(signal->rsrp);
1215 sig_strength->rsrq = rsrq_convert_to_minus_dB(signal->rsrq);
q.huang638d5872025-06-21 13:44:43 +08001216 sig_strength->rssi = rsrp_minus_dbm_convert_to_rssi_dBm(sig_strength->rsrp);
q.huang861c07d2025-06-24 16:54:58 +08001217 sig_strength->rssnr= sinr_convert_to_10_times_dB(signal->sinr);
q.huangfa0a0a32025-06-12 17:07:23 +08001218 break;
1219 }
1220 case MBTK_RADIO_TECH_UTRAN:
1221 case MBTK_RADIO_TECH_UTRAN_HSDPA:
1222 case MBTK_RADIO_TECH_UTRAN_HSUPA:
1223 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
1224 case MBTK_RADIO_TECH_UTRAN_HSPA:
1225 {
1226 LOGI("rscp = %d",signal->rscp);
1227 sig_strength->wcdma_sig_valid = 1;
1228 sig_strength->rscp = rscp_convert_to_minus_dBm(signal->rscp);
1229 sig_strength->ecno = ecno_convert_to_minus_10_times_dB(signal->ecno);
q.huang638d5872025-06-21 13:44:43 +08001230 sig_strength->rssi = rscp_minus_dbm_convert_to_rssi_dBm(sig_strength->rscp);
q.huangfa0a0a32025-06-12 17:07:23 +08001231 break;
1232 }
1233 case MBTK_RADIO_TECH_GSM:
1234 case MBTK_RADIO_TECH_GSM_COMPACT:
1235 case MBTK_RADIO_TECH_GSM_EGPRS:
1236 {
q.huang861c07d2025-06-24 16:54:58 +08001237 LOGI("g rxlev = %d",signal->rxlev);
q.huangfa0a0a32025-06-12 17:07:23 +08001238 sig_strength->gw_sig_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08001239 sig_strength->rssi = rxlev_convert_to_rssi_dBm(signal->rxlev);
q.huangfa0a0a32025-06-12 17:07:23 +08001240 break;
1241 }
1242 default:
1243 {
1244 LOGE("[%s] unknown reg type.[%d]", __func__, signal->type);
1245 }
1246 }
1247
1248}
1249
1250
b.liu68a94c92025-05-24 12:53:41 +08001251static void gsw_serving_info_callback_thread()
1252{
1253 GSW_NW_SERVING_INFO *serving_info = (GSW_NW_SERVING_INFO*)malloc(sizeof(GSW_NW_SERVING_INFO));
1254 memset(serving_info, 0x0, sizeof(GSW_NW_SERVING_INFO));
1255 int ret = -1;
1256 ret = gsw_get_nwinfo(serving_info);
1257 if(ret != 0)
1258 {
1259 LOGE("gsw_get_nwinfo failed\n");
1260 free(serving_info);
1261 return;
1262 }
1263
1264 if(serving_cb)
1265 {
1266 serving_cb(*serving_info);
1267 free(serving_info);
1268 }
1269}
1270
1271static void gsw_serving_info_callback(const void* data, int data_len)
1272{
1273 LOGE("gsw_serving_info_callback start\n");
1274
1275 if(data && data_len > 0)
1276 {
1277 pthread_t thread;
1278 pthread_create(&thread, NULL, (void*)gsw_serving_info_callback_thread, NULL);
1279 }
1280
1281 else
1282 {
1283 LOGE("data is NULL\n");
1284 return;
1285 }
1286
1287}
1288
q.huangfa0a0a32025-06-12 17:07:23 +08001289/*typedef struct
1290{
12910 mbtk_radio_technology_enum type : 8; // mbtk_radio_technology_enum
12921 uint8 rssi; // 0: 113 dBm or less
1293 // 1: 111 dBm
1294 // 2��30: 109��53 dBm
1295 // 31: 51 dBm or greater
1296 // 99: not known or not detectable
12972 uint8 rxlev;// 0:rssi < -110 dBm
1298 // 1: -110 dBm �� rssi < -109 dBm
1299 // 2: -109 dBm �� rssi < -108 dBm
1300 // ......
1301 // 61: -50 dBm �� rssi < -49 dBm
1302 // 62: -49 dBm �� rssi < -48 dBm
1303 // 63: -48 dBm �� rssi
1304 // 99: not known or not detectable
13053 uint8 ber; // 0...7 as RXQUAL values in the table in 3GPP TS 45.008 [20] subclause 8.2.4
1306 // 99 not known or not detectable
13074 uint8 rscp; // 0: rscp < -120 dBm
1308 // 1: -120 dBm �� rscp < -119 dBm
1309 // 2: -119 dBm �� rscp < -118 dBm
1310 // ......
1311 // 94: -27 dBm �� rscp < -26 dBm
1312 // 95: -26 dBm �� rscp < -25 dBm
1313 // 96: - 25 dBm �� rscp
1314 // 255: not known or not detectable
13155 uint8 ecno; // 0: Ec/Io < -24 dB
1316 // 1: -24 dB �� Ec/Io < -23.5 dB
1317 // 2: -23.5 dB �� Ec/Io < -23 dB
1318 // ......
1319 // 47: -1 dB �� Ec/Io < -0.5 dB
1320 // 48: -0.5 dB �� Ec/Io < 0 dB
1321 // 49: 0 dB �� Ec/Io
1322 // 255: not known or not detectable
13236 uint8 rsrq; // 0: rsrq < -19.5 dB
1324 // 1: -19.5 dB �� rsrq < -19 dB
1325 // 2: -19 dB �� rsrq < -18.5 dB
1326 // ......
1327 // 32: -4 dB �� rsrq < -3.5 dB
1328 // 33: -3.5 dB �� rsrq < -3 dB
1329 // 34: -3 dB �� rsrq
1330 // 255: not known or not detectable
13317 uint8 rsrp; // 0: rsrp < -140 dBm
1332 // 1: -140 dBm �� rsrp < -139 dBm
1333 // 2: -139 dBm �� rsrp < -138 dBm
1334 // ......
1335 // 95: -46 dBm �� rsrp < -45 dBm
1336 // 96: -45 dBm �� rsrp < -44 dBm
1337 // 97: -44 dBm �� rsrp
1338 // 255: not known or not detectable
13398 uint8 ss_rsrq; // 0: ss_rsrq < -43 dB
1340 // 1: -43 dB <= ss_rsrq < -42.5 dB
1341 // 2: -42.5 dB <= ss_rsrq < -42 dB
1342 // ......
1343 // 125: 19 dB <= ss_rsrq < 19.5 dB
1344 // 126: 19.5 dB <= ss_rsrq < 20 dB
1345 // 255: not known or not detectable
1346 uint8 ss_rsrp; // 0: ss_rsrp < -156 dBm
1347 // 1: -156 dBm <= ss_rsrp < -155 dBm
1348 // 2: -155 dBm <= ss_rsrp < -154 dBm
1349 // ......
1350 // 125: -32 dBm <= ss_rsrp < -31 dBm
1351 // 126: -31 dBm <= ss_rsrp
1352 // 255: not known or not detectable
1353 uint8 ss_sinr; // 0: ss_sinr < -23 dB
1354 // 1: -23 dB  ss_sinr < -22.5 dB
1355 // 2: -22.5 dB  ss_sinr < -22 dB
1356 // ......
1357 // 125: 39 dB  ss_sinr < 39.5 dBm
1358 // 126: 39.5 dB  ss_sinr < 40 dB
1359 // 127: 40 dB  ss_sinr
1360 // 255: not known or not detectable
1361} __attribute__((packed)) mbtk_signal_info_t;
1362*/
b.liu68a94c92025-05-24 12:53:41 +08001363static void gsw_sig_info_callback(const void* data, int data_len)
1364{
q.huangfa0a0a32025-06-12 17:07:23 +08001365 if(data && (data_len >= sizeof (mbtk_signal_info_t)))
b.liu68a94c92025-05-24 12:53:41 +08001366 {
b.liu68a94c92025-05-24 12:53:41 +08001367 signalStrength_t sig_strength;
q.huangfa0a0a32025-06-12 17:07:23 +08001368 convert_mbtk_sig_info_to_gsw_sig_info(( const mbtk_signal_info_t*) data,&sig_strength);
1369
b.liu68a94c92025-05-24 12:53:41 +08001370 if(sig_cb != NULL)
1371 {
1372 sig_cb(sig_strength);
1373 }
1374 }
b.liu68a94c92025-05-24 12:53:41 +08001375 else
1376 {
q.huangfa0a0a32025-06-12 17:07:23 +08001377 LOGE("data is NULL or data len %d error",data_len);
b.liu68a94c92025-05-24 12:53:41 +08001378 }
1379}
1380
q.huangc8b93122025-06-17 17:46:05 +08001381static void gsw_operating_mode_event_callback(const void* data, int data_len)
b.liu68a94c92025-05-24 12:53:41 +08001382{
q.huangc8b93122025-06-17 17:46:05 +08001383 LOGE("gsw_operating_mode_event_callback start\n");
b.liu68a94c92025-05-24 12:53:41 +08001384
q.huangc8b93122025-06-17 17:46:05 +08001385
b.liu68a94c92025-05-24 12:53:41 +08001386 if(data && data_len > 0)
1387 {
q.huangc8b93122025-06-17 17:46:05 +08001388 const uint8 *cfun_state = (const uint8*)data;
1389 LOGE("gsw_operating_mode_event_callback,data = %d\n", *cfun_state);
1390 if(airplane_cb != NULL)
b.liu68a94c92025-05-24 12:53:41 +08001391 {
q.huangc8b93122025-06-17 17:46:05 +08001392 airplane_cb(*cfun_state);
b.liu68a94c92025-05-24 12:53:41 +08001393 }
1394 }
1395
1396}
1397
q.huangc8b93122025-06-17 17:46:05 +08001398
b.liu68a94c92025-05-24 12:53:41 +08001399static void gsw_reject_callback(GSW_NW_RADIO_ACCESS_TECH_E rat, GSW_SERVICE_DOMAIN_E domain, int cause)
1400{
1401 LOGE("gsw_reject_callback start,rat = %d,domain = %d,cause = %d\n",rat,domain,cause);
1402
1403 GSW_NW_REJ_CAUSE_E *rej_cause = (GSW_NW_REJ_CAUSE_E*)malloc(sizeof(GSW_NW_REJ_CAUSE_E));
1404 memset(rej_cause, 0x0, sizeof(GSW_NW_REJ_CAUSE_E));
1405
1406 rej_cause->rej_cause = cause;
1407 rej_cause->rej_rat = rat;
1408 rej_cause->rej_domain = domain;
1409
1410 if(reject_cb != NULL)
1411 {
1412 LOGE("reject_cb is not NULL\n");
1413 reject_cb(rej_cause);
1414 }
1415 else
1416 {
1417 LOGE("reject_cb is NULL\n");
1418 }
1419
1420 free(rej_cause);
1421 LOGE("gsw_reject_callback end\n");
1422}
1423
xy.hec89938f2025-05-29 14:08:47 +08001424void gsw_sig_info_timer()
1425{
xy.hec89938f2025-05-29 14:08:47 +08001426 if(nw_init_flag == 0 || nw_info_handle == NULL)
1427 {
1428 return;
1429 }
1430
1431 mbtk_signal_info_t signal;
1432 signalStrength_t sig_strength;
1433
1434 while(nw_init_flag)
1435 {
q.huangfa0a0a32025-06-12 17:07:23 +08001436 int ret = mbtk_net_signal_get(nw_info_handle, &signal);
xy.hec89938f2025-05-29 14:08:47 +08001437 if(ret != 0)
1438 {
q.huangfa0a0a32025-06-12 17:07:23 +08001439 LOGE("mbtk_net_signal_get fail, ret is %d\n",ret);
xy.hec89938f2025-05-29 14:08:47 +08001440 }
1441
1442 else
1443 {
q.huangfa0a0a32025-06-12 17:07:23 +08001444 convert_mbtk_sig_info_to_gsw_sig_info(&signal,&sig_strength);
1445
xy.hec89938f2025-05-29 14:08:47 +08001446 }
1447
1448 if(sig_cb != NULL)
1449 {
1450 sig_cb(sig_strength);
1451 }
1452
1453 sleep(SIG_TIMER);
1454 }
1455}
1456
b.liu68a94c92025-05-24 12:53:41 +08001457
1458/**
1459 * @brief SDK interface to call back serving info
1460 * @param [in] handle_ptr
1461 * @retval 0: success
1462 * @retval other: fail
1463 */
1464int gsw_reg_serving_info_callback(GSW_NW_ServingInfoHandlePtr handle_ptr)
1465{
1466 if (nw_init_flag == 0 || nw_info_handle == NULL)
1467 {
xy.heb41615b2025-05-28 16:33:20 +08001468 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001469 }
1470
1471 if(handle_ptr == NULL)
1472 {
1473 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08001474 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001475 }
1476
1477 serving_cb = handle_ptr;
1478
1479 return GSW_HAL_SUCCESS;
1480
1481}
1482
1483
1484/**
1485 * @brief SDK interface to call back sig info
1486 * @param [in] handle_ptr
1487 * @retval 0: success
1488 * @retval other: fail
1489 */
1490int gsw_reg_sig_info_callback(GSW_NW_SigInfoHandlePtr handle_ptr)
1491{
1492 if (nw_init_flag == 0 || nw_info_handle == NULL)
1493 {
xy.heb41615b2025-05-28 16:33:20 +08001494 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001495 }
1496
1497 if(handle_ptr == NULL)
1498 {
1499 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08001500 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001501 }
1502
1503 sig_cb = handle_ptr;
1504
1505 return GSW_HAL_SUCCESS;
1506
1507}
1508
1509
1510/**
1511 * @brief SDK interface to call back rej cause
1512 * @param [in] handle_ptr
1513 * @retval 0: success
1514 * @retval other: fail
1515 */
1516int gsw_reg_rej_cause_callback(GSW_NW_RejectCauseHandlePtr handle_ptr)
1517{
1518 if (nw_init_flag == 0 || nw_info_handle == NULL)
1519 {
xy.heb41615b2025-05-28 16:33:20 +08001520 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001521 }
1522
1523 if(handle_ptr == NULL)
1524 {
1525 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08001526 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001527 }
1528
1529 reject_cb = handle_ptr;
1530
1531 return GSW_HAL_SUCCESS;
1532}
1533
1534
1535/**
1536 * @brief network sdk init
1537 * @param [in] token usr id define by who use
1538 * @retval 0: success
1539 * @retval other: fail
1540 */
1541int gsw_nw_sdk_init(int token)
1542{
1543 int ret = -1;
xy.hec89938f2025-05-29 14:08:47 +08001544 pthread_t nw_info_thread;
b.liu68a94c92025-05-24 12:53:41 +08001545
1546 if (nw_init_flag == 1 && nw_info_handle != NULL)
1547 {
1548 return GSW_HAL_SUCCESS;
1549 }
1550
1551 ret = mbtk_nw_api_import();
1552 if (ret != 0)
1553 {
1554 LOGE("mbtk_nw_api_import fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001555 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001556 }
1557
1558 nw_info_handle = mbtk_info_handle_get();
1559
1560 if (nw_info_handle == NULL)
1561 {
1562 LOGE("mbtk_info_handle_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001563 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001564 }
1565
1566 char fplmn[256] = {0};
1567 ret = mbtk_fplmn_get(nw_info_handle, fplmn);
1568 if(ret != 0)
1569 {
1570 LOGE("mbtk_fplmn_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08001571 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001572 }
1573 fplmn_max_length = (strlen(fplmn)/6);
1574 LOGE("fplmn = %s, fplmn_max_length = %d\n",fplmn,fplmn_max_length);
1575 ret = mbtk_signal_state_change_cb_reg(nw_info_handle, gsw_sig_info_callback);
1576
1577 if (ret != 0)
1578 {
1579 LOGE("mbtk_signal_state_change_cb_reg fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001580 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001581 }
1582
1583 ret = mbtk_net_state_change_cb_reg(nw_info_handle, gsw_serving_info_callback);
1584 if (ret != 0)
1585 {
1586 LOGE("mbtk_net_state_change_cb_reg fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001587 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001588 }
1589
xy.hec89938f2025-05-29 14:08:47 +08001590 ret = pthread_create(&nw_info_thread, NULL, (void*)gsw_sig_info_timer, NULL);
1591 if (ret != 0)
1592 {
1593 LOGE("pthread_create fail\n");
1594 return GSW_HAL_NORMAL_FAIL;
1595 }
1596
b.liu68a94c92025-05-24 12:53:41 +08001597 nw_init_flag = 1;
1598
1599 return GSW_HAL_SUCCESS;
1600}
1601
1602
1603/**
1604 * @brief network sdk deinit
1605 * @param
1606 * @retval 0: success
1607 * @retval other: fail
1608 */
1609int gsw_nw_sdk_deinit(void)
1610{
1611 int ret = -1;
1612
1613 if (nw_init_flag == 0 || nw_info_handle == NULL)
1614 {
xy.heb41615b2025-05-28 16:33:20 +08001615 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001616 }
1617
1618 ret = mbtk_info_handle_free(&nw_info_handle);
1619 if(ret != GSW_HAL_SUCCESS)
1620 {
1621 LOGE("mbtk_info_handle_free fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001622 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001623 }
1624
1625 dlclose(dlHandle_mbtk);
1626 nw_info_handle = NULL;
1627 nw_init_flag = 0;
1628
1629 return GSW_HAL_SUCCESS;
1630
1631}
1632
1633
1634/**
1635 * @brief get current network reg info
1636 * @param [out] serving_info struct for network info
1637 * include regstate ps_state opreator name mcc mcn etc
1638 * @retval 0: success
1639 * @retval other: fail
1640 */
1641int gsw_get_nwinfo(GSW_NW_SERVING_INFO *serving_info)
1642{
1643
1644 int ret = -1;
b.liu68a94c92025-05-24 12:53:41 +08001645 if (nw_init_flag == 0 || nw_info_handle == NULL)
1646 {
q.huang238b22a2025-06-10 14:36:59 +08001647 printf("nw_sdk_deinit not init\n");
xy.heb41615b2025-05-28 16:33:20 +08001648 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001649 }
1650
1651 LOGE("mbtk_net_reg_get start \n");
1652 //regstate
1653 mbtk_net_reg_info_t reg;
1654 memset(&reg, 0x0, sizeof(mbtk_net_reg_info_t));
1655 ret = mbtk_net_reg_get(nw_info_handle, &reg);
1656 if(ret)
1657 {
1658 LOGE("mbtk_net_reg_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001659 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001660 }
1661
1662 LOGE("convert_cs_reg_state\n");
1663 //cs_state
1664 serving_info->reg_state = convert_reg_state(reg.call_state);
1665 LOGE("convert_ps_reg_state\n");
1666 //ps_state
1667 serving_info->ps_state = convert_reg_state(reg.data_state);
1668 LOGE("convert_rat_mode\n");
1669 //reg_rat
1670 serving_info->reg_rat = convert_net_mode(reg.type);
1671 //srv_domain
1672 if(serving_info->reg_state == GSW_NETWORK_REG_REGISTERED || serving_info->reg_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1673 {
1674 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTERED || serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1675 {
1676 serving_info->srv_domain = GSW_SRV_DOMAIN_CS_PS;
1677 }
1678
1679 else
1680 {
1681 serving_info->srv_domain = GSW_SRV_DOMAIN_CS_ONLY;
1682 }
1683 }
1684
1685 else if (serving_info->ps_state == GSW_NETWORK_REG_REGISTERED || serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1686 {
1687 serving_info->srv_domain = GSW_SRV_DOMAIN_PS_ONLY;
1688 }
1689
1690 else
1691 {
1692 serving_info->srv_domain = GSW_SRV_DOMAIN_NO_SVC;
1693 //if ps and cs is both not registed, reg_rat seted to GSW_NETWORK_RADIO_NO_SVC
1694 serving_info->reg_rat = GSW_NETWORK_RADIO_NO_SVC;
1695 }
1696
1697 LOGD("roaming_ind\n");
1698 //roaming_ind
1699 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1700 {
1701 serving_info->roaming_ind = GSW_NETWORK_ROAMING_ON;
1702 }
1703 else
1704 {
1705 serving_info->roaming_ind = GSW_NETWORK_ROAMING_OFF;
1706 }
1707
1708 LOGD("reject\n");
1709 //reject
1710 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_DENIED || serving_info->reg_state == GSW_NETWORK_REG_REGISTRATION_DENIED)
1711 {
1712 LOGD("reject_callback\n");
1713 gsw_reject_callback(serving_info->reg_rat,serving_info->srv_domain,99);
1714 }
1715
1716 LOGD("reg_plmn / operator name\n");
1717 //reg_plmn / operator name
1718 mbtk_net_info_t net;
1719 memset(&net, 0x0, sizeof(mbtk_net_info_t));
1720 LOGD("mbtk_net_sel_mode_get start \n");
1721 ret = mbtk_net_sel_mode_get(nw_info_handle, &net);
1722 LOGD("mbtk_net_sel_mode_get end \n");
1723 if(ret == 0 && net.plmn > 0)
1724 {
1725 int i = 0;
1726
1727 LOGD("start to find mcc");
1728 while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
1729 {
1730 if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
1731 {
1732 LOGD("find mcc\n");
1733 break;
1734 }
1735 i++;
1736 }
1737
1738
1739 if(i == ARRAY_SIZE(lynq_operator_mcc_mnc))
1740 {
1741 LOGD("not find mcc");
1742 strcpy(serving_info->operator_name, "unknown");
1743 sprintf(serving_info->reg_plmn, "%d", net.plmn);
1744 }
1745
1746 else
1747 {
1748 LOGD("find mcc\n");
1749 strcpy(serving_info->operator_name, lynq_operator_mcc_mnc[i].lynq_operator_l);
1750 sprintf(serving_info->reg_plmn, "%d", net.plmn);
1751 }
1752
1753 LOGE("operator_name = %s\n", serving_info->operator_name);
1754 LOGE("reg_plmn = %s\n", serving_info->reg_plmn);
1755 }
1756
1757
1758 LOGD("get cell id/tac/lac/sid/nid\n");
1759 //cell id/tac/lac/sid/nid
1760 mbtk_cell_type_enum cell_type;
b.liu68a94c92025-05-24 12:53:41 +08001761 list_node_t* cell_list = NULL;
1762
1763 LOGD("mbtk_cell_get start\n");
1764 ret = mbtk_cell_get(nw_info_handle, &cell_type, &cell_list);
1765 if(ret != 0 || cell_list == NULL)
1766 {
1767 LOGE("mbtk_cell_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001768 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001769 }
1770 else
1771 {
1772 LOGE("mbtk_cell_get end,start to get node\n");
1773 list_first(cell_list);
1774 LOGE("list_first end\n");
1775 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
1776 if(cell)
1777 {
1778 LOGE("cell is not null,value2 = %u\n",cell->value2);
1779 switch(cell_type)
1780 {
1781 case MBTK_CELL_TYPE_LTE:
1782 {
1783 LOGE("is lte\n");
1784 //LOGE("LTE : tac=%x, PCI=%x, dlEuarfcn=%x, ulEuarfcn=%x, band=%x\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
1785 LOGE("LTE : tac=%d, PCI=%d, dlEuarfcn=%d, ulEuarfcn=%d, band=%d\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
1786 snprintf(serving_info->tac,sizeof(serving_info->tac),"%d",cell->value1);
1787 strcpy(serving_info->lac,"");
q.huangc8b93122025-06-17 17:46:05 +08001788 snprintf(serving_info->cell_id,sizeof(serving_info->cell_id),"%d",cell->value10);
b.liu68a94c92025-05-24 12:53:41 +08001789 break;
1790 }
1791
1792 case MBTK_CELL_TYPE_GSM:
1793 {
1794 LOGE("is gsm\n");
1795 LOGE("GSM : lac=%d, ci=%d, arfcn=%d, bsic=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
1796 sprintf(serving_info->lac,"%d",cell->value1);
1797 memset(serving_info->tac,0,sizeof(serving_info->tac));
1798 sprintf(serving_info->cell_id,"%d",cell->value2);
1799 break;
1800 }
1801 case MBTK_CELL_TYPE_UMTS:
1802 {
1803 LOGE("is wcdma\n");
1804 LOGE("UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
1805 sprintf(serving_info->lac,"%d",cell->value1);
1806 memset(serving_info->tac,0,sizeof(serving_info->tac));
1807 sprintf(serving_info->cell_id,"%d",cell->value2);
1808 break;
1809 }
1810
1811 default:
1812 break;
1813 }
1814 }
1815 else
1816 {
1817 LOGE("cell is null\n");
1818 }
1819 }
1820
1821 //not support now
1822 serving_info->sid = 0;
1823 serving_info->nid = 0;
1824
1825 return GSW_HAL_SUCCESS;
1826}
1827
1828
1829/**
1830 * @brief get current network type
1831 * @param [out] netype as GSW_NW_RADIO_ACCESS_TECH_E type
1832 * @retval 0: success
1833 * @retval other: fail
1834 */
1835int gsw_get_netype(int *netype)
1836{
1837 int ret = -1;
1838
1839 if (nw_init_flag == 0 || nw_info_handle == NULL)
1840 {
xy.heb41615b2025-05-28 16:33:20 +08001841 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001842 }
1843
1844 //regstate
1845 mbtk_net_reg_info_t reg;
1846 ret = mbtk_net_reg_get(nw_info_handle, &reg);
1847 if(ret)
1848 {
1849 LOGE("mbtk_net_reg_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001850 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001851 }
1852
1853 if(reg.data_state == MBTK_NET_REG_STATE_HOME || reg.data_state == MBTK_NET_REG_STATE_ROAMING)
1854 {
1855 *netype = convert_net_mode(reg.type);
1856 }
1857 else
1858 {
1859 *netype = GSW_NETWORK_RADIO_NO_SVC;
1860 }
1861
1862 return GSW_HAL_SUCCESS;
1863}
1864
1865
1866/**
1867 * @brief get radio opmode, as open and close airplane mode
1868 * @param [out] op_mode 1 is radio on, 0 is radio off
1869 * @retval 0: success
1870 * @retval other: fail
1871 */
1872int gsw_get_opmode(int *op_mode)
1873{
1874 int tmp_rf = -1;
1875 int ret = -1;
1876 if (nw_init_flag == 0 || nw_info_handle == NULL)
1877 {
xy.heb41615b2025-05-28 16:33:20 +08001878 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001879 }
1880
1881 ret = mbtk_get_modem_fun(nw_info_handle, &tmp_rf);
1882 if (ret != 0)
1883 {
1884 LOGE("mbtk_get_modem_fun fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001885 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001886 }
1887 if(tmp_rf == LYNQ_AIR_CFUN_MODE_OFF)
1888 {
1889 *op_mode = GSW_OP_MODE_LPM;
1890 }
1891
1892 if(tmp_rf == LYNQ_AIR_PLANE_MODE_ON)
1893 {
1894 *op_mode = GSW_OP_MODE_OFFLINE;
1895 }
1896
1897 if(tmp_rf == LYNQ_AIR_PLANE_MODE_OFF)
1898 {
1899 *op_mode = GSW_OP_MODE_ONLINE;
1900 }
1901
1902 return GSW_HAL_SUCCESS;
1903}
1904
1905
1906
1907/**
1908 * @brief set radio opmode, as open and close airplane mode
1909 * @param [in] op_mode 1 is radio on, 0 is radio off
1910 * @retval 0: success
1911 * @retval other: fail
1912 */
1913int gsw_set_opmode(int op_mode)
1914{
1915 mbtk_modem_info_t info;
1916 int rf_mode = -1;
1917 int ret = -1;
1918
1919 if (nw_init_flag == 0 || nw_info_handle == NULL)
1920 {
xy.heb41615b2025-05-28 16:33:20 +08001921 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001922 }
1923
1924 if(op_mode == GSW_OP_MODE_LPM)
1925 {
1926 rf_mode = LYNQ_AIR_CFUN_MODE_OFF;
1927 }
1928
1929 if(op_mode == GSW_OP_MODE_ONLINE)
1930 {
1931 rf_mode = LYNQ_AIR_PLANE_MODE_OFF;
1932 }
1933
1934 if(op_mode == GSW_OP_MODE_OFFLINE)
1935 {
1936 rf_mode = LYNQ_AIR_PLANE_MODE_ON;
1937 }
1938
1939 if (rf_mode != LYNQ_AIR_PLANE_MODE_ON && rf_mode != LYNQ_AIR_PLANE_MODE_OFF && rf_mode != LYNQ_AIR_CFUN_MODE_OFF)
1940 {
1941 LOGE("Input mode is error!\n");
xy.heb41615b2025-05-28 16:33:20 +08001942 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001943 }
1944
1945 info.fun = rf_mode;
1946 info.rst = 0;
1947 ret = mbtk_set_modem_fun(nw_info_handle, &info);
1948 if (ret != 0)
1949 {
1950 LOGE("gsw_set_opmode fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001951 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001952 }
1953
1954 return GSW_HAL_SUCCESS;
1955
1956}
1957
1958
1959/**
1960 * @brief get network mode preference of mdm search network scale
1961 * @param [out] mode_pref net_work pref mode:
1962 * enum prefer_mode
1963 * @retval 0: success
1964 * @retval other: fail
1965 */
1966int gsw_get_mode_preference(int *mode_pref)
1967{
1968 if (nw_init_flag == 0 || nw_info_handle == NULL)
1969 {
xy.heb41615b2025-05-28 16:33:20 +08001970 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001971 }
1972
1973 int ret = -1;
1974 mbtk_band_info_t band;
1975 memset(&band, 0, sizeof(mbtk_band_info_t));
1976
1977 ret = mbtk_current_band_get(nw_info_handle, &band);
1978 if(ret != 0)
1979 {
1980 LOGE("mbtk_current_band_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001981 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001982 }
1983
1984 *mode_pref = convert_gsw_net_config(band.net_pref);
1985 LOGE("band.net_pref = %d\n", *mode_pref);
1986 if(*mode_pref <= 0)
1987 {
1988 LOGE("no support mode\n");
xy.heb41615b2025-05-28 16:33:20 +08001989 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001990 }
1991 return GSW_HAL_SUCCESS;
1992
1993
1994}
1995
1996/**
1997 * @brief set network mode preference of mdm search network scale
1998 * @param [in] mode_pref net_work pref mode:
1999 * enum prefer_mode
2000 * @retval 0: success
2001 * @retval other: fail
2002 */
2003int gsw_set_mode_preference(int mode_pref)
2004{
2005 if (nw_init_flag == 0 || nw_info_handle == NULL)
2006 {
xy.heb41615b2025-05-28 16:33:20 +08002007 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002008 }
2009
2010 int ret = -1;
2011
2012 mbtk_band_info_t band;
2013 memset(&band, 0, sizeof(mbtk_band_info_t));
2014
2015 band.net_pref = convert_mbtk_net_config(mode_pref);
2016 LOGE("band.net_pref = %d\n", band.net_pref);
2017
2018 if(band.net_pref < 0)
2019 {
2020 LOGE("no support mode\n");
xy.heb41615b2025-05-28 16:33:20 +08002021 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002022 }
2023
2024 ret = mbtk_current_band_set(nw_info_handle, &band);
2025 if(ret != 0)
2026 {
2027 LOGE("mbtk_current_band_set fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002028 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002029 }
2030
2031 return GSW_HAL_SUCCESS;
2032}
2033
2034/**
2035 * @brief get signal csq value
2036 * @param [out] csq_value csq of signalstrengh 0 - 31, 99 invalid
2037 * @retval 0: success
2038 * @retval other: fail
2039 */
2040int gsw_get_sig_info(int *csq_value)
2041{
b.liu68a94c92025-05-24 12:53:41 +08002042 if (nw_init_flag == 0 || nw_info_handle == NULL)
2043 {
xy.heb41615b2025-05-28 16:33:20 +08002044 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002045 }
2046
2047 mbtk_signal_info_t signal;
q.huangfa0a0a32025-06-12 17:07:23 +08002048 int ret = mbtk_net_signal_get(nw_info_handle, &signal);
b.liu68a94c92025-05-24 12:53:41 +08002049 if(ret != 0)
2050 {
2051 LOGE("mbtk_net_signal_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002052 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002053 }
2054
2055 LOGD("signal.type=%d\n", signal.type);
2056 switch(signal.type)
2057 {
q.huangfa0a0a32025-06-12 17:07:23 +08002058
b.liu68a94c92025-05-24 12:53:41 +08002059 case MBTK_RADIO_TECH_E_UTRAN:
2060 {
q.huangfa0a0a32025-06-12 17:07:23 +08002061 LOGD("lte rsrp = %d dbm",signal.rsrp-141);
2062 *csq_value = rsrpToLevel(signal.rsrp-141);
b.liu68a94c92025-05-24 12:53:41 +08002063 break;
2064 }
2065 case MBTK_RADIO_TECH_UTRAN:
2066 case MBTK_RADIO_TECH_UTRAN_HSDPA:
2067 case MBTK_RADIO_TECH_UTRAN_HSUPA:
2068 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
2069 case MBTK_RADIO_TECH_UTRAN_HSPA:
2070 {
q.huangfa0a0a32025-06-12 17:07:23 +08002071 LOGD("w rscp = %d dbm",signal.rscp-121);
2072 *csq_value = rscpToLevel(signal.rscp-121);
2073 break;
2074 }
2075 case MBTK_RADIO_TECH_GSM:
2076 case MBTK_RADIO_TECH_GSM_COMPACT:
2077 case MBTK_RADIO_TECH_GSM_EGPRS:
2078 {
q.huang861c07d2025-06-24 16:54:58 +08002079 LOGD("gsm rxlev = %d (0-63)",signal.rxlev);
2080 *csq_value = rxlevToLevel(signal.rxlev);
b.liu68a94c92025-05-24 12:53:41 +08002081 break;
2082 }
2083 default:
2084 {
q.huangfa0a0a32025-06-12 17:07:23 +08002085 LOGE("[%s] unknown reg type.[%d]", __func__, signal.type);
xy.heb41615b2025-05-28 16:33:20 +08002086 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002087 }
2088 }
2089 return GSW_HAL_SUCCESS;
2090}
2091
2092/**
2093 * @brief set nework power mode, for tcam enter standby or exit standby
2094 * @param [in] mode TRUE(1) when enter standby, FALSE(0) after wake up
2095 * @retval 0: success
2096 * @retval other: fail
2097 */
2098int gsw_network_set_power_mode(char mode)
2099{
2100 int ret = -1;
2101
2102 if (nw_init_flag == 0 || nw_info_handle == NULL)
2103 {
xy.heb41615b2025-05-28 16:33:20 +08002104 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002105 }
2106
2107 if(mode != 0 && mode != 1)
2108 {
2109 LOGE("Input mode is error!\n");
xy.heb41615b2025-05-28 16:33:20 +08002110 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002111 }
2112
2113 if(mode == 1)
2114 {
2115 mode = 6;
2116 }
2117
2118 ret = mbtk_wakeup_state_set(nw_info_handle, mode);
2119 if(ret != 0)
2120 {
2121 LOGE("mbtk_wakeup_state_set fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002122 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002123 }
2124
2125 return GSW_HAL_SUCCESS;
2126
2127
2128
2129}
2130
2131/**
2132 * @brief convert rsrp rscp rssi to csq value.
2133 * @param [in] netType signal radio tech 2 means 2G 3 mens 3G,4 is 4G,5 is 5G
2134 * @param [in] sigvalue input signal_strength for different nettype
2135 * rsrp for 4G/5G, rscp for 3G, rssi for 2G
2136
2137 * @retval csq
2138 * @retval other: fail
2139 */
2140int gsw_sigInfo_to_csq(int netType, int sigValue)
2141{
q.huang238b22a2025-06-10 14:36:59 +08002142 if (nw_init_flag == 0 || nw_info_handle == NULL)
2143 {
2144 return GSW_HAL_NORMAL_FAIL;
2145 }
b.liu68a94c92025-05-24 12:53:41 +08002146 switch(netType)
q.huangfa0a0a32025-06-12 17:07:23 +08002147 {
2148 case 4:
b.liu68a94c92025-05-24 12:53:41 +08002149 {
q.huangfa0a0a32025-06-12 17:07:23 +08002150 return rsrpToLevel(sigValue);
2151 }
2152 case 3: //WCDMA
b.liu68a94c92025-05-24 12:53:41 +08002153 {
q.huangfa0a0a32025-06-12 17:07:23 +08002154 return rscpToLevel(sigValue);
2155 }
2156 case 2: //GSM
b.liu68a94c92025-05-24 12:53:41 +08002157 {
q.huangfa0a0a32025-06-12 17:07:23 +08002158 return sigValue;
b.liu68a94c92025-05-24 12:53:41 +08002159 }
2160
2161 default:
2162 {
2163 LOGE("parameter error\n");
xy.heb41615b2025-05-28 16:33:20 +08002164 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002165 }
2166 }
2167}
2168
2169/*
2170 * @brief get mobile operator name
2171 @param [out] nw_operator_name_infos get the long and short operator name info
2172 @retval 0: success
2173 @retval 0: other: fail
2174 */
2175int gsw_get_mobile_operator_name(gsw_mobile_operator_name *nw_operator_name_infos)
2176{
2177 char OperatorFN[128];
2178 char OperatorSH[128];
2179 char temp[12] = {0};
2180 mbtk_net_info_t net;
2181
2182 if (nw_init_flag == 0 || nw_info_handle == NULL)
2183 {
xy.heb41615b2025-05-28 16:33:20 +08002184 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002185 }
2186
2187 if(!mbtk_net_sel_mode_get(nw_info_handle, &net) && net.plmn > 0)
2188 {
2189 LOGE("Net : %d, %d, %d\n", net.net_sel_mode, net.net_type, net.plmn);
2190 int i = 0;
2191 while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
2192 {
2193 if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
2194 break;
2195 i++;
2196 }
2197
2198 if(i == ARRAY_SIZE(lynq_operator_mcc_mnc)) // No found mcc&mnc
2199 {
2200 strcpy(OperatorFN, "UNKNOWN");
2201 strcpy(OperatorSH, "UNKNOWN");
2202 }
2203 else
2204 {
2205 strcpy(OperatorFN, lynq_operator_mcc_mnc[i].lynq_operator_l);
2206 strcpy(OperatorSH, lynq_operator_mcc_mnc[i].lynq_operator_s);
2207
2208 memset(temp,0,12);
2209 memset(nw_operator_name_infos->mcc,0,4);
2210 sprintf(temp, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)/100);
2211 strncpy(nw_operator_name_infos->mcc, temp, strlen(temp));
2212
2213 memset(temp,0,12);
2214 memset(nw_operator_name_infos->mnc,0,4);
2215 sprintf(temp, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)%100);
2216 strncpy(nw_operator_name_infos->mnc, temp, strlen(temp));
2217 }
2218
2219 memset(nw_operator_name_infos->long_eons,0,128);
2220 memcpy(nw_operator_name_infos->long_eons,OperatorFN,strlen(OperatorFN));
2221 memset(nw_operator_name_infos->short_eons,0,128);
2222 memcpy(nw_operator_name_infos->short_eons,OperatorSH,strlen(OperatorSH));
2223
2224 return GSW_HAL_SUCCESS;
2225 }
2226
2227 else
2228 {
2229 LOGE("mbtk_net_sel_mode_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002230 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002231 }
2232
2233 return GSW_HAL_SUCCESS;
2234}
2235
2236
2237/*
2238 * @brief get current serving cell info
2239 * @param cell_info: [out] struct for current cell info
2240 * include earfcn mcc mnc pci psc tac lac etc.
2241 * @return int: 0 is success, other failed
2242 */
2243int gsw_get_cell_info(GSW_NW_CELL_INFO *cell_info)
2244{
b.liu68a94c92025-05-24 12:53:41 +08002245
2246 if (nw_init_flag == 0 || nw_info_handle == NULL)
2247 {
q.huang238b22a2025-06-10 14:36:59 +08002248 printf("nw_sdk_deinit not init\n");
xy.heb41615b2025-05-28 16:33:20 +08002249 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002250 }
2251
2252 list_node_t* cell_list = NULL;
b.liu68a94c92025-05-24 12:53:41 +08002253 mbtk_cell_type_enum type;
q.huang638d5872025-06-21 13:44:43 +08002254 int ret = mbtk_cell_get(nw_info_handle, &type, &cell_list);
b.liu68a94c92025-05-24 12:53:41 +08002255 if(ret || cell_list == NULL) {
2256 LOGE("mbtk_cell_get failed : %d\n", ret);
q.huang638d5872025-06-21 13:44:43 +08002257 list_free(cell_list);
2258 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002259 } else {
q.huang638d5872025-06-21 13:44:43 +08002260 memset(cell_info,0,sizeof(GSW_NW_CELL_INFO));
b.liu68a94c92025-05-24 12:53:41 +08002261 list_first(cell_list);
2262 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
2263 if(cell) { // Current server cell.
2264 switch(type)
2265 {
2266 case 0:
2267 {
2268 LOGD("GSM : lac=%d, ci=%d, arfcn=%d, bsic=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
q.huang638d5872025-06-21 13:44:43 +08002269 char gsm_temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002270
2271 cell_info->rat = GSW_NETWORK_RADIO_GSM;
2272
2273 cell_info->mcc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002274 snprintf(gsm_temp, sizeof(gsm_temp) ,"%X", cell->value5);
b.liu68a94c92025-05-24 12:53:41 +08002275 strncpy(cell_info->mcc, gsm_temp, sizeof(cell_info->mcc));
2276
b.liu68a94c92025-05-24 12:53:41 +08002277 cell_info->mnc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002278 snprintf(gsm_temp, sizeof(gsm_temp) ,"%X", cell->value6);
b.liu68a94c92025-05-24 12:53:41 +08002279 strncpy(cell_info->mnc, gsm_temp, sizeof(cell_info->mnc));
2280
2281 cell_info->cell_id_valid = 1;
2282 cell_info->cell_id = cell->value2;
2283
2284 cell_info->lac_valid = 1;
2285 cell_info->lac = cell->value1;
2286
2287 cell_info->arfcn_valid = 1;
2288 cell_info->arfcn = cell->value3;
q.huang861c07d2025-06-24 16:54:58 +08002289
2290 cell_info->rssi=rxlev_convert_to_rssi_dBm(cell->value7);
2291 cell_info->rssi_valid = (cell_info->rssi!=INT_32_MAX);
b.liu68a94c92025-05-24 12:53:41 +08002292 break;
2293 }
2294
2295 case 1:
2296 {
2297 LOGD("UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
q.huang638d5872025-06-21 13:44:43 +08002298 char wcdma_temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002299
2300 cell_info->rat = GSW_NETWORK_RADIO_UMTS;
2301
2302 cell_info->mcc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002303 snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%X", cell->value4);
b.liu68a94c92025-05-24 12:53:41 +08002304 strncpy(cell_info->mcc, wcdma_temp, sizeof(cell_info->mcc));
2305
b.liu68a94c92025-05-24 12:53:41 +08002306 cell_info->mnc_valid = 1;
q.huang861c07d2025-06-24 16:54:58 +08002307 snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%X", cell->value5);
b.liu68a94c92025-05-24 12:53:41 +08002308 strncpy(cell_info->mnc, wcdma_temp, sizeof(cell_info->mnc));
2309
2310 cell_info->lac_valid = 1;
2311 cell_info->lac = cell->value1;
2312
2313 cell_info->cell_id_valid = 1;
2314 cell_info->cell_id = cell->value2;
2315
2316 cell_info->uarfcn_valid = 1;
2317 cell_info->uarfcn = cell->value3;
2318
2319 cell_info->psc_valid = 1;
2320 cell_info->psc = cell->value6;
2321 break;
2322 }
2323
2324 case 2:
2325 {
2326 LOGE("LTE : tac=%d, PCI=%d, dlEuarfcn=%d, ulEuarfcn=%d, band=%d\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
b.liu68a94c92025-05-24 12:53:41 +08002327
q.huang638d5872025-06-21 13:44:43 +08002328 char lte_temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002329 cell_info->rat = GSW_NETWORK_RADIO_LTE;
2330
2331 cell_info->mcc_valid = 1;
2332 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);
2333 strncpy(cell_info->mcc, lte_temp, sizeof(cell_info->mcc));
2334
b.liu68a94c92025-05-24 12:53:41 +08002335 cell_info->mnc_valid = 1;
2336 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);
2337 strncpy(cell_info->mnc, lte_temp, sizeof(cell_info->mnc));
2338
2339 cell_info->tac_valid = 1;
2340 cell_info->tac = cell->value1;
2341
2342 cell_info->pci_valid = 1;
2343 cell_info->pci = cell->value2;
2344
2345 cell_info->earfcn_valid = 1;
2346 cell_info->earfcn = cell->value3;
2347
2348 cell_info->bler_valid = 1;
2349 cell_info->bler = cell->value4;
2350
2351 cell_info->band_valid = 1;
2352 cell_info->band = cell->value5;
2353
q.huang638d5872025-06-21 13:44:43 +08002354 cell_info->rssnr = sinr_convert_to_10_times_dB(cell->value11);
2355 cell_info->rssnr_valid=(cell_info->rssnr!=INT_32_MAX);
b.liu68a94c92025-05-24 12:53:41 +08002356
q.huang638d5872025-06-21 13:44:43 +08002357 cell_info->lteMode_valid = 1;
2358 cell_info->lteMode =(!(cell->value12));
2359
2360
2361 cell_info->rsrp = rsrp_convert_to_minus_dBm(cell->value8);
2362 cell_info->rsrp_valid = (cell_info->rsrp!=INT_32_MAX);
2363
2364 cell_info->rsrq = rsrq_convert_to_minus_dB(cell->value9);
2365 cell_info->rsrq_valid = (cell_info->rsrq!=INT_32_MAX);
b.liu68a94c92025-05-24 12:53:41 +08002366
2367 cell_info->cell_id_valid = 1;
2368 cell_info->cell_id = cell->value10;
2369
q.huang638d5872025-06-21 13:44:43 +08002370 cell_info->rssi=rsrp_minus_dbm_convert_to_rssi_dBm(cell_info->rsrp);
2371 cell_info->rssi_valid = (cell_info->rssi!=INT_32_MAX);
2372
b.liu68a94c92025-05-24 12:53:41 +08002373 break;
2374 }
2375
2376 default:
2377 break;
2378 }
2379 }
q.huang638d5872025-06-21 13:44:43 +08002380 int neibor_count = 0;
b.liu68a94c92025-05-24 12:53:41 +08002381 while ((cell = (mbtk_cell_info_t*) list_next(cell_list)) && neibor_count < 5)
2382 {
2383 switch(type)
2384 {
2385 //GSM
2386 case 0:
2387 {
2388
2389 }
2390 //WCDMA
2391 case 1:
2392 {
2393 LOGE("CELL : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
2394
2395 //cell_info->ext_info[neibor_count]->lac = cell->value1;
2396
2397 cell_info->ext_info[neibor_count].cell_id_valid = 1;
2398 cell_info->ext_info[neibor_count].cell_id = cell->value2;
2399
2400 cell_info->ext_info[neibor_count].arfcn_valid = 1;
2401 cell_info->ext_info[neibor_count].arfcn = cell->value3;
2402
2403 cell_info->ext_info[neibor_count].rat = cell_info->rat = GSW_NETWORK_RADIO_UMTS;
2404
2405 neibor_count++;
2406
2407 }
2408 //LTE
2409 case 2:
2410 {
2411 LOGE("CELL : phyCellId=%d, euArfcn=%d, rsrp=%d, rsrq=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
2412 char lte_temp[12] = {0};
2413 cell_info->ext_info[neibor_count].rat = GSW_NETWORK_RADIO_LTE;
2414
q.huang638d5872025-06-21 13:44:43 +08002415
b.liu68a94c92025-05-24 12:53:41 +08002416 cell_info->ext_info[neibor_count].pci = cell->value1;
2417 cell_info->ext_info[neibor_count].pci_valid = 1;
2418
2419 cell_info->ext_info[neibor_count].arfcn = cell->value2;
2420 cell_info->ext_info[neibor_count].arfcn_valid = 1;
2421
q.huang638d5872025-06-21 13:44:43 +08002422 cell_info->ext_info[neibor_count].rsrp = rsrp_convert_to_minus_dBm(cell->value3);
2423 cell_info->ext_info[neibor_count].rsrp_valid = (cell_info->ext_info[neibor_count].rsrp!=INT_32_MAX);
b.liu68a94c92025-05-24 12:53:41 +08002424
q.huang638d5872025-06-21 13:44:43 +08002425 cell_info->ext_info[neibor_count].rsrq = rsrq_convert_to_minus_dB(cell->value4);
2426 cell_info->ext_info[neibor_count].rsrq_valid = (cell_info->ext_info[neibor_count].rsrq!=INT_32_MAX);
2427
2428 if(cell->value7!=INT_32_MAX)
2429 {
2430 cell_info->ext_info[neibor_count].cell_id = cell->value5;
2431 cell_info->ext_info[neibor_count].cell_id_valid = 1;
2432
2433 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);
2434 strncpy(cell_info->ext_info[neibor_count].mcc, lte_temp, sizeof(cell_info->ext_info[neibor_count].mcc));
b.liu68a94c92025-05-24 12:53:41 +08002435
b.liu68a94c92025-05-24 12:53:41 +08002436
q.huang638d5872025-06-21 13:44:43 +08002437 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);
2438 strncpy(cell_info->ext_info[neibor_count].mnc, lte_temp, sizeof(cell_info->ext_info[neibor_count].mnc));
2439
2440
2441 //value 8 is tac
b.liu68a94c92025-05-24 12:53:41 +08002442
q.huang638d5872025-06-21 13:44:43 +08002443 cell_info->ext_info[neibor_count].band = cell->value9;
2444 cell_info->ext_info[neibor_count].band_valid = 1;
2445
2446 cell_info->ext_info[neibor_count].rssi=rsrp_minus_dbm_convert_to_rssi_dBm(cell_info->ext_info[neibor_count].rsrp);
2447 cell_info->ext_info[neibor_count].rssi_valid = (cell_info->ext_info[neibor_count].rssi!=INT_32_MAX);
2448 }
b.liu68a94c92025-05-24 12:53:41 +08002449
2450 neibor_count++;
2451 }
2452
2453 default:
2454 break;
2455 }
2456 }
q.huang638d5872025-06-21 13:44:43 +08002457 cell_info->ext_info_len=neibor_count;
b.liu68a94c92025-05-24 12:53:41 +08002458 }
2459 list_free(cell_list);
2460
2461 return GSW_HAL_SUCCESS;
2462}
2463
2464/*
2465 * @brief set modem status event callback
2466 @param [in] handle_ptr callback function address
2467 @retval 0: success
2468 @retval 0: other: fail
2469 */
2470int gsw_reg_set_modem_status_event_callback(GSW_NW_ModemStateHandlePtr handle_ptr)
2471{
2472
2473 if (nw_init_flag == 0 || nw_info_handle == NULL)
2474 {
xy.heb41615b2025-05-28 16:33:20 +08002475 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002476 }
2477
b.liu68a94c92025-05-24 12:53:41 +08002478 if(handle_ptr == NULL)
2479 {
2480 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08002481 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002482 }
2483
2484 modem_cb = handle_ptr;
2485
b.liu68a94c92025-05-24 12:53:41 +08002486 return GSW_HAL_SUCCESS;
2487
2488}
2489
2490
2491/*
2492 * @brief get PLMNs from the FPLMN list
2493 * @param [inout] plmn_list:
2494 * @retval 0: success
2495 * @retval other: fail
2496 */
2497int gsw_get_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2498{
2499 if (nw_init_flag == 0 || nw_info_handle == NULL)
2500 {
xy.heb41615b2025-05-28 16:33:20 +08002501 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002502 }
2503
2504 int ret = -1;
2505 char fplmn[256] = {0};
2506 LOGE("mbtk_fplmn_get enter\n");
2507 ret = mbtk_fplmn_get(nw_info_handle, fplmn);
2508 LOGE("mbtk_fplmn_get exit\n");
2509 if(ret != 0)
2510 {
2511 LOGE("mbtk_fplmn_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002512 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002513 }
2514
2515 update_fplmn_list(fplmn);
2516 for(int i = 0; i < fplmn_index; i++)
2517 {
2518 if(strcmp(fplmn_array[i],"FFFFFF") == 0)
2519 {
2520 continue;
2521 }
2522 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);
2523 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);
2524 plmn_list->plmn_list_len++;
2525 }
2526
2527 LOGE("fplmn = %s\n", fplmn);
2528 return GSW_HAL_SUCCESS;
2529}
2530
2531/*
2532 * @brief add PLMNs from the plmn_list to the FPLMN list
2533 * @param [in] plmn_list:
2534 * @retval 0: success
2535 * @retval other: fail
2536 */
2537int gsw_add_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2538{
2539
2540 if (nw_init_flag == 0 || nw_info_handle == NULL)
2541 {
xy.heb41615b2025-05-28 16:33:20 +08002542 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002543 }
2544
2545 if(plmn_list->plmn_list_len >= fplmn_max_length)
2546 {
2547 LOGE("can't save all the plmn\n");
xy.heb41615b2025-05-28 16:33:20 +08002548 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002549 }
2550
2551 int i = 0;
2552 int index = -1;
2553
2554 for(i = 0; i < plmn_list->plmn_list_len; i++)
2555 {
2556 index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);
2557
2558 if(index == -1)
2559 {
2560 LOGE("no this PLMN, add it\n");
2561 if((fplmn_index + plmn_list->plmn_list_len) > fplmn_max_length)
2562 {
2563 LOGE("can't save all the plmn\n");
xy.heb41615b2025-05-28 16:33:20 +08002564 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002565 }
2566
2567 else
2568 {
2569 memcpy(fplmn_array[fplmn_index], plmn_list->plmn_list[i].mcc, 3);
2570 memcpy(fplmn_array[fplmn_index] + 3, plmn_list->plmn_list[i].mnc, 2);
2571 fplmn_array[fplmn_index][5] = '\0';
2572 LOGE("fplmn_array[%d] = %s\n", fplmn_index, fplmn_array[fplmn_index]);
2573 fplmn_index++;
2574 }
2575 }
2576
2577 else
2578 {
2579 LOGE("already have this PLMN, don't add it\n");
2580 }
2581 }
2582
2583 char fplmn_str[256] = {0};
2584 convert_plmn_to_fplmn_str(fplmn_str);
2585
2586 LOGE("fplmn_str = %s\n", fplmn_str);
2587
2588 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2589 if(ret != 0)
2590 {
2591 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002592 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002593 }
2594
2595 LOGE("gsw_add_forbidden_networks exit\n");
2596 return GSW_HAL_SUCCESS;
2597}
2598
2599/*
2600 * @brief Remove PLMNs from the plmn_list from the FPLMN list
2601 * @param [in] plmn_list:
2602 * @retval 0: success
2603 * @retval other: fail
2604 */
2605int gsw_remove_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2606{
b.liu68a94c92025-05-24 12:53:41 +08002607 if (nw_init_flag == 0 || nw_info_handle == NULL)
2608 {
q.huangfa0a0a32025-06-12 17:07:23 +08002609 printf("nw sdk has not init\n");
xy.heb41615b2025-05-28 16:33:20 +08002610 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002611 }
2612
2613 int i = 0;
2614 int index = -1;
2615
2616 for(i = 0; i < plmn_list->plmn_list_len; i++)
2617 {
2618 index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);
2619 if(index != -1)
2620 {
2621 remove_fplmn(index);
2622 }
2623 else
2624 {
2625 LOGE("no this PLMN, can't remove it\n");
2626 }
2627 }
2628
2629 for(i = 0; i < fplmn_index; i++)
2630 {
2631 LOGE("fplmn_array[%d] = %s\n", i, fplmn_array[i]);
2632 }
2633
2634 char fplmn_str[256] = {0};
2635 convert_plmn_to_fplmn_str(fplmn_str);
2636 LOGE("fplmn_str = %s\n", fplmn_str);
2637
2638 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2639 if(ret != 0)
2640 {
2641 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002642 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002643 }
2644
2645 LOGE("gsw_remove_forbidden_networks exit\n");
2646 return GSW_HAL_SUCCESS;
2647}
2648
2649/*
2650 * @brief clear FPLMN list
2651 * @param
2652 * @retval 0: success
2653 * @retval other: fail
2654 */
2655int gsw_clear_forbidden_networks(void)
2656{
2657 if (nw_init_flag == 0 || nw_info_handle == NULL)
2658 {
xy.heb41615b2025-05-28 16:33:20 +08002659 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002660 }
2661
2662 char fplmn_str[FPLMN_STRING_LENGTH+1];
2663 memset(fplmn_str, 'F', (6 * fplmn_max_length));
2664 fplmn_str[(6 * fplmn_max_length)] = '\0';
2665
2666 LOGE("%s\n", fplmn_str);
2667 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2668 if(ret != 0)
2669 {
2670 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002671 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002672 }
2673
2674 return GSW_HAL_SUCCESS;
2675}
2676
2677/*
2678 * @brief get oos config
2679 * @param [in] oos_config
2680 * @retval 0: success
2681 * @retval other: fail
2682 */
2683int gsw_oos_config_get(GSW_NW_OOS_CONFIG_INFO_T *pt_info)
2684{
2685 if (nw_init_flag == 0 || nw_info_handle == NULL)
2686 {
xy.heb41615b2025-05-28 16:33:20 +08002687 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002688 }
2689
2690 if(pt_info == NULL)
2691 {
2692 LOGE("pt_info is null\n");
xy.heb41615b2025-05-28 16:33:20 +08002693 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002694 }
2695
2696 int ret = -1;
2697
2698 mbtk_oos_info oos_info;
2699 memset(&oos_info, 0x00, sizeof(mbtk_oos_info));
2700
2701 ret = mbtk_oos_get(nw_info_handle, &oos_info);
2702 if(ret != 0)
2703 {
2704 LOGE("mbtk_oos_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002705 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002706 }
2707
2708 if(oos_info.mode == 0)
2709 {
2710 pt_info->t_min = 0;
2711 pt_info->t_step = 0;
2712 pt_info->t_max = 0;
2713 }
2714
2715 else
2716 {
2717 pt_info->t_min = (int)oos_info.oosPhase[0];
2718 pt_info->t_step = (int)oos_info.oosPhase[1];
2719 pt_info->t_max = (int)oos_info.oosPhase[2];
2720 }
2721
2722 return GSW_HAL_SUCCESS;
2723}
2724
2725
2726/*
2727 * @brief set oos config
2728 * @param [in] oos_config
2729 * @retval 0: success
2730 * @retval other: fail
2731 */
2732int gsw_oos_config_set(GSW_NW_OOS_CONFIG_INFO_T *pt_info)
2733{
2734 if (nw_init_flag == 0 || nw_info_handle == NULL)
2735 {
xy.heb41615b2025-05-28 16:33:20 +08002736 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002737 }
2738
2739 if(pt_info == NULL)
2740 {
2741 LOGE("pt_info is null\n");
xy.heb41615b2025-05-28 16:33:20 +08002742 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002743 }
2744
2745 int ret = -1;
2746 mbtk_oos_info oos_info;
2747 memset(&oos_info, 0x00, sizeof(mbtk_oos_info));
2748
2749 if (pt_info->t_min < 0 || pt_info->t_step < 0 || pt_info->t_max < 0)
2750 {
2751 LOGE("gsw_oos_config_set set time < 0 ");
xy.heb41615b2025-05-28 16:33:20 +08002752 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002753 }
2754 else if ((pt_info->t_min > 0 && pt_info->t_min <= 255) && pt_info->t_step == 0 && pt_info->t_max == 0)
2755 {
2756 oos_info.mode = 1;
2757 oos_info.oosPhase[0] = pt_info->t_min;
2758 }
2759 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)
2760 {
2761 oos_info.mode = 1;
2762 oos_info.oosPhase[0] = pt_info->t_min;
2763 oos_info.oosPhase[1] = pt_info->t_step;
2764 }
2765 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))
2766 {
2767 oos_info.mode = 1;
2768 oos_info.oosPhase[0] = pt_info->t_min;
2769 oos_info.oosPhase[1] = pt_info->t_step;
2770 oos_info.oosPhase[2] = pt_info->t_max;
2771 }
2772 else if (pt_info->t_min == 0 && pt_info->t_step == 0 && pt_info->t_max == 0)
2773 {
2774 oos_info.mode = 0;
2775 }
2776 else
2777 {
2778 LOGE("gsw_oos_config_set set Format err");
xy.heb41615b2025-05-28 16:33:20 +08002779 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002780 }
2781
2782 ret = mbtk_oos_set(nw_info_handle, &oos_info);
2783 if(ret != 0)
2784 {
2785 LOGE("mbtk_oos_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002786 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002787 }
2788
2789 return GSW_HAL_SUCCESS;
2790}
2791
q.huang238b22a2025-06-10 14:36:59 +08002792/**
2793 * @brief get imei function
2794 * @param [in] len imei length,max is 20
2795 * @param [out] imei return imei from this func
2796 * @retval 0: success
2797 * @retval other: fail
2798 */
2799int gsw_get_imei(int len, char *imei)
2800{
q.huang238b22a2025-06-10 14:36:59 +08002801 if (nw_init_flag == 0 || nw_info_handle == NULL)
2802 {
2803 printf("nw sdk has been deinit\n");
2804 return GSW_HAL_NORMAL_FAIL;
2805 }
2806
2807 if(imei == NULL)
2808 {
2809 LOGE("imei is NULL.");
2810 return GSW_HAL_ARG_INVALID;
2811 }
2812
2813 if(len < GSW_IMEI_LENGTH)
2814 {
2815 LOGE("imei len is too short,len = %d\n", len);
2816 return GSW_HAL_NORMAL_FAIL;
2817 }
2818
q.huang861c07d2025-06-24 16:54:58 +08002819 int ret = mbtk_imei_get(nw_info_handle, (void *)imei);
q.huang238b22a2025-06-10 14:36:59 +08002820 if(ret != MBTK_ERR_OK)
2821 {
2822 LOGE("[gsw_nw] mbtk_imei_get fail [err = %d].", ret);
2823 return GSW_HAL_NORMAL_FAIL;
2824 }
2825
2826 return GSW_HAL_SUCCESS;
2827}
2828
2829/**
2830 * @brief reset modem stack only, notice: after use this method, all ril sdk
2831 * need restart by app, means network, sim, sms, data need deinit then init!
2832 * @param
2833 * @retval 0: success
2834 * @retval other: fail
2835 */
2836int gsw_reset_modem(void)
2837{
2838 int ret = -1;
2839 if (nw_init_flag == 0 || nw_info_handle == NULL)
2840 {
2841 printf("nw sdk has been deinit\n");
2842 return GSW_HAL_NORMAL_FAIL;
2843 }
2844 mbtk_modem_info_t info;
2845 info.fun = MBTK_DEV_MODEM_MIN_FUN;
2846 info.rst = 0;
2847
2848 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2849 if(ret)
2850 {
2851 LOGE("[gsw_nw] mbtk_set_modem_fun 0 fail [err = %d].", ret);
2852 return GSW_HAL_NORMAL_FAIL;
2853 }
2854
2855 sleep(1);
2856
2857 info.fun = MBTK_DEV_MODEM_FULL_FUN;
2858 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2859 if(ret)
2860 {
2861 LOGE("[gsw_nw] mbtk_set_modem_fun 1 fail [err = %d].", ret);
2862 return GSW_HAL_NORMAL_FAIL;
2863 }
2864 return GSW_HAL_SUCCESS;
2865}
b.liu68a94c92025-05-24 12:53:41 +08002866
q.huangc8b93122025-06-17 17:46:05 +08002867int gsw_reg_operating_mode_callback(GSW_NW_AirplaneModeHandlePtr handle_ptr)
2868{
2869 if (nw_init_flag == 0 || nw_info_handle == NULL)
2870 {
2871 return GSW_HAL_NORMAL_FAIL;
2872 }
2873
2874 if(handle_ptr == NULL)
2875 {
2876 LOGE("handle_ptr is NULL\n");
2877 return GSW_HAL_NORMAL_FAIL;
2878 }
2879
2880 airplane_cb = handle_ptr;
2881
2882 int ret = mbtk_radio_state_change_cb_reg(nw_info_handle,gsw_operating_mode_event_callback);
2883 if(ret != 0)
2884 {
2885 LOGE("mbtk_radio_state_change_cb_reg failed : %d\n", ret);
2886 airplane_cb=NULL;
2887 return GSW_HAL_NORMAL_FAIL;
2888 }
2889
2890 return GSW_HAL_SUCCESS;
2891
2892}
2893