blob: 147293c650c176bc09cd28f9156d45af1fc78ea1 [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;
34typedef unsigned short uint16;
35typedef void (*mbtk_info_callback_func)(const void* data, int data_len);
36
37typedef enum
38{
39 MBTK_DEV_MODEM_MIN_FUN, //Modem 最小功能
40 MBTK_DEV_MODEM_FULL_FUN, //Modem 全功能
41 MBTK_DEV_MODEM_DISABLE_RECEIVE_RF_CIRCUITS = 3, //Modem 禁用射频接收电路
42 MBTK_DEV_MODEM_DISABLE_TRANSMIT_AND_RECEIVE_RF_CIRCUITS, //Modem禁用射频发射和接收电路
43 MBTK_DEV_MODEM_DISABLE_SIM, //Modem 禁用(U)SIM 卡
44 MBTK_DEV_MODEM_TURN_OFF_FULL_SECONDARY_RECEIVE, //Modem 完全禁用辅助接收
45}MBTK_DEV_MODEM_FUNCTION;
46
47typedef enum
48{
49 MBTK_CELL_TYPE_GSM = 0,
50 MBTK_CELL_TYPE_UMTS,
51 MBTK_CELL_TYPE_LTE
52} mbtk_cell_type_enum;
53
54typedef struct
55{
56 MBTK_DEV_MODEM_FUNCTION fun;
57 int rst;
58} mbtk_modem_info_t;
59
60typedef struct
61{
62 int client_fd;
63 pthread_t read_thread_id;
64 int exit_fd[2];
65 bool is_waitting;
66 pthread_cond_t cond;
67 pthread_mutex_t mutex;
68
69 pthread_mutex_t send_mutex;
70
71 // Temp response data.
72 uint16 info_err;
73 uint16 data_len;
74 void *data;
75
76 //mbtk wyq for server_ready_status add start
77 char server_ready_status;
78 //mbtk wyq for server_ready_status add end
79
80 mbtk_info_callback_func net_state_cb;
81 mbtk_info_callback_func call_state_cb;
82 mbtk_info_callback_func sms_state_cb;
83 mbtk_info_callback_func radio_state_cb;
84 mbtk_info_callback_func sim_state_cb;
85 mbtk_info_callback_func pdp_state_cb;
86 //add signal by xr
87 mbtk_info_callback_func signal_state_cb;
88} mbtk_info_handle_t;
89
90
91
92typedef struct
93{
q.huang638d5872025-06-21 13:44:43 +080094 // NR server cell:
95 // NR cell:
b.liu68a94c92025-05-24 12:53:41 +080096 // LTE server cell: tac, PCI, dlEuarfcn, ulEuarfcn, band
97 // LTE cell: phyCellId,euArfcn,rsrp,rsrq
98 // WCDMA server cell: lac, ci, arfcn
99 // WCDMA cell: lac, ci, arfcn
100 // GSM server cell: lac, ci, arfcn, bsic
101 // GSM cell:
q.huang638d5872025-06-21 13:44:43 +0800102 uint32 value1; //tac
103 uint32 value2; //pci
104 uint32 value3; //dlEuarfcn
105 uint32 value4; //bler
106 uint32 value5; //band
107 uint32 value6; //mcc
108 uint32 value7; //mnc
109 uint32 value8; //rsrp
110 uint32 value9; //rsrq
111 uint32 value10; //cell identiy
112 uint32 value11; //sinr
113 uint32 value12; //is tdd
114 uint32 value13;
115 uint32 value14;
116 uint32 value15;
b.liu68a94c92025-05-24 12:53:41 +0800117} __attribute__((packed)) mbtk_cell_info_t;
118
119
b.liu68a94c92025-05-24 12:53:41 +0800120typedef struct
121{
122 uint8 net_pref; // mbtk_net_pref_enum
123 uint16 gsm_band; // mbtk_gsm_band_enum
124 uint16 umts_band; // mbtk_umts_band_enum
125 uint32 tdlte_band; // mbtk_tdlte_band_enum
126 uint32 fddlte_band; // mbtk_fddlte_band_enum
127 uint32 lte_ext_band; // mbtk_lte_ext_band_enum
128} __attribute__((packed)) mbtk_band_info_t;
129
130typedef struct list_arraynode
131{
132 void *data;
133 struct list_arraynode *next;
134} list_arraynode_t;
135
136typedef struct list_treenode
137{
138 list_arraynode_t *data;
139 int count;
140 struct list_treenode *left;
141 struct list_treenode *right;
142} list_treenode_t;
143
144typedef int (*list_sort_func)(void *data1, void *data2);
145typedef void (*list_free_func)(void *data);
146
147typedef struct list_node
148{
149 uint32 size;
150 list_sort_func sort_func;
151 list_free_func free_func;
152
153 uint32 cur_index;
154 list_arraynode_t *cur_array_data;
155
156 list_arraynode_t array_data;
157 list_treenode_t tree_data;
158} list_node_t;
159
160/*
1610: GSM
1621: GSM Compact
1632: UTRAN
1643: GSM w/EGPRS
1654: UTRAN w/HSDPA
1665: UTRAN w/HSUPA
1676: UTRAN w/HSDPA and HSUPA
1687: E-UTRAN
1698: UTRAN HSPA+
170*/
171typedef enum {
172 MBTK_RADIO_TECH_GSM = 0,
173 MBTK_RADIO_TECH_GSM_COMPACT,
174 MBTK_RADIO_TECH_UTRAN,
175 MBTK_RADIO_TECH_GSM_EGPRS,
176 MBTK_RADIO_TECH_UTRAN_HSDPA,
177 MBTK_RADIO_TECH_UTRAN_HSUPA,
178 MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA,
179 MBTK_RADIO_TECH_E_UTRAN, // LTE
180 MBTK_RADIO_TECH_UTRAN_HSPA
181} mbtk_radio_technology_enum;
182
183typedef struct
184{
185 /*
186 0: automatic
187 1: manual
188 */
189 uint8 net_sel_mode;
190 /*
191 0: GSM
192 1: GSM Compact
193 2: UTRAN
194 3: GSM w/EGPRS
195 4: UTRAN w/HSDPA
196 5: UTRAN w/HSUPA
197 6: UTRAN w/HSDPA and HSUPA
198 7: E-UTRAN
199 8: UTRAN HSPA+
200 0xFF: Unused
201 */
202 uint8 net_type;
203 //uint8 plmn[10]; // 46000
204 /*
205 0: unknown
206 1: available
207 2: current
208 3: forbidden
209 */
210 uint8 net_state;
211 uint32 plmn;
212} __attribute__((packed)) mbtk_net_info_t;
213
214
215typedef enum
216{
217 MBTK_NET_REG_STATE_NON = 0,
218 MBTK_NET_REG_STATE_HOME,
219 MBTK_NET_REG_STATE_SEARCHING,
220 MBTK_NET_REG_STATE_DENIED,
221 MBTK_NET_REG_STATE_UNKNOWN,
222 MBTK_NET_REG_STATE_ROAMING,
223 MBTK_NET_REG_STATE_SMS_ONLY,
224 MBTK_NET_REG_STATE_ROAMING_SMS,
225 MBTK_NET_REG_STATE_ATTACHED_EMERGENCY,
226 MBTK_NET_REG_STATE_CSFB_HOME,
227 MBTK_NET_REG_STATE_CSFB_ROAMING,
228 MBTK_NET_REG_STATE_EMERGENCY_ONLY
229} mbtk_net_reg_state_enum;
230
231typedef struct
232{
233 uint8 call_state;// mbtk_net_reg_state_enum
234 uint8 data_state;// mbtk_net_reg_state_enum
235 uint8 ims_state;// mbtk_net_reg_state_enum
236 uint8 type; // mbtk_radio_technology_enum
237 uint16 lac;
238 uint32 ci;
239} __attribute__((packed)) mbtk_net_reg_info_t;
240
241typedef struct
242{
243 uint8 type; // mbtk_radio_technology_enum
244 uint8 rssi; // 0: 113 dBm or less
245 // 1: 111 dBm
246 // 2��30: 109��53 dBm
247 // 31: 51 dBm or greater
248 // 99: not known or not detectable
249 uint8 rxlev;// 0:rssi < -110 dBm
250 // 1: -110 dBm �� rssi < -109 dBm
251 // 2: -109 dBm �� rssi < -108 dBm
252 // ......
253 // 61: -50 dBm �� rssi < -49 dBm
254 // 62: -49 dBm �� rssi < -48 dBm
255 // 63: -48 dBm �� rssi
256 // 99: not known or not detectable
257 uint8 ber; // 0...7 as RXQUAL values in the table in 3GPP TS 45.008 [20] subclause 8.2.4
258 // 99 not known or not detectable
259 uint8 rscp; // 0: rscp < -120 dBm
260 // 1: -120 dBm �� rscp < -119 dBm
261 // 2: -119 dBm �� rscp < -118 dBm
262 // ......
263 // 94: -27 dBm �� rscp < -26 dBm
264 // 95: -26 dBm �� rscp < -25 dBm
265 // 96: - 25 dBm �� rscp
266 // 255: not known or not detectable
267 uint8 ecno; // 0: Ec/Io < -24 dB
268 // 1: -24 dB �� Ec/Io < -23.5 dB
269 // 2: -23.5 dB �� Ec/Io < -23 dB
270 // ......
271 // 47: -1 dB �� Ec/Io < -0.5 dB
272 // 48: -0.5 dB �� Ec/Io < 0 dB
273 // 49: 0 dB �� Ec/Io
274 // 255: not known or not detectable
275 uint8 rsrq; // 0: rsrq < -19.5 dB
276 // 1: -19.5 dB �� rsrq < -19 dB
277 // 2: -19 dB �� rsrq < -18.5 dB
278 // ......
279 // 32: -4 dB �� rsrq < -3.5 dB
280 // 33: -3.5 dB �� rsrq < -3 dB
281 // 34: -3 dB �� rsrq
282 // 255: not known or not detectable
283 uint8 rsrp; // 0: rsrp < -140 dBm
284 // 1: -140 dBm �� rsrp < -139 dBm
285 // 2: -139 dBm �� rsrp < -138 dBm
286 // ......
287 // 95: -46 dBm �� rsrp < -45 dBm
288 // 96: -45 dBm �� rsrp < -44 dBm
289 // 97: -44 dBm �� rsrp
290 // 255: not known or not detectable
291} __attribute__((packed)) mbtk_signal_info_t;
292
293typedef struct{
294 uint8_t mode;
295 uint32_t oosPhase[3]; //单位为秒
296} mbtk_oos_info;
297
298typedef struct
299{
300 /* Configuration parameters for MCM network full band network scan when OOS (out of service)*/
301 int t_min;
302 int t_step;
303 int t_max;
304}GSW_NW_OOS_CONFIG_INFO_T;
305
b.liu68a94c92025-05-24 12:53:41 +0800306#define lib_mbtk_path "/lib/libmbtk_lib.so"
307mbtk_info_handle_t* nw_info_handle = NULL;
308
q.huang638d5872025-06-21 13:44:43 +0800309static GSW_NW_ServingInfoHandlePtr serving_cb=NULL;
310static GSW_NW_SigInfoHandlePtr sig_cb=NULL;
311static GSW_NW_RejectCauseHandlePtr reject_cb=NULL;
312static GSW_NW_ModemStateHandlePtr modem_cb=NULL;
313static GSW_NW_AirplaneModeHandlePtr airplane_cb=NULL;
b.liu68a94c92025-05-24 12:53:41 +0800314
315static void *dlHandle_mbtk;
316int nw_init_flag = 0;
317int mode = -1;
318int fplmn_max_length = 0;
319
320gsw_nw_plmn_list_t gsw_nw_plmn_list;
321char fplmn_array[FPLMN_ARRAY_SIZE][7];
322int fplmn_index = 0;
323
324static mbtk_info_handle_t* (*mbtk_info_handle_get)(void);
325static int (*mbtk_info_handle_free)(mbtk_info_handle_t** handle);
326int (*mbtk_net_sel_mode_get)(mbtk_info_handle_t* handle, mbtk_net_info_t *net);
327int (*mbtk_net_reg_get)(mbtk_info_handle_t* handle, mbtk_net_reg_info_t *reg);
328int (*mbtk_cell_get)(mbtk_info_handle_t* handle, mbtk_cell_type_enum *type, list_node_t **cell_list);
329int (*mbtk_get_modem_fun)(mbtk_info_handle_t* handle, int* fun);
330static int (*mbtk_set_modem_fun)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info);
331int (*mbtk_current_band_get)(mbtk_info_handle_t* handle, mbtk_band_info_t *band);
332int (*mbtk_current_band_set)(mbtk_info_handle_t* handle, const mbtk_band_info_t *band);
333int (*mbtk_net_signal_get)(mbtk_info_handle_t* handle, mbtk_signal_info_t *signal);
334int (*mbtk_wakeup_state_set)(mbtk_info_handle_t* handle, uint32 wakeup_state);
335int (*mbtk_signal_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
336int (*mbtk_net_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
337int (*mbtk_fplmn_get)(mbtk_info_handle_t *handle, void *fplmn);
338int (*mbtk_fplmn_set)(mbtk_info_handle_t *handle, void *fplmn);
339int (*mbtk_radio_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
340int (*mbtk_oos_get)(mbtk_info_handle_t* handle, mbtk_oos_info *oos_info);
341int (*mbtk_oos_set)(mbtk_info_handle_t* handle, mbtk_oos_info *oos_info);
q.huang238b22a2025-06-10 14:36:59 +0800342int (*mbtk_imei_get)(mbtk_info_handle_t* handle, void *imei);
343
b.liu68a94c92025-05-24 12:53:41 +0800344
345static void (*mbtk_log)(int level, const char *format, ...);
346static void (*mbtk_log_init)(char *path, char *tag);
347
348#ifndef LOG_ERR_LEVEL
349#define LOG_ERR_LEVEL 3 /* error conditions */
350#endif
351#ifndef LOG_WARN_LEVEL
352#define LOG_WARN_LEVEL 4 /* warning conditions */
353#endif
354#ifndef LOG_INFO_LEVEL
355#define LOG_INFO_LEVEL 6 /* informational */
356#endif
357#ifndef LOG_DEBUG_LEVEL
358#define LOG_DEBUG_LEVEL 7 /* debug-level messages */
359#endif
360#ifndef LOG_VERBOSE_LEVEL
361#define LOG_VERBOSE_LEVEL 8
362#endif
363
l.yang6a42e4d2025-05-28 01:04:20 -0700364#define GSW_NW "[HAL][GSW_NW]"
365
b.liu68a94c92025-05-24 12:53:41 +0800366#define LOGV(fmt, args ...) \
367 do{ \
368 char *file_ptr_1001 = __FILE__; \
369 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
370 char line_1001[10] = {0}; \
371 sprintf(line_1001, "%d", __LINE__); \
372 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
373 if(*ptr_1001 == '/') \
374 break; \
375 ptr_1001--; \
376 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700377 mbtk_log(LOG_VERBOSE_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800378 } while(0)
379
380#define LOGI(fmt, args...) \
381 do{ \
382 char *file_ptr_1001 = __FILE__; \
383 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
384 char line_1001[10] = {0}; \
385 sprintf(line_1001, "%d", __LINE__); \
386 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
387 if(*ptr_1001 == '/') \
388 break; \
389 ptr_1001--; \
390 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700391 mbtk_log(LOG_INFO_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800392 } while(0)
393
394#define LOGD(fmt, args...) \
395 do{ \
396 char *file_ptr_1001 = __FILE__; \
397 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
398 char line_1001[10] = {0}; \
399 sprintf(line_1001, "%d", __LINE__); \
400 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
401 if(*ptr_1001 == '/') \
402 break; \
403 ptr_1001--; \
404 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700405 mbtk_log(LOG_DEBUG_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800406 } while(0)
407
408#define LOGW(fmt, args...) \
409 do{ \
410 char *file_ptr_1001 = __FILE__; \
411 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
412 char line_1001[10] = {0}; \
413 sprintf(line_1001, "%d", __LINE__); \
414 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
415 if(*ptr_1001 == '/') \
416 break; \
417 ptr_1001--; \
418 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700419 mbtk_log(LOG_WARN_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800420 } while(0)
421
422#define LOGE(fmt, args...) \
423 do{ \
q.huangfa0a0a32025-06-12 17:07:23 +0800424 char *file_ptr_1001 = __FILE__; \
b.liu68a94c92025-05-24 12:53:41 +0800425 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
426 char line_1001[10] = {0}; \
427 sprintf(line_1001, "%d", __LINE__); \
428 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
429 if(*ptr_1001 == '/') \
430 break; \
431 ptr_1001--; \
432 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700433 mbtk_log(LOG_ERR_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800434 } while(0)
435
436
437
438typedef struct
439{
440 char *lynq_operator_l;
441 char *lynq_operator_s;
442 uint32 lynq_mcc_mnc;
443} lynq_operator_mcc_mnc_t;
444
445static lynq_operator_mcc_mnc_t lynq_operator_mcc_mnc[] =
446{
447 {"China Mobile","CMCC",46000},
448 {"China Unicom","CU",46001},
449 {"China Mobile","CMCC",46002},
450 {"China Telecom","CT",46003},
451 {"China Mobile","CMCC",46004},
452 {"China Telecom","CT",46005},
453 {"China Unicom","CU",46006},
454 {"China Mobile","CMCC",46007},
455 {"China Mobile","CMCC",46008},
456 {"China Unicom","CU",46009},
457 {"China Telecom","CT",46011}
458};
459
460
461//GSW include
462typedef enum prefer_mode
463{
464 GSW_PREFER_MODE_GSW = 1, /**<2G only*/
465 GSW_PREFER_MODE_WCDMA = 2, /**< 3G only*/
466 GSW_PREFER_MODE_WCDMA_GSM = 3, /**< 3G/2G*/
467 GSW_PREFER_MODE_LTE = 4, /**< 4G only*/
468 GSW_PREFER_MODE_NR5G = 5, /**< 5G only*/
469 GSW_PREFER_MODE_NR5G_LTE = 8, /**< 5G/4G*/
470 GSW_PREFER_MODE_LTE_WCDMA_GSM = 9, /**< 4G/3G/2G*/
471 GSW_PREFER_MODE_NR5G_LTE_WCDMA_GSM = 32, /**< 5G/4G/3G/2G*/
472} PREFER_MODE_E;
473
474static int mbtk_nw_api_import()
475{
476 dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);
477 if (dlHandle_mbtk == NULL)
478 {
xy.heb41615b2025-05-28 16:33:20 +0800479 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800480 }
481
482 mbtk_log_init = (void (*)(char *path, char *tag))dlsym(dlHandle_mbtk, "mbtk_log_init");
483 if (mbtk_log_init == NULL)
484 {
xy.heb41615b2025-05-28 16:33:20 +0800485 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800486 }
487
488 mbtk_log = (void (*)(int level, const char *format, ...))dlsym(dlHandle_mbtk, "mbtk_log");
489 if (mbtk_log == NULL)
490 {
xy.heb41615b2025-05-28 16:33:20 +0800491 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800492 }
493
494 mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");
495 if (mbtk_info_handle_get == NULL)
496 {
497 LOGE("mbtk_info_handle_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800498 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800499 }
500
501 mbtk_info_handle_free = (int (*)(mbtk_info_handle_t** handle))dlsym(dlHandle_mbtk, "mbtk_info_handle_free");
502 if (mbtk_info_handle_free == NULL)
503 {
504 LOGE("mbtk_info_handle_free dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800505 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800506 }
507
508 mbtk_net_sel_mode_get = (int (*)(mbtk_info_handle_t* handle, mbtk_net_info_t *net))dlsym(dlHandle_mbtk, "mbtk_net_sel_mode_get");
509 if (mbtk_net_sel_mode_get == NULL)
510 {
511 LOGE("mbtk_net_sel_mode_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800512 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800513 }
514
515 mbtk_net_reg_get = (int (*)(mbtk_info_handle_t* handle, mbtk_net_reg_info_t *reg))dlsym(dlHandle_mbtk, "mbtk_net_reg_get");
516 if (mbtk_net_reg_get == NULL)
517 {
518 LOGE("mbtk_net_reg_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800519 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800520 }
521
522 mbtk_get_modem_fun = (int (*)(mbtk_info_handle_t* handle, int* fun))dlsym(dlHandle_mbtk, "mbtk_get_modem_fun");
523 if (mbtk_get_modem_fun == NULL)
524 {
525 LOGE("mbtk_get_modem_fun dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800526 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800527 }
528
529 mbtk_set_modem_fun = (int (*)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info))dlsym(dlHandle_mbtk, "mbtk_set_modem_fun");
530 if (mbtk_set_modem_fun == NULL)
531 {
532 LOGE("mbtk_set_modem_fun dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800533 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800534 }
535
536 mbtk_current_band_get = (int (*)(mbtk_info_handle_t* handle, mbtk_band_info_t *band))dlsym(dlHandle_mbtk, "mbtk_current_band_get");
537 if (mbtk_current_band_get == NULL)
538 {
539 LOGE("mbtk_current_band_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800540 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800541 }
542
543 mbtk_current_band_set = (int (*)(mbtk_info_handle_t* handle, const mbtk_band_info_t *band))dlsym(dlHandle_mbtk, "mbtk_current_band_set");
544 if (mbtk_current_band_set == NULL)
545 {
546 LOGE("mbtk_current_band_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800547 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800548 }
549
550 mbtk_net_signal_get = (int (*)(mbtk_info_handle_t* handle, mbtk_signal_info_t *signal))dlsym(dlHandle_mbtk, "mbtk_net_signal_get");
551 if (mbtk_net_signal_get == NULL)
552 {
553 LOGE("mbtk_net_signal_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800554 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800555 }
556
557 mbtk_wakeup_state_set = (int (*)(mbtk_info_handle_t* handle, uint32 wakeup_state))dlsym(dlHandle_mbtk, "mbtk_wakeup_state_set");
558 if (mbtk_wakeup_state_set == NULL)
559 {
560 LOGE("mbtk_wakeup_state_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800561 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800562 }
563
564 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");
565 if (mbtk_cell_get == NULL)
566 {
567 LOGE("mbtk_cell_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800568 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800569 }
570
571 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");
572 if (mbtk_signal_state_change_cb_reg == NULL)
573 {
574 LOGE("mbtk_signal_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800575 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800576 }
577
578 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");
579 if (mbtk_net_state_change_cb_reg == NULL)
580 {
581 LOGE("mbtk_net_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800582 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800583 }
584
585 mbtk_fplmn_get = (int(*)(mbtk_info_handle_t *handle, void *fplmn))dlsym(dlHandle_mbtk, "mbtk_fplmn_get");
586 if (mbtk_fplmn_get == NULL)
587 {
588 LOGE("mbtk_fplmn_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800589 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800590 }
591
592 mbtk_fplmn_set = (int(*)(mbtk_info_handle_t *handle, void *fplmn))dlsym(dlHandle_mbtk, "mbtk_fplmn_set");
593 if (mbtk_fplmn_set == NULL)
594 {
595 LOGE("mbtk_fplmn_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800596 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800597 }
598
599 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");
600 if (mbtk_radio_state_change_cb_reg == NULL)
601 {
602 LOGE("mbtk_radio_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800603 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800604 }
605
606 mbtk_oos_get = (int (*)(mbtk_info_handle_t* handle, mbtk_oos_info *oos))dlsym(dlHandle_mbtk, "mbtk_oos_get");
607 if (mbtk_oos_get == NULL)
608 {
609 LOGE("mbtk_oos_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800610 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800611 }
612
613 mbtk_oos_set = (int (*)(mbtk_info_handle_t* handle, mbtk_oos_info *oos))dlsym(dlHandle_mbtk, "mbtk_oos_set");
614 if (mbtk_oos_set == NULL)
615 {
616 LOGE("mbtk_oos_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800617 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800618 }
q.huang238b22a2025-06-10 14:36:59 +0800619
620 mbtk_imei_get = (int (*)(mbtk_info_handle_t* handle, void *imei))dlsym(dlHandle_mbtk, "mbtk_imei_get");
621 if (mbtk_imei_get == NULL)
622 {
623 LOGE("mbtk_imei_get dlsym fail\n");
624 return GSW_HAL_NORMAL_FAIL;
625 }
b.liu68a94c92025-05-24 12:53:41 +0800626
627 return GSW_HAL_SUCCESS;
628}
629
630void list_first(list_node_t *list)
631{
632 if (list) {
633 list->cur_index = 0;
634 list->cur_array_data = list->array_data.next;
635 }
636}
637
638void* list_next(list_node_t *list)
639{
640 if (list) {
641 list_arraynode_t *node = list->cur_array_data;
642 if (node) {
643 LOGE("node is not null\n");
644 list->cur_array_data = list->cur_array_data->next;
645 list->cur_index++;
646 return node->data;
647 } else {
648 LOGE("node is null\n");
649 return NULL;
650 }
651 } else {
652 LOGE("list is null\n");
653 return NULL;
654 }
655}
656
657void list_free(list_node_t *list)
658{
659 if (list) {
660 list_arraynode_t *node = &(list->array_data); // Head node
661 list_arraynode_t *node_temp = NULL;
662 while (node->next) {
663 node_temp = node->next;
664 node->next = node->next->next;
665
666 if (list->free_func) {
667 list->free_func(node_temp->data);
668 } else {
669 free(node_temp->data);
670 }
671 free(node_temp);
672 }
673 free(list);
674 }
675}
676
q.huang638d5872025-06-21 13:44:43 +0800677static int32_t gsm_rssi_convert_to_dBm(uint8 rssi)
678{
679 if(rssi <= 31)
680 {
681 return rssi * 2 - 113; //0 map -113
682 //31 map -51
683 }
684 else
685 {
686 return INT_32_MAX;
687 }
688}
689
690
q.huangfa0a0a32025-06-12 17:07:23 +0800691static int32_t rscp_convert_to_minus_dBm(uint8 rscp)
b.liu68a94c92025-05-24 12:53:41 +0800692{
q.huangfa0a0a32025-06-12 17:07:23 +0800693 if(rscp <= 96)
b.liu68a94c92025-05-24 12:53:41 +0800694 {
q.huangfa0a0a32025-06-12 17:07:23 +0800695 return 121-rscp; // 96 map 25
696 // 0 map -121, below -120
b.liu68a94c92025-05-24 12:53:41 +0800697 }
b.liu68a94c92025-05-24 12:53:41 +0800698 else
699 {
q.huangfa0a0a32025-06-12 17:07:23 +0800700 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800701 }
702}
703
q.huangfa0a0a32025-06-12 17:07:23 +0800704static int32_t rsrp_convert_to_minus_dBm(uint8 rsrp)
b.liu68a94c92025-05-24 12:53:41 +0800705{
q.huangfa0a0a32025-06-12 17:07:23 +0800706 if(rsrp <= 97)
b.liu68a94c92025-05-24 12:53:41 +0800707 {
q.huangfa0a0a32025-06-12 17:07:23 +0800708 return 141-rsrp; // 97 map 44
709 // 0 map 141 below 140
b.liu68a94c92025-05-24 12:53:41 +0800710 }
711 else
712 {
q.huangfa0a0a32025-06-12 17:07:23 +0800713 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800714 }
715}
716
q.huangfa0a0a32025-06-12 17:07:23 +0800717static int32_t rsrq_convert_to_minus_dB(uint8 rsrq)
b.liu68a94c92025-05-24 12:53:41 +0800718{
q.huangfa0a0a32025-06-12 17:07:23 +0800719 if(rsrq <= 34)
b.liu68a94c92025-05-24 12:53:41 +0800720 {
q.huangfa0a0a32025-06-12 17:07:23 +0800721 return (40-rsrq)/2; //=20-rsrq / 2;
722 // 34 map 3
723 // 0 map 20
b.liu68a94c92025-05-24 12:53:41 +0800724 }
725 else
726 {
q.huangfa0a0a32025-06-12 17:07:23 +0800727 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800728 }
729}
730
q.huang638d5872025-06-21 13:44:43 +0800731static int32_t sinr_convert_to_10_times_dB(uint8 sinr)
732{
733 if(sinr <=35 && sinr>=-20)
734 {
735 return sinr*10; //35 map 350 db
736 // -20 map -2000 db
737 }
738 else
739 {
740 return INT_32_MAX;
741 }
742}
743
744
745static int32_t rscp_minus_dbm_convert_to_rssi_dBm(int32_t rscp)
746{
747 if(rscp!=INT_32_MAX)
748 {
749 return -rscp;
750 }
751 else
752 {
753 return INT_32_MAX;
754 }
755}
756
757static int32_t rsrp_minus_dbm_convert_to_rssi_dBm(int32_t rsrp)
758{
759 if(rsrp!=INT_32_MAX)
760 {
761 return -rsrp;
762 }
763 else
764 {
765 return INT_32_MAX;
766 }
767}
768
769
770
b.liu68a94c92025-05-24 12:53:41 +0800771
q.huangfa0a0a32025-06-12 17:07:23 +0800772//int ecno; /**< Valid values are positive integers. This value is the actual Ec/Io multiplied
773// * by -10. Example: If the actual Ec/Io is -12.5 dB, then this response value
774// * will be 125.*/
775//uint8 ecno; // 0: Ec/Io < -24 dB
776 // 1: -24 dB �� Ec/Io < -23.5 dB
777 // 2: -23.5 dB �� Ec/Io < -23 dB
778 // ......
779 // 47: -1 dB �� Ec/Io < -0.5 dB
780 // 48: -0.5 dB �� Ec/Io < 0 dB
781 // 49: 0 dB �� Ec/Io
782 // 255: not known or not detectabl
783static int32_t ecno_convert_to_minus_10_times_dB(uint8 ecno)
b.liu68a94c92025-05-24 12:53:41 +0800784{
q.huangfa0a0a32025-06-12 17:07:23 +0800785 if(ecno <=49)
b.liu68a94c92025-05-24 12:53:41 +0800786 {
q.huangfa0a0a32025-06-12 17:07:23 +0800787 return 245-ecno*5; //49 map 0 db
788 // 1 map 240 db
789 // 0 map 245 below 240
b.liu68a94c92025-05-24 12:53:41 +0800790 }
q.huangfa0a0a32025-06-12 17:07:23 +0800791 else
b.liu68a94c92025-05-24 12:53:41 +0800792 {
q.huangfa0a0a32025-06-12 17:07:23 +0800793 return INT_32_MAX;
b.liu68a94c92025-05-24 12:53:41 +0800794 }
795}
796
b.liu68a94c92025-05-24 12:53:41 +0800797
b.liu68a94c92025-05-24 12:53:41 +0800798
q.huangfa0a0a32025-06-12 17:07:23 +0800799/* change realCsq to level */
800static int rscpToLevel(int rscp)
b.liu68a94c92025-05-24 12:53:41 +0800801{
q.huangfa0a0a32025-06-12 17:07:23 +0800802
803 if (rscp < -110) {
b.liu68a94c92025-05-24 12:53:41 +0800804 return 0;
q.huangfa0a0a32025-06-12 17:07:23 +0800805 } else if (rscp <= -95) {
806 return rscp+111; // to 16
807 } else if (rscp >=-93 && rscp <=-90) {
808 return rscp+110; // to 20
809 } else if (rscp >=-89 && rscp <=-59) {
810 return (rscp+152)/3; // =(rscp+89)/3+21 to 31
811 } else if (rscp ==- 94) { // Geely requirement, -94 map 16
812 return 16;
813 } else if(rscp <= -25) {
814 return 31;
b.liu68a94c92025-05-24 12:53:41 +0800815 }
q.huangfa0a0a32025-06-12 17:07:23 +0800816 return 99;
b.liu68a94c92025-05-24 12:53:41 +0800817}
818
q.huangfa0a0a32025-06-12 17:07:23 +0800819static int rsrpToLevel(int rsrp)
820{
821 if (rsrp < -130) {
822 return 0;
823 } else if (rsrp <= -118) {
824 return (rsrp+132)/2; // to 7
825 } else if (rsrp <=-109) {
826 return rsrp+125; // to 16
827 } else if (rsrp <=-103) {
828 return (rsrp+141)/2; // =(rsrp+109)/2+16 to 19
829 } else if (rsrp <=- 85) {
830 return (rsrp+160)/3; // =(rsrp+103)/3+19 to 25
831 } else if(rsrp <= -55) {
832 return (rsrp+210)/5; // =(rsrp+85)/5+25 to 31
833 } else if(rsrp <=-44)
834 {
835 return 31;
836 }
837 return 99;
838}
839
840
841
842
b.liu68a94c92025-05-24 12:53:41 +0800843
844static int convert_reg_state(int reg_state_t)
845{
846 LOGD("reg_state_t = %d\n",reg_state_t);
847 int reg_state = 0;
848
849 switch (reg_state_t)
850 {
851 case MBTK_NET_REG_STATE_NON:
852 {
853 reg_state = GSW_NETWORK_REG_NOT_REGISTERED;
854 break;
855 }
856 case MBTK_NET_REG_STATE_HOME:
857 {
858 reg_state = GSW_NETWORK_REG_REGISTERED;
859 break;
860 }
861 case MBTK_NET_REG_STATE_SEARCHING:
862 {
863 reg_state = GSW_NETWORK_REG_NOT_REGISTERED_SEARCHING;
864 break;
865 }
866 case MBTK_NET_REG_STATE_DENIED:
867 {
868 reg_state = GSW_NETWORK_REG_REGISTRATION_DENIED;
869 break;
870 }
871 case MBTK_NET_REG_STATE_UNKNOWN:
872 {
873 reg_state = GSW_NETWORK_REG_REGISTRATION_UNKNOWN;
874 break;
875 }
876 case MBTK_NET_REG_STATE_ROAMING:
877 {
878 reg_state = GSW_NETWORK_REG_REGISTRATION_ROAMING;
879 break;
880 }
881 case MBTK_NET_REG_STATE_SMS_ONLY:
882 case MBTK_NET_REG_STATE_ROAMING_SMS:
883 case MBTK_NET_REG_STATE_ATTACHED_EMERGENCY:
884 case MBTK_NET_REG_STATE_CSFB_HOME:
885 case MBTK_NET_REG_STATE_CSFB_ROAMING:
886 case MBTK_NET_REG_STATE_EMERGENCY_ONLY:
887 {
888 reg_state = GSW_NETWORK_REG_LIMITED_SERVICE;
889 break;
890 }
891 }
892
893 return reg_state;
894}
895
896
897static int convert_net_mode(int net_mode)
898{
899 LOGD("net_mode = %d\n",net_mode);
900 switch(net_mode)
901 {
902 case MBTK_RADIO_TECH_GSM:
903 case MBTK_RADIO_TECH_GSM_COMPACT:
904 case MBTK_RADIO_TECH_GSM_EGPRS:
905 {
906 return GSW_NETWORK_RADIO_GSM;
907 }
908 case MBTK_RADIO_TECH_UTRAN:
909 case MBTK_RADIO_TECH_UTRAN_HSDPA:
910 case MBTK_RADIO_TECH_UTRAN_HSUPA:
911 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
912 case MBTK_RADIO_TECH_UTRAN_HSPA:
913 {
914 return GSW_NETWORK_RADIO_UMTS;
915 }
916 case MBTK_RADIO_TECH_E_UTRAN:
917 {
918 return GSW_NETWORK_RADIO_LTE;
919 }
920
921 default:
922 {
923 return GSW_NETWORK_RADIO_NO_SVC;
924 }
925 }
926
927 return GSW_NETWORK_RADIO_NO_SVC;
928}
929
930static int convert_mbtk_net_config(int config)
931{
932 int net_pref = -1;
933
934 switch(config)
935 {
936 case GSW_PREFER_MODE_GSW:
937 {
938 net_pref = 0;
939 break;
940 }
941
942 case GSW_PREFER_MODE_WCDMA:
943 {
944 net_pref = 1;
945 break;
946 }
947
948 case GSW_PREFER_MODE_WCDMA_GSM:
949 {
950 net_pref = 2;
951 break;
952 }
953
954 case GSW_PREFER_MODE_LTE:
955 case GSW_PREFER_MODE_NR5G:
956 case GSW_PREFER_MODE_NR5G_LTE:
957 {
958 net_pref = 5;
959 break;
960 }
961
962 case GSW_PREFER_MODE_LTE_WCDMA_GSM:
963 case GSW_PREFER_MODE_NR5G_LTE_WCDMA_GSM:
964 {
965 net_pref = 15;
966 break;
967 }
968 }
969
970 return net_pref;
971}
972
973
974static int convert_gsw_net_config(int config)
975{
976 int net_config = -1;
q.huang72680852025-06-11 13:42:21 +0800977 LOGD("config = %d\n",config);
b.liu68a94c92025-05-24 12:53:41 +0800978
979 switch (config)
980 {
981 case 0:
982 {
983 net_config = GSW_PREFER_MODE_GSW;
984 break;
985 }
986
987 case 1:
988 {
989 net_config = GSW_PREFER_MODE_WCDMA;
990 break;
991 }
992
993 case 2:
994 {
995 net_config = GSW_PREFER_MODE_WCDMA_GSM;
996 break;
997 }
998
999 case 5:
1000 {
1001 net_config = GSW_PREFER_MODE_LTE;
1002 break;
1003 }
1004
1005 case 15:
1006 {
1007 net_config = GSW_PREFER_MODE_LTE_WCDMA_GSM;
1008 break;
1009 }
1010 }
1011
1012 return net_config;
1013}
1014
1015//64F010 -> 46001 (64->46,F0->0,10->01)
1016static void transform_fplmn_str_to_plmn(char *entry)
1017{
1018 if (strncmp(entry, "FFFFFF", ENTRY_LENGTH) == 0) {
1019 return; //if FFFFFF,means invalid fplmn, do nothing
1020 }
1021
1022 char temp = entry[0];
1023 entry[0] = entry[1];
1024 entry[1] = temp;
1025
1026 temp = entry[ENTRY_LENGTH - 2];
1027 entry[ENTRY_LENGTH - 2] = entry[ENTRY_LENGTH - 1];
1028 entry[ENTRY_LENGTH - 1] = temp;
1029
1030 memmove(entry + 2, entry + 3, ENTRY_LENGTH - 2);
1031
1032 LOGE("after transform_fplmn_str_to_plmn: %s\n", entry);
1033
1034 //valid fplmn
1035 fplmn_index++;
1036}
1037
1038static void extract_mcc_mnc(char *entry, char *mcc, char *mnc)
1039{
1040 strncpy(mcc,entry,3);
1041 mcc[3] = '\0';
1042 strncpy(mnc,entry + 3,2);
1043 mnc[2] = '\0';
1044
1045 LOGE("entry = %s, mcc = %s, mnc = %s\n", entry, mcc, mnc);
1046}
1047
1048
1049static void update_fplmn_list(char *fplmn_str)
1050{
1051 LOGE("fplmn_str = %s\n",fplmn_str);
1052 char temp_fplmn_array[FPLMN_ARRAY_SIZE][7];
1053 memset(fplmn_array, 0, sizeof(fplmn_array));
1054 memset(temp_fplmn_array, 0, sizeof(temp_fplmn_array));
1055 fplmn_index = 0;
1056 int array_length = 0;
1057
1058 for (int i = 0; i < strlen(fplmn_str); i += 6) {
1059
1060 int length = (i + 6 < strlen(fplmn_str)) ? 6 : strlen(fplmn_str) - i;
1061 strncpy(temp_fplmn_array[array_length], fplmn_str + i, length);
1062 temp_fplmn_array[array_length][length] = '\0';
1063 array_length++;
1064 if (i + 6 >= strlen(fplmn_str)) {
1065 break;
1066 }
1067 }
1068
1069 for (int i = 0; i < array_length; i++) {
1070 LOGE("array[%d] = %s\n", i, temp_fplmn_array[i]);
1071 transform_fplmn_str_to_plmn(temp_fplmn_array[i]);
1072 strncpy(fplmn_array[i], temp_fplmn_array[i], ENTRY_LENGTH);
1073 LOGE("fplmn_array[%d] = %s\n", i, fplmn_array[i]);
1074 }
1075
1076}
1077
1078static void format_plmn(char *result, char *plmn_entry)
1079{
1080 strncpy(result, plmn_entry, strlen(plmn_entry));
1081 LOGE("result = %s, numStr = %s\n",result, plmn_entry);
1082
1083 if (strlen(result) >= 2) {
1084 char temp = result[0];
1085 result[0] = result[1];
1086 result[1] = temp;
1087 }
1088
1089 LOGE("1.result = %s\n",result);
1090
1091 if (strlen(result) >= 3) {
1092 memmove(&result[3], &result[2], strlen(result) - 2 + 1);
1093 result[2] = 'F';
1094 }
1095
1096 LOGE("2.result = %s\n",result);
1097
1098 if (strlen(result) >= 2) {
1099 char temp = result[strlen(result) - 1];
1100 result[strlen(result) - 1] = result[strlen(result) - 2];
1101 result[strlen(result) - 2] = temp;
1102 }
1103
1104 LOGE("3.result = %s\n",result);
1105}
1106
1107
1108static void convert_plmn_to_fplmn_str(char *fplmn_str)
1109{
1110 char temp_fplmn_str[128] = {0};
1111 char temp[20]; // 临时存储单个格式化后的数字
1112 int index = 0;
1113
1114 for (int i = 0; i < fplmn_index; i++) {
1115 memset(temp, 0x0, sizeof(temp));
1116 format_plmn(temp, fplmn_array[i]);
1117 strcat(temp_fplmn_str, temp);
1118 index += strlen(temp);
1119 }
1120
1121 while(index < (6 * fplmn_max_length))
1122 {
1123 temp_fplmn_str[index++] = 'F';
1124 }
1125
1126 // 修剪或截断formattedNumbers,确保它不超过6 * fplmn_max_length个字符
1127 if (index > (6 * fplmn_max_length)) {
1128 temp_fplmn_str[(6 * fplmn_max_length)] = '\0';
1129 }
1130
1131 LOGE("%s\n", temp_fplmn_str);
1132 strncpy(fplmn_str, temp_fplmn_str, strlen(temp_fplmn_str));
1133 LOGE("fplmn_str = %s\n", fplmn_str);
1134}
1135
1136static int check_index(char *mcc, char *mnc)
1137{
1138 int i = 0;
1139
1140 for(i = 0; i < fplmn_index; i++)
1141 {
1142 if(strncmp(fplmn_array[i], mcc, 3) == 0 && strncmp(fplmn_array[i] + 3, mnc, 2) == 0)
1143 {
1144 LOGE("index = %d\n", i);
1145 return i;
1146 }
1147 }
1148
1149 LOGE("not find\n");
1150 return -1;
1151}
1152
1153static void remove_fplmn(int index)
1154{
1155 int write_index = 0;
1156 for (int i = 0; i < fplmn_index; i++) {
1157 if (i != index) {
1158 strncpy(fplmn_array[write_index++], fplmn_array[i], ENTRY_LENGTH);
1159 }
1160 }
1161 fplmn_index--;
1162}
1163
q.huangfa0a0a32025-06-12 17:07:23 +08001164static void convert_mbtk_sig_info_to_gsw_sig_info(const mbtk_signal_info_t* signal, signalStrength_t* sig_strength)
1165{
1166 LOGD("signal->type=%d", signal->type);
1167 memset(sig_strength,0,sizeof (signalStrength_t));
1168 switch(signal->type)
1169 {
1170 case MBTK_RADIO_TECH_E_UTRAN:
1171 {
1172 LOGI("rsrp = %d",signal->rsrp);
1173 sig_strength->lte_sig_valid = 1;
q.huangc8b93122025-06-17 17:46:05 +08001174 sig_strength->rsrp = rsrp_convert_to_minus_dBm(signal->rsrp);
1175 sig_strength->rsrq = rsrq_convert_to_minus_dB(signal->rsrq);
q.huang638d5872025-06-21 13:44:43 +08001176 sig_strength->rssi = rsrp_minus_dbm_convert_to_rssi_dBm(sig_strength->rsrp);
q.huangfa0a0a32025-06-12 17:07:23 +08001177 sig_strength->rssnr=INT_32_MAX;
1178 break;
1179 }
1180 case MBTK_RADIO_TECH_UTRAN:
1181 case MBTK_RADIO_TECH_UTRAN_HSDPA:
1182 case MBTK_RADIO_TECH_UTRAN_HSUPA:
1183 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
1184 case MBTK_RADIO_TECH_UTRAN_HSPA:
1185 {
1186 LOGI("rscp = %d",signal->rscp);
1187 sig_strength->wcdma_sig_valid = 1;
1188 sig_strength->rscp = rscp_convert_to_minus_dBm(signal->rscp);
1189 sig_strength->ecno = ecno_convert_to_minus_10_times_dB(signal->ecno);
q.huang638d5872025-06-21 13:44:43 +08001190 sig_strength->rssi = rscp_minus_dbm_convert_to_rssi_dBm(sig_strength->rscp);
q.huangfa0a0a32025-06-12 17:07:23 +08001191 break;
1192 }
1193 case MBTK_RADIO_TECH_GSM:
1194 case MBTK_RADIO_TECH_GSM_COMPACT:
1195 case MBTK_RADIO_TECH_GSM_EGPRS:
1196 {
1197 LOGI("g rssi = %d",signal->rssi);
1198 sig_strength->gw_sig_valid = 1;
q.huang638d5872025-06-21 13:44:43 +08001199 sig_strength->rssi = gsm_rssi_convert_to_dBm(signal->rssi);
q.huangfa0a0a32025-06-12 17:07:23 +08001200 break;
1201 }
1202 default:
1203 {
1204 LOGE("[%s] unknown reg type.[%d]", __func__, signal->type);
1205 }
1206 }
1207
1208}
1209
1210
b.liu68a94c92025-05-24 12:53:41 +08001211static void gsw_serving_info_callback_thread()
1212{
1213 GSW_NW_SERVING_INFO *serving_info = (GSW_NW_SERVING_INFO*)malloc(sizeof(GSW_NW_SERVING_INFO));
1214 memset(serving_info, 0x0, sizeof(GSW_NW_SERVING_INFO));
1215 int ret = -1;
1216 ret = gsw_get_nwinfo(serving_info);
1217 if(ret != 0)
1218 {
1219 LOGE("gsw_get_nwinfo failed\n");
1220 free(serving_info);
1221 return;
1222 }
1223
1224 if(serving_cb)
1225 {
1226 serving_cb(*serving_info);
1227 free(serving_info);
1228 }
1229}
1230
1231static void gsw_serving_info_callback(const void* data, int data_len)
1232{
1233 LOGE("gsw_serving_info_callback start\n");
1234
1235 if(data && data_len > 0)
1236 {
1237 pthread_t thread;
1238 pthread_create(&thread, NULL, (void*)gsw_serving_info_callback_thread, NULL);
1239 }
1240
1241 else
1242 {
1243 LOGE("data is NULL\n");
1244 return;
1245 }
1246
1247}
1248
q.huangfa0a0a32025-06-12 17:07:23 +08001249/*typedef struct
1250{
12510 mbtk_radio_technology_enum type : 8; // mbtk_radio_technology_enum
12521 uint8 rssi; // 0: 113 dBm or less
1253 // 1: 111 dBm
1254 // 2��30: 109��53 dBm
1255 // 31: 51 dBm or greater
1256 // 99: not known or not detectable
12572 uint8 rxlev;// 0:rssi < -110 dBm
1258 // 1: -110 dBm �� rssi < -109 dBm
1259 // 2: -109 dBm �� rssi < -108 dBm
1260 // ......
1261 // 61: -50 dBm �� rssi < -49 dBm
1262 // 62: -49 dBm �� rssi < -48 dBm
1263 // 63: -48 dBm �� rssi
1264 // 99: not known or not detectable
12653 uint8 ber; // 0...7 as RXQUAL values in the table in 3GPP TS 45.008 [20] subclause 8.2.4
1266 // 99 not known or not detectable
12674 uint8 rscp; // 0: rscp < -120 dBm
1268 // 1: -120 dBm �� rscp < -119 dBm
1269 // 2: -119 dBm �� rscp < -118 dBm
1270 // ......
1271 // 94: -27 dBm �� rscp < -26 dBm
1272 // 95: -26 dBm �� rscp < -25 dBm
1273 // 96: - 25 dBm �� rscp
1274 // 255: not known or not detectable
12755 uint8 ecno; // 0: Ec/Io < -24 dB
1276 // 1: -24 dB �� Ec/Io < -23.5 dB
1277 // 2: -23.5 dB �� Ec/Io < -23 dB
1278 // ......
1279 // 47: -1 dB �� Ec/Io < -0.5 dB
1280 // 48: -0.5 dB �� Ec/Io < 0 dB
1281 // 49: 0 dB �� Ec/Io
1282 // 255: not known or not detectable
12836 uint8 rsrq; // 0: rsrq < -19.5 dB
1284 // 1: -19.5 dB �� rsrq < -19 dB
1285 // 2: -19 dB �� rsrq < -18.5 dB
1286 // ......
1287 // 32: -4 dB �� rsrq < -3.5 dB
1288 // 33: -3.5 dB �� rsrq < -3 dB
1289 // 34: -3 dB �� rsrq
1290 // 255: not known or not detectable
12917 uint8 rsrp; // 0: rsrp < -140 dBm
1292 // 1: -140 dBm �� rsrp < -139 dBm
1293 // 2: -139 dBm �� rsrp < -138 dBm
1294 // ......
1295 // 95: -46 dBm �� rsrp < -45 dBm
1296 // 96: -45 dBm �� rsrp < -44 dBm
1297 // 97: -44 dBm �� rsrp
1298 // 255: not known or not detectable
12998 uint8 ss_rsrq; // 0: ss_rsrq < -43 dB
1300 // 1: -43 dB <= ss_rsrq < -42.5 dB
1301 // 2: -42.5 dB <= ss_rsrq < -42 dB
1302 // ......
1303 // 125: 19 dB <= ss_rsrq < 19.5 dB
1304 // 126: 19.5 dB <= ss_rsrq < 20 dB
1305 // 255: not known or not detectable
1306 uint8 ss_rsrp; // 0: ss_rsrp < -156 dBm
1307 // 1: -156 dBm <= ss_rsrp < -155 dBm
1308 // 2: -155 dBm <= ss_rsrp < -154 dBm
1309 // ......
1310 // 125: -32 dBm <= ss_rsrp < -31 dBm
1311 // 126: -31 dBm <= ss_rsrp
1312 // 255: not known or not detectable
1313 uint8 ss_sinr; // 0: ss_sinr < -23 dB
1314 // 1: -23 dB  ss_sinr < -22.5 dB
1315 // 2: -22.5 dB  ss_sinr < -22 dB
1316 // ......
1317 // 125: 39 dB  ss_sinr < 39.5 dBm
1318 // 126: 39.5 dB  ss_sinr < 40 dB
1319 // 127: 40 dB  ss_sinr
1320 // 255: not known or not detectable
1321} __attribute__((packed)) mbtk_signal_info_t;
1322*/
b.liu68a94c92025-05-24 12:53:41 +08001323static void gsw_sig_info_callback(const void* data, int data_len)
1324{
q.huangfa0a0a32025-06-12 17:07:23 +08001325 if(data && (data_len >= sizeof (mbtk_signal_info_t)))
b.liu68a94c92025-05-24 12:53:41 +08001326 {
b.liu68a94c92025-05-24 12:53:41 +08001327 signalStrength_t sig_strength;
q.huangfa0a0a32025-06-12 17:07:23 +08001328 convert_mbtk_sig_info_to_gsw_sig_info(( const mbtk_signal_info_t*) data,&sig_strength);
1329
b.liu68a94c92025-05-24 12:53:41 +08001330 if(sig_cb != NULL)
1331 {
1332 sig_cb(sig_strength);
1333 }
1334 }
b.liu68a94c92025-05-24 12:53:41 +08001335 else
1336 {
q.huangfa0a0a32025-06-12 17:07:23 +08001337 LOGE("data is NULL or data len %d error",data_len);
b.liu68a94c92025-05-24 12:53:41 +08001338 }
1339}
1340
q.huangc8b93122025-06-17 17:46:05 +08001341static void gsw_operating_mode_event_callback(const void* data, int data_len)
b.liu68a94c92025-05-24 12:53:41 +08001342{
q.huangc8b93122025-06-17 17:46:05 +08001343 LOGE("gsw_operating_mode_event_callback start\n");
b.liu68a94c92025-05-24 12:53:41 +08001344
q.huangc8b93122025-06-17 17:46:05 +08001345
b.liu68a94c92025-05-24 12:53:41 +08001346 if(data && data_len > 0)
1347 {
q.huangc8b93122025-06-17 17:46:05 +08001348 const uint8 *cfun_state = (const uint8*)data;
1349 LOGE("gsw_operating_mode_event_callback,data = %d\n", *cfun_state);
1350 if(airplane_cb != NULL)
b.liu68a94c92025-05-24 12:53:41 +08001351 {
q.huangc8b93122025-06-17 17:46:05 +08001352 airplane_cb(*cfun_state);
b.liu68a94c92025-05-24 12:53:41 +08001353 }
1354 }
1355
1356}
1357
q.huangc8b93122025-06-17 17:46:05 +08001358
b.liu68a94c92025-05-24 12:53:41 +08001359static void gsw_reject_callback(GSW_NW_RADIO_ACCESS_TECH_E rat, GSW_SERVICE_DOMAIN_E domain, int cause)
1360{
1361 LOGE("gsw_reject_callback start,rat = %d,domain = %d,cause = %d\n",rat,domain,cause);
1362
1363 GSW_NW_REJ_CAUSE_E *rej_cause = (GSW_NW_REJ_CAUSE_E*)malloc(sizeof(GSW_NW_REJ_CAUSE_E));
1364 memset(rej_cause, 0x0, sizeof(GSW_NW_REJ_CAUSE_E));
1365
1366 rej_cause->rej_cause = cause;
1367 rej_cause->rej_rat = rat;
1368 rej_cause->rej_domain = domain;
1369
1370 if(reject_cb != NULL)
1371 {
1372 LOGE("reject_cb is not NULL\n");
1373 reject_cb(rej_cause);
1374 }
1375 else
1376 {
1377 LOGE("reject_cb is NULL\n");
1378 }
1379
1380 free(rej_cause);
1381 LOGE("gsw_reject_callback end\n");
1382}
1383
xy.hec89938f2025-05-29 14:08:47 +08001384void gsw_sig_info_timer()
1385{
xy.hec89938f2025-05-29 14:08:47 +08001386 if(nw_init_flag == 0 || nw_info_handle == NULL)
1387 {
1388 return;
1389 }
1390
1391 mbtk_signal_info_t signal;
1392 signalStrength_t sig_strength;
1393
1394 while(nw_init_flag)
1395 {
q.huangfa0a0a32025-06-12 17:07:23 +08001396 int ret = mbtk_net_signal_get(nw_info_handle, &signal);
xy.hec89938f2025-05-29 14:08:47 +08001397 if(ret != 0)
1398 {
q.huangfa0a0a32025-06-12 17:07:23 +08001399 LOGE("mbtk_net_signal_get fail, ret is %d\n",ret);
xy.hec89938f2025-05-29 14:08:47 +08001400 }
1401
1402 else
1403 {
q.huangfa0a0a32025-06-12 17:07:23 +08001404 convert_mbtk_sig_info_to_gsw_sig_info(&signal,&sig_strength);
1405
xy.hec89938f2025-05-29 14:08:47 +08001406 }
1407
1408 if(sig_cb != NULL)
1409 {
1410 sig_cb(sig_strength);
1411 }
1412
1413 sleep(SIG_TIMER);
1414 }
1415}
1416
b.liu68a94c92025-05-24 12:53:41 +08001417
1418/**
1419 * @brief SDK interface to call back serving info
1420 * @param [in] handle_ptr
1421 * @retval 0: success
1422 * @retval other: fail
1423 */
1424int gsw_reg_serving_info_callback(GSW_NW_ServingInfoHandlePtr handle_ptr)
1425{
1426 if (nw_init_flag == 0 || nw_info_handle == NULL)
1427 {
xy.heb41615b2025-05-28 16:33:20 +08001428 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001429 }
1430
1431 if(handle_ptr == NULL)
1432 {
1433 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08001434 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001435 }
1436
1437 serving_cb = handle_ptr;
1438
1439 return GSW_HAL_SUCCESS;
1440
1441}
1442
1443
1444/**
1445 * @brief SDK interface to call back sig info
1446 * @param [in] handle_ptr
1447 * @retval 0: success
1448 * @retval other: fail
1449 */
1450int gsw_reg_sig_info_callback(GSW_NW_SigInfoHandlePtr handle_ptr)
1451{
1452 if (nw_init_flag == 0 || nw_info_handle == NULL)
1453 {
xy.heb41615b2025-05-28 16:33:20 +08001454 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001455 }
1456
1457 if(handle_ptr == NULL)
1458 {
1459 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08001460 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001461 }
1462
1463 sig_cb = handle_ptr;
1464
1465 return GSW_HAL_SUCCESS;
1466
1467}
1468
1469
1470/**
1471 * @brief SDK interface to call back rej cause
1472 * @param [in] handle_ptr
1473 * @retval 0: success
1474 * @retval other: fail
1475 */
1476int gsw_reg_rej_cause_callback(GSW_NW_RejectCauseHandlePtr handle_ptr)
1477{
1478 if (nw_init_flag == 0 || nw_info_handle == NULL)
1479 {
xy.heb41615b2025-05-28 16:33:20 +08001480 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001481 }
1482
1483 if(handle_ptr == NULL)
1484 {
1485 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08001486 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001487 }
1488
1489 reject_cb = handle_ptr;
1490
1491 return GSW_HAL_SUCCESS;
1492}
1493
1494
1495/**
1496 * @brief network sdk init
1497 * @param [in] token usr id define by who use
1498 * @retval 0: success
1499 * @retval other: fail
1500 */
1501int gsw_nw_sdk_init(int token)
1502{
1503 int ret = -1;
xy.hec89938f2025-05-29 14:08:47 +08001504 pthread_t nw_info_thread;
b.liu68a94c92025-05-24 12:53:41 +08001505
1506 if (nw_init_flag == 1 && nw_info_handle != NULL)
1507 {
1508 return GSW_HAL_SUCCESS;
1509 }
1510
1511 ret = mbtk_nw_api_import();
1512 if (ret != 0)
1513 {
1514 LOGE("mbtk_nw_api_import fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001515 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001516 }
1517
1518 nw_info_handle = mbtk_info_handle_get();
1519
1520 if (nw_info_handle == NULL)
1521 {
1522 LOGE("mbtk_info_handle_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001523 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001524 }
1525
1526 char fplmn[256] = {0};
1527 ret = mbtk_fplmn_get(nw_info_handle, fplmn);
1528 if(ret != 0)
1529 {
1530 LOGE("mbtk_fplmn_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08001531 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001532 }
1533 fplmn_max_length = (strlen(fplmn)/6);
1534 LOGE("fplmn = %s, fplmn_max_length = %d\n",fplmn,fplmn_max_length);
1535 ret = mbtk_signal_state_change_cb_reg(nw_info_handle, gsw_sig_info_callback);
1536
1537 if (ret != 0)
1538 {
1539 LOGE("mbtk_signal_state_change_cb_reg fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001540 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001541 }
1542
1543 ret = mbtk_net_state_change_cb_reg(nw_info_handle, gsw_serving_info_callback);
1544 if (ret != 0)
1545 {
1546 LOGE("mbtk_net_state_change_cb_reg fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001547 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001548 }
1549
xy.hec89938f2025-05-29 14:08:47 +08001550 ret = pthread_create(&nw_info_thread, NULL, (void*)gsw_sig_info_timer, NULL);
1551 if (ret != 0)
1552 {
1553 LOGE("pthread_create fail\n");
1554 return GSW_HAL_NORMAL_FAIL;
1555 }
1556
b.liu68a94c92025-05-24 12:53:41 +08001557 nw_init_flag = 1;
1558
1559 return GSW_HAL_SUCCESS;
1560}
1561
1562
1563/**
1564 * @brief network sdk deinit
1565 * @param
1566 * @retval 0: success
1567 * @retval other: fail
1568 */
1569int gsw_nw_sdk_deinit(void)
1570{
1571 int ret = -1;
1572
1573 if (nw_init_flag == 0 || nw_info_handle == NULL)
1574 {
xy.heb41615b2025-05-28 16:33:20 +08001575 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001576 }
1577
1578 ret = mbtk_info_handle_free(&nw_info_handle);
1579 if(ret != GSW_HAL_SUCCESS)
1580 {
1581 LOGE("mbtk_info_handle_free fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001582 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001583 }
1584
1585 dlclose(dlHandle_mbtk);
1586 nw_info_handle = NULL;
1587 nw_init_flag = 0;
1588
1589 return GSW_HAL_SUCCESS;
1590
1591}
1592
1593
1594/**
1595 * @brief get current network reg info
1596 * @param [out] serving_info struct for network info
1597 * include regstate ps_state opreator name mcc mcn etc
1598 * @retval 0: success
1599 * @retval other: fail
1600 */
1601int gsw_get_nwinfo(GSW_NW_SERVING_INFO *serving_info)
1602{
1603
1604 int ret = -1;
b.liu68a94c92025-05-24 12:53:41 +08001605 if (nw_init_flag == 0 || nw_info_handle == NULL)
1606 {
q.huang238b22a2025-06-10 14:36:59 +08001607 printf("nw_sdk_deinit not init\n");
xy.heb41615b2025-05-28 16:33:20 +08001608 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001609 }
1610
1611 LOGE("mbtk_net_reg_get start \n");
1612 //regstate
1613 mbtk_net_reg_info_t reg;
1614 memset(&reg, 0x0, sizeof(mbtk_net_reg_info_t));
1615 ret = mbtk_net_reg_get(nw_info_handle, &reg);
1616 if(ret)
1617 {
1618 LOGE("mbtk_net_reg_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001619 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001620 }
1621
1622 LOGE("convert_cs_reg_state\n");
1623 //cs_state
1624 serving_info->reg_state = convert_reg_state(reg.call_state);
1625 LOGE("convert_ps_reg_state\n");
1626 //ps_state
1627 serving_info->ps_state = convert_reg_state(reg.data_state);
1628 LOGE("convert_rat_mode\n");
1629 //reg_rat
1630 serving_info->reg_rat = convert_net_mode(reg.type);
1631 //srv_domain
1632 if(serving_info->reg_state == GSW_NETWORK_REG_REGISTERED || serving_info->reg_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1633 {
1634 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTERED || serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1635 {
1636 serving_info->srv_domain = GSW_SRV_DOMAIN_CS_PS;
1637 }
1638
1639 else
1640 {
1641 serving_info->srv_domain = GSW_SRV_DOMAIN_CS_ONLY;
1642 }
1643 }
1644
1645 else if (serving_info->ps_state == GSW_NETWORK_REG_REGISTERED || serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1646 {
1647 serving_info->srv_domain = GSW_SRV_DOMAIN_PS_ONLY;
1648 }
1649
1650 else
1651 {
1652 serving_info->srv_domain = GSW_SRV_DOMAIN_NO_SVC;
1653 //if ps and cs is both not registed, reg_rat seted to GSW_NETWORK_RADIO_NO_SVC
1654 serving_info->reg_rat = GSW_NETWORK_RADIO_NO_SVC;
1655 }
1656
1657 LOGD("roaming_ind\n");
1658 //roaming_ind
1659 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1660 {
1661 serving_info->roaming_ind = GSW_NETWORK_ROAMING_ON;
1662 }
1663 else
1664 {
1665 serving_info->roaming_ind = GSW_NETWORK_ROAMING_OFF;
1666 }
1667
1668 LOGD("reject\n");
1669 //reject
1670 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_DENIED || serving_info->reg_state == GSW_NETWORK_REG_REGISTRATION_DENIED)
1671 {
1672 LOGD("reject_callback\n");
1673 gsw_reject_callback(serving_info->reg_rat,serving_info->srv_domain,99);
1674 }
1675
1676 LOGD("reg_plmn / operator name\n");
1677 //reg_plmn / operator name
1678 mbtk_net_info_t net;
1679 memset(&net, 0x0, sizeof(mbtk_net_info_t));
1680 LOGD("mbtk_net_sel_mode_get start \n");
1681 ret = mbtk_net_sel_mode_get(nw_info_handle, &net);
1682 LOGD("mbtk_net_sel_mode_get end \n");
1683 if(ret == 0 && net.plmn > 0)
1684 {
1685 int i = 0;
1686
1687 LOGD("start to find mcc");
1688 while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
1689 {
1690 if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
1691 {
1692 LOGD("find mcc\n");
1693 break;
1694 }
1695 i++;
1696 }
1697
1698
1699 if(i == ARRAY_SIZE(lynq_operator_mcc_mnc))
1700 {
1701 LOGD("not find mcc");
1702 strcpy(serving_info->operator_name, "unknown");
1703 sprintf(serving_info->reg_plmn, "%d", net.plmn);
1704 }
1705
1706 else
1707 {
1708 LOGD("find mcc\n");
1709 strcpy(serving_info->operator_name, lynq_operator_mcc_mnc[i].lynq_operator_l);
1710 sprintf(serving_info->reg_plmn, "%d", net.plmn);
1711 }
1712
1713 LOGE("operator_name = %s\n", serving_info->operator_name);
1714 LOGE("reg_plmn = %s\n", serving_info->reg_plmn);
1715 }
1716
1717
1718 LOGD("get cell id/tac/lac/sid/nid\n");
1719 //cell id/tac/lac/sid/nid
1720 mbtk_cell_type_enum cell_type;
b.liu68a94c92025-05-24 12:53:41 +08001721 list_node_t* cell_list = NULL;
1722
1723 LOGD("mbtk_cell_get start\n");
1724 ret = mbtk_cell_get(nw_info_handle, &cell_type, &cell_list);
1725 if(ret != 0 || cell_list == NULL)
1726 {
1727 LOGE("mbtk_cell_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001728 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001729 }
1730 else
1731 {
1732 LOGE("mbtk_cell_get end,start to get node\n");
1733 list_first(cell_list);
1734 LOGE("list_first end\n");
1735 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
1736 if(cell)
1737 {
1738 LOGE("cell is not null,value2 = %u\n",cell->value2);
1739 switch(cell_type)
1740 {
1741 case MBTK_CELL_TYPE_LTE:
1742 {
1743 LOGE("is lte\n");
1744 //LOGE("LTE : tac=%x, PCI=%x, dlEuarfcn=%x, ulEuarfcn=%x, band=%x\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
1745 LOGE("LTE : tac=%d, PCI=%d, dlEuarfcn=%d, ulEuarfcn=%d, band=%d\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
1746 snprintf(serving_info->tac,sizeof(serving_info->tac),"%d",cell->value1);
1747 strcpy(serving_info->lac,"");
q.huangc8b93122025-06-17 17:46:05 +08001748 snprintf(serving_info->cell_id,sizeof(serving_info->cell_id),"%d",cell->value10);
b.liu68a94c92025-05-24 12:53:41 +08001749 break;
1750 }
1751
1752 case MBTK_CELL_TYPE_GSM:
1753 {
1754 LOGE("is gsm\n");
1755 LOGE("GSM : lac=%d, ci=%d, arfcn=%d, bsic=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
1756 sprintf(serving_info->lac,"%d",cell->value1);
1757 memset(serving_info->tac,0,sizeof(serving_info->tac));
1758 sprintf(serving_info->cell_id,"%d",cell->value2);
1759 break;
1760 }
1761 case MBTK_CELL_TYPE_UMTS:
1762 {
1763 LOGE("is wcdma\n");
1764 LOGE("UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
1765 sprintf(serving_info->lac,"%d",cell->value1);
1766 memset(serving_info->tac,0,sizeof(serving_info->tac));
1767 sprintf(serving_info->cell_id,"%d",cell->value2);
1768 break;
1769 }
1770
1771 default:
1772 break;
1773 }
1774 }
1775 else
1776 {
1777 LOGE("cell is null\n");
1778 }
1779 }
1780
1781 //not support now
1782 serving_info->sid = 0;
1783 serving_info->nid = 0;
1784
1785 return GSW_HAL_SUCCESS;
1786}
1787
1788
1789/**
1790 * @brief get current network type
1791 * @param [out] netype as GSW_NW_RADIO_ACCESS_TECH_E type
1792 * @retval 0: success
1793 * @retval other: fail
1794 */
1795int gsw_get_netype(int *netype)
1796{
1797 int ret = -1;
1798
1799 if (nw_init_flag == 0 || nw_info_handle == NULL)
1800 {
xy.heb41615b2025-05-28 16:33:20 +08001801 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001802 }
1803
1804 //regstate
1805 mbtk_net_reg_info_t reg;
1806 ret = mbtk_net_reg_get(nw_info_handle, &reg);
1807 if(ret)
1808 {
1809 LOGE("mbtk_net_reg_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001810 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001811 }
1812
1813 if(reg.data_state == MBTK_NET_REG_STATE_HOME || reg.data_state == MBTK_NET_REG_STATE_ROAMING)
1814 {
1815 *netype = convert_net_mode(reg.type);
1816 }
1817 else
1818 {
1819 *netype = GSW_NETWORK_RADIO_NO_SVC;
1820 }
1821
1822 return GSW_HAL_SUCCESS;
1823}
1824
1825
1826/**
1827 * @brief get radio opmode, as open and close airplane mode
1828 * @param [out] op_mode 1 is radio on, 0 is radio off
1829 * @retval 0: success
1830 * @retval other: fail
1831 */
1832int gsw_get_opmode(int *op_mode)
1833{
1834 int tmp_rf = -1;
1835 int ret = -1;
1836 if (nw_init_flag == 0 || nw_info_handle == NULL)
1837 {
xy.heb41615b2025-05-28 16:33:20 +08001838 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001839 }
1840
1841 ret = mbtk_get_modem_fun(nw_info_handle, &tmp_rf);
1842 if (ret != 0)
1843 {
1844 LOGE("mbtk_get_modem_fun fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001845 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001846 }
1847 if(tmp_rf == LYNQ_AIR_CFUN_MODE_OFF)
1848 {
1849 *op_mode = GSW_OP_MODE_LPM;
1850 }
1851
1852 if(tmp_rf == LYNQ_AIR_PLANE_MODE_ON)
1853 {
1854 *op_mode = GSW_OP_MODE_OFFLINE;
1855 }
1856
1857 if(tmp_rf == LYNQ_AIR_PLANE_MODE_OFF)
1858 {
1859 *op_mode = GSW_OP_MODE_ONLINE;
1860 }
1861
1862 return GSW_HAL_SUCCESS;
1863}
1864
1865
1866
1867/**
1868 * @brief set radio opmode, as open and close airplane mode
1869 * @param [in] op_mode 1 is radio on, 0 is radio off
1870 * @retval 0: success
1871 * @retval other: fail
1872 */
1873int gsw_set_opmode(int op_mode)
1874{
1875 mbtk_modem_info_t info;
1876 int rf_mode = -1;
1877 int ret = -1;
1878
1879 if (nw_init_flag == 0 || nw_info_handle == NULL)
1880 {
xy.heb41615b2025-05-28 16:33:20 +08001881 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001882 }
1883
1884 if(op_mode == GSW_OP_MODE_LPM)
1885 {
1886 rf_mode = LYNQ_AIR_CFUN_MODE_OFF;
1887 }
1888
1889 if(op_mode == GSW_OP_MODE_ONLINE)
1890 {
1891 rf_mode = LYNQ_AIR_PLANE_MODE_OFF;
1892 }
1893
1894 if(op_mode == GSW_OP_MODE_OFFLINE)
1895 {
1896 rf_mode = LYNQ_AIR_PLANE_MODE_ON;
1897 }
1898
1899 if (rf_mode != LYNQ_AIR_PLANE_MODE_ON && rf_mode != LYNQ_AIR_PLANE_MODE_OFF && rf_mode != LYNQ_AIR_CFUN_MODE_OFF)
1900 {
1901 LOGE("Input mode is error!\n");
xy.heb41615b2025-05-28 16:33:20 +08001902 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001903 }
1904
1905 info.fun = rf_mode;
1906 info.rst = 0;
1907 ret = mbtk_set_modem_fun(nw_info_handle, &info);
1908 if (ret != 0)
1909 {
1910 LOGE("gsw_set_opmode fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001911 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001912 }
1913
1914 return GSW_HAL_SUCCESS;
1915
1916}
1917
1918
1919/**
1920 * @brief get network mode preference of mdm search network scale
1921 * @param [out] mode_pref net_work pref mode:
1922 * enum prefer_mode
1923 * @retval 0: success
1924 * @retval other: fail
1925 */
1926int gsw_get_mode_preference(int *mode_pref)
1927{
1928 if (nw_init_flag == 0 || nw_info_handle == NULL)
1929 {
xy.heb41615b2025-05-28 16:33:20 +08001930 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001931 }
1932
1933 int ret = -1;
1934 mbtk_band_info_t band;
1935 memset(&band, 0, sizeof(mbtk_band_info_t));
1936
1937 ret = mbtk_current_band_get(nw_info_handle, &band);
1938 if(ret != 0)
1939 {
1940 LOGE("mbtk_current_band_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001941 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001942 }
1943
1944 *mode_pref = convert_gsw_net_config(band.net_pref);
1945 LOGE("band.net_pref = %d\n", *mode_pref);
1946 if(*mode_pref <= 0)
1947 {
1948 LOGE("no support mode\n");
xy.heb41615b2025-05-28 16:33:20 +08001949 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001950 }
1951 return GSW_HAL_SUCCESS;
1952
1953
1954}
1955
1956/**
1957 * @brief set network mode preference of mdm search network scale
1958 * @param [in] mode_pref net_work pref mode:
1959 * enum prefer_mode
1960 * @retval 0: success
1961 * @retval other: fail
1962 */
1963int gsw_set_mode_preference(int mode_pref)
1964{
1965 if (nw_init_flag == 0 || nw_info_handle == NULL)
1966 {
xy.heb41615b2025-05-28 16:33:20 +08001967 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001968 }
1969
1970 int ret = -1;
1971
1972 mbtk_band_info_t band;
1973 memset(&band, 0, sizeof(mbtk_band_info_t));
1974
1975 band.net_pref = convert_mbtk_net_config(mode_pref);
1976 LOGE("band.net_pref = %d\n", band.net_pref);
1977
1978 if(band.net_pref < 0)
1979 {
1980 LOGE("no support mode\n");
xy.heb41615b2025-05-28 16:33:20 +08001981 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001982 }
1983
1984 ret = mbtk_current_band_set(nw_info_handle, &band);
1985 if(ret != 0)
1986 {
1987 LOGE("mbtk_current_band_set fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001988 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001989 }
1990
1991 return GSW_HAL_SUCCESS;
1992}
1993
1994/**
1995 * @brief get signal csq value
1996 * @param [out] csq_value csq of signalstrengh 0 - 31, 99 invalid
1997 * @retval 0: success
1998 * @retval other: fail
1999 */
2000int gsw_get_sig_info(int *csq_value)
2001{
b.liu68a94c92025-05-24 12:53:41 +08002002 if (nw_init_flag == 0 || nw_info_handle == NULL)
2003 {
xy.heb41615b2025-05-28 16:33:20 +08002004 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002005 }
2006
2007 mbtk_signal_info_t signal;
q.huangfa0a0a32025-06-12 17:07:23 +08002008 int ret = mbtk_net_signal_get(nw_info_handle, &signal);
b.liu68a94c92025-05-24 12:53:41 +08002009 if(ret != 0)
2010 {
2011 LOGE("mbtk_net_signal_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002012 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002013 }
2014
2015 LOGD("signal.type=%d\n", signal.type);
2016 switch(signal.type)
2017 {
q.huangfa0a0a32025-06-12 17:07:23 +08002018
b.liu68a94c92025-05-24 12:53:41 +08002019 case MBTK_RADIO_TECH_E_UTRAN:
2020 {
q.huangfa0a0a32025-06-12 17:07:23 +08002021 LOGD("lte rsrp = %d dbm",signal.rsrp-141);
2022 *csq_value = rsrpToLevel(signal.rsrp-141);
b.liu68a94c92025-05-24 12:53:41 +08002023 break;
2024 }
2025 case MBTK_RADIO_TECH_UTRAN:
2026 case MBTK_RADIO_TECH_UTRAN_HSDPA:
2027 case MBTK_RADIO_TECH_UTRAN_HSUPA:
2028 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
2029 case MBTK_RADIO_TECH_UTRAN_HSPA:
2030 {
q.huangfa0a0a32025-06-12 17:07:23 +08002031 LOGD("w rscp = %d dbm",signal.rscp-121);
2032 *csq_value = rscpToLevel(signal.rscp-121);
2033 break;
2034 }
2035 case MBTK_RADIO_TECH_GSM:
2036 case MBTK_RADIO_TECH_GSM_COMPACT:
2037 case MBTK_RADIO_TECH_GSM_EGPRS:
2038 {
2039 LOGD("gsm rssi = %d (0-31)",signal.rssi);
2040 *csq_value = signal.rssi;
b.liu68a94c92025-05-24 12:53:41 +08002041 break;
2042 }
2043 default:
2044 {
q.huangfa0a0a32025-06-12 17:07:23 +08002045 LOGE("[%s] unknown reg type.[%d]", __func__, signal.type);
xy.heb41615b2025-05-28 16:33:20 +08002046 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002047 }
2048 }
2049 return GSW_HAL_SUCCESS;
2050}
2051
2052/**
2053 * @brief set nework power mode, for tcam enter standby or exit standby
2054 * @param [in] mode TRUE(1) when enter standby, FALSE(0) after wake up
2055 * @retval 0: success
2056 * @retval other: fail
2057 */
2058int gsw_network_set_power_mode(char mode)
2059{
2060 int ret = -1;
2061
2062 if (nw_init_flag == 0 || nw_info_handle == NULL)
2063 {
xy.heb41615b2025-05-28 16:33:20 +08002064 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002065 }
2066
2067 if(mode != 0 && mode != 1)
2068 {
2069 LOGE("Input mode is error!\n");
xy.heb41615b2025-05-28 16:33:20 +08002070 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002071 }
2072
2073 if(mode == 1)
2074 {
2075 mode = 6;
2076 }
2077
2078 ret = mbtk_wakeup_state_set(nw_info_handle, mode);
2079 if(ret != 0)
2080 {
2081 LOGE("mbtk_wakeup_state_set fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002082 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002083 }
2084
2085 return GSW_HAL_SUCCESS;
2086
2087
2088
2089}
2090
2091/**
2092 * @brief convert rsrp rscp rssi to csq value.
2093 * @param [in] netType signal radio tech 2 means 2G 3 mens 3G,4 is 4G,5 is 5G
2094 * @param [in] sigvalue input signal_strength for different nettype
2095 * rsrp for 4G/5G, rscp for 3G, rssi for 2G
2096
2097 * @retval csq
2098 * @retval other: fail
2099 */
2100int gsw_sigInfo_to_csq(int netType, int sigValue)
2101{
q.huang238b22a2025-06-10 14:36:59 +08002102 if (nw_init_flag == 0 || nw_info_handle == NULL)
2103 {
2104 return GSW_HAL_NORMAL_FAIL;
2105 }
b.liu68a94c92025-05-24 12:53:41 +08002106 switch(netType)
q.huangfa0a0a32025-06-12 17:07:23 +08002107 {
2108 case 4:
b.liu68a94c92025-05-24 12:53:41 +08002109 {
q.huangfa0a0a32025-06-12 17:07:23 +08002110 return rsrpToLevel(sigValue);
2111 }
2112 case 3: //WCDMA
b.liu68a94c92025-05-24 12:53:41 +08002113 {
q.huangfa0a0a32025-06-12 17:07:23 +08002114 return rscpToLevel(sigValue);
2115 }
2116 case 2: //GSM
b.liu68a94c92025-05-24 12:53:41 +08002117 {
q.huangfa0a0a32025-06-12 17:07:23 +08002118 return sigValue;
b.liu68a94c92025-05-24 12:53:41 +08002119 }
2120
2121 default:
2122 {
2123 LOGE("parameter error\n");
xy.heb41615b2025-05-28 16:33:20 +08002124 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002125 }
2126 }
2127}
2128
2129/*
2130 * @brief get mobile operator name
2131 @param [out] nw_operator_name_infos get the long and short operator name info
2132 @retval 0: success
2133 @retval 0: other: fail
2134 */
2135int gsw_get_mobile_operator_name(gsw_mobile_operator_name *nw_operator_name_infos)
2136{
2137 char OperatorFN[128];
2138 char OperatorSH[128];
2139 char temp[12] = {0};
2140 mbtk_net_info_t net;
2141
2142 if (nw_init_flag == 0 || nw_info_handle == NULL)
2143 {
xy.heb41615b2025-05-28 16:33:20 +08002144 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002145 }
2146
2147 if(!mbtk_net_sel_mode_get(nw_info_handle, &net) && net.plmn > 0)
2148 {
2149 LOGE("Net : %d, %d, %d\n", net.net_sel_mode, net.net_type, net.plmn);
2150 int i = 0;
2151 while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
2152 {
2153 if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
2154 break;
2155 i++;
2156 }
2157
2158 if(i == ARRAY_SIZE(lynq_operator_mcc_mnc)) // No found mcc&mnc
2159 {
2160 strcpy(OperatorFN, "UNKNOWN");
2161 strcpy(OperatorSH, "UNKNOWN");
2162 }
2163 else
2164 {
2165 strcpy(OperatorFN, lynq_operator_mcc_mnc[i].lynq_operator_l);
2166 strcpy(OperatorSH, lynq_operator_mcc_mnc[i].lynq_operator_s);
2167
2168 memset(temp,0,12);
2169 memset(nw_operator_name_infos->mcc,0,4);
2170 sprintf(temp, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)/100);
2171 strncpy(nw_operator_name_infos->mcc, temp, strlen(temp));
2172
2173 memset(temp,0,12);
2174 memset(nw_operator_name_infos->mnc,0,4);
2175 sprintf(temp, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)%100);
2176 strncpy(nw_operator_name_infos->mnc, temp, strlen(temp));
2177 }
2178
2179 memset(nw_operator_name_infos->long_eons,0,128);
2180 memcpy(nw_operator_name_infos->long_eons,OperatorFN,strlen(OperatorFN));
2181 memset(nw_operator_name_infos->short_eons,0,128);
2182 memcpy(nw_operator_name_infos->short_eons,OperatorSH,strlen(OperatorSH));
2183
2184 return GSW_HAL_SUCCESS;
2185 }
2186
2187 else
2188 {
2189 LOGE("mbtk_net_sel_mode_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002190 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002191 }
2192
2193 return GSW_HAL_SUCCESS;
2194}
2195
2196
2197/*
2198 * @brief get current serving cell info
2199 * @param cell_info: [out] struct for current cell info
2200 * include earfcn mcc mnc pci psc tac lac etc.
2201 * @return int: 0 is success, other failed
2202 */
2203int gsw_get_cell_info(GSW_NW_CELL_INFO *cell_info)
2204{
b.liu68a94c92025-05-24 12:53:41 +08002205
2206 if (nw_init_flag == 0 || nw_info_handle == NULL)
2207 {
q.huang238b22a2025-06-10 14:36:59 +08002208 printf("nw_sdk_deinit not init\n");
xy.heb41615b2025-05-28 16:33:20 +08002209 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002210 }
2211
2212 list_node_t* cell_list = NULL;
b.liu68a94c92025-05-24 12:53:41 +08002213 mbtk_cell_type_enum type;
q.huang638d5872025-06-21 13:44:43 +08002214 int ret = mbtk_cell_get(nw_info_handle, &type, &cell_list);
b.liu68a94c92025-05-24 12:53:41 +08002215 if(ret || cell_list == NULL) {
2216 LOGE("mbtk_cell_get failed : %d\n", ret);
q.huang638d5872025-06-21 13:44:43 +08002217 list_free(cell_list);
2218 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002219 } else {
q.huang638d5872025-06-21 13:44:43 +08002220 memset(cell_info,0,sizeof(GSW_NW_CELL_INFO));
b.liu68a94c92025-05-24 12:53:41 +08002221 list_first(cell_list);
2222 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
2223 if(cell) { // Current server cell.
2224 switch(type)
2225 {
2226 case 0:
2227 {
2228 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 +08002229 char gsm_temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002230
2231 cell_info->rat = GSW_NETWORK_RADIO_GSM;
2232
2233 cell_info->mcc_valid = 1;
2234 snprintf(gsm_temp, sizeof(gsm_temp) ,"%d", cell->value5);
2235 strncpy(cell_info->mcc, gsm_temp, sizeof(cell_info->mcc));
2236
2237 memset(gsm_temp, 0, sizeof(gsm_temp));
2238
2239 cell_info->mnc_valid = 1;
2240 snprintf(gsm_temp, sizeof(gsm_temp) ,"%d", cell->value6);
2241 strncpy(cell_info->mnc, gsm_temp, sizeof(cell_info->mnc));
2242
2243 cell_info->cell_id_valid = 1;
2244 cell_info->cell_id = cell->value2;
2245
2246 cell_info->lac_valid = 1;
2247 cell_info->lac = cell->value1;
2248
2249 cell_info->arfcn_valid = 1;
2250 cell_info->arfcn = cell->value3;
2251
2252 break;
2253 }
2254
2255 case 1:
2256 {
2257 LOGD("UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
q.huang638d5872025-06-21 13:44:43 +08002258 char wcdma_temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002259
2260 cell_info->rat = GSW_NETWORK_RADIO_UMTS;
2261
2262 cell_info->mcc_valid = 1;
2263 snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%d", cell->value4);
2264 strncpy(cell_info->mcc, wcdma_temp, sizeof(cell_info->mcc));
2265
2266 memset(wcdma_temp, 0, sizeof(wcdma_temp));
2267
2268 cell_info->mnc_valid = 1;
2269 snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%d", cell->value5);
2270 strncpy(cell_info->mnc, wcdma_temp, sizeof(cell_info->mnc));
2271
2272 cell_info->lac_valid = 1;
2273 cell_info->lac = cell->value1;
2274
2275 cell_info->cell_id_valid = 1;
2276 cell_info->cell_id = cell->value2;
2277
2278 cell_info->uarfcn_valid = 1;
2279 cell_info->uarfcn = cell->value3;
2280
2281 cell_info->psc_valid = 1;
2282 cell_info->psc = cell->value6;
2283 break;
2284 }
2285
2286 case 2:
2287 {
2288 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 +08002289
q.huang638d5872025-06-21 13:44:43 +08002290 char lte_temp[12];
b.liu68a94c92025-05-24 12:53:41 +08002291 cell_info->rat = GSW_NETWORK_RADIO_LTE;
2292
2293 cell_info->mcc_valid = 1;
2294 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);
2295 strncpy(cell_info->mcc, lte_temp, sizeof(cell_info->mcc));
2296
b.liu68a94c92025-05-24 12:53:41 +08002297 cell_info->mnc_valid = 1;
2298 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);
2299 strncpy(cell_info->mnc, lte_temp, sizeof(cell_info->mnc));
2300
2301 cell_info->tac_valid = 1;
2302 cell_info->tac = cell->value1;
2303
2304 cell_info->pci_valid = 1;
2305 cell_info->pci = cell->value2;
2306
2307 cell_info->earfcn_valid = 1;
2308 cell_info->earfcn = cell->value3;
2309
2310 cell_info->bler_valid = 1;
2311 cell_info->bler = cell->value4;
2312
2313 cell_info->band_valid = 1;
2314 cell_info->band = cell->value5;
2315
q.huang638d5872025-06-21 13:44:43 +08002316 cell_info->rssnr = sinr_convert_to_10_times_dB(cell->value11);
2317 cell_info->rssnr_valid=(cell_info->rssnr!=INT_32_MAX);
b.liu68a94c92025-05-24 12:53:41 +08002318
q.huang638d5872025-06-21 13:44:43 +08002319 cell_info->lteMode_valid = 1;
2320 cell_info->lteMode =(!(cell->value12));
2321
2322
2323 cell_info->rsrp = rsrp_convert_to_minus_dBm(cell->value8);
2324 cell_info->rsrp_valid = (cell_info->rsrp!=INT_32_MAX);
2325
2326 cell_info->rsrq = rsrq_convert_to_minus_dB(cell->value9);
2327 cell_info->rsrq_valid = (cell_info->rsrq!=INT_32_MAX);
b.liu68a94c92025-05-24 12:53:41 +08002328
2329 cell_info->cell_id_valid = 1;
2330 cell_info->cell_id = cell->value10;
2331
q.huang638d5872025-06-21 13:44:43 +08002332 cell_info->rssi=rsrp_minus_dbm_convert_to_rssi_dBm(cell_info->rsrp);
2333 cell_info->rssi_valid = (cell_info->rssi!=INT_32_MAX);
2334
b.liu68a94c92025-05-24 12:53:41 +08002335 break;
2336 }
2337
2338 default:
2339 break;
2340 }
2341 }
q.huang638d5872025-06-21 13:44:43 +08002342 int neibor_count = 0;
b.liu68a94c92025-05-24 12:53:41 +08002343 while ((cell = (mbtk_cell_info_t*) list_next(cell_list)) && neibor_count < 5)
2344 {
2345 switch(type)
2346 {
2347 //GSM
2348 case 0:
2349 {
2350
2351 }
2352 //WCDMA
2353 case 1:
2354 {
2355 LOGE("CELL : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
2356
2357 //cell_info->ext_info[neibor_count]->lac = cell->value1;
2358
2359 cell_info->ext_info[neibor_count].cell_id_valid = 1;
2360 cell_info->ext_info[neibor_count].cell_id = cell->value2;
2361
2362 cell_info->ext_info[neibor_count].arfcn_valid = 1;
2363 cell_info->ext_info[neibor_count].arfcn = cell->value3;
2364
2365 cell_info->ext_info[neibor_count].rat = cell_info->rat = GSW_NETWORK_RADIO_UMTS;
2366
2367 neibor_count++;
2368
2369 }
2370 //LTE
2371 case 2:
2372 {
2373 LOGE("CELL : phyCellId=%d, euArfcn=%d, rsrp=%d, rsrq=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
2374 char lte_temp[12] = {0};
2375 cell_info->ext_info[neibor_count].rat = GSW_NETWORK_RADIO_LTE;
2376
q.huang638d5872025-06-21 13:44:43 +08002377
b.liu68a94c92025-05-24 12:53:41 +08002378 cell_info->ext_info[neibor_count].pci = cell->value1;
2379 cell_info->ext_info[neibor_count].pci_valid = 1;
2380
2381 cell_info->ext_info[neibor_count].arfcn = cell->value2;
2382 cell_info->ext_info[neibor_count].arfcn_valid = 1;
2383
q.huang638d5872025-06-21 13:44:43 +08002384 cell_info->ext_info[neibor_count].rsrp = rsrp_convert_to_minus_dBm(cell->value3);
2385 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 +08002386
q.huang638d5872025-06-21 13:44:43 +08002387 cell_info->ext_info[neibor_count].rsrq = rsrq_convert_to_minus_dB(cell->value4);
2388 cell_info->ext_info[neibor_count].rsrq_valid = (cell_info->ext_info[neibor_count].rsrq!=INT_32_MAX);
2389
2390 if(cell->value7!=INT_32_MAX)
2391 {
2392 cell_info->ext_info[neibor_count].cell_id = cell->value5;
2393 cell_info->ext_info[neibor_count].cell_id_valid = 1;
2394
2395 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);
2396 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 +08002397
b.liu68a94c92025-05-24 12:53:41 +08002398
q.huang638d5872025-06-21 13:44:43 +08002399 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);
2400 strncpy(cell_info->ext_info[neibor_count].mnc, lte_temp, sizeof(cell_info->ext_info[neibor_count].mnc));
2401
2402
2403 //value 8 is tac
b.liu68a94c92025-05-24 12:53:41 +08002404
q.huang638d5872025-06-21 13:44:43 +08002405 cell_info->ext_info[neibor_count].band = cell->value9;
2406 cell_info->ext_info[neibor_count].band_valid = 1;
2407
2408 cell_info->ext_info[neibor_count].rssi=rsrp_minus_dbm_convert_to_rssi_dBm(cell_info->ext_info[neibor_count].rsrp);
2409 cell_info->ext_info[neibor_count].rssi_valid = (cell_info->ext_info[neibor_count].rssi!=INT_32_MAX);
2410 }
b.liu68a94c92025-05-24 12:53:41 +08002411
2412 neibor_count++;
2413 }
2414
2415 default:
2416 break;
2417 }
2418 }
q.huang638d5872025-06-21 13:44:43 +08002419 cell_info->ext_info_len=neibor_count;
b.liu68a94c92025-05-24 12:53:41 +08002420 }
2421 list_free(cell_list);
2422
2423 return GSW_HAL_SUCCESS;
2424}
2425
2426/*
2427 * @brief set modem status event callback
2428 @param [in] handle_ptr callback function address
2429 @retval 0: success
2430 @retval 0: other: fail
2431 */
2432int gsw_reg_set_modem_status_event_callback(GSW_NW_ModemStateHandlePtr handle_ptr)
2433{
2434
2435 if (nw_init_flag == 0 || nw_info_handle == NULL)
2436 {
xy.heb41615b2025-05-28 16:33:20 +08002437 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002438 }
2439
b.liu68a94c92025-05-24 12:53:41 +08002440 if(handle_ptr == NULL)
2441 {
2442 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08002443 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002444 }
2445
2446 modem_cb = handle_ptr;
2447
b.liu68a94c92025-05-24 12:53:41 +08002448 return GSW_HAL_SUCCESS;
2449
2450}
2451
2452
2453/*
2454 * @brief get PLMNs from the FPLMN list
2455 * @param [inout] plmn_list:
2456 * @retval 0: success
2457 * @retval other: fail
2458 */
2459int gsw_get_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2460{
2461 if (nw_init_flag == 0 || nw_info_handle == NULL)
2462 {
xy.heb41615b2025-05-28 16:33:20 +08002463 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002464 }
2465
2466 int ret = -1;
2467 char fplmn[256] = {0};
2468 LOGE("mbtk_fplmn_get enter\n");
2469 ret = mbtk_fplmn_get(nw_info_handle, fplmn);
2470 LOGE("mbtk_fplmn_get exit\n");
2471 if(ret != 0)
2472 {
2473 LOGE("mbtk_fplmn_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002474 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002475 }
2476
2477 update_fplmn_list(fplmn);
2478 for(int i = 0; i < fplmn_index; i++)
2479 {
2480 if(strcmp(fplmn_array[i],"FFFFFF") == 0)
2481 {
2482 continue;
2483 }
2484 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);
2485 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);
2486 plmn_list->plmn_list_len++;
2487 }
2488
2489 LOGE("fplmn = %s\n", fplmn);
2490 return GSW_HAL_SUCCESS;
2491}
2492
2493/*
2494 * @brief add PLMNs from the plmn_list to the FPLMN list
2495 * @param [in] plmn_list:
2496 * @retval 0: success
2497 * @retval other: fail
2498 */
2499int gsw_add_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2500{
2501
2502 if (nw_init_flag == 0 || nw_info_handle == NULL)
2503 {
xy.heb41615b2025-05-28 16:33:20 +08002504 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002505 }
2506
2507 if(plmn_list->plmn_list_len >= fplmn_max_length)
2508 {
2509 LOGE("can't save all the plmn\n");
xy.heb41615b2025-05-28 16:33:20 +08002510 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002511 }
2512
2513 int i = 0;
2514 int index = -1;
2515
2516 for(i = 0; i < plmn_list->plmn_list_len; i++)
2517 {
2518 index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);
2519
2520 if(index == -1)
2521 {
2522 LOGE("no this PLMN, add it\n");
2523 if((fplmn_index + plmn_list->plmn_list_len) > fplmn_max_length)
2524 {
2525 LOGE("can't save all the plmn\n");
xy.heb41615b2025-05-28 16:33:20 +08002526 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002527 }
2528
2529 else
2530 {
2531 memcpy(fplmn_array[fplmn_index], plmn_list->plmn_list[i].mcc, 3);
2532 memcpy(fplmn_array[fplmn_index] + 3, plmn_list->plmn_list[i].mnc, 2);
2533 fplmn_array[fplmn_index][5] = '\0';
2534 LOGE("fplmn_array[%d] = %s\n", fplmn_index, fplmn_array[fplmn_index]);
2535 fplmn_index++;
2536 }
2537 }
2538
2539 else
2540 {
2541 LOGE("already have this PLMN, don't add it\n");
2542 }
2543 }
2544
2545 char fplmn_str[256] = {0};
2546 convert_plmn_to_fplmn_str(fplmn_str);
2547
2548 LOGE("fplmn_str = %s\n", fplmn_str);
2549
2550 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2551 if(ret != 0)
2552 {
2553 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002554 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002555 }
2556
2557 LOGE("gsw_add_forbidden_networks exit\n");
2558 return GSW_HAL_SUCCESS;
2559}
2560
2561/*
2562 * @brief Remove PLMNs from the plmn_list from the FPLMN list
2563 * @param [in] plmn_list:
2564 * @retval 0: success
2565 * @retval other: fail
2566 */
2567int gsw_remove_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2568{
b.liu68a94c92025-05-24 12:53:41 +08002569 if (nw_init_flag == 0 || nw_info_handle == NULL)
2570 {
q.huangfa0a0a32025-06-12 17:07:23 +08002571 printf("nw sdk has not init\n");
xy.heb41615b2025-05-28 16:33:20 +08002572 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002573 }
2574
2575 int i = 0;
2576 int index = -1;
2577
2578 for(i = 0; i < plmn_list->plmn_list_len; i++)
2579 {
2580 index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);
2581 if(index != -1)
2582 {
2583 remove_fplmn(index);
2584 }
2585 else
2586 {
2587 LOGE("no this PLMN, can't remove it\n");
2588 }
2589 }
2590
2591 for(i = 0; i < fplmn_index; i++)
2592 {
2593 LOGE("fplmn_array[%d] = %s\n", i, fplmn_array[i]);
2594 }
2595
2596 char fplmn_str[256] = {0};
2597 convert_plmn_to_fplmn_str(fplmn_str);
2598 LOGE("fplmn_str = %s\n", fplmn_str);
2599
2600 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2601 if(ret != 0)
2602 {
2603 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002604 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002605 }
2606
2607 LOGE("gsw_remove_forbidden_networks exit\n");
2608 return GSW_HAL_SUCCESS;
2609}
2610
2611/*
2612 * @brief clear FPLMN list
2613 * @param
2614 * @retval 0: success
2615 * @retval other: fail
2616 */
2617int gsw_clear_forbidden_networks(void)
2618{
2619 if (nw_init_flag == 0 || nw_info_handle == NULL)
2620 {
xy.heb41615b2025-05-28 16:33:20 +08002621 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002622 }
2623
2624 char fplmn_str[FPLMN_STRING_LENGTH+1];
2625 memset(fplmn_str, 'F', (6 * fplmn_max_length));
2626 fplmn_str[(6 * fplmn_max_length)] = '\0';
2627
2628 LOGE("%s\n", fplmn_str);
2629 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2630 if(ret != 0)
2631 {
2632 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002633 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002634 }
2635
2636 return GSW_HAL_SUCCESS;
2637}
2638
2639/*
2640 * @brief get oos config
2641 * @param [in] oos_config
2642 * @retval 0: success
2643 * @retval other: fail
2644 */
2645int gsw_oos_config_get(GSW_NW_OOS_CONFIG_INFO_T *pt_info)
2646{
2647 if (nw_init_flag == 0 || nw_info_handle == NULL)
2648 {
xy.heb41615b2025-05-28 16:33:20 +08002649 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002650 }
2651
2652 if(pt_info == NULL)
2653 {
2654 LOGE("pt_info is null\n");
xy.heb41615b2025-05-28 16:33:20 +08002655 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002656 }
2657
2658 int ret = -1;
2659
2660 mbtk_oos_info oos_info;
2661 memset(&oos_info, 0x00, sizeof(mbtk_oos_info));
2662
2663 ret = mbtk_oos_get(nw_info_handle, &oos_info);
2664 if(ret != 0)
2665 {
2666 LOGE("mbtk_oos_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002667 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002668 }
2669
2670 if(oos_info.mode == 0)
2671 {
2672 pt_info->t_min = 0;
2673 pt_info->t_step = 0;
2674 pt_info->t_max = 0;
2675 }
2676
2677 else
2678 {
2679 pt_info->t_min = (int)oos_info.oosPhase[0];
2680 pt_info->t_step = (int)oos_info.oosPhase[1];
2681 pt_info->t_max = (int)oos_info.oosPhase[2];
2682 }
2683
2684 return GSW_HAL_SUCCESS;
2685}
2686
2687
2688/*
2689 * @brief set oos config
2690 * @param [in] oos_config
2691 * @retval 0: success
2692 * @retval other: fail
2693 */
2694int gsw_oos_config_set(GSW_NW_OOS_CONFIG_INFO_T *pt_info)
2695{
2696 if (nw_init_flag == 0 || nw_info_handle == NULL)
2697 {
xy.heb41615b2025-05-28 16:33:20 +08002698 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002699 }
2700
2701 if(pt_info == NULL)
2702 {
2703 LOGE("pt_info is null\n");
xy.heb41615b2025-05-28 16:33:20 +08002704 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002705 }
2706
2707 int ret = -1;
2708 mbtk_oos_info oos_info;
2709 memset(&oos_info, 0x00, sizeof(mbtk_oos_info));
2710
2711 if (pt_info->t_min < 0 || pt_info->t_step < 0 || pt_info->t_max < 0)
2712 {
2713 LOGE("gsw_oos_config_set set time < 0 ");
xy.heb41615b2025-05-28 16:33:20 +08002714 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002715 }
2716 else if ((pt_info->t_min > 0 && pt_info->t_min <= 255) && pt_info->t_step == 0 && pt_info->t_max == 0)
2717 {
2718 oos_info.mode = 1;
2719 oos_info.oosPhase[0] = pt_info->t_min;
2720 }
2721 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)
2722 {
2723 oos_info.mode = 1;
2724 oos_info.oosPhase[0] = pt_info->t_min;
2725 oos_info.oosPhase[1] = pt_info->t_step;
2726 }
2727 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))
2728 {
2729 oos_info.mode = 1;
2730 oos_info.oosPhase[0] = pt_info->t_min;
2731 oos_info.oosPhase[1] = pt_info->t_step;
2732 oos_info.oosPhase[2] = pt_info->t_max;
2733 }
2734 else if (pt_info->t_min == 0 && pt_info->t_step == 0 && pt_info->t_max == 0)
2735 {
2736 oos_info.mode = 0;
2737 }
2738 else
2739 {
2740 LOGE("gsw_oos_config_set set Format err");
xy.heb41615b2025-05-28 16:33:20 +08002741 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002742 }
2743
2744 ret = mbtk_oos_set(nw_info_handle, &oos_info);
2745 if(ret != 0)
2746 {
2747 LOGE("mbtk_oos_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002748 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002749 }
2750
2751 return GSW_HAL_SUCCESS;
2752}
2753
q.huang238b22a2025-06-10 14:36:59 +08002754/**
2755 * @brief get imei function
2756 * @param [in] len imei length,max is 20
2757 * @param [out] imei return imei from this func
2758 * @retval 0: success
2759 * @retval other: fail
2760 */
2761int gsw_get_imei(int len, char *imei)
2762{
2763 int ret = -1;
b.liu68a94c92025-05-24 12:53:41 +08002764
q.huang238b22a2025-06-10 14:36:59 +08002765 if (nw_init_flag == 0 || nw_info_handle == NULL)
2766 {
2767 printf("nw sdk has been deinit\n");
2768 return GSW_HAL_NORMAL_FAIL;
2769 }
2770
2771 if(imei == NULL)
2772 {
2773 LOGE("imei is NULL.");
2774 return GSW_HAL_ARG_INVALID;
2775 }
2776
2777 if(len < GSW_IMEI_LENGTH)
2778 {
2779 LOGE("imei len is too short,len = %d\n", len);
2780 return GSW_HAL_NORMAL_FAIL;
2781 }
2782
2783 ret = mbtk_imei_get(nw_info_handle, (void *)imei);
2784 if(ret != MBTK_ERR_OK)
2785 {
2786 LOGE("[gsw_nw] mbtk_imei_get fail [err = %d].", ret);
2787 return GSW_HAL_NORMAL_FAIL;
2788 }
2789
2790 return GSW_HAL_SUCCESS;
2791}
2792
2793/**
2794 * @brief reset modem stack only, notice: after use this method, all ril sdk
2795 * need restart by app, means network, sim, sms, data need deinit then init!
2796 * @param
2797 * @retval 0: success
2798 * @retval other: fail
2799 */
2800int gsw_reset_modem(void)
2801{
2802 int ret = -1;
2803 if (nw_init_flag == 0 || nw_info_handle == NULL)
2804 {
2805 printf("nw sdk has been deinit\n");
2806 return GSW_HAL_NORMAL_FAIL;
2807 }
2808 mbtk_modem_info_t info;
2809 info.fun = MBTK_DEV_MODEM_MIN_FUN;
2810 info.rst = 0;
2811
2812 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2813 if(ret)
2814 {
2815 LOGE("[gsw_nw] mbtk_set_modem_fun 0 fail [err = %d].", ret);
2816 return GSW_HAL_NORMAL_FAIL;
2817 }
2818
2819 sleep(1);
2820
2821 info.fun = MBTK_DEV_MODEM_FULL_FUN;
2822 ret = mbtk_set_modem_fun(nw_info_handle, &info);
2823 if(ret)
2824 {
2825 LOGE("[gsw_nw] mbtk_set_modem_fun 1 fail [err = %d].", ret);
2826 return GSW_HAL_NORMAL_FAIL;
2827 }
2828 return GSW_HAL_SUCCESS;
2829}
b.liu68a94c92025-05-24 12:53:41 +08002830
q.huangc8b93122025-06-17 17:46:05 +08002831int gsw_reg_operating_mode_callback(GSW_NW_AirplaneModeHandlePtr handle_ptr)
2832{
2833 if (nw_init_flag == 0 || nw_info_handle == NULL)
2834 {
2835 return GSW_HAL_NORMAL_FAIL;
2836 }
2837
2838 if(handle_ptr == NULL)
2839 {
2840 LOGE("handle_ptr is NULL\n");
2841 return GSW_HAL_NORMAL_FAIL;
2842 }
2843
2844 airplane_cb = handle_ptr;
2845
2846 int ret = mbtk_radio_state_change_cb_reg(nw_info_handle,gsw_operating_mode_event_callback);
2847 if(ret != 0)
2848 {
2849 LOGE("mbtk_radio_state_change_cb_reg failed : %d\n", ret);
2850 airplane_cb=NULL;
2851 return GSW_HAL_NORMAL_FAIL;
2852 }
2853
2854 return GSW_HAL_SUCCESS;
2855
2856}
2857